/*
<: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_model_types.h"
#include "bcmolt_model_ids.h"

/******************************************************************************/
bcmos_bool bcmolt_activation_fail_reason_pack(bcmolt_activation_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_activation_fail_reason_unpack(bcmolt_activation_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_additional_bw_eligibility_pack(bcmolt_additional_bw_eligibility this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_additional_bw_eligibility_unpack(bcmolt_additional_bw_eligibility *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_id_pack(bcmolt_ae_ni_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_id_unpack(bcmolt_ae_ni_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_en_state_pack(bcmolt_ae_ni_en_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_en_state_unpack(bcmolt_ae_ni_en_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_id_pack(bcmolt_ae_ni_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_id_unpack(bcmolt_ae_ni_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_id_pack(bcmolt_ae_ni_set_ae_ni_en_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_id_unpack(bcmolt_ae_ni_set_ae_ni_en_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_id_pack(bcmolt_ae_path_ds_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_id_unpack(bcmolt_ae_path_ds_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_id_pack(bcmolt_ae_path_ds_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_id_unpack(bcmolt_ae_path_ds_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_id_pack(bcmolt_ae_path_ds_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_id_unpack(bcmolt_ae_path_ds_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_id_pack(bcmolt_ae_path_ds_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_id_unpack(bcmolt_ae_path_ds_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_id_pack(bcmolt_ae_path_ds_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_id_unpack(bcmolt_ae_path_ds_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_id_pack(bcmolt_ae_path_ds_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_id_unpack(bcmolt_ae_path_ds_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_id_pack(bcmolt_ae_path_us_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_id_unpack(bcmolt_ae_path_us_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_id_pack(bcmolt_ae_path_us_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_id_unpack(bcmolt_ae_path_us_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_id_pack(bcmolt_ae_path_us_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_id_unpack(bcmolt_ae_path_us_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_id_pack(bcmolt_ae_path_us_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_id_unpack(bcmolt_ae_path_us_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_id_pack(bcmolt_ae_path_us_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_id_unpack(bcmolt_ae_path_us_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_id_pack(bcmolt_ae_path_us_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_id_unpack(bcmolt_ae_path_us_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_operation_pack(bcmolt_alloc_operation this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_operation_unpack(bcmolt_alloc_operation *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_state_pack(bcmolt_alloc_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_state_unpack(bcmolt_alloc_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_type_pack(bcmolt_alloc_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_type_unpack(bcmolt_alloc_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_type_to_scan_pack(bcmolt_alloc_type_to_scan this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_alloc_type_to_scan_unpack(bcmolt_alloc_type_to_scan *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_mode_pack(bcmolt_api_capture_buffer_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_mode_unpack(bcmolt_api_capture_buffer_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_location_pack(bcmolt_api_capture_location this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_location_unpack(bcmolt_api_capture_location *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_calibration_record_pack(bcmolt_calibration_record this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_calibration_record_unpack(bcmolt_calibration_record *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_sign_pack(bcmolt_sign this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_sign_unpack(bcmolt_sign *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_line_rate_capabilities_pack(bcmolt_upstream_line_rate_capabilities this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_line_rate_capabilities_unpack(bcmolt_upstream_line_rate_capabilities *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_link_type_pack(bcmolt_link_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_link_type_unpack(bcmolt_link_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_capture_strobe_signal_pack(bcmolt_capture_strobe_signal this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_capture_strobe_signal_unpack(bcmolt_capture_strobe_signal *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_id_pack(bcmolt_channel_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_id_unpack(bcmolt_channel_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_id_pack(bcmolt_channel_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_id_unpack(bcmolt_channel_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_console_redirection_pack(bcmolt_console_redirection this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_console_redirection_unpack(bcmolt_console_redirection *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_control_state_pack(bcmolt_control_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_control_state_unpack(bcmolt_control_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_dba_mode_pack(bcmolt_dba_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_dba_mode_unpack(bcmolt_dba_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_dba_ram_pack(bcmolt_dba_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_dba_ram_unpack(bcmolt_dba_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_dba_type_pack(bcmolt_dba_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_dba_type_unpack(bcmolt_dba_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_status_pack(bcmolt_ddr_test_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_status_unpack(bcmolt_ddr_test_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_result_pack(bcmolt_ddr_test_result this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_result_unpack(bcmolt_ddr_test_result *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_host_connection_fail_reason_pack(bcmolt_host_connection_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_host_connection_fail_reason_unpack(bcmolt_host_connection_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_deactivation_reason_pack(bcmolt_deactivation_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_deactivation_reason_unpack(bcmolt_deactivation_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_id_pack(bcmolt_debug_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_id_unpack(bcmolt_debug_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_id_pack(bcmolt_debug_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_id_unpack(bcmolt_debug_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_id_pack(bcmolt_debug_cli_input_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_id_unpack(bcmolt_debug_cli_input_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_id_pack(bcmolt_debug_cli_output_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_id_unpack(bcmolt_debug_cli_output_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_file_almost_full_id_pack(bcmolt_debug_file_almost_full_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_file_almost_full_id_unpack(bcmolt_debug_file_almost_full_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_id_pack(bcmolt_debug_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_id_unpack(bcmolt_debug_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_reset_api_capture_id_pack(bcmolt_debug_reset_api_capture_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_reset_api_capture_id_unpack(bcmolt_debug_reset_api_capture_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_start_api_capture_id_pack(bcmolt_debug_start_api_capture_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_start_api_capture_id_unpack(bcmolt_debug_start_api_capture_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_stop_api_capture_id_pack(bcmolt_debug_stop_api_capture_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_stop_api_capture_id_unpack(bcmolt_debug_stop_api_capture_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_id_pack(bcmolt_device_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_id_unpack(bcmolt_device_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_id_pack(bcmolt_device_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_id_unpack(bcmolt_device_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_chip_revision_pack(bcmolt_device_chip_revision this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_chip_revision_unpack(bcmolt_device_chip_revision *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connect_id_pack(bcmolt_device_connect_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_connect_id_unpack(bcmolt_device_connect_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_id_pack(bcmolt_device_connection_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_id_unpack(bcmolt_device_connection_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_established_id_pack(bcmolt_device_connection_established_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_established_id_unpack(bcmolt_device_connection_established_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_id_pack(bcmolt_device_connection_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_id_unpack(bcmolt_device_connection_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_id_pack(bcmolt_device_ddr_test_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_id_unpack(bcmolt_device_ddr_test_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_id_pack(bcmolt_device_device_keep_alive_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_id_unpack(bcmolt_device_device_keep_alive_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_id_pack(bcmolt_device_device_ready_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_id_unpack(bcmolt_device_device_ready_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_disconnect_id_pack(bcmolt_device_disconnect_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_disconnect_id_unpack(bcmolt_device_disconnect_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_disconnection_complete_id_pack(bcmolt_device_disconnection_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_disconnection_complete_id_unpack(bcmolt_device_disconnection_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_id_pack(bcmolt_device_host_keep_alive_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_id_unpack(bcmolt_device_host_keep_alive_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_id_pack(bcmolt_device_image_transfer_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_id_unpack(bcmolt_device_image_transfer_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_id_pack(bcmolt_device_image_transfer_data_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_id_unpack(bcmolt_device_image_transfer_data_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_id_pack(bcmolt_device_image_transfer_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_id_unpack(bcmolt_device_image_transfer_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_type_pack(bcmolt_device_image_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_type_unpack(bcmolt_device_image_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_id_pack(bcmolt_device_indications_dropped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_id_unpack(bcmolt_device_indications_dropped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_id_pack(bcmolt_device_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_id_unpack(bcmolt_device_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_speed_pack(bcmolt_nni_speed this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_speed_unpack(bcmolt_nni_speed *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_id_pack(bcmolt_device_reset_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_id_unpack(bcmolt_device_reset_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_mode_pack(bcmolt_device_reset_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_mode_unpack(bcmolt_device_reset_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_id_pack(bcmolt_device_run_ddr_test_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_id_unpack(bcmolt_device_run_ddr_test_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_state_pack(bcmolt_device_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_state_unpack(bcmolt_device_state *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_id_pack(bcmolt_device_sw_error_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_id_unpack(bcmolt_device_sw_error_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_id_pack(bcmolt_device_sw_exception_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_id_unpack(bcmolt_device_sw_exception_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_upgrade_activate_id_pack(bcmolt_device_sw_upgrade_activate_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_upgrade_activate_id_unpack(bcmolt_device_sw_upgrade_activate_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_disable_serial_number_control_pack(bcmolt_disable_serial_number_control this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_disable_serial_number_control_unpack(bcmolt_disable_serial_number_control *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_drv_icf_id_pack(bcmolt_drv_icf_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_drv_icf_id_unpack(bcmolt_drv_icf_id *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_drv_sgb_id_pack(bcmolt_drv_sgb_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_drv_sgb_id_unpack(bcmolt_drv_sgb_id *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ds_vlan_action_pack(bcmolt_ds_vlan_action this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ds_vlan_action_unpack(bcmolt_ds_vlan_action *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_tfb_trap_behavior_pack(bcmolt_tfb_trap_behavior this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_tfb_trap_behavior_unpack(bcmolt_tfb_trap_behavior *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_tfb_mode_pack(bcmolt_tfb_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_tfb_mode_unpack(bcmolt_tfb_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_lim_sec_mode_up_pack(bcmolt_lim_sec_mode_up this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_lim_sec_mode_up_unpack(bcmolt_lim_sec_mode_up *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_lim_sec_mode_dn_pack(bcmolt_lim_sec_mode_dn this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_lim_sec_mode_dn_unpack(bcmolt_lim_sec_mode_dn *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xim_sec_mode_pack(bcmolt_xim_sec_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xim_sec_mode_unpack(bcmolt_xim_sec_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_hsc_ram_pack(bcmolt_hsc_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_hsc_ram_unpack(bcmolt_hsc_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_lim_ram_pack(bcmolt_lim_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_lim_ram_unpack(bcmolt_lim_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_lky_ram_pack(bcmolt_lky_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_lky_ram_unpack(bcmolt_lky_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mic_ram_pack(bcmolt_mic_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mic_ram_unpack(bcmolt_mic_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpcsrm_ram_pack(bcmolt_xpcsrm_ram this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xpcsrm_ram_unpack(bcmolt_xpcsrm_ram *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_transfer_status_pack(bcmolt_embedded_image_transfer_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_transfer_status_unpack(bcmolt_embedded_image_transfer_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_information_format_pack(bcmolt_epon_encryption_information_format this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_information_format_unpack(bcmolt_epon_encryption_information_format *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_energy_detect_source_pack(bcmolt_energy_detect_source this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_energy_detect_source_unpack(bcmolt_energy_detect_source *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_1g_turbo_mode_pack(bcmolt_epon_1g_turbo_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_1g_turbo_mode_unpack(bcmolt_epon_1g_turbo_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_mode_pack(bcmolt_epon_clock_transport_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_mode_unpack(bcmolt_epon_clock_transport_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_dba_reporting_mode_pack(bcmolt_epon_dba_reporting_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_dba_reporting_mode_unpack(bcmolt_epon_dba_reporting_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_rate_pack(bcmolt_epon_link_rate this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_rate_unpack(bcmolt_epon_link_rate *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_status_pack(bcmolt_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_status_unpack(bcmolt_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_id_pack(bcmolt_epon_denied_link_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_id_unpack(bcmolt_epon_denied_link_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_id_pack(bcmolt_epon_denied_link_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_id_unpack(bcmolt_epon_denied_link_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_id_pack(bcmolt_epon_denied_link_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_id_unpack(bcmolt_epon_denied_link_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_id_pack(bcmolt_epon_denied_link_laser_on_off_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_id_unpack(bcmolt_epon_denied_link_laser_on_off_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_id_pack(bcmolt_epon_denied_link_llid_pool_empty_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_id_unpack(bcmolt_epon_denied_link_llid_pool_empty_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_id_pack(bcmolt_epon_denied_link_max_link_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_id_unpack(bcmolt_epon_denied_link_max_link_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_id_pack(bcmolt_epon_denied_link_overhead_profile_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_id_unpack(bcmolt_epon_denied_link_overhead_profile_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_id_pack(bcmolt_epon_denied_link_range_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_id_unpack(bcmolt_epon_denied_link_range_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_id_pack(bcmolt_epon_denied_link_rogue_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_id_unpack(bcmolt_epon_denied_link_rogue_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_id_pack(bcmolt_epon_denied_link_system_resource_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_id_unpack(bcmolt_epon_denied_link_system_resource_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_id_pack(bcmolt_epon_denied_link_tdm_channels_exhausted_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_id_unpack(bcmolt_epon_denied_link_tdm_channels_exhausted_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_id_pack(bcmolt_epon_denied_link_unknown_link_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_id_unpack(bcmolt_epon_denied_link_unknown_link_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_id_pack(bcmolt_epon_denied_link_upstream_bandwidth_violation_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_id_unpack(bcmolt_epon_denied_link_upstream_bandwidth_violation_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_mode_pack(bcmolt_epon_encryption_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_mode_unpack(bcmolt_epon_encryption_mode *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_choice_pack(bcmolt_epon_key_choice this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_choice_unpack(bcmolt_epon_key_choice *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_direction_pack(bcmolt_epon_encryption_direction this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_direction_unpack(bcmolt_epon_encryption_direction *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_fec_en_state_pack(bcmolt_epon_fec_en_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_fec_en_state_unpack(bcmolt_epon_fec_en_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_type_pack(bcmolt_epon_oam_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_type_unpack(bcmolt_epon_oam_type *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_id_pack(bcmolt_epon_link_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_id_unpack(bcmolt_epon_link_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_id_pack(bcmolt_epon_link_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_id_unpack(bcmolt_epon_link_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_delete_link_id_pack(bcmolt_epon_link_delete_link_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_delete_link_id_unpack(bcmolt_epon_link_delete_link_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_id_pack(bcmolt_epon_link_duplicate_mpcp_registration_request_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_id_unpack(bcmolt_epon_link_duplicate_mpcp_registration_request_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_encryption_enabled_id_pack(bcmolt_epon_link_encryption_enabled_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_encryption_enabled_id_unpack(bcmolt_epon_link_encryption_enabled_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_state_pack(bcmolt_epon_link_fec_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_state_unpack(bcmolt_epon_link_fec_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_force_rediscovery_id_pack(bcmolt_epon_link_force_rediscovery_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_force_rediscovery_id_unpack(bcmolt_epon_link_force_rediscovery_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_id_pack(bcmolt_epon_link_frame_captured_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_id_unpack(bcmolt_epon_link_frame_captured_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_status_pack(bcmolt_epon_link_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_status_unpack(bcmolt_epon_link_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_discovery_info_pack(bcmolt_mpcp_discovery_info this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_discovery_info_unpack(bcmolt_mpcp_discovery_info *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_id_pack(bcmolt_epon_link_inject_frame_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_id_unpack(bcmolt_epon_link_inject_frame_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_id_pack(bcmolt_epon_link_key_exchange_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_id_unpack(bcmolt_epon_link_key_exchange_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_id_pack(bcmolt_epon_link_key_exchange_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_id_unpack(bcmolt_epon_link_key_exchange_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_started_id_pack(bcmolt_epon_link_key_exchange_started_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_started_id_unpack(bcmolt_epon_link_key_exchange_started_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_stop_id_pack(bcmolt_epon_link_key_exchange_stop_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_stop_id_unpack(bcmolt_epon_link_key_exchange_stop_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_stopped_id_pack(bcmolt_epon_link_key_exchange_stopped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_stopped_id_unpack(bcmolt_epon_link_key_exchange_stopped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_id_pack(bcmolt_epon_link_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_id_unpack(bcmolt_epon_link_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_deleted_id_pack(bcmolt_epon_link_link_deleted_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_deleted_id_unpack(bcmolt_epon_link_link_deleted_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_id_pack(bcmolt_epon_link_link_speed_mismatch_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_id_unpack(bcmolt_epon_link_link_speed_mismatch_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_deregistered_id_pack(bcmolt_epon_link_mpcp_deregistered_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_deregistered_id_unpack(bcmolt_epon_link_mpcp_deregistered_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_id_pack(bcmolt_epon_link_mpcp_discovered_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_id_unpack(bcmolt_epon_link_mpcp_discovered_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_reg_ack_timeout_id_pack(bcmolt_epon_link_mpcp_reg_ack_timeout_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_reg_ack_timeout_id_unpack(bcmolt_epon_link_mpcp_reg_ack_timeout_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_id_pack(bcmolt_epon_link_mpcp_report_timeout_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_id_unpack(bcmolt_epon_link_mpcp_report_timeout_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_id_pack(bcmolt_epon_link_oam_keepalive_timeout_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_id_unpack(bcmolt_epon_link_oam_keepalive_timeout_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_id_pack(bcmolt_epon_link_oam_keepalive_timer_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_id_unpack(bcmolt_epon_link_oam_keepalive_timer_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_started_id_pack(bcmolt_epon_link_oam_keepalive_timer_started_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_started_id_unpack(bcmolt_epon_link_oam_keepalive_timer_started_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stop_id_pack(bcmolt_epon_link_oam_keepalive_timer_stop_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stop_id_unpack(bcmolt_epon_link_oam_keepalive_timer_stop_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stopped_id_pack(bcmolt_epon_link_oam_keepalive_timer_stopped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stopped_id_unpack(bcmolt_epon_link_oam_keepalive_timer_stopped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_id_pack(bcmolt_epon_link_preprovisioned_link_created_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_id_unpack(bcmolt_epon_link_preprovisioned_link_created_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_id_pack(bcmolt_epon_link_protection_switch_occurred_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_id_unpack(bcmolt_epon_link_protection_switch_occurred_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_id_pack(bcmolt_epon_link_range_value_changed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_id_unpack(bcmolt_epon_link_range_value_changed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_rerange_failure_id_pack(bcmolt_epon_link_rerange_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_rerange_failure_id_unpack(bcmolt_epon_link_rerange_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_id_pack(bcmolt_epon_link_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_id_unpack(bcmolt_epon_link_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_id_pack(bcmolt_epon_link_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_id_unpack(bcmolt_epon_link_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_id_pack(bcmolt_epon_link_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_id_unpack(bcmolt_epon_link_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_id_pack(bcmolt_epon_link_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_id_unpack(bcmolt_epon_link_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_state_flags_pack(bcmolt_epon_link_state_flags this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_state_flags_unpack(bcmolt_epon_link_state_flags *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_done_id_pack(bcmolt_epon_link_static_registration_done_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_done_id_unpack(bcmolt_epon_link_static_registration_done_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_id_pack(bcmolt_epon_link_static_registration_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_id_unpack(bcmolt_epon_link_static_registration_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_type_pack(bcmolt_epon_link_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_type_unpack(bcmolt_epon_link_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_gate_mode_pack(bcmolt_mpcp_gate_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_gate_mode_unpack(bcmolt_mpcp_gate_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_registration_gate_flags_pack(bcmolt_mpcp_registration_gate_flags this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mpcp_registration_gate_flags_unpack(bcmolt_mpcp_registration_gate_flags *this, bcmolt_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_id_pack(bcmolt_epon_ni_add_link_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_id_unpack(bcmolt_epon_ni_add_link_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_id_pack(bcmolt_epon_ni_add_multicast_link_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_id_unpack(bcmolt_epon_ni_add_multicast_link_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_id_pack(bcmolt_epon_ni_add_protected_standby_link_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_id_unpack(bcmolt_epon_ni_add_protected_standby_link_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_id_pack(bcmolt_epon_ni_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_id_unpack(bcmolt_epon_ni_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_rogue_scan_10g_failure_id_pack(bcmolt_epon_ni_auto_rogue_scan_10g_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_rogue_scan_10g_failure_id_unpack(bcmolt_epon_ni_auto_rogue_scan_10g_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_rogue_scan_1g_failure_id_pack(bcmolt_epon_ni_auto_rogue_scan_1g_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_rogue_scan_1g_failure_id_unpack(bcmolt_epon_ni_auto_rogue_scan_1g_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_id_pack(bcmolt_epon_ni_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_id_unpack(bcmolt_epon_ni_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_en_state_pack(bcmolt_epon_ni_en_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_en_state_unpack(bcmolt_epon_ni_en_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_id_pack(bcmolt_epon_ni_issue_rssi_grant_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_id_unpack(bcmolt_epon_ni_issue_rssi_grant_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_id_pack(bcmolt_epon_ni_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_id_unpack(bcmolt_epon_ni_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_id_pack(bcmolt_epon_ni_llid_quarantined_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_id_unpack(bcmolt_epon_ni_llid_quarantined_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_id_pack(bcmolt_epon_ni_mpcp_timestamp_changed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_id_unpack(bcmolt_epon_ni_mpcp_timestamp_changed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_id_pack(bcmolt_epon_ni_no_reports_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_id_unpack(bcmolt_epon_ni_no_reports_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_id_pack(bcmolt_epon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_id_unpack(bcmolt_epon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_id_pack(bcmolt_epon_ni_protection_switching_apply_rerange_delta_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_id_unpack(bcmolt_epon_ni_protection_switching_apply_rerange_delta_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rerange_failure_id_pack(bcmolt_epon_ni_rerange_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rerange_failure_id_unpack(bcmolt_epon_ni_rerange_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_id_pack(bcmolt_epon_ni_rogue_llid_scan_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_id_unpack(bcmolt_epon_ni_rogue_llid_scan_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_id_pack(bcmolt_epon_ni_rogue_scan_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_id_unpack(bcmolt_epon_ni_rogue_scan_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_id_pack(bcmolt_epon_ni_rssi_measurement_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_id_unpack(bcmolt_epon_ni_rssi_measurement_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_id_pack(bcmolt_epon_ni_set_epon_ni_en_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_id_unpack(bcmolt_epon_ni_set_epon_ni_en_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_id_pack(bcmolt_epon_ni_start_onu_upgrade_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_id_unpack(bcmolt_epon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_id_pack(bcmolt_epon_ni_state_change_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_id_unpack(bcmolt_epon_ni_state_change_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extension_type_pack(bcmolt_epon_oam_extension_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_oam_extension_type_unpack(bcmolt_epon_oam_extension_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_id_pack(bcmolt_epon_onu_10g_us_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_id_unpack(bcmolt_epon_onu_10g_us_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_id_pack(bcmolt_epon_onu_10g_us_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_id_unpack(bcmolt_epon_onu_10g_us_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_id_pack(bcmolt_epon_onu_10g_us_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_id_unpack(bcmolt_epon_onu_10g_us_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_id_pack(bcmolt_epon_onu_10g_us_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_id_unpack(bcmolt_epon_onu_10g_us_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_id_pack(bcmolt_epon_onu_10g_us_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_id_unpack(bcmolt_epon_onu_10g_us_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_id_pack(bcmolt_epon_onu_10g_us_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_id_unpack(bcmolt_epon_onu_10g_us_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_id_pack(bcmolt_epon_onu_10g_us_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_id_unpack(bcmolt_epon_onu_10g_us_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_id_pack(bcmolt_epon_onu_1g_us_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_id_unpack(bcmolt_epon_onu_1g_us_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_id_pack(bcmolt_epon_onu_1g_us_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_id_unpack(bcmolt_epon_onu_1g_us_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_id_pack(bcmolt_epon_onu_1g_us_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_id_unpack(bcmolt_epon_onu_1g_us_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_id_pack(bcmolt_epon_onu_1g_us_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_id_unpack(bcmolt_epon_onu_1g_us_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_id_pack(bcmolt_epon_onu_1g_us_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_id_unpack(bcmolt_epon_onu_1g_us_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_id_pack(bcmolt_epon_onu_1g_us_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_id_unpack(bcmolt_epon_onu_1g_us_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_id_pack(bcmolt_epon_onu_1g_us_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_id_unpack(bcmolt_epon_onu_1g_us_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_onu_response_code_pack(bcmolt_epon_onu_upgrade_onu_response_code this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_onu_response_code_unpack(bcmolt_epon_onu_upgrade_onu_response_code *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_return_code_pack(bcmolt_epon_onu_upgrade_return_code this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_return_code_unpack(bcmolt_epon_onu_upgrade_return_code *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_id_pack(bcmolt_epon_path_10g_ds_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_id_unpack(bcmolt_epon_path_10g_ds_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_id_pack(bcmolt_epon_path_10g_ds_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_id_unpack(bcmolt_epon_path_10g_ds_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_id_pack(bcmolt_epon_path_10g_ds_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_id_unpack(bcmolt_epon_path_10g_ds_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_id_pack(bcmolt_epon_path_10g_ds_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_id_unpack(bcmolt_epon_path_10g_ds_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_id_pack(bcmolt_epon_path_10g_ds_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_id_unpack(bcmolt_epon_path_10g_ds_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_id_pack(bcmolt_epon_path_10g_ds_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_id_unpack(bcmolt_epon_path_10g_ds_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_id_pack(bcmolt_epon_path_10g_ds_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_id_unpack(bcmolt_epon_path_10g_ds_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_id_pack(bcmolt_epon_path_10g_us_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_id_unpack(bcmolt_epon_path_10g_us_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_id_pack(bcmolt_epon_path_10g_us_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_id_unpack(bcmolt_epon_path_10g_us_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_id_pack(bcmolt_epon_path_10g_us_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_id_unpack(bcmolt_epon_path_10g_us_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_id_pack(bcmolt_epon_path_10g_us_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_id_unpack(bcmolt_epon_path_10g_us_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_id_pack(bcmolt_epon_path_10g_us_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_id_unpack(bcmolt_epon_path_10g_us_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_id_pack(bcmolt_epon_path_10g_us_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_id_unpack(bcmolt_epon_path_10g_us_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_id_pack(bcmolt_epon_path_10g_us_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_id_unpack(bcmolt_epon_path_10g_us_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_id_pack(bcmolt_epon_path_1g_ds_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_id_unpack(bcmolt_epon_path_1g_ds_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_id_pack(bcmolt_epon_path_1g_ds_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_id_unpack(bcmolt_epon_path_1g_ds_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_id_pack(bcmolt_epon_path_1g_ds_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_id_unpack(bcmolt_epon_path_1g_ds_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_id_pack(bcmolt_epon_path_1g_ds_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_id_unpack(bcmolt_epon_path_1g_ds_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_id_pack(bcmolt_epon_path_1g_ds_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_id_unpack(bcmolt_epon_path_1g_ds_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_id_pack(bcmolt_epon_path_1g_ds_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_id_unpack(bcmolt_epon_path_1g_ds_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_id_pack(bcmolt_epon_path_1g_ds_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_id_unpack(bcmolt_epon_path_1g_ds_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_id_pack(bcmolt_epon_path_1g_us_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_id_unpack(bcmolt_epon_path_1g_us_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_id_pack(bcmolt_epon_path_1g_us_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_id_unpack(bcmolt_epon_path_1g_us_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_id_pack(bcmolt_epon_path_1g_us_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_id_unpack(bcmolt_epon_path_1g_us_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_id_pack(bcmolt_epon_path_1g_us_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_id_unpack(bcmolt_epon_path_1g_us_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_id_pack(bcmolt_epon_path_1g_us_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_id_unpack(bcmolt_epon_path_1g_us_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_id_pack(bcmolt_epon_path_1g_us_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_id_unpack(bcmolt_epon_path_1g_us_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_id_pack(bcmolt_epon_path_1g_us_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_id_unpack(bcmolt_epon_path_1g_us_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_state_pack(bcmolt_epon_protection_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_state_unpack(bcmolt_epon_protection_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_type_pack(bcmolt_epon_protection_switching_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_type_unpack(bcmolt_epon_protection_switching_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_protection_switching_detection_options_pack(bcmolt_protection_switching_detection_options this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_protection_switching_detection_options_unpack(bcmolt_protection_switching_detection_options *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_reranging_options_pack(bcmolt_epon_protection_switching_reranging_options this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_reranging_options_unpack(bcmolt_epon_protection_switching_reranging_options *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_pin_pack(bcmolt_gpio_pin this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_pin_unpack(bcmolt_gpio_pin *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_polarity_pack(bcmolt_gpio_polarity this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_polarity_unpack(bcmolt_gpio_polarity *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_id_pack(bcmolt_epon_rp_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_id_unpack(bcmolt_epon_rp_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_id_pack(bcmolt_epon_rp_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_id_unpack(bcmolt_epon_rp_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ext_irq_pack(bcmolt_ext_irq this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ext_irq_unpack(bcmolt_ext_irq *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_flush_mac_table_option_pack(bcmolt_flush_mac_table_option this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_flush_mac_table_option_unpack(bcmolt_flush_mac_table_option *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_frequency_adjustment_direction_pack(bcmolt_frequency_adjustment_direction this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_frequency_adjustment_direction_unpack(bcmolt_frequency_adjustment_direction *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_direction_pack(bcmolt_gem_port_direction this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_direction_unpack(bcmolt_gem_port_direction *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_type_pack(bcmolt_gem_port_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_type_unpack(bcmolt_gem_port_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_operation_pack(bcmolt_gem_port_operation this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_operation_unpack(bcmolt_gem_port_operation *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_id_pack(bcmolt_gpio_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_id_unpack(bcmolt_gpio_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_id_pack(bcmolt_gpio_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_id_unpack(bcmolt_gpio_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_pin_dir_pack(bcmolt_gpio_pin_dir this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_pin_dir_unpack(bcmolt_gpio_pin_dir *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_value_pack(bcmolt_gpio_value this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_value_unpack(bcmolt_gpio_value *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_id_pack(bcmolt_gpon_alloc_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_id_unpack(bcmolt_gpon_alloc_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_id_pack(bcmolt_gpon_alloc_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_id_unpack(bcmolt_gpon_alloc_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_id_pack(bcmolt_gpon_alloc_configuration_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_id_unpack(bcmolt_gpon_alloc_configuration_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_id_pack(bcmolt_gpon_alloc_get_alloc_stats_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_id_unpack(bcmolt_gpon_alloc_get_alloc_stats_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_id_pack(bcmolt_gpon_alloc_get_stats_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_id_unpack(bcmolt_gpon_alloc_get_stats_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_id_pack(bcmolt_gpon_alloc_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_id_unpack(bcmolt_gpon_alloc_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_id_pack(bcmolt_gpon_alloc_set_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_id_unpack(bcmolt_gpon_alloc_set_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_id_pack(bcmolt_gpon_alloc_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_id_unpack(bcmolt_gpon_alloc_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_id_pack(bcmolt_gpon_alloc_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_id_unpack(bcmolt_gpon_alloc_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_id_pack(bcmolt_gpon_alloc_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_id_unpack(bcmolt_gpon_alloc_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_id_pack(bcmolt_gpon_alloc_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_id_unpack(bcmolt_gpon_alloc_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_id_pack(bcmolt_gpon_gem_port_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_id_unpack(bcmolt_gpon_gem_port_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_id_pack(bcmolt_gpon_gem_port_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_id_unpack(bcmolt_gpon_gem_port_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_id_pack(bcmolt_gpon_gem_port_configuration_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_id_unpack(bcmolt_gpon_gem_port_configuration_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_id_pack(bcmolt_gpon_gem_port_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_id_unpack(bcmolt_gpon_gem_port_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_id_pack(bcmolt_gpon_gem_port_set_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_id_unpack(bcmolt_gpon_gem_port_set_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_id_pack(bcmolt_gpon_gem_port_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_id_unpack(bcmolt_gpon_gem_port_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_id_pack(bcmolt_gpon_gem_port_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_id_unpack(bcmolt_gpon_gem_port_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_id_pack(bcmolt_gpon_gem_port_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_id_unpack(bcmolt_gpon_gem_port_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_id_pack(bcmolt_gpon_gem_port_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_id_unpack(bcmolt_gpon_gem_port_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_state_pack(bcmolt_gpon_gem_port_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_state_unpack(bcmolt_gpon_gem_port_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_id_pack(bcmolt_gpon_iwf_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_id_unpack(bcmolt_gpon_iwf_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_id_pack(bcmolt_gpon_iwf_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_id_unpack(bcmolt_gpon_iwf_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_id_pack(bcmolt_gpon_iwf_ds_egress_flow_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_id_unpack(bcmolt_gpon_iwf_ds_egress_flow_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_id_pack(bcmolt_gpon_iwf_ds_egress_flow_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_id_unpack(bcmolt_gpon_iwf_ds_egress_flow_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_pack(bcmolt_gpon_iwf_ds_ingress_flow_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_unpack(bcmolt_gpon_iwf_ds_ingress_flow_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_id_pack(bcmolt_gpon_iwf_ds_ingress_flow_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_id_unpack(bcmolt_gpon_iwf_ds_ingress_flow_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_completed_id_pack(bcmolt_gpon_iwf_flush_mac_table_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_completed_id_unpack(bcmolt_gpon_iwf_flush_mac_table_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_id_pack(bcmolt_gpon_iwf_flush_mac_table_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_id_unpack(bcmolt_gpon_iwf_flush_mac_table_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_id_pack(bcmolt_gpon_iwf_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_id_unpack(bcmolt_gpon_iwf_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_id_pack(bcmolt_gpon_iwf_mac_table_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_id_unpack(bcmolt_gpon_iwf_mac_table_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_id_pack(bcmolt_gpon_iwf_mac_table_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_id_unpack(bcmolt_gpon_iwf_mac_table_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_id_pack(bcmolt_gpon_iwf_mac_table_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_id_unpack(bcmolt_gpon_iwf_mac_table_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_aged_id_pack(bcmolt_gpon_iwf_mac_table_mac_aged_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_aged_id_unpack(bcmolt_gpon_iwf_mac_table_mac_aged_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_id_pack(bcmolt_gpon_iwf_mac_table_mac_dropped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_id_unpack(bcmolt_gpon_iwf_mac_table_mac_dropped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_id_pack(bcmolt_gpon_iwf_mac_table_mac_move_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_id_unpack(bcmolt_gpon_iwf_mac_table_mac_move_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_id_pack(bcmolt_gpon_iwf_mac_table_new_mac_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_id_unpack(bcmolt_gpon_iwf_mac_table_new_mac_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_id_pack(bcmolt_gpon_iwf_scan_mac_table_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_id_unpack(bcmolt_gpon_iwf_scan_mac_table_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_id_pack(bcmolt_gpon_iwf_scan_mac_table_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_id_unpack(bcmolt_gpon_iwf_scan_mac_table_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_id_pack(bcmolt_gpon_iwf_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_id_unpack(bcmolt_gpon_iwf_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_id_pack(bcmolt_gpon_iwf_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_id_unpack(bcmolt_gpon_iwf_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_id_pack(bcmolt_gpon_iwf_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_id_unpack(bcmolt_gpon_iwf_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_id_pack(bcmolt_gpon_iwf_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_id_unpack(bcmolt_gpon_iwf_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_id_pack(bcmolt_gpon_iwf_us_flow_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_id_unpack(bcmolt_gpon_iwf_us_flow_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_id_pack(bcmolt_gpon_iwf_us_flow_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_id_unpack(bcmolt_gpon_iwf_us_flow_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_key_exchange_mode_pack(bcmolt_key_exchange_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_key_exchange_mode_unpack(bcmolt_key_exchange_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_activate_all_onus_completed_id_pack(bcmolt_gpon_ni_activate_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_activate_all_onus_completed_id_unpack(bcmolt_gpon_ni_activate_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_id_pack(bcmolt_gpon_ni_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_id_unpack(bcmolt_gpon_ni_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_id_pack(bcmolt_gpon_ni_broadcast_ploam_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_id_unpack(bcmolt_gpon_ni_broadcast_ploam_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_id_pack(bcmolt_gpon_ni_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_id_unpack(bcmolt_gpon_ni_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_id_pack(bcmolt_gpon_ni_cpu_packets_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_id_unpack(bcmolt_gpon_ni_cpu_packets_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_id_pack(bcmolt_gpon_ni_cpu_packets_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_id_unpack(bcmolt_gpon_ni_cpu_packets_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_deactivate_all_onus_completed_id_pack(bcmolt_gpon_ni_deactivate_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_deactivate_all_onus_completed_id_unpack(bcmolt_gpon_ni_deactivate_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_all_onus_completed_id_pack(bcmolt_gpon_ni_disable_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_all_onus_completed_id_unpack(bcmolt_gpon_ni_disable_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_id_pack(bcmolt_gpon_ni_disable_serial_number_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_id_unpack(bcmolt_gpon_ni_disable_serial_number_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_enable_all_onus_completed_id_pack(bcmolt_gpon_ni_enable_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_enable_all_onus_completed_id_unpack(bcmolt_gpon_ni_enable_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_id_pack(bcmolt_gpon_ni_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_id_unpack(bcmolt_gpon_ni_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_id_pack(bcmolt_gpon_ni_los_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_id_unpack(bcmolt_gpon_ni_los_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_id_pack(bcmolt_gpon_ni_onu_discovered_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_id_unpack(bcmolt_gpon_ni_onu_discovered_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_id_pack(bcmolt_gpon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_id_unpack(bcmolt_gpon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_id_pack(bcmolt_gpon_ni_protection_switching_onus_ranged_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_id_unpack(bcmolt_gpon_ni_protection_switching_onus_ranged_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_id_pack(bcmolt_gpon_ni_protection_switching_switchover_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_id_unpack(bcmolt_gpon_ni_protection_switching_switchover_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_id_pack(bcmolt_gpon_ni_protection_switching_traffic_resume_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_id_unpack(bcmolt_gpon_ni_protection_switching_traffic_resume_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id_pack(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id_unpack(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_reset_id_pack(bcmolt_gpon_ni_reset_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_reset_id_unpack(bcmolt_gpon_ni_reset_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_id_pack(bcmolt_gpon_ni_rogue_detection_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_id_unpack(bcmolt_gpon_ni_rogue_detection_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_id_pack(bcmolt_gpon_ni_rogue_detection_window_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_id_unpack(bcmolt_gpon_ni_rogue_detection_window_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id_pack(bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id_unpack(bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id_pack(bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id_unpack(bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_id_pack(bcmolt_gpon_ni_set_onu_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_id_unpack(bcmolt_gpon_ni_set_onu_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_id_pack(bcmolt_gpon_ni_set_pon_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_id_unpack(bcmolt_gpon_ni_set_pon_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_single_request_standby_pon_monitoring_id_pack(bcmolt_gpon_ni_single_request_standby_pon_monitoring_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_single_request_standby_pon_monitoring_id_unpack(bcmolt_gpon_ni_single_request_standby_pon_monitoring_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id_pack(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id_unpack(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_id_pack(bcmolt_gpon_ni_start_onu_upgrade_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_id_unpack(bcmolt_gpon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_id_pack(bcmolt_gpon_ni_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_id_unpack(bcmolt_gpon_ni_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_id_pack(bcmolt_gpon_ni_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_id_unpack(bcmolt_gpon_ni_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_id_pack(bcmolt_gpon_ni_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_id_unpack(bcmolt_gpon_ni_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_id_pack(bcmolt_gpon_ni_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_id_unpack(bcmolt_gpon_ni_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_id_pack(bcmolt_gpon_ni_state_change_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_id_unpack(bcmolt_gpon_ni_state_change_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_id_pack(bcmolt_gpon_ni_tod_request_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_id_unpack(bcmolt_gpon_ni_tod_request_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_id_pack(bcmolt_gpon_ni_tod_request_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_id_unpack(bcmolt_gpon_ni_tod_request_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_id_pack(bcmolt_gpon_onu_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_id_unpack(bcmolt_gpon_onu_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_id_pack(bcmolt_gpon_onu_ber_interval_configuration_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_id_unpack(bcmolt_gpon_onu_ber_interval_configuration_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_id_pack(bcmolt_gpon_onu_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_id_unpack(bcmolt_gpon_onu_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_id_pack(bcmolt_gpon_onu_change_power_level_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_id_unpack(bcmolt_gpon_onu_change_power_level_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_id_pack(bcmolt_gpon_onu_cpu_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_id_unpack(bcmolt_gpon_onu_cpu_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_id_pack(bcmolt_gpon_onu_cpu_packets_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_id_unpack(bcmolt_gpon_onu_cpu_packets_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_id_pack(bcmolt_gpon_onu_dfi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_id_unpack(bcmolt_gpon_onu_dfi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_id_pack(bcmolt_gpon_onu_dgi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_id_unpack(bcmolt_gpon_onu_dgi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_id_pack(bcmolt_gpon_onu_dowi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_id_unpack(bcmolt_gpon_onu_dowi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_id_pack(bcmolt_gpon_onu_err_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_id_unpack(bcmolt_gpon_onu_err_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_id_pack(bcmolt_gpon_onu_invalid_dbru_report_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_id_unpack(bcmolt_gpon_onu_invalid_dbru_report_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_id_pack(bcmolt_gpon_onu_key_exchange_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_id_unpack(bcmolt_gpon_onu_key_exchange_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_cycle_skipped_id_pack(bcmolt_gpon_onu_key_exchange_cycle_skipped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_cycle_skipped_id_unpack(bcmolt_gpon_onu_key_exchange_cycle_skipped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_id_pack(bcmolt_gpon_onu_key_exchange_decrypt_required_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_id_unpack(bcmolt_gpon_onu_key_exchange_decrypt_required_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_id_pack(bcmolt_gpon_onu_key_exchange_key_mismatch_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_id_unpack(bcmolt_gpon_onu_key_exchange_key_mismatch_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_request_timeout_id_pack(bcmolt_gpon_onu_key_exchange_key_request_timeout_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_request_timeout_id_unpack(bcmolt_gpon_onu_key_exchange_key_request_timeout_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_pack(bcmolt_gpon_onu_key_exchange_unconsecutive_index_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_unpack(bcmolt_gpon_onu_key_exchange_unconsecutive_index_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_id_pack(bcmolt_gpon_onu_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_id_unpack(bcmolt_gpon_onu_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_id_pack(bcmolt_gpon_onu_loai_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_id_unpack(bcmolt_gpon_onu_loai_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_id_pack(bcmolt_gpon_onu_loki_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_id_unpack(bcmolt_gpon_onu_loki_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_id_pack(bcmolt_gpon_onu_memi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_id_unpack(bcmolt_gpon_onu_memi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_id_pack(bcmolt_gpon_onu_omci_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_id_unpack(bcmolt_gpon_onu_omci_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_id_pack(bcmolt_gpon_onu_omci_port_id_configuration_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_id_unpack(bcmolt_gpon_onu_omci_port_id_configuration_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_id_pack(bcmolt_gpon_onu_onu_activation_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_id_unpack(bcmolt_gpon_onu_onu_activation_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_id_pack(bcmolt_gpon_onu_onu_activation_standby_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_id_unpack(bcmolt_gpon_onu_onu_activation_standby_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_id_pack(bcmolt_gpon_onu_onu_alarm_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_id_unpack(bcmolt_gpon_onu_onu_alarm_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_id_pack(bcmolt_gpon_onu_onu_deactivation_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_id_unpack(bcmolt_gpon_onu_onu_deactivation_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_id_pack(bcmolt_gpon_onu_onu_disable_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_id_unpack(bcmolt_gpon_onu_onu_disable_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_id_pack(bcmolt_gpon_onu_onu_enable_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_id_unpack(bcmolt_gpon_onu_onu_enable_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_optical_reflection_id_pack(bcmolt_gpon_onu_optical_reflection_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_optical_reflection_id_unpack(bcmolt_gpon_onu_optical_reflection_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_id_pack(bcmolt_gpon_onu_password_authentication_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_id_unpack(bcmolt_gpon_onu_password_authentication_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_id_pack(bcmolt_gpon_onu_pee_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_id_unpack(bcmolt_gpon_onu_pee_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_id_pack(bcmolt_gpon_onu_ploam_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_id_unpack(bcmolt_gpon_onu_ploam_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_id_pack(bcmolt_gpon_onu_possible_drift_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_id_unpack(bcmolt_gpon_onu_possible_drift_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_id_pack(bcmolt_gpon_onu_power_management_state_change_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_id_unpack(bcmolt_gpon_onu_power_management_state_change_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_id_pack(bcmolt_gpon_onu_pst_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_id_unpack(bcmolt_gpon_onu_pst_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_id_pack(bcmolt_gpon_onu_ranging_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_id_unpack(bcmolt_gpon_onu_ranging_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_id_pack(bcmolt_gpon_onu_rei_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_id_unpack(bcmolt_gpon_onu_rei_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_id_pack(bcmolt_gpon_onu_rssi_measurement_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_id_unpack(bcmolt_gpon_onu_rssi_measurement_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_id_pack(bcmolt_gpon_onu_rssi_measurement_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_id_unpack(bcmolt_gpon_onu_rssi_measurement_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_id_pack(bcmolt_gpon_onu_sdi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_id_unpack(bcmolt_gpon_onu_sdi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_id_pack(bcmolt_gpon_onu_set_onu_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_id_unpack(bcmolt_gpon_onu_set_onu_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_id_pack(bcmolt_gpon_onu_sfi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_id_unpack(bcmolt_gpon_onu_sfi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_id_pack(bcmolt_gpon_onu_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_id_unpack(bcmolt_gpon_onu_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_id_pack(bcmolt_gpon_onu_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_id_unpack(bcmolt_gpon_onu_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_id_pack(bcmolt_gpon_onu_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_id_unpack(bcmolt_gpon_onu_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_id_pack(bcmolt_gpon_onu_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_id_unpack(bcmolt_gpon_onu_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_id_pack(bcmolt_gpon_onu_sufi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_id_unpack(bcmolt_gpon_onu_sufi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_id_pack(bcmolt_gpon_onu_tiwi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_id_unpack(bcmolt_gpon_onu_tiwi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_omci_device_id_pack(bcmolt_omci_device_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_omci_device_id_unpack(bcmolt_omci_device_id *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_return_code_pack(bcmolt_gpon_onu_upgrade_return_code this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_return_code_unpack(bcmolt_gpon_onu_upgrade_return_code *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_omci_result_code_pack(bcmolt_omci_result_code this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_omci_result_code_unpack(bcmolt_omci_result_code *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_state_pack(bcmolt_onu_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_state_unpack(bcmolt_onu_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rssi_location_sign_pack(bcmolt_rssi_location_sign this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rssi_location_sign_unpack(bcmolt_rssi_location_sign *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_post_discovery_mode_pack(bcmolt_onu_post_discovery_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_post_discovery_mode_unpack(bcmolt_onu_post_discovery_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_id_pack(bcmolt_gpon_trx_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_id_unpack(bcmolt_gpon_trx_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_id_pack(bcmolt_gpon_trx_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_id_unpack(bcmolt_gpon_trx_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_image_transfer_status_pack(bcmolt_image_transfer_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_image_transfer_status_unpack(bcmolt_image_transfer_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_iwf_mode_pack(bcmolt_iwf_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_iwf_mode_unpack(bcmolt_iwf_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_id_pack(bcmolt_log_entry_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_id_unpack(bcmolt_log_entry_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_id_pack(bcmolt_log_entry_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_id_unpack(bcmolt_log_entry_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_id_pack(bcmolt_log_entry_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_id_unpack(bcmolt_log_entry_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_id_pack(bcmolt_log_entry_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_id_unpack(bcmolt_log_entry_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_id_pack(bcmolt_log_entry_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_id_unpack(bcmolt_log_entry_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_id_pack(bcmolt_log_entry_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_id_unpack(bcmolt_log_entry_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_id_pack(bcmolt_log_entry_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_id_unpack(bcmolt_log_entry_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_file_id_pack(bcmolt_log_file_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_file_id_unpack(bcmolt_log_file_id *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_level_pack(bcmolt_log_level this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_level_unpack(bcmolt_log_level *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_style_pack(bcmolt_log_style this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_style_unpack(bcmolt_log_style *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_type_pack(bcmolt_log_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_log_type_unpack(bcmolt_log_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_id_pack(bcmolt_logger_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_id_unpack(bcmolt_logger_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_id_pack(bcmolt_logger_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_id_unpack(bcmolt_logger_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_clear_log_id_pack(bcmolt_logger_clear_log_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_clear_log_id_unpack(bcmolt_logger_clear_log_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_id_pack(bcmolt_logger_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_id_unpack(bcmolt_logger_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_id_pack(bcmolt_logger_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_id_unpack(bcmolt_logger_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_id_pack(bcmolt_logger_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_id_unpack(bcmolt_logger_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_id_pack(bcmolt_logger_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_id_unpack(bcmolt_logger_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_id_pack(bcmolt_logger_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_id_unpack(bcmolt_logger_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_miss_fallback_pack(bcmolt_mac_table_miss_fallback this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_miss_fallback_unpack(bcmolt_mac_table_miss_fallback *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_learning_mode_pack(bcmolt_mac_table_learning_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_learning_mode_unpack(bcmolt_mac_table_learning_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mapping_tag_method_pack(bcmolt_mapping_tag_method this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_mapping_tag_method_unpack(bcmolt_mapping_tag_method *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_id_pack(bcmolt_nni_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_id_unpack(bcmolt_nni_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_id_pack(bcmolt_nni_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_id_unpack(bcmolt_nni_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_connection_pack(bcmolt_nni_connection this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_connection_unpack(bcmolt_nni_connection *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_id_pack(bcmolt_nni_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_id_unpack(bcmolt_nni_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trivalent_pack(bcmolt_trivalent this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trivalent_unpack(bcmolt_trivalent *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_id_pack(bcmolt_nni_serdes_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_id_unpack(bcmolt_nni_serdes_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_id_pack(bcmolt_nni_serdes_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_id_unpack(bcmolt_nni_serdes_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_id_pack(bcmolt_nni_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_id_unpack(bcmolt_nni_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_id_pack(bcmolt_nni_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_id_unpack(bcmolt_nni_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_id_pack(bcmolt_nni_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_id_unpack(bcmolt_nni_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_id_pack(bcmolt_nni_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_id_unpack(bcmolt_nni_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_id_pack(bcmolt_nni_status_changed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_id_unpack(bcmolt_nni_status_changed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_odn_class_pack(bcmolt_odn_class this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_odn_class_unpack(bcmolt_odn_class *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_omci_port_id_operation_pack(bcmolt_omci_port_id_operation this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_omci_port_id_operation_unpack(bcmolt_omci_port_id_operation *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_operation_pack(bcmolt_onu_operation this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_operation_unpack(bcmolt_onu_operation *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_level_pack(bcmolt_onu_power_level this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_level_unpack(bcmolt_onu_power_level *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_tc_protocol_pack(bcmolt_tc_protocol this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_tc_protocol_unpack(bcmolt_tc_protocol *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_packet_injection_error_pack(bcmolt_packet_injection_error this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_packet_injection_error_unpack(bcmolt_packet_injection_error *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_packet_type_pack(bcmolt_packet_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_packet_type_unpack(bcmolt_packet_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_password_authentication_fail_reason_pack(bcmolt_password_authentication_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_password_authentication_fail_reason_unpack(bcmolt_password_authentication_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_polarity_pack(bcmolt_polarity this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_polarity_unpack(bcmolt_polarity *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_polling_interval_pack(bcmolt_polling_interval this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_s32(buf, (int32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_polling_interval_unpack(bcmolt_polling_interval *this, bcmolt_buf *buf)
{
    int32_t num_val;
    if (!bcmolt_buf_read_s32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_operation_pack(bcmolt_pon_operation this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_operation_unpack(bcmolt_pon_operation *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_options_pack(bcmolt_pon_protection_switching_options this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u32(buf, (uint32_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_options_unpack(bcmolt_pon_protection_switching_options *this, bcmolt_buf *buf)
{
    uint32_t num_val;
    if (!bcmolt_buf_read_u32(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_state_pack(bcmolt_pon_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_state_unpack(bcmolt_pon_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_power_levelling_control_pack(bcmolt_power_levelling_control this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_power_levelling_control_unpack(bcmolt_power_levelling_control *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_power_management_transition_reason_pack(bcmolt_power_management_transition_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_power_management_transition_reason_unpack(bcmolt_power_management_transition_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_polynomial_pack(bcmolt_prbs_polynomial this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_polynomial_unpack(bcmolt_prbs_polynomial *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_mode_pack(bcmolt_prbs_checker_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_mode_unpack(bcmolt_prbs_checker_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_lock_state_pack(bcmolt_prbs_lock_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_lock_state_unpack(bcmolt_prbs_lock_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_raman_mitigation_mode_pack(bcmolt_raman_mitigation_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_raman_mitigation_mode_unpack(bcmolt_raman_mitigation_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_fail_reason_pack(bcmolt_ranging_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_fail_reason_unpack(bcmolt_ranging_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_registration_behavior_pack(bcmolt_registration_behavior this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_registration_behavior_unpack(bcmolt_registration_behavior *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_fail_reason_pack(bcmolt_request_registration_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_fail_reason_unpack(bcmolt_request_registration_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_result_pack(bcmolt_result this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_result_unpack(bcmolt_result *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_type_pack(bcmolt_rogue_detection_algorithm_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_type_unpack(bcmolt_rogue_detection_algorithm_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_window_pack(bcmolt_rogue_detection_window this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_window_unpack(bcmolt_rogue_detection_window *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_measurement_result_pack(bcmolt_rogue_measurement_result this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_measurement_result_unpack(bcmolt_rogue_measurement_result *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_scan_status_pack(bcmolt_rogue_scan_status this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_scan_status_unpack(bcmolt_rogue_scan_status *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rssi_measurement_fail_reason_pack(bcmolt_rssi_measurement_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_rssi_measurement_fail_reason_unpack(bcmolt_rssi_measurement_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_secure_mutual_authentication_fail_reason_pack(bcmolt_secure_mutual_authentication_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_secure_mutual_authentication_fail_reason_unpack(bcmolt_secure_mutual_authentication_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_ranging_mode_pack(bcmolt_serdes_ranging_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_ranging_mode_unpack(bcmolt_serdes_ranging_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_instance_pack(bcmolt_serdes_instance this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_instance_unpack(bcmolt_serdes_instance *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_shaper_mode_pack(bcmolt_shaper_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_shaper_mode_unpack(bcmolt_shaper_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_id_pack(bcmolt_software_error_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_id_unpack(bcmolt_software_error_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_id_pack(bcmolt_software_error_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_id_unpack(bcmolt_software_error_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_condition_type_pack(bcmolt_stat_condition_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_stat_condition_type_unpack(bcmolt_stat_condition_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_switch_over_type_c_onu_state_pack(bcmolt_switch_over_type_c_onu_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_switch_over_type_c_onu_state_unpack(bcmolt_switch_over_type_c_onu_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_system_mode_pack(bcmolt_system_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_system_mode_unpack(bcmolt_system_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_us_operating_wavelength_bands_pack(bcmolt_us_operating_wavelength_bands this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_us_operating_wavelength_bands_unpack(bcmolt_us_operating_wavelength_bands *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_traffic_resume_result_pack(bcmolt_traffic_resume_result this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_traffic_resume_result_unpack(bcmolt_traffic_resume_result *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_id_pack(bcmolt_trx_calibration_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_id_unpack(bcmolt_trx_calibration_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_id_pack(bcmolt_trx_calibration_capture_window_and_statistic_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_id_unpack(bcmolt_trx_calibration_capture_window_and_statistic_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_id_pack(bcmolt_trx_calibration_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_id_unpack(bcmolt_trx_calibration_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_id_pack(bcmolt_trx_calibration_start_capture_window_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_id_unpack(bcmolt_trx_calibration_start_capture_window_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_id_pack(bcmolt_trx_calibration_stop_capture_window_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_id_unpack(bcmolt_trx_calibration_stop_capture_window_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_trigger_pack(bcmolt_trx_calibration_trigger this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_trigger_unpack(bcmolt_trx_calibration_trigger *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_trigger_position_pack(bcmolt_trx_calibration_trigger_position this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_trigger_position_unpack(bcmolt_trx_calibration_trigger_position *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_window_mode_pack(bcmolt_trx_calibration_window_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_window_mode_unpack(bcmolt_trx_calibration_window_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_type_pack(bcmolt_trx_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_type_unpack(bcmolt_trx_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_tune_in_fail_reason_pack(bcmolt_tune_in_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_tune_in_fail_reason_unpack(bcmolt_tune_in_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_tune_out_fail_reason_pack(bcmolt_tune_out_fail_reason this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_tune_out_fail_reason_unpack(bcmolt_tune_out_fail_reason *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_uart_baudrate_pack(bcmolt_uart_baudrate this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_uart_baudrate_unpack(bcmolt_uart_baudrate *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_us_gem_port_destination_pack(bcmolt_us_gem_port_destination this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_us_gem_port_destination_unpack(bcmolt_us_gem_port_destination *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_us_vlan_action_pack(bcmolt_us_vlan_action this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_us_vlan_action_unpack(bcmolt_us_vlan_action *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_to_flow_mapping_method_pack(bcmolt_vlan_to_flow_mapping_method this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_to_flow_mapping_method_unpack(bcmolt_vlan_to_flow_mapping_method *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_id_pack(bcmolt_xgpon_alloc_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_id_unpack(bcmolt_xgpon_alloc_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_id_pack(bcmolt_xgpon_alloc_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_id_unpack(bcmolt_xgpon_alloc_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_id_pack(bcmolt_xgpon_alloc_configuration_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_id_unpack(bcmolt_xgpon_alloc_configuration_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_id_pack(bcmolt_xgpon_alloc_get_alloc_stats_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_id_unpack(bcmolt_xgpon_alloc_get_alloc_stats_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_id_pack(bcmolt_xgpon_alloc_get_stats_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_id_unpack(bcmolt_xgpon_alloc_get_stats_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_id_pack(bcmolt_xgpon_alloc_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_id_unpack(bcmolt_xgpon_alloc_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_id_pack(bcmolt_xgpon_alloc_set_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_id_unpack(bcmolt_xgpon_alloc_set_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_id_pack(bcmolt_xgpon_alloc_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_id_unpack(bcmolt_xgpon_alloc_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_id_pack(bcmolt_xgpon_alloc_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_id_unpack(bcmolt_xgpon_alloc_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_id_pack(bcmolt_xgpon_alloc_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_id_unpack(bcmolt_xgpon_alloc_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_id_pack(bcmolt_xgpon_alloc_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_id_unpack(bcmolt_xgpon_alloc_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_id_pack(bcmolt_xgpon_gem_port_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_id_unpack(bcmolt_xgpon_gem_port_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_id_pack(bcmolt_xgpon_gem_port_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_id_unpack(bcmolt_xgpon_gem_port_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_id_pack(bcmolt_xgpon_gem_port_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_id_unpack(bcmolt_xgpon_gem_port_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_id_pack(bcmolt_xgpon_gem_port_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_id_unpack(bcmolt_xgpon_gem_port_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_id_pack(bcmolt_xgpon_gem_port_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_id_unpack(bcmolt_xgpon_gem_port_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_id_pack(bcmolt_xgpon_gem_port_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_id_unpack(bcmolt_xgpon_gem_port_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_id_pack(bcmolt_xgpon_gem_port_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_id_unpack(bcmolt_xgpon_gem_port_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_state_pack(bcmolt_xgpon_gem_port_state this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_state_unpack(bcmolt_xgpon_gem_port_state *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_id_pack(bcmolt_xgpon_iwf_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_id_unpack(bcmolt_xgpon_iwf_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_id_pack(bcmolt_xgpon_iwf_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_id_unpack(bcmolt_xgpon_iwf_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_activate_all_onus_completed_id_pack(bcmolt_xgpon_ni_activate_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_activate_all_onus_completed_id_unpack(bcmolt_xgpon_ni_activate_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_id_pack(bcmolt_xgpon_ni_adjust_tx_wavelength_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_id_unpack(bcmolt_xgpon_ni_adjust_tx_wavelength_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_id_pack(bcmolt_xgpon_ni_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_id_unpack(bcmolt_xgpon_ni_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_id_pack(bcmolt_xgpon_ni_broadcast_ploam_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_id_unpack(bcmolt_xgpon_ni_broadcast_ploam_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_id_pack(bcmolt_xgpon_ni_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_id_unpack(bcmolt_xgpon_ni_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_id_pack(bcmolt_xgpon_ni_cpu_packets_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_id_unpack(bcmolt_xgpon_ni_cpu_packets_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_id_pack(bcmolt_xgpon_ni_cpu_packets_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_id_unpack(bcmolt_xgpon_ni_cpu_packets_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_deactivate_all_onus_completed_id_pack(bcmolt_xgpon_ni_deactivate_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_deactivate_all_onus_completed_id_unpack(bcmolt_xgpon_ni_deactivate_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_all_onus_completed_id_pack(bcmolt_xgpon_ni_disable_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_all_onus_completed_id_unpack(bcmolt_xgpon_ni_disable_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_id_pack(bcmolt_xgpon_ni_disable_serial_number_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_id_unpack(bcmolt_xgpon_ni_disable_serial_number_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_enable_all_onus_completed_id_pack(bcmolt_xgpon_ni_enable_all_onus_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_enable_all_onus_completed_id_unpack(bcmolt_xgpon_ni_enable_all_onus_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_id_pack(bcmolt_xgpon_ni_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_id_unpack(bcmolt_xgpon_ni_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_id_pack(bcmolt_xgpon_ni_los_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_id_unpack(bcmolt_xgpon_ni_los_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_id_pack(bcmolt_xgpon_ni_onu_discovered_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_id_unpack(bcmolt_xgpon_ni_onu_discovered_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_id_pack(bcmolt_xgpon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_id_unpack(bcmolt_xgpon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_id_pack(bcmolt_xgpon_ni_protection_switching_onus_ranged_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_id_unpack(bcmolt_xgpon_ni_protection_switching_onus_ranged_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_id_pack(bcmolt_xgpon_ni_protection_switching_switchover_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_id_unpack(bcmolt_xgpon_ni_protection_switching_switchover_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_id_pack(bcmolt_xgpon_ni_protection_switching_traffic_resume_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_id_unpack(bcmolt_xgpon_ni_protection_switching_traffic_resume_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_reset_id_pack(bcmolt_xgpon_ni_reset_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_reset_id_unpack(bcmolt_xgpon_ni_reset_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_id_pack(bcmolt_xgpon_ni_rogue_detection_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_id_unpack(bcmolt_xgpon_ni_rogue_detection_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_id_pack(bcmolt_xgpon_ni_rogue_detection_window_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_id_unpack(bcmolt_xgpon_ni_rogue_detection_window_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id_pack(bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id_unpack(bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_id_pack(bcmolt_xgpon_ni_run_special_bw_map_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_id_unpack(bcmolt_xgpon_ni_run_special_bw_map_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id_pack(bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id_unpack(bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_id_pack(bcmolt_xgpon_ni_set_onu_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_id_unpack(bcmolt_xgpon_ni_set_onu_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_id_pack(bcmolt_xgpon_ni_set_pon_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_id_unpack(bcmolt_xgpon_ni_set_pon_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id_pack(bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id_unpack(bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id_pack(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id_unpack(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_id_pack(bcmolt_xgpon_ni_start_onu_upgrade_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_id_unpack(bcmolt_xgpon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_id_pack(bcmolt_xgpon_ni_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_id_unpack(bcmolt_xgpon_ni_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_id_pack(bcmolt_xgpon_ni_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_id_unpack(bcmolt_xgpon_ni_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_id_pack(bcmolt_xgpon_ni_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_id_unpack(bcmolt_xgpon_ni_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_id_pack(bcmolt_xgpon_ni_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_id_unpack(bcmolt_xgpon_ni_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_id_pack(bcmolt_xgpon_ni_state_change_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_id_unpack(bcmolt_xgpon_ni_state_change_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_id_pack(bcmolt_xgpon_ni_tod_request_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_id_unpack(bcmolt_xgpon_ni_tod_request_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_id_pack(bcmolt_xgpon_ni_tod_request_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_id_unpack(bcmolt_xgpon_ni_tod_request_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_num_of_onus_pack(bcmolt_xgpon_num_of_onus this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_num_of_onus_unpack(bcmolt_xgpon_num_of_onus *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_id_pack(bcmolt_xgpon_onu_adjust_tx_wavelength_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_id_unpack(bcmolt_xgpon_onu_adjust_tx_wavelength_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_id_pack(bcmolt_xgpon_onu_auto_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_id_unpack(bcmolt_xgpon_onu_auto_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_id_pack(bcmolt_xgpon_onu_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_id_unpack(bcmolt_xgpon_onu_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_id_pack(bcmolt_xgpon_onu_change_power_levelling_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_id_unpack(bcmolt_xgpon_onu_change_power_levelling_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_id_pack(bcmolt_xgpon_onu_cpu_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_id_unpack(bcmolt_xgpon_onu_cpu_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_id_pack(bcmolt_xgpon_onu_cpu_packets_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_id_unpack(bcmolt_xgpon_onu_cpu_packets_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_id_pack(bcmolt_xgpon_onu_dfi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_id_unpack(bcmolt_xgpon_onu_dfi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_id_pack(bcmolt_xgpon_onu_dgi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_id_unpack(bcmolt_xgpon_onu_dgi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_id_pack(bcmolt_xgpon_onu_dowi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_id_unpack(bcmolt_xgpon_onu_dowi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_get_power_consumption_id_pack(bcmolt_xgpon_onu_get_power_consumption_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_get_power_consumption_id_unpack(bcmolt_xgpon_onu_get_power_consumption_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_get_power_level_id_pack(bcmolt_xgpon_onu_get_power_level_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_get_power_level_id_unpack(bcmolt_xgpon_onu_get_power_level_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_id_pack(bcmolt_xgpon_onu_invalid_dbru_report_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_id_unpack(bcmolt_xgpon_onu_invalid_dbru_report_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_id_pack(bcmolt_xgpon_onu_key_exchange_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_id_unpack(bcmolt_xgpon_onu_key_exchange_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_cycle_skipped_id_pack(bcmolt_xgpon_onu_key_exchange_cycle_skipped_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_cycle_skipped_id_unpack(bcmolt_xgpon_onu_key_exchange_cycle_skipped_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_id_pack(bcmolt_xgpon_onu_key_exchange_key_mismatch_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_id_unpack(bcmolt_xgpon_onu_key_exchange_key_mismatch_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_request_timeout_id_pack(bcmolt_xgpon_onu_key_exchange_key_request_timeout_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_request_timeout_id_unpack(bcmolt_xgpon_onu_key_exchange_key_request_timeout_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_id_pack(bcmolt_xgpon_onu_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_id_unpack(bcmolt_xgpon_onu_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_id_pack(bcmolt_xgpon_onu_looci_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_id_unpack(bcmolt_xgpon_onu_looci_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_id_pack(bcmolt_xgpon_onu_omci_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_id_unpack(bcmolt_xgpon_onu_omci_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_id_pack(bcmolt_xgpon_onu_onu_activation_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_id_unpack(bcmolt_xgpon_onu_onu_activation_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_id_pack(bcmolt_xgpon_onu_onu_alarm_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_id_unpack(bcmolt_xgpon_onu_onu_alarm_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_id_pack(bcmolt_xgpon_onu_onu_deactivation_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_id_unpack(bcmolt_xgpon_onu_onu_deactivation_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_id_pack(bcmolt_xgpon_onu_onu_disable_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_id_unpack(bcmolt_xgpon_onu_onu_disable_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_id_pack(bcmolt_xgpon_onu_onu_enable_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_id_unpack(bcmolt_xgpon_onu_onu_enable_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_id_pack(bcmolt_xgpon_onu_onu_tuning_in_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_id_unpack(bcmolt_xgpon_onu_onu_tuning_in_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_id_pack(bcmolt_xgpon_onu_onu_tuning_in_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_id_unpack(bcmolt_xgpon_onu_onu_tuning_in_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_id_pack(bcmolt_xgpon_onu_onu_tuning_out_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_id_unpack(bcmolt_xgpon_onu_onu_tuning_out_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_id_pack(bcmolt_xgpon_onu_onu_tuning_out_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_id_unpack(bcmolt_xgpon_onu_onu_tuning_out_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_optical_reflection_id_pack(bcmolt_xgpon_onu_optical_reflection_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_optical_reflection_id_unpack(bcmolt_xgpon_onu_optical_reflection_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_id_pack(bcmolt_xgpon_onu_ploam_packet_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_id_unpack(bcmolt_xgpon_onu_ploam_packet_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_id_pack(bcmolt_xgpon_onu_possible_drift_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_id_unpack(bcmolt_xgpon_onu_possible_drift_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_id_pack(bcmolt_xgpon_onu_power_consumption_report_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_id_unpack(bcmolt_xgpon_onu_power_consumption_report_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_id_pack(bcmolt_xgpon_onu_power_level_report_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_id_unpack(bcmolt_xgpon_onu_power_level_report_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_id_pack(bcmolt_xgpon_onu_power_management_state_change_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_id_unpack(bcmolt_xgpon_onu_power_management_state_change_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_id_pack(bcmolt_xgpon_onu_pqsi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_id_unpack(bcmolt_xgpon_onu_pqsi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_id_pack(bcmolt_xgpon_onu_ranging_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_id_unpack(bcmolt_xgpon_onu_ranging_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_id_pack(bcmolt_xgpon_onu_registration_id_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_id_unpack(bcmolt_xgpon_onu_registration_id_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_id_pack(bcmolt_xgpon_onu_request_registration_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_id_unpack(bcmolt_xgpon_onu_request_registration_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_id_pack(bcmolt_xgpon_onu_rssi_measurement_completed_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_id_unpack(bcmolt_xgpon_onu_rssi_measurement_completed_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_id_pack(bcmolt_xgpon_onu_rssi_measurement_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_id_unpack(bcmolt_xgpon_onu_rssi_measurement_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_id_pack(bcmolt_xgpon_onu_sdi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_id_unpack(bcmolt_xgpon_onu_sdi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_pack(bcmolt_xgpon_onu_secure_mutual_authentication_failure_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_failure_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_id_pack(bcmolt_xgpon_onu_secure_mutual_authentication_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_id_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_id_pack(bcmolt_xgpon_onu_set_onu_state_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_id_unpack(bcmolt_xgpon_onu_set_onu_state_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_id_pack(bcmolt_xgpon_onu_sfi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_id_unpack(bcmolt_xgpon_onu_sfi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_id_pack(bcmolt_xgpon_onu_stat_alarm_cleared_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_id_unpack(bcmolt_xgpon_onu_stat_alarm_cleared_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_id_pack(bcmolt_xgpon_onu_stat_alarm_raised_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_id_unpack(bcmolt_xgpon_onu_stat_alarm_raised_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_id_pack(bcmolt_xgpon_onu_stat_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_id_unpack(bcmolt_xgpon_onu_stat_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_id_pack(bcmolt_xgpon_onu_stat_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_id_unpack(bcmolt_xgpon_onu_stat_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_id_pack(bcmolt_xgpon_onu_sufi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_id_unpack(bcmolt_xgpon_onu_sufi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_id_pack(bcmolt_xgpon_onu_tiwi_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_id_unpack(bcmolt_xgpon_onu_tiwi_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_id_pack(bcmolt_xgpon_onu_tuning_response_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_id_unpack(bcmolt_xgpon_onu_tuning_response_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_ranging_mode_pack(bcmolt_xgpon_serdes_ranging_mode this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_ranging_mode_unpack(bcmolt_xgpon_serdes_ranging_mode *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_id_pack(bcmolt_xgpon_trx_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_id_unpack(bcmolt_xgpon_trx_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_id_pack(bcmolt_xgpon_trx_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_id_unpack(bcmolt_xgpon_trx_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_type_pack(bcmolt_xgpon_trx_type this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u8(buf, (uint8_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_type_unpack(bcmolt_xgpon_trx_type *this, bcmolt_buf *buf)
{
    uint8_t num_val;
    if (!bcmolt_buf_read_u8(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_id_pack(bcmolt_xpon_serdes_cfg_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_id_unpack(bcmolt_xpon_serdes_cfg_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_id_pack(bcmolt_xpon_serdes_key_id this, bcmolt_buf *buf)
{
    return bcmolt_buf_write_u16(buf, (uint16_t) this);
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_id_unpack(bcmolt_xpon_serdes_key_id *this, bcmolt_buf *buf)
{
    uint16_t num_val;
    if (!bcmolt_buf_read_u16(buf, &num_val))
    {
        return BCMOS_FALSE;
    }

    *this = num_val;
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_actual_schedulershaper_set_default(bcmolt_actual_schedulershaper *this)
{
    this->actual_mbs_tq = (bcmolt_time_quanta) 0;
    this->actual_weight_tq = (bcmolt_time_quanta) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_actual_schedulershaper_pack(const bcmolt_actual_schedulershaper *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->actual_mbs_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->actual_weight_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_actual_schedulershaper_unpack(bcmolt_actual_schedulershaper *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->actual_mbs_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->actual_weight_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_actual_schedulershaper_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_actual_schedulershaper_bounds_check(const bcmolt_actual_schedulershaper *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_aes_key_set_default(bcmolt_aes_key *this)
{
    memset(this->bytes, 0, sizeof(this->bytes));
}

/******************************************************************************/
bcmos_bool bcmolt_aes_key_pack(const bcmolt_aes_key *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->bytes, 16))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_aes_key_unpack(bcmolt_aes_key *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->bytes, 16))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_aes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 16);
}

/******************************************************************************/
bcmos_bool bcmolt_aes_key_bounds_check(const bcmolt_aes_key *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_api_capture_buffer_reader_set_default(bcmolt_api_capture_buffer_reader *this)
{
    this->offset = 0;
    this->size = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_reader_pack(const bcmolt_api_capture_buffer_reader *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_reader_unpack(bcmolt_api_capture_buffer_reader *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_reader_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_buffer_reader_bounds_check(const bcmolt_api_capture_buffer_reader *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_api_capture_config_set_default(bcmolt_api_capture_config *this)
{
    this->location = BCMOLT_API_CAPTURE_LOCATION_DEVICE;
    this->buffer_size_bytes = 16384;
    this->buffer_mode = BCMOLT_API_CAPTURE_BUFFER_MODE_WRAP;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_config_pack(const bcmolt_api_capture_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_api_capture_location_pack(this->location, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->buffer_size_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_api_capture_buffer_mode_pack(this->buffer_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_config_unpack(bcmolt_api_capture_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_api_capture_location_unpack(&this->location, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->buffer_size_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_api_capture_buffer_mode_unpack(&this->buffer_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_config_bounds_check(const bcmolt_api_capture_config *this)
{
    switch (this->location)
    {
        case BCMOLT_API_CAPTURE_LOCATION_DEVICE:
            break;
        case BCMOLT_API_CAPTURE_LOCATION_HOST:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->buffer_size_bytes < 16384)
    {
        return BCMOS_FALSE;
    }

    switch (this->buffer_mode)
    {
        case BCMOLT_API_CAPTURE_BUFFER_MODE_OVERFLOW:
            break;
        case BCMOLT_API_CAPTURE_BUFFER_MODE_WRAP:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_api_capture_stats_set_default(bcmolt_api_capture_stats *this)
{
    this->buffer_used_bytes = 0;
    this->buffer_wrap_count = 0;
    this->events_recorded = 0;
    this->events_dropped = 0;
    this->readable_bytes = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_stats_pack(const bcmolt_api_capture_stats *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->buffer_used_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->buffer_wrap_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->events_recorded))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->events_dropped))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->readable_bytes))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_stats_unpack(bcmolt_api_capture_stats *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->buffer_used_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->buffer_wrap_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->events_recorded))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->events_dropped))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->readable_bytes))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_stats_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 20);
}

/******************************************************************************/
bcmos_bool bcmolt_api_capture_stats_bounds_check(const bcmolt_api_capture_stats *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_bounds_set_default(bcmolt_bounds *this)
{
    this->best_case = 0;
    this->worst_case = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_bounds_pack(const bcmolt_bounds *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->best_case))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->worst_case))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_bounds_unpack(bcmolt_bounds *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->best_case))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->worst_case))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_bounds_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_bounds_bounds_check(const bcmolt_bounds *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_bounds_8_set_default(bcmolt_arr_bounds_8 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_bounds_8_pack(const bcmolt_arr_bounds_8 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_bounds_pack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_bounds_8_unpack(bcmolt_arr_bounds_8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_bounds_unpack(&this->arr[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_bounds_8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_bounds_8_bounds_check(const bcmolt_arr_bounds_8 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_calibration_record_8_set_default(bcmolt_arr_calibration_record_8 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_calibration_record_8_pack(const bcmolt_arr_calibration_record_8 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_calibration_record_pack(this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_calibration_record_8_unpack(bcmolt_arr_calibration_record_8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_calibration_record_unpack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_calibration_record_8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_calibration_record_8_bounds_check(const bcmolt_arr_calibration_record_8 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ds_frequency_offset_set_default(bcmolt_ds_frequency_offset *this)
{
    this->sign = BCMOLT_SIGN_POSITIVE;
    this->value = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ds_frequency_offset_pack(const bcmolt_ds_frequency_offset *this, bcmolt_buf *buf)
{
    if (!bcmolt_sign_pack(this->sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ds_frequency_offset_unpack(bcmolt_ds_frequency_offset *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_sign_unpack(&this->sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->value))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ds_frequency_offset_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_ds_frequency_offset_bounds_check(const bcmolt_ds_frequency_offset *this)
{
    switch (this->sign)
    {
        case BCMOLT_SIGN_POSITIVE:
            break;
        case BCMOLT_SIGN_NEGATIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_channel_profile_set_default(bcmolt_channel_profile *this)
{
    this->version = 0;
    this->channel_index = 0;
    this->ds_frequency_offset.sign = BCMOLT_SIGN_POSITIVE;
    this->ds_frequency_offset.value = 0;
    this->channel_partition = 0;
    this->uwlch_id = 0;
    this->us_frequency = 0;
    this->us_rate = BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G;
    this->default_onu_attenuation = 0;
    this->response_threshold = 0;
    this->us_link_type = BCMOLT_LINK_TYPE_UNSPECIFIED;
    this->is_valid = BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_profile_pack(const bcmolt_channel_profile *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->channel_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ds_frequency_offset_pack(&this->ds_frequency_offset, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->channel_partition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->uwlch_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->us_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_upstream_line_rate_capabilities_pack(this->us_rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->default_onu_attenuation))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->response_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_link_type_pack(this->us_link_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->is_valid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_profile_unpack(bcmolt_channel_profile *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->channel_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ds_frequency_offset_unpack(&this->ds_frequency_offset, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->channel_partition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->uwlch_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->us_frequency))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_upstream_line_rate_capabilities_unpack(&this->us_rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->default_onu_attenuation))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->response_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_link_type_unpack(&this->us_link_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->is_valid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 15);
}

/******************************************************************************/
bcmos_bool bcmolt_channel_profile_bounds_check(const bcmolt_channel_profile *this)
{
    if (this->version > 15)
    {
        return BCMOS_FALSE;
    }

    if (this->channel_index > 15)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ds_frequency_offset_bounds_check(&this->ds_frequency_offset))
    {
        return BCMOS_FALSE;
    }

    if (this->channel_partition > 15)
    {
        return BCMOS_FALSE;
    }

    if (this->uwlch_id > 15)
    {
        return BCMOS_FALSE;
    }

    switch (this->us_rate)
    {
        case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G:
            break;
        case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_10_G:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->default_onu_attenuation > 7)
    {
        return BCMOS_FALSE;
    }

    switch (this->us_link_type)
    {
        case BCMOLT_LINK_TYPE_UNSPECIFIED:
            break;
        case BCMOLT_LINK_TYPE_B:
            break;
        case BCMOLT_LINK_TYPE_A:
            break;
        case BCMOLT_LINK_TYPE_A_AND_B:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_channel_profile_8_set_default(bcmolt_arr_channel_profile_8 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_channel_profile_8_pack(const bcmolt_arr_channel_profile_8 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_channel_profile_pack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_channel_profile_8_unpack(bcmolt_arr_channel_profile_8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_channel_profile_unpack(&this->arr[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_channel_profile_8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 120);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_channel_profile_8_bounds_check(const bcmolt_arr_channel_profile_8 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_power_consumption_channel_report_set_default(bcmolt_power_consumption_channel_report *this)
{
    this->ds_wavelength_channel_id = 0;
    this->us_wavelength_channel_id = 0;
    this->power_consumption = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_power_consumption_channel_report_pack(const bcmolt_power_consumption_channel_report *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->ds_wavelength_channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->us_wavelength_channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->power_consumption))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_power_consumption_channel_report_unpack(bcmolt_power_consumption_channel_report *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->ds_wavelength_channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->us_wavelength_channel_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->power_consumption))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_power_consumption_channel_report_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_power_consumption_channel_report_bounds_check(const bcmolt_power_consumption_channel_report *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_power_consumption_channel_report_8_set_default(bcmolt_arr_power_consumption_channel_report_8 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_power_consumption_channel_report_8_pack(const bcmolt_arr_power_consumption_channel_report_8 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_power_consumption_channel_report_pack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_power_consumption_channel_report_8_unpack(bcmolt_arr_power_consumption_channel_report_8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 8; i0++)
    {
        if (!bcmolt_power_consumption_channel_report_unpack(&this->arr[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_power_consumption_channel_report_8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 32);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_power_consumption_channel_report_8_bounds_check(const bcmolt_arr_power_consumption_channel_report_8 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u16_2_set_default(bcmolt_arr_u16_2 *this)
{
    this->arr[0] = 4096;
    this->arr[1] = 8192;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_pack(const bcmolt_arr_u16_2 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 2; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_unpack(bcmolt_arr_u16_2 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 2; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, &this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_bounds_check(const bcmolt_arr_u16_2 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u16_2_hex_set_default(bcmolt_arr_u16_2_hex *this)
{
    this->arr[0] = 33024U;
    this->arr[1] = 33024U;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_hex_pack(const bcmolt_arr_u16_2_hex *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 2; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_hex_unpack(bcmolt_arr_u16_2_hex *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 2; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, &this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_2_hex_bounds_check(const bcmolt_arr_u16_2_hex *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u16_5_hex_set_default(bcmolt_arr_u16_5_hex *this)
{
    this->arr[0] = 33024U;
    this->arr[1] = 34984U;
    this->arr[2] = 37120U;
    this->arr[3] = 37376U;
    this->arr[4] = 33024U;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_5_hex_pack(const bcmolt_arr_u16_5_hex *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 5; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_5_hex_unpack(bcmolt_arr_u16_5_hex *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 5; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, &this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_5_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_5_hex_bounds_check(const bcmolt_arr_u16_5_hex *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u16_7_set_default(bcmolt_arr_u16_7 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_7_pack(const bcmolt_arr_u16_7 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 7; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_7_unpack(bcmolt_arr_u16_7 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 7; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, &this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_7_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 14);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u16_7_bounds_check(const bcmolt_arr_u16_7 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u32_6_set_default(bcmolt_arr_u32_6 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u32_6_pack(const bcmolt_arr_u32_6 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 6; i0++)
    {
        if (!bcmolt_buf_write_u32(buf, this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u32_6_unpack(bcmolt_arr_u32_6 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 6; i0++)
    {
        if (!bcmolt_buf_read_u32(buf, &this->arr[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u32_6_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 24);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u32_6_bounds_check(const bcmolt_arr_u32_6 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_10_set_default(bcmolt_arr_u8_10 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_10_pack(const bcmolt_arr_u8_10 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 10))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_10_unpack(bcmolt_arr_u8_10 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 10))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_10_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_10_bounds_check(const bcmolt_arr_u8_10 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_12_set_default(bcmolt_arr_u8_12 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_12_pack(const bcmolt_arr_u8_12 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 12))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_12_unpack(bcmolt_arr_u8_12 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 12))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_12_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_12_bounds_check(const bcmolt_arr_u8_12 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_13_set_default(bcmolt_arr_u8_13 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_13_pack(const bcmolt_arr_u8_13 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 13))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_13_unpack(bcmolt_arr_u8_13 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 13))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_13_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 13);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_13_bounds_check(const bcmolt_arr_u8_13 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_36_set_default(bcmolt_arr_u8_36 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_36_pack(const bcmolt_arr_u8_36 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 36))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_36_unpack(bcmolt_arr_u8_36 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 36))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_36_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 36);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_36_bounds_check(const bcmolt_arr_u8_36 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_4_set_default(bcmolt_arr_u8_4 *this)
{
    this->arr[0] = 7;
    this->arr[1] = 7;
    this->arr[2] = 7;
    this->arr[3] = 7;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_4_pack(const bcmolt_arr_u8_4 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_4_unpack(bcmolt_arr_u8_4 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_4_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_4_bounds_check(const bcmolt_arr_u8_4 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_u8_40_set_default(bcmolt_arr_u8_40 *this)
{
    memset(this->arr, 0, sizeof(this->arr));
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_40_pack(const bcmolt_arr_u8_40 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->arr, 40))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_40_unpack(bcmolt_arr_u8_40 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->arr, 40))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_40_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 40);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_u8_40_bounds_check(const bcmolt_arr_u8_40 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_burst_profile_set_default(bcmolt_xgpon_burst_profile *this)
{
    this->profile_version = 0;
    this->is_fec_on = BCMOS_FALSE;
    this->delimiter_size_in_bytes = 0;
    this->delimiter_pattern_high = 0;
    this->delimiter_pattern_low = 8;
    this->preamble_length_in_bytes = 8;
    this->preamble_repeats_count = 0;
    this->preamble_pattern_high = 0;
    this->preamble_pattern_low = 0;
    this->pon_tag = 0;
    this->num_of_guard_bytes = 0;
    this->is_profile_valid = BCMOS_FALSE;
    this->burst_overhead_size_in_words = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_burst_profile_pack(const bcmolt_xgpon_burst_profile *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->profile_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->is_fec_on))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->delimiter_size_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->delimiter_pattern_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->delimiter_pattern_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->preamble_length_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->preamble_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->preamble_pattern_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->preamble_pattern_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u64(buf, this->pon_tag))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->num_of_guard_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->is_profile_valid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->burst_overhead_size_in_words))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_burst_profile_unpack(bcmolt_xgpon_burst_profile *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->profile_version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->is_fec_on))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->delimiter_size_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->delimiter_pattern_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->delimiter_pattern_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->preamble_length_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->preamble_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->preamble_pattern_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->preamble_pattern_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u64(buf, &this->pon_tag))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->num_of_guard_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->is_profile_valid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->burst_overhead_size_in_words))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_burst_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 38);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_burst_profile_bounds_check(const bcmolt_xgpon_burst_profile *this)
{
    if (this->delimiter_size_in_bytes > 8)
    {
        return BCMOS_FALSE;
    }

    if (this->preamble_length_in_bytes < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->preamble_length_in_bytes > 8)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_xgpon_burst_profile_4_set_default(bcmolt_arr_xgpon_burst_profile_4 *this)
{
    this->arr[0].profile_version = 0;
    this->arr[0].is_fec_on = BCMOS_FALSE;
    this->arr[0].delimiter_size_in_bytes = 8;
    this->arr[0].delimiter_pattern_high = 3015562000UL;
    this->arr[0].delimiter_pattern_low = 2999259041UL;
    this->arr[0].preamble_length_in_bytes = 8;
    this->arr[0].preamble_repeats_count = 20;
    this->arr[0].preamble_pattern_high = 2863311530UL;
    this->arr[0].preamble_pattern_low = 2863311530UL;
    this->arr[0].pon_tag = 0;
    this->arr[0].num_of_guard_bytes = 16;
    this->arr[0].is_profile_valid = BCMOS_TRUE;
    this->arr[0].burst_overhead_size_in_words = 78;
    this->arr[1].profile_version = 0;
    this->arr[1].is_fec_on = BCMOS_FALSE;
    this->arr[1].delimiter_size_in_bytes = 8;
    this->arr[1].delimiter_pattern_high = 3015562000UL;
    this->arr[1].delimiter_pattern_low = 2999259041UL;
    this->arr[1].preamble_length_in_bytes = 8;
    this->arr[1].preamble_repeats_count = 9;
    this->arr[1].preamble_pattern_high = 2863311530UL;
    this->arr[1].preamble_pattern_low = 2863311530UL;
    this->arr[1].pon_tag = 0;
    this->arr[1].num_of_guard_bytes = 16;
    this->arr[1].is_profile_valid = BCMOS_TRUE;
    this->arr[1].burst_overhead_size_in_words = 56;
    this->arr[2].profile_version = 0;
    this->arr[2].is_fec_on = BCMOS_TRUE;
    this->arr[2].delimiter_size_in_bytes = 8;
    this->arr[2].delimiter_pattern_high = 3015562000UL;
    this->arr[2].delimiter_pattern_low = 2999259041UL;
    this->arr[2].preamble_length_in_bytes = 8;
    this->arr[2].preamble_repeats_count = 20;
    this->arr[2].preamble_pattern_high = 2863311530UL;
    this->arr[2].preamble_pattern_low = 2863311530UL;
    this->arr[2].pon_tag = 0;
    this->arr[2].num_of_guard_bytes = 16;
    this->arr[2].is_profile_valid = BCMOS_TRUE;
    this->arr[2].burst_overhead_size_in_words = 78;
    this->arr[3].profile_version = 0;
    this->arr[3].is_fec_on = BCMOS_TRUE;
    this->arr[3].delimiter_size_in_bytes = 8;
    this->arr[3].delimiter_pattern_high = 3015562000UL;
    this->arr[3].delimiter_pattern_low = 2999259041UL;
    this->arr[3].preamble_length_in_bytes = 8;
    this->arr[3].preamble_repeats_count = 9;
    this->arr[3].preamble_pattern_high = 2863311530UL;
    this->arr[3].preamble_pattern_low = 2863311530UL;
    this->arr[3].pon_tag = 0;
    this->arr[3].num_of_guard_bytes = 16;
    this->arr[3].is_profile_valid = BCMOS_TRUE;
    this->arr[3].burst_overhead_size_in_words = 56;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_burst_profile_4_pack(const bcmolt_arr_xgpon_burst_profile_4 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 4; i0++)
    {
        if (!bcmolt_xgpon_burst_profile_pack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_burst_profile_4_unpack(bcmolt_arr_xgpon_burst_profile_4 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 4; i0++)
    {
        if (!bcmolt_xgpon_burst_profile_unpack(&this->arr[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_burst_profile_4_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 152);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_burst_profile_4_bounds_check(const bcmolt_arr_xgpon_burst_profile_4 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_trx_configuration_set_default(bcmolt_xgpon_trx_configuration *this)
{
    this->trx_reset_pattern_first = 0;
    this->trx_reset_pattern_middle = 0;
    this->trx_reset_pattern_last = 0;
    this->trx_reset_middle_repeats_count = 0;
    this->trx_reset_location = 0;
    this->trx_reset_polarity = BCMOS_FALSE;
    this->bcdr_reset_pattern_first = 0;
    this->bcdr_reset_pattern_middle = 0;
    this->bcdr_reset_pattern_last = 0;
    this->bcdr_reset_middle_repeats_count = 0;
    this->bcdr_reset_location = 0;
    this->bcdr_reset_polarity = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_configuration_pack(const bcmolt_xgpon_trx_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->trx_reset_middle_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->trx_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->trx_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->bcdr_reset_middle_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->bcdr_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->bcdr_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_configuration_unpack(bcmolt_xgpon_trx_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->trx_reset_middle_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->trx_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->trx_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->bcdr_reset_middle_repeats_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->bcdr_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->bcdr_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 31);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_configuration_bounds_check(const bcmolt_xgpon_trx_configuration *this)
{
    if (this->trx_reset_location > 511)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_arr_xgpon_trx_configuration_4_set_default(bcmolt_arr_xgpon_trx_configuration_4 *this)
{
    this->arr[0].trx_reset_pattern_first = 0;
    this->arr[0].trx_reset_pattern_middle = 4294967295UL;
    this->arr[0].trx_reset_pattern_last = 0;
    this->arr[0].trx_reset_middle_repeats_count = 4;
    this->arr[0].trx_reset_location = 0;
    this->arr[0].trx_reset_polarity = BCMOS_FALSE;
    this->arr[0].bcdr_reset_pattern_first = 0;
    this->arr[0].bcdr_reset_pattern_middle = 255;
    this->arr[0].bcdr_reset_pattern_last = 0;
    this->arr[0].bcdr_reset_middle_repeats_count = 1;
    this->arr[0].bcdr_reset_location = 20;
    this->arr[0].bcdr_reset_polarity = BCMOS_FALSE;
    this->arr[1].trx_reset_pattern_first = 0;
    this->arr[1].trx_reset_pattern_middle = 4294967295UL;
    this->arr[1].trx_reset_pattern_last = 0;
    this->arr[1].trx_reset_middle_repeats_count = 4;
    this->arr[1].trx_reset_location = 33;
    this->arr[1].trx_reset_polarity = BCMOS_FALSE;
    this->arr[1].bcdr_reset_pattern_first = 0;
    this->arr[1].bcdr_reset_pattern_middle = 255;
    this->arr[1].bcdr_reset_pattern_last = 0;
    this->arr[1].bcdr_reset_middle_repeats_count = 1;
    this->arr[1].bcdr_reset_location = 23;
    this->arr[1].bcdr_reset_polarity = BCMOS_FALSE;
    this->arr[2].trx_reset_pattern_first = 0;
    this->arr[2].trx_reset_pattern_middle = 4294967295UL;
    this->arr[2].trx_reset_pattern_last = 0;
    this->arr[2].trx_reset_middle_repeats_count = 4;
    this->arr[2].trx_reset_location = 0;
    this->arr[2].trx_reset_polarity = BCMOS_FALSE;
    this->arr[2].bcdr_reset_pattern_first = 0;
    this->arr[2].bcdr_reset_pattern_middle = 255;
    this->arr[2].bcdr_reset_pattern_last = 0;
    this->arr[2].bcdr_reset_middle_repeats_count = 1;
    this->arr[2].bcdr_reset_location = 20;
    this->arr[2].bcdr_reset_polarity = BCMOS_FALSE;
    this->arr[3].trx_reset_pattern_first = 0;
    this->arr[3].trx_reset_pattern_middle = 4294967295UL;
    this->arr[3].trx_reset_pattern_last = 0;
    this->arr[3].trx_reset_middle_repeats_count = 4;
    this->arr[3].trx_reset_location = 33;
    this->arr[3].trx_reset_polarity = BCMOS_FALSE;
    this->arr[3].bcdr_reset_pattern_first = 0;
    this->arr[3].bcdr_reset_pattern_middle = 255;
    this->arr[3].bcdr_reset_pattern_last = 0;
    this->arr[3].bcdr_reset_middle_repeats_count = 1;
    this->arr[3].bcdr_reset_location = 23;
    this->arr[3].bcdr_reset_polarity = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_pack(const bcmolt_arr_xgpon_trx_configuration_4 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    for (i0 = 0; i0 < 4; i0++)
    {
        if (!bcmolt_xgpon_trx_configuration_pack(&this->arr[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_unpack(bcmolt_arr_xgpon_trx_configuration_4 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    for (i0 = 0; i0 < 4; i0++)
    {
        if (!bcmolt_xgpon_trx_configuration_unpack(&this->arr[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 124);
}

/******************************************************************************/
bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_bounds_check(const bcmolt_arr_xgpon_trx_configuration_4 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_automatic_onu_deactivation_set_default(bcmolt_automatic_onu_deactivation *this)
{
    this->los = BCMOS_FALSE;
    this->onu_alarms = BCMOS_FALSE;
    this->tiwi = BCMOS_FALSE;
    this->ack_timeout = BCMOS_FALSE;
    this->sfi = BCMOS_FALSE;
    this->loki = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_automatic_onu_deactivation_pack(const bcmolt_automatic_onu_deactivation *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->los))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->onu_alarms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->tiwi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->ack_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->sfi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->loki))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_automatic_onu_deactivation_unpack(bcmolt_automatic_onu_deactivation *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->los))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->onu_alarms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->tiwi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->ack_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->sfi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->loki))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_automatic_onu_deactivation_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_automatic_onu_deactivation_bounds_check(const bcmolt_automatic_onu_deactivation *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_resync_control_set_default(bcmolt_resync_control *this)
{
    this->start_pattern = 15;
    this->middle_pattern = 0;
    this->last_pattern = 0;
    this->middle_repetition = 0;
    this->location = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_resync_control_pack(const bcmolt_resync_control *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->start_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->middle_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->last_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->middle_repetition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->location))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_resync_control_unpack(bcmolt_resync_control *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->start_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->middle_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->last_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->middle_repetition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->location))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_resync_control_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_resync_control_bounds_check(const bcmolt_resync_control *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_bcdr_resync_pattern_configuration_set_default(bcmolt_bcdr_resync_pattern_configuration *this)
{
    this->resync_control.start_pattern = 15;
    this->resync_control.middle_pattern = 0;
    this->resync_control.last_pattern = 0;
    this->resync_control.middle_repetition = 0;
    this->resync_control.location = 34;
    this->ranging_resync_control.start_pattern = 15;
    this->ranging_resync_control.middle_pattern = 0;
    this->ranging_resync_control.last_pattern = 0;
    this->ranging_resync_control.middle_repetition = 0;
    this->ranging_resync_control.location = 7;
}

/******************************************************************************/
bcmos_bool bcmolt_bcdr_resync_pattern_configuration_pack(const bcmolt_bcdr_resync_pattern_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_resync_control_pack(&this->resync_control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_pack(&this->ranging_resync_control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_bcdr_resync_pattern_configuration_unpack(bcmolt_bcdr_resync_pattern_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_resync_control_unpack(&this->resync_control, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_unpack(&this->ranging_resync_control, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_bcdr_resync_pattern_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_bcdr_resync_pattern_configuration_bounds_check(const bcmolt_bcdr_resync_pattern_configuration *this)
{
    if (!bcmolt_resync_control_bounds_check(&this->resync_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_bounds_check(&this->ranging_resync_control))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ber_monitor_params_set_default(bcmolt_ber_monitor_params *this)
{
    this->us_ber_interval = 5000;
    this->sf_threshold = 3;
    this->sd_threshold = 5;
}

/******************************************************************************/
bcmos_bool bcmolt_ber_monitor_params_pack(const bcmolt_ber_monitor_params *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->us_ber_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->sf_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->sd_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ber_monitor_params_unpack(bcmolt_ber_monitor_params *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->us_ber_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->sf_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->sd_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ber_monitor_params_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_ber_monitor_params_bounds_check(const bcmolt_ber_monitor_params *this)
{
    if (this->us_ber_interval > 60000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->sf_threshold < 3)
    {
        return BCMOS_FALSE;
    }

    if (this->sf_threshold > 8)
    {
        return BCMOS_FALSE;
    }

    if (this->sd_threshold < 4)
    {
        return BCMOS_FALSE;
    }

    if (this->sd_threshold > 9)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_cbr_rt_allocation_profile_set_default(bcmolt_cbr_rt_allocation_profile *this)
{
    this->ma_7 = 64;
    this->ma_3 = 256;
    this->ma_1 = 512;
}

/******************************************************************************/
bcmos_bool bcmolt_cbr_rt_allocation_profile_pack(const bcmolt_cbr_rt_allocation_profile *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->ma_7))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->ma_3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->ma_1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_cbr_rt_allocation_profile_unpack(bcmolt_cbr_rt_allocation_profile *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->ma_7))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->ma_3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->ma_1))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_cbr_rt_allocation_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_cbr_rt_allocation_profile_bounds_check(const bcmolt_cbr_rt_allocation_profile *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ddr_test_completed_set_default(bcmolt_ddr_test_completed *this)
{
    this->status = (bcmolt_ddr_test_status) 2;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_completed_pack(const bcmolt_ddr_test_completed *this, bcmolt_buf *buf)
{
    if (!bcmolt_ddr_test_status_pack(this->status, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->status)
    {
        case BCMOLT_DDR_TEST_STATUS_COMPLETED:
            {
                if (!bcmolt_ddr_test_result_pack(this->u.completed.cpu_result, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_ddr_test_result_pack(this->u.completed.ras_0_result, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_ddr_test_result_pack(this->u.completed.ras_1_result, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED:
            {
                if (!bcmolt_host_connection_fail_reason_pack(this->u.connection_failed.reason, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_TIMEOUT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ddr_test_completed_get_packed_length(const bcmolt_ddr_test_completed *this)
{
    uint32_t count = 1;
    switch (this->status)
    {
        case BCMOLT_DDR_TEST_STATUS_COMPLETED:
            {
                count += 3;
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED:
            {
                count += 1;
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_TIMEOUT:
        default:
            {
            }
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_completed_unpack(bcmolt_ddr_test_completed *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_ddr_test_status_unpack(&this->status, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->status)
    {
        case BCMOLT_DDR_TEST_STATUS_COMPLETED:
            {
                if (!bcmolt_ddr_test_result_unpack(&this->u.completed.cpu_result, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_ddr_test_result_unpack(&this->u.completed.ras_0_result, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_ddr_test_result_unpack(&this->u.completed.ras_1_result, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED:
            {
                if (!bcmolt_host_connection_fail_reason_unpack(&this->u.connection_failed.reason, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_TIMEOUT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_completed_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_ddr_test_status status;
    if (!bcmolt_ddr_test_status_unpack(&status, packed))
    {
        return BCMOS_FALSE;
    }

    switch (status)
    {
        case BCMOLT_DDR_TEST_STATUS_COMPLETED:
            {
                if (!bcmolt_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

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

                if (!bcmolt_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED:
            {
                if (!bcmolt_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_TIMEOUT:
        default:
            {
            }
            break;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ddr_test_completed_bounds_check(const bcmolt_ddr_test_completed *this)
{
    switch (this->status)
    {
        case BCMOLT_DDR_TEST_STATUS_COMPLETED:
            {
                switch (this->u.completed.cpu_result)
                {
                    case BCMOLT_DDR_TEST_RESULT_SUCCESS:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_PHY_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_DRAM_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_SHMOO_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_EDIS_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_MEM_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_NOT_TESTED:
                        break;
                    default:
                        return BCMOS_FALSE;
                }

                switch (this->u.completed.ras_0_result)
                {
                    case BCMOLT_DDR_TEST_RESULT_SUCCESS:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_PHY_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_DRAM_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_SHMOO_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_EDIS_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_MEM_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_NOT_TESTED:
                        break;
                    default:
                        return BCMOS_FALSE;
                }

                switch (this->u.completed.ras_1_result)
                {
                    case BCMOLT_DDR_TEST_RESULT_SUCCESS:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_PHY_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_DRAM_INIT_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_SHMOO_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_EDIS_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_MEM_TEST_ERROR:
                        break;
                    case BCMOLT_DDR_TEST_RESULT_NOT_TESTED:
                        break;
                    default:
                        return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED:
            {
                switch (this->u.connection_failed.reason)
                {
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_TIMEOUT:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_KEEPALIVE:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_USER_CALLBACK_ERROR:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_SOFTWARE_VERSION_MISMATCH:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_MISMATCH:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_NNI_SPEED_MISMATCH:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_RECONNECT_TIMEOUT:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_INTERNAL_ERROR:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_NOT_SUPPORTED:
                        break;
                    case BCMOLT_HOST_CONNECTION_FAIL_REASON_PARAMETER:
                        break;
                    default:
                        return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_DDR_TEST_STATUS_TIMEOUT:
            break;
        default:
            {
            }

            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_device_cfg_set_default(bcmolt_debug_device_cfg *this)
{
    this->host_dma_rx_queue_size = 128;
    this->host_dma_tx_queue_size = 128;
    this->avs_control = BCMOS_FALSE;
    this->use_prev_pon_serdes_firmware = BCMOS_FALSE;
    this->use_prev_nni_serdes_firmware = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_device_cfg_pack(const bcmolt_debug_device_cfg *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->host_dma_rx_queue_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->host_dma_tx_queue_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->avs_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->use_prev_pon_serdes_firmware))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->use_prev_nni_serdes_firmware))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_device_cfg_unpack(bcmolt_debug_device_cfg *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->host_dma_rx_queue_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->host_dma_tx_queue_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->avs_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->use_prev_pon_serdes_firmware))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->use_prev_nni_serdes_firmware))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_device_cfg_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_debug_device_cfg_bounds_check(const bcmolt_debug_device_cfg *this)
{
    if (this->host_dma_rx_queue_size < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->host_dma_rx_queue_size > 1024)
    {
        return BCMOS_FALSE;
    }

    if (this->host_dma_tx_queue_size < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->host_dma_tx_queue_size > 1024)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_nni_speed_set_default(bcmolt_device_nni_speed *this)
{
    this->first_half = BCMOLT_NNI_SPEED_GBPS_1;
    this->second_half = BCMOLT_NNI_SPEED_GBPS_1;
}

/******************************************************************************/
bcmos_bool bcmolt_device_nni_speed_pack(const bcmolt_device_nni_speed *this, bcmolt_buf *buf)
{
    if (!bcmolt_nni_speed_pack(this->first_half, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_nni_speed_pack(this->second_half, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_nni_speed_unpack(bcmolt_device_nni_speed *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_nni_speed_unpack(&this->first_half, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_nni_speed_unpack(&this->second_half, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_nni_speed_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_device_nni_speed_bounds_check(const bcmolt_device_nni_speed *this)
{
    switch (this->first_half)
    {
        case BCMOLT_NNI_SPEED_GBPS_1:
            break;
        case BCMOLT_NNI_SPEED_GBPS_2P5:
            break;
        case BCMOLT_NNI_SPEED_GBPS_10:
            break;
        case BCMOLT_NNI_SPEED_GBPS_12P5:
            break;
        case BCMOLT_NNI_SPEED_GBPS_10_G_MUX:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->second_half)
    {
        case BCMOLT_NNI_SPEED_GBPS_1:
            break;
        case BCMOLT_NNI_SPEED_GBPS_2P5:
            break;
        case BCMOLT_NNI_SPEED_GBPS_10:
            break;
        case BCMOLT_NNI_SPEED_GBPS_12P5:
            break;
        case BCMOLT_NNI_SPEED_GBPS_10_G_MUX:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/* \cond UNDOCUMENTED_SYMBOLS */

/******************************************************************************/
void bcmolt_dummy_struct_for_embedded_types_set_default(bcmolt_dummy_struct_for_embedded_types *this)
{
    this->ad = (bcmolt_aggregation_domain) 0;
    this->et = (bcmolt_epon_top) 0;
    this->elg = (bcmolt_epm_lim_global) 0;
    this->dba_port = (bcmolt_dba_port) 0;
    this->sgb = BCMOLT_DRV_SGB_ID_IDX0;
    this->icf = BCMOLT_DRV_ICF_ID_IDX0;
    this->tfb_trap_behavior = BCMOLT_TFB_TRAP_BEHAVIOR_DROP;
    this->tfb_mode = BCMOLT_TFB_MODE_GPON;
    this->lim_sec_mode_up = BCMOLT_LIM_SEC_MODE_UP_TEK;
    this->lim_sec_mode_dn = BCMOLT_LIM_SEC_MODE_DN_TEK;
    this->xim_sec_mode = BCMOLT_XIM_SEC_MODE_RESERVED_0;
    this->dba_ram = BCMOLT_DBA_RAM_GRANT_FIFO_RAM_0;
    this->hsc_ram = BCMOLT_HSC_RAM_LLC_T1;
    this->lim_ram = BCMOLT_LIM_RAM_LLID_UP;
    this->lky_ram = BCMOLT_LKY_RAM_TX_KEY_RAM;
    this->mic_ram = BCMOLT_MIC_RAM_RANGE;
    this->xpcs_ram = BCMOLT_XPCSRM_RAM_CAPTURE_FIFO;
    this->xg2g_id = (bcmolt_xg2g_id) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_dummy_struct_for_embedded_types_pack(const bcmolt_dummy_struct_for_embedded_types *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->ad))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->et))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->elg))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->dba_port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_drv_sgb_id_pack(this->sgb, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_drv_icf_id_pack(this->icf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tfb_trap_behavior_pack(this->tfb_trap_behavior, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tfb_mode_pack(this->tfb_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_sec_mode_up_pack(this->lim_sec_mode_up, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_sec_mode_dn_pack(this->lim_sec_mode_dn, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xim_sec_mode_pack(this->xim_sec_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_dba_ram_pack(this->dba_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_hsc_ram_pack(this->hsc_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_ram_pack(this->lim_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lky_ram_pack(this->lky_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mic_ram_pack(this->mic_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xpcsrm_ram_pack(this->xpcs_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->xg2g_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_dummy_struct_for_embedded_types_unpack(bcmolt_dummy_struct_for_embedded_types *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->ad))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->et))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->elg))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->dba_port))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_drv_sgb_id_unpack(&this->sgb, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_drv_icf_id_unpack(&this->icf, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tfb_trap_behavior_unpack(&this->tfb_trap_behavior, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tfb_mode_unpack(&this->tfb_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_sec_mode_up_unpack(&this->lim_sec_mode_up, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_sec_mode_dn_unpack(&this->lim_sec_mode_dn, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xim_sec_mode_unpack(&this->xim_sec_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_dba_ram_unpack(&this->dba_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_hsc_ram_unpack(&this->hsc_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lim_ram_unpack(&this->lim_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_lky_ram_unpack(&this->lky_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mic_ram_unpack(&this->mic_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xpcsrm_ram_unpack(&this->xpcs_ram, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->xg2g_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_dummy_struct_for_embedded_types_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 18);
}

/******************************************************************************/
bcmos_bool bcmolt_dummy_struct_for_embedded_types_bounds_check(const bcmolt_dummy_struct_for_embedded_types *this)
{
    if (this->ad > (bcmolt_aggregation_domain) 1)
    {
        return BCMOS_FALSE;
    }

    if (this->et > (bcmolt_epon_top) 7)
    {
        return BCMOS_FALSE;
    }

    if (this->elg > (bcmolt_epm_lim_global) 15)
    {
        return BCMOS_FALSE;
    }

    if (this->dba_port > (bcmolt_dba_port) 7)
    {
        return BCMOS_FALSE;
    }

    switch (this->sgb)
    {
        case BCMOLT_DRV_SGB_ID_IDX0:
            break;
        case BCMOLT_DRV_SGB_ID_IDX1:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->icf)
    {
        case BCMOLT_DRV_ICF_ID_IDX0:
            break;
        case BCMOLT_DRV_ICF_ID_IDX1:
            break;
        case BCMOLT_DRV_ICF_ID_IDX2:
            break;
        case BCMOLT_DRV_ICF_ID_IDX3:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->tfb_trap_behavior)
    {
        case BCMOLT_TFB_TRAP_BEHAVIOR_DROP:
            break;
        case BCMOLT_TFB_TRAP_BEHAVIOR_FORWARD_NNI:
            break;
        case BCMOLT_TFB_TRAP_BEHAVIOR_FORWARD_CPU:
            break;
        case BCMOLT_TFB_TRAP_BEHAVIOR_SNOOP:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->tfb_mode)
    {
        case BCMOLT_TFB_MODE_GPON:
            break;
        case BCMOLT_TFB_MODE_XGPON:
            break;
        case BCMOLT_TFB_MODE_EPON:
            break;
        case BCMOLT_TFB_MODE_XEPON:
            break;
        case BCMOLT_TFB_MODE_COEX:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lim_sec_mode_up)
    {
        case BCMOLT_LIM_SEC_MODE_UP_TEK:
            break;
        case BCMOLT_LIM_SEC_MODE_UP_PER_LLID:
            break;
        case BCMOLT_LIM_SEC_MODE_UP_NTT:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lim_sec_mode_dn)
    {
        case BCMOLT_LIM_SEC_MODE_DN_TEK:
            break;
        case BCMOLT_LIM_SEC_MODE_DN_PER_LLID:
            break;
        case BCMOLT_LIM_SEC_MODE_DN_NTT:
            break;
        case BCMOLT_LIM_SEC_MODE_DN_CEPON:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->xim_sec_mode)
    {
        case BCMOLT_XIM_SEC_MODE_RESERVED_0:
            break;
        case BCMOLT_XIM_SEC_MODE_PER_LLID:
            break;
        case BCMOLT_XIM_SEC_MODE_RESERVED_2:
            break;
        case BCMOLT_XIM_SEC_MODE_CEPON:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dba_ram)
    {
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_0:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_1:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_2:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_3:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_4:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_5:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_6:
            break;
        case BCMOLT_DBA_RAM_GRANT_FIFO_RAM_7:
            break;
        case BCMOLT_DBA_RAM_GRANTS_OUT_RAM:
            break;
        case BCMOLT_DBA_RAM_GRANTS_IN_RAM:
            break;
        case BCMOLT_DBA_RAM_GRANTS_RETIRED_RAM:
            break;
        case BCMOLT_DBA_RAM_REPORT_RAM:
            break;
        case BCMOLT_DBA_RAM_GRANT_CFG_RAM:
            break;
        case BCMOLT_DBA_RAM_DEFAULT_TOKENS_RAM:
            break;
        case BCMOLT_DBA_RAM_POLL_RECORDS_RAM:
            break;
        case BCMOLT_DBA_RAM_HEIR_POLL_RAM:
            break;
        case BCMOLT_DBA_RAM_LAST_POLL_TIME_RAM:
            break;
        case BCMOLT_DBA_RAM_POLL_ORDER_RAM:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_0:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_1:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_2:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_3:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_4:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_5:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_6:
            break;
        case BCMOLT_DBA_RAM_TDM_RAM_7:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->hsc_ram)
    {
        case BCMOLT_HSC_RAM_LLC_T1:
            break;
        case BCMOLT_HSC_RAM_LLC_T2:
            break;
        case BCMOLT_HSC_RAM_LLC_T3:
            break;
        case BCMOLT_HSC_RAM_GRP_T2:
            break;
        case BCMOLT_HSC_RAM_GRP_T3:
            break;
        case BCMOLT_HSC_RAM_SHP_T1:
            break;
        case BCMOLT_HSC_RAM_SHP_T2:
            break;
        case BCMOLT_HSC_RAM_SHP_T3:
            break;
        case BCMOLT_HSC_RAM_PRF_T1:
            break;
        case BCMOLT_HSC_RAM_PRF_T2:
            break;
        case BCMOLT_HSC_RAM_PRF_T3:
            break;
        case BCMOLT_HSC_RAM_CRE_T1:
            break;
        case BCMOLT_HSC_RAM_CRE_T2:
            break;
        case BCMOLT_HSC_RAM_CRE_T3:
            break;
        case BCMOLT_HSC_RAM_ELU:
            break;
        case BCMOLT_HSC_RAM_PTR_T1:
            break;
        case BCMOLT_HSC_RAM_PTR_T2:
            break;
        case BCMOLT_HSC_RAM_AGR_SHP_T1:
            break;
        case BCMOLT_HSC_RAM_AEM:
            break;
        case BCMOLT_HSC_RAM_ALL_LLC:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lim_ram)
    {
        case BCMOLT_LIM_RAM_LLID_UP:
            break;
        case BCMOLT_LIM_RAM_PER_ONU_STAT:
            break;
        case BCMOLT_LIM_RAM_FEC_UP_FULL_S:
            break;
        case BCMOLT_LIM_RAM_FEC_UP_DATA:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lky_ram)
    {
        case BCMOLT_LKY_RAM_TX_KEY_RAM:
            break;
        case BCMOLT_LKY_RAM_TX_KEY_BUFFER:
            break;
        case BCMOLT_LKY_RAM_RX_KEY_RAM:
            break;
        case BCMOLT_LKY_RAM_RX_KEY_BUFFER:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->mic_ram)
    {
        case BCMOLT_MIC_RAM_RANGE:
            break;
        case BCMOLT_MIC_RAM_LLID:
            break;
        case BCMOLT_MIC_RAM_IDX:
            break;
        case BCMOLT_MIC_RAM_GRANT_MISS:
            break;
        case BCMOLT_MIC_RAM_GRANT_ID:
            break;
        case BCMOLT_MIC_RAM_TX_IV:
            break;
        case BCMOLT_MIC_RAM_RX_IV:
            break;
        case BCMOLT_MIC_RAM_TX_PORT_STAT:
            break;
        case BCMOLT_MIC_RAM_RX_PORT_STAT:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->xpcs_ram)
    {
        case BCMOLT_XPCSRM_RAM_CAPTURE_FIFO:
            break;
        case BCMOLT_XPCSRM_RAM_FEC_DECODE:
            break;
        case BCMOLT_XPCSRM_RAM_FEC_STATS:
            break;
        case BCMOLT_XPCSRM_RAM_FEC_ENQUEUE:
            break;
        case BCMOLT_XPCSRM_RAM_IDLE_INSERT:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->xg2g_id > (bcmolt_xg2g_id) 7)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/* \endcond */

/******************************************************************************/
void bcmolt_embedded_image_entry_set_default(bcmolt_embedded_image_entry *this)
{
    this->image_type = BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER;
    this->image_size = 0;
    this->crc32 = 0;
    this->status = BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_NONE;
    memset(this->image_name, 0, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_pack(const bcmolt_embedded_image_entry *this, bcmolt_buf *buf)
{
    if (!bcmolt_device_image_type_pack(this->image_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->image_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->crc32))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_embedded_image_transfer_status_pack(this->status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->image_name, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_unpack(bcmolt_embedded_image_entry *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_device_image_type_unpack(&this->image_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->image_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->crc32))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_embedded_image_transfer_status_unpack(&this->status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->image_name, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 74);
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_bounds_check(const bcmolt_embedded_image_entry *this)
{
    switch (this->image_type)
    {
        case BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER:
            break;
        case BCMOLT_DEVICE_IMAGE_TYPE_APPLICATION:
            break;
        case BCMOLT_DEVICE_IMAGE_TYPE_ITU_PON_ONU_FIRMWARE:
            break;
        case BCMOLT_DEVICE_IMAGE_TYPE_EPON_ONU_FIRMWARE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->status)
    {
        case BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_NONE:
            break;
        case BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_IN_PROGRESS:
            break;
        case BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_SUCCESS:
            break;
        case BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_FAILURE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_embedded_image_entry_list_u8_set_default(bcmolt_embedded_image_entry_list_u8 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_list_u8_pack(const bcmolt_embedded_image_entry_list_u8 *this, bcmolt_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_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_embedded_image_entry_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_embedded_image_entry_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_embedded_image_entry_list_u8_get_packed_length(const bcmolt_embedded_image_entry_list_u8 *this)
{
    return 1 + (74 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_list_u8_unpack(bcmolt_embedded_image_entry_list_u8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_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_embedded_image_entry_list_u8\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_embedded_image_entry *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_embedded_image_entry));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_embedded_image_entry_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_list_u8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint8_t len;
    if (!bcmolt_buf_read_u8(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_embedded_image_entry) * len);
    if (!bcmolt_buf_skip(packed, len * 74))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_embedded_image_entry_list_u8_bounds_check(const bcmolt_embedded_image_entry_list_u8 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_encryption_information_container_set_default(bcmolt_encryption_information_container *this)
{
    this->format = (bcmolt_epon_encryption_information_format) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_encryption_information_container_pack(const bcmolt_encryption_information_container *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_encryption_information_format_pack(this->format, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->format)
    {
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
            {
                if (!bcmolt_buf_write(buf, this->u.cfb.key, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
            {
                if (!bcmolt_buf_write(buf, this->u.ctr.key, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write(buf, this->u.ctr.sci, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_encryption_information_container_get_packed_length(const bcmolt_encryption_information_container *this)
{
    uint32_t count = 1;
    switch (this->format)
    {
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
            {
                count += 16;
            }
            break;
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
            {
                count += 24;
            }
            break;
        default:
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_encryption_information_container_unpack(bcmolt_encryption_information_container *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_encryption_information_format_unpack(&this->format, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->format)
    {
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
            {
                if (!bcmolt_buf_read(buf, this->u.cfb.key, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
            {
                if (!bcmolt_buf_read(buf, this->u.ctr.key, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read(buf, this->u.ctr.sci, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_encryption_information_container_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_encryption_information_format format;
    if (!bcmolt_epon_encryption_information_format_unpack(&format, packed))
    {
        return BCMOS_FALSE;
    }

    switch (format)
    {
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
            {
                if (!bcmolt_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
            {
                if (!bcmolt_buf_skip(packed, 16))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_encryption_information_container_bounds_check(const bcmolt_encryption_information_container *this)
{
    switch (this->format)
    {
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB:
            {
            }
            break;
        case BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR:
            {
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_clock_transport_configuration_set_default(bcmolt_epon_clock_transport_configuration *this)
{
    this->epon_clock_transport_mode = BCMOLT_EPON_CLOCK_TRANSPORT_MODE_HOST_DRIVEN;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_configuration_pack(const bcmolt_epon_clock_transport_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_clock_transport_mode_pack(this->epon_clock_transport_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_configuration_unpack(bcmolt_epon_clock_transport_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_clock_transport_mode_unpack(&this->epon_clock_transport_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_clock_transport_configuration_bounds_check(const bcmolt_epon_clock_transport_configuration *this)
{
    switch (this->epon_clock_transport_mode)
    {
        case BCMOLT_EPON_CLOCK_TRANSPORT_MODE_HOST_DRIVEN:
            break;
        case BCMOLT_EPON_CLOCK_TRANSPORT_MODE_EMBEDDED_DRIVEN:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_unknown_link_status_set_default(bcmolt_unknown_link_status *this)
{
    this->link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    this->alarm_status = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_unknown_link_status_pack(const bcmolt_unknown_link_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_link_rate_pack(this->link_rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_unknown_link_status_unpack(bcmolt_unknown_link_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_link_rate_unpack(&this->link_rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_unknown_link_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_unknown_link_status_bounds_check(const bcmolt_unknown_link_status *this)
{
    switch (this->link_rate)
    {
        case BCMOLT_EPON_LINK_RATE_TEN_TEN:
            break;
        case BCMOLT_EPON_LINK_RATE_TEN_ONE:
            break;
        case BCMOLT_EPON_LINK_RATE_ONE_ONE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->alarm_status)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_laser_on_off_status_set_default(bcmolt_laser_on_off_status *this)
{
    this->laser_on_time = (bcmolt_time_quanta) 0;
    this->laser_off_time = (bcmolt_time_quanta) 0;
    this->alarm_status = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_laser_on_off_status_pack(const bcmolt_laser_on_off_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_on_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_off_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_laser_on_off_status_unpack(bcmolt_laser_on_off_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_on_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_off_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_laser_on_off_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_laser_on_off_status_bounds_check(const bcmolt_laser_on_off_status *this)
{
    switch (this->alarm_status)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_range_status_set_default(bcmolt_range_status *this)
{
    this->range = (bcmolt_time_quanta) 0;
    this->alarm_status = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_range_status_pack(const bcmolt_range_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_range_status_unpack(bcmolt_range_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_range_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_range_status_bounds_check(const bcmolt_range_status *this)
{
    switch (this->alarm_status)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_rogue_status_set_default(bcmolt_rogue_status *this)
{
    this->denied_llid = (bcmolt_epon_llid) 0;
    this->denied_range = (bcmolt_time_quanta) 0;
    this->alarm_status = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_status_pack(const bcmolt_rogue_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->denied_llid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->denied_range))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_status_unpack(bcmolt_rogue_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->denied_llid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->denied_range))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->alarm_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_status_bounds_check(const bcmolt_rogue_status *this)
{
    switch (this->alarm_status)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_alarm_state_set_default(bcmolt_epon_denied_link_alarm_state *this)
{
    this->unknown_link_violation.link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    this->unknown_link_violation.alarm_status = BCMOLT_STATUS_OFF;
    this->overhead_profile_violation = BCMOLT_STATUS_OFF;
    this->max_link_violation = BCMOLT_STATUS_OFF;
    this->llid_pool_empty_violation = BCMOLT_STATUS_OFF;
    this->laser_on_off_violation.laser_on_time = (bcmolt_time_quanta) 0;
    this->laser_on_off_violation.laser_off_time = (bcmolt_time_quanta) 0;
    this->laser_on_off_violation.alarm_status = BCMOLT_STATUS_OFF;
    this->system_resource_violation = BCMOLT_STATUS_OFF;
    this->range_violation.range = (bcmolt_time_quanta) 0;
    this->range_violation.alarm_status = BCMOLT_STATUS_OFF;
    this->tdm_channels_exhausted = BCMOLT_STATUS_OFF;
    this->rogue_violation.denied_llid = (bcmolt_epon_llid) 0;
    this->rogue_violation.denied_range = (bcmolt_time_quanta) 0;
    this->rogue_violation.alarm_status = BCMOLT_STATUS_OFF;
    this->upstream_bandwidth_violation = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_alarm_state_pack(const bcmolt_epon_denied_link_alarm_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_unknown_link_status_pack(&this->unknown_link_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->overhead_profile_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->max_link_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->llid_pool_empty_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_laser_on_off_status_pack(&this->laser_on_off_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->system_resource_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_range_status_pack(&this->range_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->tdm_channels_exhausted, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_status_pack(&this->rogue_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->upstream_bandwidth_violation, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_alarm_state_unpack(bcmolt_epon_denied_link_alarm_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_unknown_link_status_unpack(&this->unknown_link_violation, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->overhead_profile_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->max_link_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->llid_pool_empty_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_laser_on_off_status_unpack(&this->laser_on_off_violation, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->system_resource_violation, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_range_status_unpack(&this->range_violation, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->tdm_channels_exhausted, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_status_unpack(&this->rogue_violation, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->upstream_bandwidth_violation, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 30);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_alarm_state_bounds_check(const bcmolt_epon_denied_link_alarm_state *this)
{
    if (!bcmolt_unknown_link_status_bounds_check(&this->unknown_link_violation))
    {
        return BCMOS_FALSE;
    }

    switch (this->overhead_profile_violation)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->max_link_violation)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->llid_pool_empty_violation)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_laser_on_off_status_bounds_check(&this->laser_on_off_violation))
    {
        return BCMOS_FALSE;
    }

    switch (this->system_resource_violation)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_range_status_bounds_check(&this->range_violation))
    {
        return BCMOS_FALSE;
    }

    switch (this->tdm_channels_exhausted)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_status_bounds_check(&this->rogue_violation))
    {
        return BCMOS_FALSE;
    }

    switch (this->upstream_bandwidth_violation)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_encryption_config_set_default(bcmolt_epon_encryption_config *this)
{
    this->downstream_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
    this->downstream_key_choice = BCMOLT_EPON_KEY_CHOICE_KEY_0;
    this->downstream_encryption_information.format = BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB;
    memset(this->downstream_encryption_information.u.cfb.key, 0, sizeof(this->downstream_encryption_information.u.cfb.key));
    this->upstream_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
    this->upstream_key_choice = BCMOLT_EPON_KEY_CHOICE_KEY_0;
    this->upstream_encryption_information.format = BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB;
    memset(this->upstream_encryption_information.u.cfb.key, 0, sizeof(this->upstream_encryption_information.u.cfb.key));
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_config_pack(const bcmolt_epon_encryption_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_encryption_mode_pack(this->downstream_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_key_choice_pack(this->downstream_key_choice, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_pack(&this->downstream_encryption_information, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_encryption_mode_pack(this->upstream_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_key_choice_pack(this->upstream_key_choice, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_pack(&this->upstream_encryption_information, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_encryption_config_get_packed_length(const bcmolt_epon_encryption_config *this)
{
    return 6 + bcmolt_encryption_information_container_get_packed_length(&this->downstream_encryption_information) + bcmolt_encryption_information_container_get_packed_length(&this->upstream_encryption_information);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_config_unpack(bcmolt_epon_encryption_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_encryption_mode_unpack(&this->downstream_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_key_choice_unpack(&this->downstream_key_choice, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_unpack(&this->downstream_encryption_information, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_encryption_mode_unpack(&this->upstream_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_key_choice_unpack(&this->upstream_key_choice, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_unpack(&this->upstream_encryption_information, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

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

    if (!bcmolt_encryption_information_container_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

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

    if (!bcmolt_encryption_information_container_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_encryption_config_bounds_check(const bcmolt_epon_encryption_config *this)
{
    switch (this->downstream_mode)
    {
        case BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_TRIPLE_CHURNING:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_ZERO_OVERHEAD_AES:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->downstream_key_choice)
    {
        case BCMOLT_EPON_KEY_CHOICE_KEY_0:
            break;
        case BCMOLT_EPON_KEY_CHOICE_KEY_1:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_bounds_check(&this->downstream_encryption_information))
    {
        return BCMOS_FALSE;
    }

    switch (this->upstream_mode)
    {
        case BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_TRIPLE_CHURNING:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_ZERO_OVERHEAD_AES:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->upstream_key_choice)
    {
        case BCMOLT_EPON_KEY_CHOICE_KEY_0:
            break;
        case BCMOLT_EPON_KEY_CHOICE_KEY_1:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_encryption_information_container_bounds_check(&this->upstream_encryption_information))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_key_exchange_config_set_default(bcmolt_epon_key_exchange_config *this)
{
    this->oam_type = BCMOLT_EPON_OAM_TYPE_BROADCOM;
    this->period = 0;
    this->direction = BCMOLT_EPON_ENCRYPTION_DIRECTION_DOWNSTREAM_ONLY;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_exchange_config_pack(const bcmolt_epon_key_exchange_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_oam_type_pack(this->oam_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->period))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_exchange_config_unpack(bcmolt_epon_key_exchange_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_type_unpack(&this->oam_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->period))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_exchange_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_key_exchange_config_bounds_check(const bcmolt_epon_key_exchange_config *this)
{
    switch (this->oam_type)
    {
        case BCMOLT_EPON_OAM_TYPE_BROADCOM:
            break;
        case BCMOLT_EPON_OAM_TYPE_CTC:
            break;
        case BCMOLT_EPON_OAM_TYPE_DPOE:
            break;
        case BCMOLT_EPON_OAM_TYPE_SIEPONA:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->direction)
    {
        case BCMOLT_EPON_ENCRYPTION_DIRECTION_DOWNSTREAM_ONLY:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_laser_overhead_parameters_set_default(bcmolt_epon_laser_overhead_parameters *this)
{
    this->laser_on_time = (bcmolt_time_quanta) 32;
    this->laser_off_time = (bcmolt_time_quanta) 32;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_laser_overhead_parameters_pack(const bcmolt_epon_laser_overhead_parameters *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_on_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_off_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_laser_overhead_parameters_unpack(bcmolt_epon_laser_overhead_parameters *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_on_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_off_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_laser_overhead_parameters_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_laser_overhead_parameters_bounds_check(const bcmolt_epon_laser_overhead_parameters *this)
{
    if (this->laser_on_time > (bcmolt_time_quanta) 62)
    {
        return BCMOS_FALSE;
    }

    if (this->laser_off_time > (bcmolt_time_quanta) 62)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_alarm_state_set_default(bcmolt_epon_link_alarm_state *this)
{
    this->key_exchange_failure = BCMOLT_STATUS_OFF;
    this->invalid_mpcp_report_received = BCMOLT_STATUS_OFF;
    this->mpcp_report_timeout = BCMOLT_STATUS_OFF;
    this->oam_keepalive_timeout = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_alarm_state_pack(const bcmolt_epon_link_alarm_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->key_exchange_failure, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->invalid_mpcp_report_received, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->mpcp_report_timeout, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->oam_keepalive_timeout, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_alarm_state_unpack(bcmolt_epon_link_alarm_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->key_exchange_failure, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->invalid_mpcp_report_received, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->mpcp_report_timeout, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->oam_keepalive_timeout, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_alarm_state_bounds_check(const bcmolt_epon_link_alarm_state *this)
{
    switch (this->key_exchange_failure)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->invalid_mpcp_report_received)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->mpcp_report_timeout)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->oam_keepalive_timeout)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_fec_en_set_default(bcmolt_epon_link_fec_en *this)
{
    this->upstream = BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT;
    this->downstream = BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_en_pack(const bcmolt_epon_link_fec_en *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_link_fec_state_pack(this->upstream, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_link_fec_state_pack(this->downstream, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_en_unpack(bcmolt_epon_link_fec_en *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_link_fec_state_unpack(&this->upstream, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_link_fec_state_unpack(&this->downstream, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_en_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_fec_en_bounds_check(const bcmolt_epon_link_fec_en *this)
{
    switch (this->upstream)
    {
        case BCMOLT_EPON_LINK_FEC_STATE_DISABLED:
            break;
        case BCMOLT_EPON_LINK_FEC_STATE_ENABLED:
            break;
        case BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->downstream)
    {
        case BCMOLT_EPON_LINK_FEC_STATE_DISABLED:
            break;
        case BCMOLT_EPON_LINK_FEC_STATE_ENABLED:
            break;
        case BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_info_set_default(bcmolt_epon_link_info *this)
{
    this->link_status = (bcmolt_epon_link_status) 0;
    this->rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    this->llid = (bcmolt_epon_llid) 0;
    this->mpcp_discovery_info = (bcmolt_mpcp_discovery_info) 0;
    this->onu_laser_on_time_tq = (bcmolt_time_quanta) 0;
    this->onu_laser_off_time_tq = (bcmolt_time_quanta) 0;
    this->pending_grants = 0;
    this->range_value_tq = (bcmolt_time_quanta) 0;
    this->tunnel_id = (bcmolt_epon_tunnel_id) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_info_pack(const bcmolt_epon_link_info *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_link_status_pack(this->link_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_link_rate_pack(this->rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->llid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mpcp_discovery_info_pack(this->mpcp_discovery_info, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->onu_laser_on_time_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->onu_laser_off_time_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->pending_grants))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->tunnel_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_info_unpack(bcmolt_epon_link_info *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_link_status_unpack(&this->link_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_link_rate_unpack(&this->rate, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->llid))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mpcp_discovery_info_unpack(&this->mpcp_discovery_info, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->onu_laser_on_time_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->onu_laser_off_time_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->pending_grants))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->tunnel_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_info_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 24);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_info_bounds_check(const bcmolt_epon_link_info *this)
{
    if ((this->link_status & 0x00F6) != 0)
    {
        return BCMOS_FALSE;
    }

    switch (this->rate)
    {
        case BCMOLT_EPON_LINK_RATE_TEN_TEN:
            break;
        case BCMOLT_EPON_LINK_RATE_TEN_ONE:
            break;
        case BCMOLT_EPON_LINK_RATE_ONE_ONE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if ((this->mpcp_discovery_info & 0xFFCCU) != 0)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gate_parameters_set_default(bcmolt_gate_parameters *this)
{
    this->flags = (bcmolt_mpcp_registration_gate_flags) 0;
    this->delay_before_ms = 50;
    this->gate_size_tq = (bcmolt_time_quanta) 42;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_pack(const bcmolt_gate_parameters *this, bcmolt_buf *buf)
{
    if (!bcmolt_mpcp_registration_gate_flags_pack(this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->delay_before_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->gate_size_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_unpack(bcmolt_gate_parameters *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_mpcp_registration_gate_flags_unpack(&this->flags, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->delay_before_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->gate_size_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_bounds_check(const bcmolt_gate_parameters *this)
{
    if ((this->flags & 0xFFFFFFFEUL) != 0)
    {
        return BCMOS_FALSE;
    }

    if (this->delay_before_ms > 3600000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->gate_size_tq > (bcmolt_time_quanta) 65535UL)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gate_parameters_list_u32_set_default(bcmolt_gate_parameters_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_list_u32_pack(const bcmolt_gate_parameters_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_gate_parameters_list_u32\" 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_gate_parameters_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gate_parameters_list_u32_get_packed_length(const bcmolt_gate_parameters_list_u32 *this)
{
    return 4 + (12 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_list_u32_unpack(bcmolt_gate_parameters_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_gate_parameters_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gate_parameters *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gate_parameters));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gate_parameters_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gate_parameters) * len);
    if (!bcmolt_buf_skip(packed, len * 12))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gate_parameters_list_u32_bounds_check(const bcmolt_gate_parameters_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_registration_gate_mode_set_default(bcmolt_epon_registration_gate_mode *this)
{
    this->registration_gate_mode = (bcmolt_mpcp_gate_mode) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_registration_gate_mode_pack(const bcmolt_epon_registration_gate_mode *this, bcmolt_buf *buf)
{
    if (!bcmolt_mpcp_gate_mode_pack(this->registration_gate_mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->registration_gate_mode)
    {
        case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
            {
                if (!bcmolt_buf_write_u16(buf, this->u.teknovus.reg_ack_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_MPCP_GATE_MODE_CUSTOM:
            {
                if (!bcmolt_gate_parameters_list_u32_pack(&this->u.custom.gates, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_registration_gate_mode_get_packed_length(const bcmolt_epon_registration_gate_mode *this)
{
    uint32_t count = 1;
    switch (this->registration_gate_mode)
    {
        case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
            {
                count += 2;
            }
            break;
        case BCMOLT_MPCP_GATE_MODE_CUSTOM:
            {
                count += bcmolt_gate_parameters_list_u32_get_packed_length(&this->u.custom.gates);
            }
            break;
        default:
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_registration_gate_mode_unpack(bcmolt_epon_registration_gate_mode *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_mpcp_gate_mode_unpack(&this->registration_gate_mode, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->registration_gate_mode)
    {
        case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
            {
                if (!bcmolt_buf_read_u16(buf, &this->u.teknovus.reg_ack_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_MPCP_GATE_MODE_CUSTOM:
            {
                if (!bcmolt_gate_parameters_list_u32_unpack(&this->u.custom.gates, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_registration_gate_mode_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_mpcp_gate_mode registration_gate_mode;
    if (!bcmolt_mpcp_gate_mode_unpack(&registration_gate_mode, packed))
    {
        return BCMOS_FALSE;
    }

    switch (registration_gate_mode)
    {
        case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
            {
                if (!bcmolt_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_MPCP_GATE_MODE_CUSTOM:
            {
                if (!bcmolt_gate_parameters_list_u32_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_registration_gate_mode_bounds_check(const bcmolt_epon_registration_gate_mode *this)
{
    switch (this->registration_gate_mode)
    {
        case BCMOLT_MPCP_GATE_MODE_TEKNOVUS:
            {
                if (this->u.teknovus.reg_ack_timeout_ms < 50)
                {
                    return BCMOS_FALSE;
                }

                if (this->u.teknovus.reg_ack_timeout_ms > 200)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_MPCP_GATE_MODE_CUSTOM:
            {
                if (!bcmolt_gate_parameters_list_u32_bounds_check(&this->u.custom.gates))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_logical_link_options_set_default(bcmolt_epon_logical_link_options *this)
{
    this->registration_gate_mode.registration_gate_mode = BCMOLT_MPCP_GATE_MODE_TEKNOVUS;
    this->registration_gate_mode.u.teknovus.reg_ack_timeout_ms = 100;
    this->reporting_mode = BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_A;
    this->max_links = 512;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_logical_link_options_pack(const bcmolt_epon_logical_link_options *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_registration_gate_mode_pack(&this->registration_gate_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_dba_reporting_mode_pack(this->reporting_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->max_links))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_logical_link_options_get_packed_length(const bcmolt_epon_logical_link_options *this)
{
    return 3 + bcmolt_epon_registration_gate_mode_get_packed_length(&this->registration_gate_mode);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_logical_link_options_unpack(bcmolt_epon_logical_link_options *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_registration_gate_mode_unpack(&this->registration_gate_mode, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_dba_reporting_mode_unpack(&this->reporting_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->max_links))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_logical_link_options_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_epon_registration_gate_mode_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

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

    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_logical_link_options_bounds_check(const bcmolt_epon_logical_link_options *this)
{
    if (!bcmolt_epon_registration_gate_mode_bounds_check(&this->registration_gate_mode))
    {
        return BCMOS_FALSE;
    }

    switch (this->reporting_mode)
    {
        case BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_A:
            break;
        case BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_B:
            break;
        case BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_C:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->max_links > 2044)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_alarm_state_set_default(bcmolt_epon_ni_alarm_state *this)
{
    this->no_reports = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_alarm_state_pack(const bcmolt_epon_ni_alarm_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->no_reports, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_alarm_state_unpack(bcmolt_epon_ni_alarm_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->no_reports, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 1);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_alarm_state_bounds_check(const bcmolt_epon_ni_alarm_state *this)
{
    switch (this->no_reports)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_encryption_cfg_set_default(bcmolt_epon_ni_encryption_cfg *this)
{
    this->downstream_encryption_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
    this->upstream_encryption_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_encryption_cfg_pack(const bcmolt_epon_ni_encryption_cfg *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_encryption_mode_pack(this->downstream_encryption_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_encryption_mode_pack(this->upstream_encryption_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_encryption_cfg_unpack(bcmolt_epon_ni_encryption_cfg *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_encryption_mode_unpack(&this->downstream_encryption_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_encryption_mode_unpack(&this->upstream_encryption_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_encryption_cfg_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_encryption_cfg_bounds_check(const bcmolt_epon_ni_encryption_cfg *this)
{
    switch (this->downstream_encryption_mode)
    {
        case BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_TRIPLE_CHURNING:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_ZERO_OVERHEAD_AES:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->upstream_encryption_mode)
    {
        case BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_TRIPLE_CHURNING:
            break;
        case BCMOLT_EPON_ENCRYPTION_MODE_EPON_ZERO_OVERHEAD_AES:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_upgrade_params_set_default(bcmolt_epon_onu_upgrade_params *this)
{
    this->oam_extension_type = (bcmolt_epon_oam_extension_type) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_params_pack(const bcmolt_epon_onu_upgrade_params *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_oam_extension_type_pack(this->oam_extension_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oam_extension_type)
    {
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.broadcom.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.ctc.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.dasan.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.kt.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.dpoe.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_u16(buf, this->u.dpoe.block_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_u32(buf, this->u.dpoe.final_ack_response_timeout))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_upgrade_params_get_packed_length(const bcmolt_epon_onu_upgrade_params *this)
{
    uint32_t count = 1;
    switch (this->oam_extension_type)
    {
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
            {
                count += 4;
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
            {
                count += 10;
            }
            break;
        default:
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_params_unpack(bcmolt_epon_onu_upgrade_params *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_oam_extension_type_unpack(&this->oam_extension_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->oam_extension_type)
    {
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.broadcom.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.ctc.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.dasan.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.kt.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.dpoe.response_timeout_ms))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_u16(buf, &this->u.dpoe.block_size))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_u32(buf, &this->u.dpoe.final_ack_response_timeout))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_params_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_epon_oam_extension_type oam_extension_type;
    if (!bcmolt_epon_oam_extension_type_unpack(&oam_extension_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (oam_extension_type)
    {
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_skip(packed, 2))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_params_bounds_check(const bcmolt_epon_onu_upgrade_params *this)
{
    switch (this->oam_extension_type)
    {
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED:
            {
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM:
            {
                if (this->u.broadcom.response_timeout_ms < 50)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC:
            {
                if (this->u.ctc.response_timeout_ms < 100)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN:
            {
                if (this->u.dasan.response_timeout_ms < 50)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_KT:
            {
                if (this->u.kt.response_timeout_ms < 50)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE:
            {
                if (this->u.dpoe.response_timeout_ms < 1000)
                {
                    return BCMOS_FALSE;
                }

                if (this->u.dpoe.block_size < 1)
                {
                    return BCMOS_FALSE;
                }

                if (this->u.dpoe.final_ack_response_timeout < 15)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_upgrade_status_set_default(bcmolt_epon_onu_upgrade_status *this)
{
    bcmos_mac_address_init(&this->onu_id);
    this->error_code = BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_SUCCESS;
    this->onu_return_code = BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_OK;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_pack(const bcmolt_epon_onu_upgrade_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_mac_address(buf, this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_onu_upgrade_return_code_pack(this->error_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_onu_upgrade_onu_response_code_pack(this->onu_return_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_unpack(bcmolt_epon_onu_upgrade_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_mac_address(buf, &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_onu_upgrade_return_code_unpack(&this->error_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_onu_upgrade_onu_response_code_unpack(&this->onu_return_code, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_bounds_check(const bcmolt_epon_onu_upgrade_status *this)
{
    switch (this->error_code)
    {
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_SUCCESS:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_ONU_RESPONSE_TIMEOUT:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_ONU_ERROR_RESPONSE:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_SYNC_ERROR:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_COMMIT_FAILED:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_INTERNAL:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_PARSE_ERROR:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->onu_return_code)
    {
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_OK:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_UNDEFINED:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_NOT_FOUND:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_NO_ACCESS:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_FULL:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ILLEGAL_OPERATION:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_UNKNOWN_ID:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_BAD_BLOCK:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_TIMEOUT:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_BUSY:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_INCOMPATIBLE_FILE:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_CORRUPTED_FILE:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_NOT_DEFINED:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_ALLOC_EXCEEDED:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_ILLEGAL_OP:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_FILE_EXISTS:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_WRITING_NVS:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_CRC_ERROR:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_PARAM_ERROR:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_CMD_UNSUPPORTED:
            break;
        case BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_LAST:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_upgrade_status_list_u32_set_default(bcmolt_epon_onu_upgrade_status_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_pack(const bcmolt_epon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_onu_upgrade_status_list_u32\" 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_onu_upgrade_status_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_upgrade_status_list_u32_get_packed_length(const bcmolt_epon_onu_upgrade_status_list_u32 *this)
{
    return 4 + (8 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_unpack(bcmolt_epon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_onu_upgrade_status_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_epon_onu_upgrade_status *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_epon_onu_upgrade_status));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_epon_onu_upgrade_status_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_epon_onu_upgrade_status) * len);
    if (!bcmolt_buf_skip(packed, len * 8))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_bounds_check(const bcmolt_epon_onu_upgrade_status_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_protection_switching_configuration_set_default(bcmolt_epon_protection_switching_configuration *this)
{
    this->protection_type = BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_NO_PROTECTION_SWTICHING;
    this->protection_switching_options = (bcmolt_protection_switching_detection_options) 0;
    this->rerange_options = BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_NONE;
    this->rerange_attempts = 0;
    this->rerange_interval = 0;
    this->sync_gate_duration = 0;
    this->gpio_input = BCMOLT_GPIO_PIN_UNCONFIGURED;
    this->gpio_input_polarity = BCMOLT_GPIO_POLARITY_ACTIVE_HIGH;
    this->gpio_output = BCMOLT_GPIO_PIN_UNCONFIGURED;
    this->gpio_output_polarity = BCMOLT_GPIO_POLARITY_ACTIVE_HIGH;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_configuration_pack(const bcmolt_epon_protection_switching_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_epon_protection_switching_type_pack(this->protection_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_protection_switching_detection_options_pack(this->protection_switching_options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_protection_switching_reranging_options_pack(this->rerange_options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->rerange_attempts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->rerange_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->sync_gate_duration))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_pack(this->gpio_input, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_polarity_pack(this->gpio_input_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_pack(this->gpio_output, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_polarity_pack(this->gpio_output_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_configuration_unpack(bcmolt_epon_protection_switching_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_epon_protection_switching_type_unpack(&this->protection_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_protection_switching_detection_options_unpack(&this->protection_switching_options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_epon_protection_switching_reranging_options_unpack(&this->rerange_options, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->rerange_attempts))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->rerange_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->sync_gate_duration))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_unpack(&this->gpio_input, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_polarity_unpack(&this->gpio_input_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_unpack(&this->gpio_output, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_polarity_unpack(&this->gpio_output_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_epon_protection_switching_configuration_bounds_check(const bcmolt_epon_protection_switching_configuration *this)
{
    switch (this->protection_type)
    {
        case BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_NO_PROTECTION_SWTICHING:
            break;
        case BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_LINE_CARD_PROTECTION_SWITCHING:
            break;
        default:
            return BCMOS_FALSE;
    }

    if ((this->protection_switching_options & 0x00FE) != 0)
    {
        return BCMOS_FALSE;
    }

    switch (this->rerange_options)
    {
        case BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_NONE:
            break;
        case BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_SINGLE_LOGICAL_LINK:
            break;
        case BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_ALL_LOGICAL_LINKS:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->gpio_input)
    {
        case BCMOLT_GPIO_PIN_PIN0:
            break;
        case BCMOLT_GPIO_PIN_PIN1:
            break;
        case BCMOLT_GPIO_PIN_PIN2:
            break;
        case BCMOLT_GPIO_PIN_PIN3:
            break;
        case BCMOLT_GPIO_PIN_PIN4:
            break;
        case BCMOLT_GPIO_PIN_PIN5:
            break;
        case BCMOLT_GPIO_PIN_PIN6:
            break;
        case BCMOLT_GPIO_PIN_PIN7:
            break;
        case BCMOLT_GPIO_PIN_PIN8:
            break;
        case BCMOLT_GPIO_PIN_PIN9:
            break;
        case BCMOLT_GPIO_PIN_PIN10:
            break;
        case BCMOLT_GPIO_PIN_PIN11:
            break;
        case BCMOLT_GPIO_PIN_PIN12:
            break;
        case BCMOLT_GPIO_PIN_PIN13:
            break;
        case BCMOLT_GPIO_PIN_PIN14:
            break;
        case BCMOLT_GPIO_PIN_PIN15:
            break;
        case BCMOLT_GPIO_PIN_PIN16:
            break;
        case BCMOLT_GPIO_PIN_PIN17:
            break;
        case BCMOLT_GPIO_PIN_PIN18:
            break;
        case BCMOLT_GPIO_PIN_PIN19:
            break;
        case BCMOLT_GPIO_PIN_PIN20:
            break;
        case BCMOLT_GPIO_PIN_PIN21:
            break;
        case BCMOLT_GPIO_PIN_PIN22:
            break;
        case BCMOLT_GPIO_PIN_PIN23:
            break;
        case BCMOLT_GPIO_PIN_PIN24:
            break;
        case BCMOLT_GPIO_PIN_PIN25:
            break;
        case BCMOLT_GPIO_PIN_PIN26:
            break;
        case BCMOLT_GPIO_PIN_PIN27:
            break;
        case BCMOLT_GPIO_PIN_PIN28:
            break;
        case BCMOLT_GPIO_PIN_PIN29:
            break;
        case BCMOLT_GPIO_PIN_PIN30:
            break;
        case BCMOLT_GPIO_PIN_PIN31:
            break;
        case BCMOLT_GPIO_PIN_PIN32:
            break;
        case BCMOLT_GPIO_PIN_PIN33:
            break;
        case BCMOLT_GPIO_PIN_PIN34:
            break;
        case BCMOLT_GPIO_PIN_PIN35:
            break;
        case BCMOLT_GPIO_PIN_PIN36:
            break;
        case BCMOLT_GPIO_PIN_PIN37:
            break;
        case BCMOLT_GPIO_PIN_PIN38:
            break;
        case BCMOLT_GPIO_PIN_PIN39:
            break;
        case BCMOLT_GPIO_PIN_PIN40:
            break;
        case BCMOLT_GPIO_PIN_PIN41:
            break;
        case BCMOLT_GPIO_PIN_PIN42:
            break;
        case BCMOLT_GPIO_PIN_PIN43:
            break;
        case BCMOLT_GPIO_PIN_PIN44:
            break;
        case BCMOLT_GPIO_PIN_PIN45:
            break;
        case BCMOLT_GPIO_PIN_PIN46:
            break;
        case BCMOLT_GPIO_PIN_PIN47:
            break;
        case BCMOLT_GPIO_PIN_PIN48:
            break;
        case BCMOLT_GPIO_PIN_PIN49:
            break;
        case BCMOLT_GPIO_PIN_PIN50:
            break;
        case BCMOLT_GPIO_PIN_PIN51:
            break;
        case BCMOLT_GPIO_PIN_PIN52:
            break;
        case BCMOLT_GPIO_PIN_PIN53:
            break;
        case BCMOLT_GPIO_PIN_PIN54:
            break;
        case BCMOLT_GPIO_PIN_PIN55:
            break;
        case BCMOLT_GPIO_PIN_PIN56:
            break;
        case BCMOLT_GPIO_PIN_PIN57:
            break;
        case BCMOLT_GPIO_PIN_PIN58:
            break;
        case BCMOLT_GPIO_PIN_PIN59:
            break;
        case BCMOLT_GPIO_PIN_PIN60:
            break;
        case BCMOLT_GPIO_PIN_PIN61:
            break;
        case BCMOLT_GPIO_PIN_PIN62:
            break;
        case BCMOLT_GPIO_PIN_PIN63:
            break;
        case BCMOLT_GPIO_PIN_PIN64:
            break;
        case BCMOLT_GPIO_PIN_PIN65:
            break;
        case BCMOLT_GPIO_PIN_PIN66:
            break;
        case BCMOLT_GPIO_PIN_PIN67:
            break;
        case BCMOLT_GPIO_PIN_PIN68:
            break;
        case BCMOLT_GPIO_PIN_PIN69:
            break;
        case BCMOLT_GPIO_PIN_PIN70:
            break;
        case BCMOLT_GPIO_PIN_PIN71:
            break;
        case BCMOLT_GPIO_PIN_PIN72:
            break;
        case BCMOLT_GPIO_PIN_PIN73:
            break;
        case BCMOLT_GPIO_PIN_PIN74:
            break;
        case BCMOLT_GPIO_PIN_PIN75:
            break;
        case BCMOLT_GPIO_PIN_PIN76:
            break;
        case BCMOLT_GPIO_PIN_PIN77:
            break;
        case BCMOLT_GPIO_PIN_PIN78:
            break;
        case BCMOLT_GPIO_PIN_PIN79:
            break;
        case BCMOLT_GPIO_PIN_PIN80:
            break;
        case BCMOLT_GPIO_PIN_PIN81:
            break;
        case BCMOLT_GPIO_PIN_PIN82:
            break;
        case BCMOLT_GPIO_PIN_PIN83:
            break;
        case BCMOLT_GPIO_PIN_PIN84:
            break;
        case BCMOLT_GPIO_PIN_PIN85:
            break;
        case BCMOLT_GPIO_PIN_PIN86:
            break;
        case BCMOLT_GPIO_PIN_PIN87:
            break;
        case BCMOLT_GPIO_PIN_PIN88:
            break;
        case BCMOLT_GPIO_PIN_PIN89:
            break;
        case BCMOLT_GPIO_PIN_PIN90:
            break;
        case BCMOLT_GPIO_PIN_PIN91:
            break;
        case BCMOLT_GPIO_PIN_PIN92:
            break;
        case BCMOLT_GPIO_PIN_PIN93:
            break;
        case BCMOLT_GPIO_PIN_PIN94:
            break;
        case BCMOLT_GPIO_PIN_PIN95:
            break;
        case BCMOLT_GPIO_PIN_PIN96:
            break;
        case BCMOLT_GPIO_PIN_PIN97:
            break;
        case BCMOLT_GPIO_PIN_PIN98:
            break;
        case BCMOLT_GPIO_PIN_PIN99:
            break;
        case BCMOLT_GPIO_PIN_PIN100:
            break;
        case BCMOLT_GPIO_PIN_PIN101:
            break;
        case BCMOLT_GPIO_PIN_PIN102:
            break;
        case BCMOLT_GPIO_PIN_PIN103:
            break;
        case BCMOLT_GPIO_PIN_PIN104:
            break;
        case BCMOLT_GPIO_PIN_PIN105:
            break;
        case BCMOLT_GPIO_PIN_PIN106:
            break;
        case BCMOLT_GPIO_PIN_UNCONFIGURED:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->gpio_input_polarity)
    {
        case BCMOLT_GPIO_POLARITY_ACTIVE_LOW:
            break;
        case BCMOLT_GPIO_POLARITY_ACTIVE_HIGH:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->gpio_output)
    {
        case BCMOLT_GPIO_PIN_PIN0:
            break;
        case BCMOLT_GPIO_PIN_PIN1:
            break;
        case BCMOLT_GPIO_PIN_PIN2:
            break;
        case BCMOLT_GPIO_PIN_PIN3:
            break;
        case BCMOLT_GPIO_PIN_PIN4:
            break;
        case BCMOLT_GPIO_PIN_PIN5:
            break;
        case BCMOLT_GPIO_PIN_PIN6:
            break;
        case BCMOLT_GPIO_PIN_PIN7:
            break;
        case BCMOLT_GPIO_PIN_PIN8:
            break;
        case BCMOLT_GPIO_PIN_PIN9:
            break;
        case BCMOLT_GPIO_PIN_PIN10:
            break;
        case BCMOLT_GPIO_PIN_PIN11:
            break;
        case BCMOLT_GPIO_PIN_PIN12:
            break;
        case BCMOLT_GPIO_PIN_PIN13:
            break;
        case BCMOLT_GPIO_PIN_PIN14:
            break;
        case BCMOLT_GPIO_PIN_PIN15:
            break;
        case BCMOLT_GPIO_PIN_PIN16:
            break;
        case BCMOLT_GPIO_PIN_PIN17:
            break;
        case BCMOLT_GPIO_PIN_PIN18:
            break;
        case BCMOLT_GPIO_PIN_PIN19:
            break;
        case BCMOLT_GPIO_PIN_PIN20:
            break;
        case BCMOLT_GPIO_PIN_PIN21:
            break;
        case BCMOLT_GPIO_PIN_PIN22:
            break;
        case BCMOLT_GPIO_PIN_PIN23:
            break;
        case BCMOLT_GPIO_PIN_PIN24:
            break;
        case BCMOLT_GPIO_PIN_PIN25:
            break;
        case BCMOLT_GPIO_PIN_PIN26:
            break;
        case BCMOLT_GPIO_PIN_PIN27:
            break;
        case BCMOLT_GPIO_PIN_PIN28:
            break;
        case BCMOLT_GPIO_PIN_PIN29:
            break;
        case BCMOLT_GPIO_PIN_PIN30:
            break;
        case BCMOLT_GPIO_PIN_PIN31:
            break;
        case BCMOLT_GPIO_PIN_PIN32:
            break;
        case BCMOLT_GPIO_PIN_PIN33:
            break;
        case BCMOLT_GPIO_PIN_PIN34:
            break;
        case BCMOLT_GPIO_PIN_PIN35:
            break;
        case BCMOLT_GPIO_PIN_PIN36:
            break;
        case BCMOLT_GPIO_PIN_PIN37:
            break;
        case BCMOLT_GPIO_PIN_PIN38:
            break;
        case BCMOLT_GPIO_PIN_PIN39:
            break;
        case BCMOLT_GPIO_PIN_PIN40:
            break;
        case BCMOLT_GPIO_PIN_PIN41:
            break;
        case BCMOLT_GPIO_PIN_PIN42:
            break;
        case BCMOLT_GPIO_PIN_PIN43:
            break;
        case BCMOLT_GPIO_PIN_PIN44:
            break;
        case BCMOLT_GPIO_PIN_PIN45:
            break;
        case BCMOLT_GPIO_PIN_PIN46:
            break;
        case BCMOLT_GPIO_PIN_PIN47:
            break;
        case BCMOLT_GPIO_PIN_PIN48:
            break;
        case BCMOLT_GPIO_PIN_PIN49:
            break;
        case BCMOLT_GPIO_PIN_PIN50:
            break;
        case BCMOLT_GPIO_PIN_PIN51:
            break;
        case BCMOLT_GPIO_PIN_PIN52:
            break;
        case BCMOLT_GPIO_PIN_PIN53:
            break;
        case BCMOLT_GPIO_PIN_PIN54:
            break;
        case BCMOLT_GPIO_PIN_PIN55:
            break;
        case BCMOLT_GPIO_PIN_PIN56:
            break;
        case BCMOLT_GPIO_PIN_PIN57:
            break;
        case BCMOLT_GPIO_PIN_PIN58:
            break;
        case BCMOLT_GPIO_PIN_PIN59:
            break;
        case BCMOLT_GPIO_PIN_PIN60:
            break;
        case BCMOLT_GPIO_PIN_PIN61:
            break;
        case BCMOLT_GPIO_PIN_PIN62:
            break;
        case BCMOLT_GPIO_PIN_PIN63:
            break;
        case BCMOLT_GPIO_PIN_PIN64:
            break;
        case BCMOLT_GPIO_PIN_PIN65:
            break;
        case BCMOLT_GPIO_PIN_PIN66:
            break;
        case BCMOLT_GPIO_PIN_PIN67:
            break;
        case BCMOLT_GPIO_PIN_PIN68:
            break;
        case BCMOLT_GPIO_PIN_PIN69:
            break;
        case BCMOLT_GPIO_PIN_PIN70:
            break;
        case BCMOLT_GPIO_PIN_PIN71:
            break;
        case BCMOLT_GPIO_PIN_PIN72:
            break;
        case BCMOLT_GPIO_PIN_PIN73:
            break;
        case BCMOLT_GPIO_PIN_PIN74:
            break;
        case BCMOLT_GPIO_PIN_PIN75:
            break;
        case BCMOLT_GPIO_PIN_PIN76:
            break;
        case BCMOLT_GPIO_PIN_PIN77:
            break;
        case BCMOLT_GPIO_PIN_PIN78:
            break;
        case BCMOLT_GPIO_PIN_PIN79:
            break;
        case BCMOLT_GPIO_PIN_PIN80:
            break;
        case BCMOLT_GPIO_PIN_PIN81:
            break;
        case BCMOLT_GPIO_PIN_PIN82:
            break;
        case BCMOLT_GPIO_PIN_PIN83:
            break;
        case BCMOLT_GPIO_PIN_PIN84:
            break;
        case BCMOLT_GPIO_PIN_PIN85:
            break;
        case BCMOLT_GPIO_PIN_PIN86:
            break;
        case BCMOLT_GPIO_PIN_PIN87:
            break;
        case BCMOLT_GPIO_PIN_PIN88:
            break;
        case BCMOLT_GPIO_PIN_PIN89:
            break;
        case BCMOLT_GPIO_PIN_PIN90:
            break;
        case BCMOLT_GPIO_PIN_PIN91:
            break;
        case BCMOLT_GPIO_PIN_PIN92:
            break;
        case BCMOLT_GPIO_PIN_PIN93:
            break;
        case BCMOLT_GPIO_PIN_PIN94:
            break;
        case BCMOLT_GPIO_PIN_PIN95:
            break;
        case BCMOLT_GPIO_PIN_PIN96:
            break;
        case BCMOLT_GPIO_PIN_PIN97:
            break;
        case BCMOLT_GPIO_PIN_PIN98:
            break;
        case BCMOLT_GPIO_PIN_PIN99:
            break;
        case BCMOLT_GPIO_PIN_PIN100:
            break;
        case BCMOLT_GPIO_PIN_PIN101:
            break;
        case BCMOLT_GPIO_PIN_PIN102:
            break;
        case BCMOLT_GPIO_PIN_PIN103:
            break;
        case BCMOLT_GPIO_PIN_PIN104:
            break;
        case BCMOLT_GPIO_PIN_PIN105:
            break;
        case BCMOLT_GPIO_PIN_PIN106:
            break;
        case BCMOLT_GPIO_PIN_UNCONFIGURED:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->gpio_output_polarity)
    {
        case BCMOLT_GPIO_POLARITY_ACTIVE_LOW:
            break;
        case BCMOLT_GPIO_POLARITY_ACTIVE_HIGH:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_u8_list_u16_set_default(bcmolt_u8_list_u16 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_pack(const bcmolt_u8_list_u16 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(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_u8_list_u16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_u8_list_u16_get_packed_length(const bcmolt_u8_list_u16 *this)
{
    return 2 + this->len;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_unpack(bcmolt_u8_list_u16 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(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_u8_list_u16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint8_t));
        }
    }

    if (!bcmolt_buf_read(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_bounds_check(const bcmolt_u8_list_u16 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ethernet_frame_masked_set_default(bcmolt_ethernet_frame_masked *this)
{
    this->frame_octets.len = 0;
    this->frame_octets.val = NULL;
    this->mask_octets.len = 0;
    this->mask_octets.val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_masked_pack(const bcmolt_ethernet_frame_masked *this, bcmolt_buf *buf)
{
    if (!bcmolt_u8_list_u16_pack(&this->frame_octets, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_pack(&this->mask_octets, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ethernet_frame_masked_get_packed_length(const bcmolt_ethernet_frame_masked *this)
{
    return bcmolt_u8_list_u16_get_packed_length(&this->frame_octets) + bcmolt_u8_list_u16_get_packed_length(&this->mask_octets);
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_masked_unpack(bcmolt_ethernet_frame_masked *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_u8_list_u16_unpack(&this->frame_octets, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_unpack(&this->mask_octets, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_masked_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_u8_list_u16_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_masked_bounds_check(const bcmolt_ethernet_frame_masked *this)
{
    if (!bcmolt_u8_list_u16_bounds_check(&this->frame_octets))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_bounds_check(&this->mask_octets))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ethernet_frame_unmasked_set_default(bcmolt_ethernet_frame_unmasked *this)
{
    this->frame_octets.len = 0;
    this->frame_octets.val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_unmasked_pack(const bcmolt_ethernet_frame_unmasked *this, bcmolt_buf *buf)
{
    if (!bcmolt_u8_list_u16_pack(&this->frame_octets, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ethernet_frame_unmasked_get_packed_length(const bcmolt_ethernet_frame_unmasked *this)
{
    return bcmolt_u8_list_u16_get_packed_length(&this->frame_octets);
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_unmasked_unpack(bcmolt_ethernet_frame_unmasked *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_u8_list_u16_unpack(&this->frame_octets, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_unmasked_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_u8_list_u16_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ethernet_frame_unmasked_bounds_check(const bcmolt_ethernet_frame_unmasked *this)
{
    if (!bcmolt_u8_list_u16_bounds_check(&this->frame_octets))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_extended_guard_time_set_default(bcmolt_extended_guard_time *this)
{
    this->additional_preburst_guard_time = 0;
    this->additional_postburst_guard_time = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_extended_guard_time_pack(const bcmolt_extended_guard_time *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->additional_preburst_guard_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->additional_postburst_guard_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_extended_guard_time_unpack(bcmolt_extended_guard_time *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->additional_preburst_guard_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->additional_postburst_guard_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_extended_guard_time_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_extended_guard_time_bounds_check(const bcmolt_extended_guard_time *this)
{
    if (this->additional_preburst_guard_time > 500)
    {
        return BCMOS_FALSE;
    }

    if (this->additional_postburst_guard_time > 500)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_firmware_sw_version_set_default(bcmolt_firmware_sw_version *this)
{
    this->major = 0;
    this->minor = 0;
    this->revision = 0;
    this->model = 0;
    memset(this->build_time, 0, 32);
}

/******************************************************************************/
bcmos_bool bcmolt_firmware_sw_version_pack(const bcmolt_firmware_sw_version *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->model))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->build_time, 32))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_firmware_sw_version_unpack(bcmolt_firmware_sw_version *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->model))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->build_time, 32))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_firmware_sw_version_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 39);
}

/******************************************************************************/
bcmos_bool bcmolt_firmware_sw_version_bounds_check(const bcmolt_firmware_sw_version *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gem_port_configuration_set_default(bcmolt_gem_port_configuration *this)
{
    this->direction = BCMOLT_GEM_PORT_DIRECTION_DOWNSTREAM;
    this->type = BCMOLT_GEM_PORT_TYPE_UNICAST;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_configuration_pack(const bcmolt_gem_port_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_gem_port_direction_pack(this->direction, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gem_port_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_configuration_unpack(bcmolt_gem_port_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_gem_port_direction_unpack(&this->direction, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gem_port_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_gem_port_configuration_bounds_check(const bcmolt_gem_port_configuration *this)
{
    switch (this->direction)
    {
        case BCMOLT_GEM_PORT_DIRECTION_DOWNSTREAM:
            break;
        case BCMOLT_GEM_PORT_DIRECTION_UPSTREAM:
            break;
        case BCMOLT_GEM_PORT_DIRECTION_BIDIRECTIONAL:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_GEM_PORT_TYPE_UNICAST:
            break;
        case BCMOLT_GEM_PORT_TYPE_MULTICAST:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_with_state_set_default(bcmolt_gpon_alloc_with_state *this)
{
    this->alloc_id = (bcmolt_gpon_alloc_id) 0;
    this->state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_pack(const bcmolt_gpon_alloc_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_unpack(bcmolt_gpon_alloc_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_bounds_check(const bcmolt_gpon_alloc_with_state *this)
{
    if (this->alloc_id > (bcmolt_gpon_alloc_id) 4095)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_ALLOC_STATE_INACTIVE:
            break;
        case BCMOLT_ALLOC_STATE_PROCESSING:
            break;
        case BCMOLT_ALLOC_STATE_ACTIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_with_state_list_u16_max_32_set_default(bcmolt_gpon_alloc_with_state_list_u16_max_32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_pack(const bcmolt_gpon_alloc_with_state_list_u16_max_32 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_gpon_alloc_with_state_list_u16_max_32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_alloc_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_with_state_list_u16_max_32_get_packed_length(const bcmolt_gpon_alloc_with_state_list_u16_max_32 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_unpack(bcmolt_gpon_alloc_with_state_list_u16_max_32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_gpon_alloc_with_state_list_u16_max_32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_alloc_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_alloc_with_state));
        }
    }

    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_alloc_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_alloc_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_bounds_check(const bcmolt_gpon_alloc_with_state_list_u16_max_32 *this)
{
    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_debug_flow_config_set_default(bcmolt_gpon_debug_flow_config *this)
{
    this->untagged_flow = BCMOLT_CONTROL_STATE_DISABLE;
    this->untagged_vid = (bcmolt_vlan_id) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_debug_flow_config_pack(const bcmolt_gpon_debug_flow_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->untagged_flow, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->untagged_vid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_debug_flow_config_unpack(bcmolt_gpon_debug_flow_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->untagged_flow, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->untagged_vid))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_debug_flow_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_debug_flow_config_bounds_check(const bcmolt_gpon_debug_flow_config *this)
{
    switch (this->untagged_flow)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->untagged_vid > (bcmolt_vlan_id) 4095)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_id_list_u8_max_16_set_default(bcmolt_gpon_gem_id_list_u8_max_16 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_pack(const bcmolt_gpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_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_gpon_gem_id_list_u8_max_16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_id_list_u8_max_16_get_packed_length(const bcmolt_gpon_gem_id_list_u8_max_16 *this)
{
    return 1 + (2 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_unpack(bcmolt_gpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_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_gpon_gem_id_list_u8_max_16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_gem_id *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_gem_id));
        }
    }

    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint8_t len;
    if (!bcmolt_buf_read_u8(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_gem_id) * len);
    if (!bcmolt_buf_skip(packed, len * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_bounds_check(const bcmolt_gpon_gem_id_list_u8_max_16 *this)
{
    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_with_state_set_default(bcmolt_gpon_gem_port_with_state *this)
{
    this->gem_id = (bcmolt_gpon_gem_id) 0;
    this->state = BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_pack(const bcmolt_gpon_gem_port_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_unpack(bcmolt_gpon_gem_port_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_bounds_check(const bcmolt_gpon_gem_port_with_state *this)
{
    if (this->gem_id > (bcmolt_gpon_gem_id) 4095)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_GPON_GEM_PORT_STATE_INACTIVE:
            break;
        case BCMOLT_GPON_GEM_PORT_STATE_PROCESSING:
            break;
        case BCMOLT_GPON_GEM_PORT_STATE_ACTIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_with_state_list_u16_max_128_set_default(bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_128_pack(const bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_gpon_gem_port_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_gem_port_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_with_state_list_u16_max_128_get_packed_length(const bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_128_unpack(bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_gpon_gem_port_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_gem_port_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_gem_port_with_state));
        }
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_gem_port_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_gem_port_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_128_bounds_check(const bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this)
{
    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_with_state_list_u16_max_256_set_default(bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_256_pack(const bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_gpon_gem_port_with_state_list_u16_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_gem_port_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_with_state_list_u16_max_256_get_packed_length(const bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_256_unpack(bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_gpon_gem_port_with_state_list_u16_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_gem_port_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_gem_port_with_state));
        }
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_gem_port_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_gem_port_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_256_bounds_check(const bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this)
{
    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_debug_flow_config_set_default(bcmolt_gpon_iwf_debug_flow_config *this)
{
    this->learn_untagged_flow_vids = BCMOS_FALSE;
    this->untagged_flow_shaping_ms_per_sec = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_debug_flow_config_pack(const bcmolt_gpon_iwf_debug_flow_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->learn_untagged_flow_vids))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->untagged_flow_shaping_ms_per_sec))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_debug_flow_config_unpack(bcmolt_gpon_iwf_debug_flow_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->learn_untagged_flow_vids))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->untagged_flow_shaping_ms_per_sec))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_debug_flow_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_debug_flow_config_bounds_check(const bcmolt_gpon_iwf_debug_flow_config *this)
{
    if (this->untagged_flow_shaping_ms_per_sec > 1000)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_key_exchange_set_default(bcmolt_gpon_key_exchange *this)
{
    this->interval = 10000;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
    this->mode = BCMOLT_KEY_EXCHANGE_MODE_NORMAL;
    this->encrypted_ports_only = BCMOLT_CONTROL_STATE_ENABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_key_exchange_pack(const bcmolt_gpon_key_exchange *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_key_exchange_mode_pack(this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->encrypted_ports_only, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_key_exchange_unpack(bcmolt_gpon_key_exchange *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_key_exchange_mode_unpack(&this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->encrypted_ports_only, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_key_exchange_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_key_exchange_bounds_check(const bcmolt_gpon_key_exchange *this)
{
    if (this->interval < 1000)
    {
        return BCMOS_FALSE;
    }

    if (this->interval > 3600000UL)
    {
        return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->mode)
    {
        case BCMOLT_KEY_EXCHANGE_MODE_NORMAL:
            break;
        case BCMOLT_KEY_EXCHANGE_MODE_ENHANCED:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->encrypted_ports_only)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_mac_table_scan_result_set_default(bcmolt_gpon_mac_table_scan_result *this)
{
    this->vlan = (bcmolt_vlan_id) 0;
    this->flow_id = (bcmolt_flow_id) 0;
    this->stat = BCMOS_FALSE;
    this->gem_port_id = (bcmolt_gpon_gem_id) 0;
    this->onu_id = (bcmolt_gpon_onu_id) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_pack(const bcmolt_gpon_mac_table_scan_result *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->stat))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_unpack(bcmolt_gpon_mac_table_scan_result *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->vlan))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->stat))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_bounds_check(const bcmolt_gpon_mac_table_scan_result *this)
{
    if (this->flow_id > (bcmolt_flow_id) 4095)
    {
        return BCMOS_FALSE;
    }

    if (this->gem_port_id > (bcmolt_gpon_gem_id) 4095)
    {
        return BCMOS_FALSE;
    }

    if (this->onu_id > (bcmolt_gpon_onu_id) 127)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_mac_table_scan_result_list_u16_set_default(bcmolt_gpon_mac_table_scan_result_list_u16 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_pack(const bcmolt_gpon_mac_table_scan_result_list_u16 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_gpon_mac_table_scan_result_list_u16\" 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_gpon_mac_table_scan_result_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_mac_table_scan_result_list_u16_get_packed_length(const bcmolt_gpon_mac_table_scan_result_list_u16 *this)
{
    return 2 + (9 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_unpack(bcmolt_gpon_mac_table_scan_result_list_u16 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_gpon_mac_table_scan_result_list_u16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_mac_table_scan_result *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_mac_table_scan_result));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_mac_table_scan_result_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_mac_table_scan_result) * len);
    if (!bcmolt_buf_skip(packed, len * 9))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_bounds_check(const bcmolt_gpon_mac_table_scan_result_list_u16 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_debug_set_default(bcmolt_gpon_ni_debug *this)
{
    this->number_of_gem_ports_per_onu = 64;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_debug_pack(const bcmolt_gpon_ni_debug *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->number_of_gem_ports_per_onu))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_debug_unpack(bcmolt_gpon_ni_debug *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->number_of_gem_ports_per_onu))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_debug_bounds_check(const bcmolt_gpon_ni_debug *this)
{
    if (this->number_of_gem_ports_per_onu < 8)
    {
        return BCMOS_FALSE;
    }

    if (this->number_of_gem_ports_per_onu > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_activation_set_default(bcmolt_gpon_onu_activation *this)
{
    this->key_exchange = BCMOLT_CONTROL_STATE_DISABLE;
    this->password_authentication = BCMOLT_CONTROL_STATE_ENABLE;
    this->fail_due_to_password_authentication_failure = BCMOLT_CONTROL_STATE_ENABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_activation_pack(const bcmolt_gpon_onu_activation *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->key_exchange, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->password_authentication, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->fail_due_to_password_authentication_failure, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_activation_unpack(bcmolt_gpon_onu_activation *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->key_exchange, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->password_authentication, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->fail_due_to_password_authentication_failure, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_activation_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_activation_bounds_check(const bcmolt_gpon_onu_activation *this)
{
    switch (this->key_exchange)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->password_authentication)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->fail_due_to_password_authentication_failure)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_alarm_state_set_default(bcmolt_gpon_onu_alarm_state *this)
{
    this->losi = BCMOLT_STATUS_OFF;
    this->lofi = BCMOLT_STATUS_OFF;
    this->loami = BCMOLT_STATUS_OFF;
    this->dgi = BCMOLT_STATUS_OFF;
    this->tiwi = BCMOLT_STATUS_OFF;
    this->dowi = BCMOLT_STATUS_OFF;
    this->sufi = BCMOLT_STATUS_OFF;
    this->sfi = BCMOLT_STATUS_OFF;
    this->sdi = BCMOLT_STATUS_OFF;
    this->dfi = BCMOLT_STATUS_OFF;
    this->loai = BCMOLT_STATUS_OFF;
    this->loki = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarm_state_pack(const bcmolt_gpon_onu_alarm_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lofi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->loami, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dgi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->tiwi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dowi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sufi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sdi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->loai, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->loki, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarm_state_unpack(bcmolt_gpon_onu_alarm_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lofi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->loami, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dgi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->tiwi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dowi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sufi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sdi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->loai, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->loki, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarm_state_bounds_check(const bcmolt_gpon_onu_alarm_state *this)
{
    switch (this->losi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lofi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->loami)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dgi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->tiwi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dowi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sufi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sfi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sdi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dfi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->loai)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->loki)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_alarms_set_default(bcmolt_gpon_onu_alarms *this)
{
    this->losi = BCMOLT_STATUS_OFF;
    this->lofi = BCMOLT_STATUS_OFF;
    this->loami = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_pack(const bcmolt_gpon_onu_alarms *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lofi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->loami, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_unpack(bcmolt_gpon_onu_alarms *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lofi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->loami, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_bounds_check(const bcmolt_gpon_onu_alarms *this)
{
    switch (this->losi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lofi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->loami)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_alarms_thresholds_set_default(bcmolt_gpon_onu_alarms_thresholds *this)
{
    this->losi = 4;
    this->lofi = 4;
    this->loami = 3;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_thresholds_pack(const bcmolt_gpon_onu_alarms_thresholds *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->losi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->lofi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->loami))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_thresholds_unpack(bcmolt_gpon_onu_alarms_thresholds *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->losi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->lofi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->loami))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_thresholds_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_alarms_thresholds_bounds_check(const bcmolt_gpon_onu_alarms_thresholds *this)
{
    if (this->losi < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->losi > 15)
    {
        return BCMOS_FALSE;
    }

    if (this->lofi < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->lofi > 15)
    {
        return BCMOS_FALSE;
    }

    if (this->loami < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->loami > 15)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_eqd_set_default(bcmolt_gpon_onu_eqd *this)
{
    this->onu_id = (bcmolt_gpon_onu_id) 0;
    this->eqd = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_pack(const bcmolt_gpon_onu_eqd *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->eqd))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_unpack(bcmolt_gpon_onu_eqd *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->eqd))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_bounds_check(const bcmolt_gpon_onu_eqd *this)
{
    if (this->onu_id > (bcmolt_gpon_onu_id) 127)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_eqd_list_u32_set_default(bcmolt_gpon_onu_eqd_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_list_u32_pack(const bcmolt_gpon_onu_eqd_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_gpon_onu_eqd_list_u32\" 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_gpon_onu_eqd_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_eqd_list_u32_get_packed_length(const bcmolt_gpon_onu_eqd_list_u32 *this)
{
    return 4 + (6 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_list_u32_unpack(bcmolt_gpon_onu_eqd_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_gpon_onu_eqd_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_onu_eqd *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_onu_eqd));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_onu_eqd_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_onu_eqd) * len);
    if (!bcmolt_buf_skip(packed, len * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_eqd_list_u32_bounds_check(const bcmolt_gpon_onu_eqd_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_id_list_u32_max_256_set_default(bcmolt_gpon_onu_id_list_u32_max_256 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_pack(const bcmolt_gpon_onu_id_list_u32_max_256 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_gpon_onu_id_list_u32_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_id_list_u32_max_256_get_packed_length(const bcmolt_gpon_onu_id_list_u32_max_256 *this)
{
    return 4 + (2 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_unpack(bcmolt_gpon_onu_id_list_u32_max_256 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_gpon_onu_id_list_u32_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_onu_id *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_onu_id));
        }
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_onu_id) * len);
    if (!bcmolt_buf_skip(packed, len * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_bounds_check(const bcmolt_gpon_onu_id_list_u32_max_256 *this)
{
    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_upgrade_params_set_default(bcmolt_gpon_onu_upgrade_params *this)
{
    this->response_timeout_ms = 1000;
    this->max_retry_count = 23;
    this->omci_format = BCMOLT_OMCI_DEVICE_ID_EXTENDED;
    this->window_size = 32;
    this->activate_commit = BCMOS_FALSE;
    this->delay_for_commit_ms = 40000UL;
    this->max_activation_attempts = 23;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_params_pack(const bcmolt_gpon_onu_upgrade_params *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->response_timeout_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->max_retry_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_omci_device_id_pack(this->omci_format, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->activate_commit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->delay_for_commit_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->max_activation_attempts))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_params_unpack(bcmolt_gpon_onu_upgrade_params *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->response_timeout_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->max_retry_count))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_omci_device_id_unpack(&this->omci_format, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->activate_commit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->delay_for_commit_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->max_activation_attempts))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_params_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 14);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_params_bounds_check(const bcmolt_gpon_onu_upgrade_params *this)
{
    if (this->response_timeout_ms < 50)
    {
        return BCMOS_FALSE;
    }

    switch (this->omci_format)
    {
        case BCMOLT_OMCI_DEVICE_ID_BASELINE:
            break;
        case BCMOLT_OMCI_DEVICE_ID_EXTENDED:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->window_size < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->window_size > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_upgrade_status_set_default(bcmolt_gpon_onu_upgrade_status *this)
{
    this->onu_id = (bcmolt_pon_onu_id) 0;
    this->error_code = BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_SUCCESS;
    this->fail_reason = BCMOLT_OMCI_RESULT_CODE_NO_ERROR;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_pack(const bcmolt_gpon_onu_upgrade_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpon_onu_upgrade_return_code_pack(this->error_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_omci_result_code_pack(this->fail_reason, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_unpack(bcmolt_gpon_onu_upgrade_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpon_onu_upgrade_return_code_unpack(&this->error_code, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_omci_result_code_unpack(&this->fail_reason, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_bounds_check(const bcmolt_gpon_onu_upgrade_status *this)
{
    if (this->onu_id > (bcmolt_pon_onu_id) 511)
    {
        return BCMOS_FALSE;
    }

    switch (this->error_code)
    {
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_SUCCESS:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ONU_RESPONSE_TIMEOUT:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ONU_ERROR_RESPONSE:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_TCI_MISMATCH:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_GET_IMAGE_FAILED:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ACTIVATION_FAILED:
            break;
        case BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_INTERNAL:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->fail_reason)
    {
        case BCMOLT_OMCI_RESULT_CODE_NO_ERROR:
            break;
        case BCMOLT_OMCI_RESULT_CODE_PROCESSING_ERROR:
            break;
        case BCMOLT_OMCI_RESULT_CODE_NOT_SUPPORTED:
            break;
        case BCMOLT_OMCI_RESULT_CODE_PARAMETER_ERROR:
            break;
        case BCMOLT_OMCI_RESULT_CODE_UNKNOWN_ENTITY:
            break;
        case BCMOLT_OMCI_RESULT_CODE_UNKNOWN_INSTANCE:
            break;
        case BCMOLT_OMCI_RESULT_CODE_DEVICE_BUSY:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_upgrade_status_list_u32_set_default(bcmolt_gpon_onu_upgrade_status_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_pack(const bcmolt_gpon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_gpon_onu_upgrade_status_list_u32\" 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_gpon_onu_upgrade_status_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_upgrade_status_list_u32_get_packed_length(const bcmolt_gpon_onu_upgrade_status_list_u32 *this)
{
    return 4 + (4 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_unpack(bcmolt_gpon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_gpon_onu_upgrade_status_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_onu_upgrade_status *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_onu_upgrade_status));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_onu_upgrade_status_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_onu_upgrade_status) * len);
    if (!bcmolt_buf_skip(packed, len * 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_bounds_check(const bcmolt_gpon_onu_upgrade_status_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_with_state_set_default(bcmolt_gpon_onu_with_state *this)
{
    this->onu_id = (bcmolt_gpon_onu_id) 0;
    this->state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_pack(const bcmolt_gpon_onu_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_unpack(bcmolt_gpon_onu_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_bounds_check(const bcmolt_gpon_onu_with_state *this)
{
    if (this->onu_id > (bcmolt_gpon_onu_id) 127)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_ONU_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_ONU_STATE_INACTIVE:
            break;
        case BCMOLT_ONU_STATE_ACTIVE:
            break;
        case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
            break;
        case BCMOLT_ONU_STATE_DISABLED:
            break;
        case BCMOLT_ONU_STATE_AWAKE_FREE:
            break;
        case BCMOLT_ONU_STATE_PROCESSING:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
            break;
        case BCMOLT_ONU_STATE_UNAWARE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_with_state_list_u16_max_128_set_default(bcmolt_gpon_onu_with_state_list_u16_max_128 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_pack(const bcmolt_gpon_onu_with_state_list_u16_max_128 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_gpon_onu_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_onu_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_with_state_list_u16_max_128_get_packed_length(const bcmolt_gpon_onu_with_state_list_u16_max_128 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_unpack(bcmolt_gpon_onu_with_state_list_u16_max_128 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_gpon_onu_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_gpon_onu_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_gpon_onu_with_state));
        }
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_gpon_onu_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_gpon_onu_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_bounds_check(const bcmolt_gpon_onu_with_state_list_u16_max_128 *this)
{
    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_rssi_general_configuration_set_default(bcmolt_gpon_rssi_general_configuration *this)
{
    this->location = 20;
    this->location_sign = BCMOLT_RSSI_LOCATION_SIGN_BEFORE;
    this->start_pattern = 15;
    this->middle_pattern = 15;
    this->last_pattern = 15;
    this->middle_repertition = 50;
    this->minimum_burst = 55;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_rssi_general_configuration_pack(const bcmolt_gpon_rssi_general_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rssi_location_sign_pack(this->location_sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->start_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->middle_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->last_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->middle_repertition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->minimum_burst))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_rssi_general_configuration_unpack(bcmolt_gpon_rssi_general_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rssi_location_sign_unpack(&this->location_sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->start_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->middle_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->last_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->middle_repertition))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->minimum_burst))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_rssi_general_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_rssi_general_configuration_bounds_check(const bcmolt_gpon_rssi_general_configuration *this)
{
    switch (this->location_sign)
    {
        case BCMOLT_RSSI_LOCATION_SIGN_BEFORE:
            break;
        case BCMOLT_RSSI_LOCATION_SIGN_AFTER:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_sn_acquisition_set_default(bcmolt_gpon_sn_acquisition *this)
{
    this->interval = 1000;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
    this->onu_post_discovery_mode = BCMOLT_ONU_POST_DISCOVERY_MODE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_sn_acquisition_pack(const bcmolt_gpon_sn_acquisition *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_onu_post_discovery_mode_pack(this->onu_post_discovery_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_sn_acquisition_unpack(bcmolt_gpon_sn_acquisition *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_onu_post_discovery_mode_unpack(&this->onu_post_discovery_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_sn_acquisition_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_sn_acquisition_bounds_check(const bcmolt_gpon_sn_acquisition *this)
{
    if (this->interval < 1000)
    {
        return BCMOS_FALSE;
    }

    if (this->interval > 2147483UL)
    {
        return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->onu_post_discovery_mode)
    {
        case BCMOLT_ONU_POST_DISCOVERY_MODE_NONE:
            break;
        case BCMOLT_ONU_POST_DISCOVERY_MODE_ACTIVATE:
            break;
        case BCMOLT_ONU_POST_DISCOVERY_MODE_DISABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_host_sw_version_set_default(bcmolt_host_sw_version *this)
{
    this->major = 0;
    this->minor = 0;
    this->revision = 0;
    this->model = 0;
    memset(this->build_time, 0, 32);
}

/******************************************************************************/
bcmos_bool bcmolt_host_sw_version_pack(const bcmolt_host_sw_version *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->model))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->build_time, 32))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_host_sw_version_unpack(bcmolt_host_sw_version *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->major))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->minor))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->revision))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->model))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->build_time, 32))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_host_sw_version_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 39);
}

/******************************************************************************/
bcmos_bool bcmolt_host_sw_version_bounds_check(const bcmolt_host_sw_version *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_hw_pon_id_set_default(bcmolt_hw_pon_id *this)
{
    this->pon_id_1 = 0;
    this->pon_id_2 = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_hw_pon_id_pack(const bcmolt_hw_pon_id *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->pon_id_1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->pon_id_2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_hw_pon_id_unpack(bcmolt_hw_pon_id *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->pon_id_1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->pon_id_2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_hw_pon_id_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_hw_pon_id_bounds_check(const bcmolt_hw_pon_id *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ieee_8021as_port_identity_set_default(bcmolt_ieee_8021as_port_identity *this)
{
    memset(this->clock_identity, 0, sizeof(this->clock_identity));
    this->port_number = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_port_identity_pack(const bcmolt_ieee_8021as_port_identity *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->clock_identity, 8))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->port_number))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_port_identity_unpack(bcmolt_ieee_8021as_port_identity *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->clock_identity, 8))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->port_number))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_port_identity_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_port_identity_bounds_check(const bcmolt_ieee_8021as_port_identity *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ieee_8021as_timestamp_set_default(bcmolt_ieee_8021as_timestamp *this)
{
    this->seconds_high = 0;
    this->seconds_low = 0;
    this->nanoseconds = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_timestamp_pack(const bcmolt_ieee_8021as_timestamp *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->seconds_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->seconds_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->nanoseconds))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_timestamp_unpack(bcmolt_ieee_8021as_timestamp *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->seconds_high))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->seconds_low))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->nanoseconds))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_timestamp_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_timestamp_bounds_check(const bcmolt_ieee_8021as_timestamp *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ieee_8021as_time_sync_set_default(bcmolt_ieee_8021as_time_sync *this)
{
    bcmos_mac_address_init(&this->destination_mac);
    bcmos_mac_address_init(&this->source_mac);
    this->eth_type_len = 0;
    this->eth_subtype = 0;
    memset(this->ieee_oui, 0, sizeof(this->ieee_oui));
    this->msg_id = 0;
    this->x = 0;
    this->tod.seconds_high = 0;
    this->tod.seconds_low = 0;
    this->tod.nanoseconds = 0;
    memset(this->port_identity.clock_identity, 0, sizeof(this->port_identity.clock_identity));
    this->port_identity.port_number = 0;
    this->log_msg_interval = 0;
    this->rate_ratio = 0;
    this->gm_time_base_indicator = 0;
    memset(this->last_gm_phase_change, 0, sizeof(this->last_gm_phase_change));
    this->last_frequency_change = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_time_sync_pack(const bcmolt_ieee_8021as_time_sync *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_mac_address(buf, this->destination_mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_mac_address(buf, this->source_mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->eth_type_len))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->eth_subtype))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->ieee_oui, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->msg_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->x))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ieee_8021as_timestamp_pack(&this->tod, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ieee_8021as_port_identity_pack(&this->port_identity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_s8(buf, this->log_msg_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_double(buf, this->rate_ratio))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->gm_time_base_indicator))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->last_gm_phase_change, 12))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_s32(buf, this->last_frequency_change))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_time_sync_unpack(bcmolt_ieee_8021as_time_sync *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_mac_address(buf, &this->destination_mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_mac_address(buf, &this->source_mac))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->eth_type_len))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->eth_subtype))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->ieee_oui, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->msg_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->x))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ieee_8021as_timestamp_unpack(&this->tod, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ieee_8021as_port_identity_unpack(&this->port_identity, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_s8(buf, &this->log_msg_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_double(buf, &this->rate_ratio))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->gm_time_base_indicator))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->last_gm_phase_change, 12))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_s32(buf, &this->last_frequency_change))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_time_sync_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 71);
}

/******************************************************************************/
bcmos_bool bcmolt_ieee_8021as_time_sync_bounds_check(const bcmolt_ieee_8021as_time_sync *this)
{
    if (!bcmolt_ieee_8021as_timestamp_bounds_check(&this->tod))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ieee_8021as_port_identity_bounds_check(&this->port_identity))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_indication_shaping_set_default(bcmolt_indication_shaping *this)
{
    this->enabled = BCMOS_FALSE;
    this->max_rate = 1000;
    this->max_burst = 100;
}

/******************************************************************************/
bcmos_bool bcmolt_indication_shaping_pack(const bcmolt_indication_shaping *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->enabled))
    {
        return BCMOS_FALSE;
    }

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

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_indication_shaping_unpack(bcmolt_indication_shaping *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->enabled))
    {
        return BCMOS_FALSE;
    }

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

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_indication_shaping_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_indication_shaping_bounds_check(const bcmolt_indication_shaping *this)
{
    if (this->max_rate < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->max_rate > 10000)
    {
        return BCMOS_FALSE;
    }

    if (this->max_burst < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->max_burst > 10000)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_la_resync_pattern_configuration_set_default(bcmolt_la_resync_pattern_configuration *this)
{
    this->resync_control.start_pattern = 15;
    this->resync_control.middle_pattern = 15;
    this->resync_control.last_pattern = 15;
    this->resync_control.middle_repetition = 0;
    this->resync_control.location = 40;
    this->ranging_resync_control.start_pattern = 15;
    this->ranging_resync_control.middle_pattern = 15;
    this->ranging_resync_control.last_pattern = 15;
    this->ranging_resync_control.middle_repetition = 0;
    this->ranging_resync_control.location = 1;
}

/******************************************************************************/
bcmos_bool bcmolt_la_resync_pattern_configuration_pack(const bcmolt_la_resync_pattern_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_resync_control_pack(&this->resync_control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_pack(&this->ranging_resync_control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_la_resync_pattern_configuration_unpack(bcmolt_la_resync_pattern_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_resync_control_unpack(&this->resync_control, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_unpack(&this->ranging_resync_control, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_la_resync_pattern_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 10);
}

/******************************************************************************/
bcmos_bool bcmolt_la_resync_pattern_configuration_bounds_check(const bcmolt_la_resync_pattern_configuration *this)
{
    if (!bcmolt_resync_control_bounds_check(&this->resync_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_resync_control_bounds_check(&this->ranging_resync_control))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_buffer_set_default(bcmolt_log_buffer *this)
{
    memset(this->buff, 0, 2048);
    this->msg_to_read = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_log_buffer_pack(const bcmolt_log_buffer *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->buff, 2048))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->msg_to_read))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_buffer_unpack(bcmolt_log_buffer *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->buff, 2048))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->msg_to_read))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_buffer_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2052);
}

/******************************************************************************/
bcmos_bool bcmolt_log_buffer_bounds_check(const bcmolt_log_buffer *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_mac_table_configuration_set_default(bcmolt_mac_table_configuration *this)
{
    this->miss_fallback = BCMOLT_MAC_TABLE_MISS_FALLBACK_DROP;
    this->default_flow_id = (bcmolt_flow_id) 0;
    this->aging_time = 30;
    this->learning_mode = BCMOLT_MAC_TABLE_LEARNING_MODE_NORMAL;
    this->automatic_mac_learning = BCMOLT_CONTROL_STATE_DISABLE;
    this->automatic_mac_aging = BCMOLT_CONTROL_STATE_DISABLE;
    this->automatic_mac_move = BCMOLT_CONTROL_STATE_DISABLE;
    this->automatic_static_mode = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_configuration_pack(const bcmolt_mac_table_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_mac_table_miss_fallback_pack(this->miss_fallback, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->default_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->aging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mac_table_learning_mode_pack(this->learning_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->automatic_mac_learning, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->automatic_mac_aging, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->automatic_mac_move, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->automatic_static_mode))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_configuration_unpack(bcmolt_mac_table_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_mac_table_miss_fallback_unpack(&this->miss_fallback, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->default_flow_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->aging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_mac_table_learning_mode_unpack(&this->learning_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->automatic_mac_learning, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->automatic_mac_aging, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->automatic_mac_move, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->automatic_static_mode))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_mac_table_configuration_bounds_check(const bcmolt_mac_table_configuration *this)
{
    switch (this->miss_fallback)
    {
        case BCMOLT_MAC_TABLE_MISS_FALLBACK_DROP:
            break;
        case BCMOLT_MAC_TABLE_MISS_FALLBACK_DEFAULT_FLOW:
            break;
        case BCMOLT_MAC_TABLE_MISS_FALLBACK_VID:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->default_flow_id > (bcmolt_flow_id) 4095)
    {
        return BCMOS_FALSE;
    }

    if (this->aging_time < 30)
    {
        return BCMOS_FALSE;
    }

    if (this->aging_time > 86400UL)
    {
        return BCMOS_FALSE;
    }

    switch (this->learning_mode)
    {
        case BCMOLT_MAC_TABLE_LEARNING_MODE_NORMAL:
            break;
        case BCMOLT_MAC_TABLE_LEARNING_MODE_MOVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->automatic_mac_learning)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->automatic_mac_aging)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->automatic_mac_move)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_macaddress_list_u32_set_default(bcmolt_macaddress_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_pack(const bcmolt_macaddress_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_macaddress_list_u32\" 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_buf_write_mac_address(buf, this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_macaddress_list_u32_get_packed_length(const bcmolt_macaddress_list_u32 *this)
{
    return 4 + (6 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_unpack(bcmolt_macaddress_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_macaddress_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmos_mac_address *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmos_mac_address));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmos_mac_address) * len);
    if (!bcmolt_buf_skip(packed, len * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_bounds_check(const bcmolt_macaddress_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_macaddress_list_u32_max_2048_set_default(bcmolt_macaddress_list_u32_max_2048 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_max_2048_pack(const bcmolt_macaddress_list_u32_max_2048 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_macaddress_list_u32_max_2048\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_macaddress_list_u32_max_2048_get_packed_length(const bcmolt_macaddress_list_u32_max_2048 *this)
{
    return 4 + (6 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_max_2048_unpack(bcmolt_macaddress_list_u32_max_2048 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_macaddress_list_u32_max_2048\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmos_mac_address *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmos_mac_address));
        }
    }

    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_max_2048_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmos_mac_address) * len);
    if (!bcmolt_buf_skip(packed, len * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_macaddress_list_u32_max_2048_bounds_check(const bcmolt_macaddress_list_u32_max_2048 *this)
{
    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_link_status_set_default(bcmolt_nni_link_status *this)
{
    this->link_status = BCMOLT_TRIVALENT_FALSE;
    this->signal_detected = BCMOLT_TRIVALENT_FALSE;
    this->pmd_locked = BCMOLT_TRIVALENT_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_link_status_pack(const bcmolt_nni_link_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_trivalent_pack(this->link_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_trivalent_pack(this->signal_detected, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_trivalent_pack(this->pmd_locked, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_link_status_unpack(bcmolt_nni_link_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_trivalent_unpack(&this->link_status, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_trivalent_unpack(&this->signal_detected, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_trivalent_unpack(&this->pmd_locked, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_link_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_nni_link_status_bounds_check(const bcmolt_nni_link_status *this)
{
    switch (this->link_status)
    {
        case BCMOLT_TRIVALENT_FALSE:
            break;
        case BCMOLT_TRIVALENT_TRUE:
            break;
        case BCMOLT_TRIVALENT_NOT_APPLICABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->signal_detected)
    {
        case BCMOLT_TRIVALENT_FALSE:
            break;
        case BCMOLT_TRIVALENT_TRUE:
            break;
        case BCMOLT_TRIVALENT_NOT_APPLICABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->pmd_locked)
    {
        case BCMOLT_TRIVALENT_FALSE:
            break;
        case BCMOLT_TRIVALENT_TRUE:
            break;
        case BCMOLT_TRIVALENT_NOT_APPLICABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_oam_heartbeat_config_set_default(bcmolt_oam_heartbeat_config *this)
{
    this->send_period = 0;
    this->transmit_frame.len = 0;
    this->transmit_frame.val = NULL;
    this->ignored_receive_frame_template.frame_octets.len = 0;
    this->ignored_receive_frame_template.frame_octets.val = NULL;
    this->ignored_receive_frame_template.mask_octets.len = 0;
    this->ignored_receive_frame_template.mask_octets.val = NULL;
    this->receive_timeout = 1;
    this->maximum_receive_size = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_oam_heartbeat_config_pack(const bcmolt_oam_heartbeat_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->send_period))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_pack(&this->transmit_frame, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ethernet_frame_masked_pack(&this->ignored_receive_frame_template, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->receive_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->maximum_receive_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_oam_heartbeat_config_get_packed_length(const bcmolt_oam_heartbeat_config *this)
{
    return 6 + bcmolt_u8_list_u16_get_packed_length(&this->transmit_frame) + bcmolt_ethernet_frame_masked_get_packed_length(&this->ignored_receive_frame_template);
}

/******************************************************************************/
bcmos_bool bcmolt_oam_heartbeat_config_unpack(bcmolt_oam_heartbeat_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->send_period))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_unpack(&this->transmit_frame, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ethernet_frame_masked_unpack(&this->ignored_receive_frame_template, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->receive_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->maximum_receive_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_oam_heartbeat_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_u8_list_u16_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ethernet_frame_masked_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_skip(packed, 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_oam_heartbeat_config_bounds_check(const bcmolt_oam_heartbeat_config *this)
{
    if (!bcmolt_u8_list_u16_bounds_check(&this->transmit_frame))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_ethernet_frame_masked_bounds_check(&this->ignored_receive_frame_template))
    {
        return BCMOS_FALSE;
    }

    if (this->receive_timeout < 1)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_onu_power_management_configuration_set_default(bcmolt_onu_power_management_configuration *this)
{
    this->ilowpower = 1600;
    this->iaware = 160;
    this->itransinit = 80;
    this->itxinit = 40;
    this->irxoff = 1600;
    this->low_power_clobi = 8;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_management_configuration_pack(const bcmolt_onu_power_management_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->ilowpower))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->iaware))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->itransinit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->itxinit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->irxoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->low_power_clobi))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_management_configuration_unpack(bcmolt_onu_power_management_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->ilowpower))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->iaware))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->itransinit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->itxinit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->irxoff))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->low_power_clobi))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_management_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 18);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_power_management_configuration_bounds_check(const bcmolt_onu_power_management_configuration *this)
{
    if (this->ilowpower < 8)
    {
        return BCMOS_FALSE;
    }

    if (this->ilowpower > 480000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->iaware < 8)
    {
        return BCMOS_FALSE;
    }

    if (this->iaware > 480000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->itransinit > 8000)
    {
        return BCMOS_FALSE;
    }

    if (this->itxinit > 8000)
    {
        return BCMOS_FALSE;
    }

    if (this->irxoff < 8)
    {
        return BCMOS_FALSE;
    }

    if (this->irxoff > 480000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->low_power_clobi < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->low_power_clobi > 1023)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_onu_tuning_configuration_set_default(bcmolt_onu_tuning_configuration *this)
{
    this->tsource = 1000;
    this->ttarget = 1000;
    this->request_registration_required = BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_tuning_configuration_pack(const bcmolt_onu_tuning_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->tsource))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->ttarget))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->request_registration_required))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_tuning_configuration_unpack(bcmolt_onu_tuning_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->tsource))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->ttarget))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->request_registration_required))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_onu_tuning_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_onu_tuning_configuration_bounds_check(const bcmolt_onu_tuning_configuration *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_id_set_default(bcmolt_pon_id *this)
{
    this->administrative_label = 0;
    this->dwlch_id = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_id_pack(const bcmolt_pon_id *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->administrative_label))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->dwlch_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_id_unpack(bcmolt_pon_id *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->administrative_label))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->dwlch_id))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_id_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_id_bounds_check(const bcmolt_pon_id *this)
{
    if (this->administrative_label > 4294967280UL)
    {
        return BCMOS_FALSE;
    }

    if (this->dwlch_id > 7)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_operation_control_set_default(bcmolt_operation_control *this)
{
    this->re = 0;
    this->odn_class = BCMOLT_ODN_CLASS_N1;
    this->ds_fec_mode = BCMOLT_CONTROL_STATE_ENABLE;
    this->protocol = BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_989_P_3;
    this->ds_link_type = BCMOLT_LINK_TYPE_UNSPECIFIED;
    this->pon_id.administrative_label = 0;
    this->pon_id.dwlch_id = 0;
    this->c = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_operation_control_pack(const bcmolt_operation_control *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->re))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_odn_class_pack(this->odn_class, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->ds_fec_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tc_protocol_pack(this->protocol, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_link_type_pack(this->ds_link_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_pon_id_pack(&this->pon_id, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->c))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_operation_control_unpack(bcmolt_operation_control *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->re))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_odn_class_unpack(&this->odn_class, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->ds_fec_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_tc_protocol_unpack(&this->protocol, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_link_type_unpack(&this->ds_link_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_pon_id_unpack(&this->pon_id, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->c))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_operation_control_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 11);
}

/******************************************************************************/
bcmos_bool bcmolt_operation_control_bounds_check(const bcmolt_operation_control *this)
{
    if (this->re > 1)
    {
        return BCMOS_FALSE;
    }

    switch (this->odn_class)
    {
        case BCMOLT_ODN_CLASS_N1:
            break;
        case BCMOLT_ODN_CLASS_N2:
            break;
        case BCMOLT_ODN_CLASS_E1:
            break;
        case BCMOLT_ODN_CLASS_E2:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->ds_fec_mode)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->protocol)
    {
        case BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_987_P_3:
            break;
        case BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_989_P_3:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->ds_link_type)
    {
        case BCMOLT_LINK_TYPE_UNSPECIFIED:
            break;
        case BCMOLT_LINK_TYPE_B:
            break;
        case BCMOLT_LINK_TYPE_A:
            break;
        case BCMOLT_LINK_TYPE_A_AND_B:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_pon_id_bounds_check(&this->pon_id))
    {
        return BCMOS_FALSE;
    }

    if (this->c > 1)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_periodic_standby_pon_monitoring_set_default(bcmolt_periodic_standby_pon_monitoring *this)
{
    this->interval = 5000;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_periodic_standby_pon_monitoring_pack(const bcmolt_periodic_standby_pon_monitoring *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_periodic_standby_pon_monitoring_unpack(bcmolt_periodic_standby_pon_monitoring *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_periodic_standby_pon_monitoring_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_periodic_standby_pon_monitoring_bounds_check(const bcmolt_periodic_standby_pon_monitoring *this)
{
    if (this->interval < 1000)
    {
        return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_aggregate_shaper_set_default(bcmolt_pon_aggregate_shaper *this)
{
    this->bandwidth_kbps = 0;
    this->mbs_kB = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_aggregate_shaper_pack(const bcmolt_pon_aggregate_shaper *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->bandwidth_kbps))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->mbs_kB))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_aggregate_shaper_unpack(bcmolt_pon_aggregate_shaper *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->bandwidth_kbps))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->mbs_kB))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_aggregate_shaper_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_aggregate_shaper_bounds_check(const bcmolt_pon_aggregate_shaper *this)
{
    if (this->mbs_kB > 4000)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_alloc_sla_set_default(bcmolt_pon_alloc_sla *this)
{
    this->cbr_rt_bw = 0;
    this->cbr_nrt_bw = 0;
    this->guaranteed_bw = 0;
    this->maximum_bw = 0;
    this->additional_bw_eligibility = BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NONE;
    this->cbr_rt_compensation = BCMOS_FALSE;
    this->cbr_rt_ap_index = 0;
    this->cbr_nrt_ap_index = 0;
    this->alloc_type = BCMOLT_ALLOC_TYPE_NONE;
    this->weight = 0;
    this->priority = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_alloc_sla_pack(const bcmolt_pon_alloc_sla *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->cbr_rt_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->cbr_nrt_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->guaranteed_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->maximum_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_additional_bw_eligibility_pack(this->additional_bw_eligibility, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->cbr_rt_compensation))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->cbr_rt_ap_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->cbr_nrt_ap_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_alloc_type_pack(this->alloc_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->weight))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_alloc_sla_unpack(bcmolt_pon_alloc_sla *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->cbr_rt_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->cbr_nrt_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->guaranteed_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->maximum_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_additional_bw_eligibility_unpack(&this->additional_bw_eligibility, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->cbr_rt_compensation))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->cbr_rt_ap_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->cbr_nrt_ap_index))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_alloc_type_unpack(&this->alloc_type, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->weight))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_alloc_sla_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 23);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_alloc_sla_bounds_check(const bcmolt_pon_alloc_sla *this)
{
    switch (this->additional_bw_eligibility)
    {
        case BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NONE:
            break;
        case BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NON_ASSURED:
            break;
        case BCMOLT_ADDITIONAL_BW_ELIGIBILITY_BEST_EFFORT:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->cbr_rt_ap_index > 0)
    {
        return BCMOS_FALSE;
    }

    if (this->cbr_nrt_ap_index > 1)
    {
        return BCMOS_FALSE;
    }

    switch (this->alloc_type)
    {
        case BCMOLT_ALLOC_TYPE_NONE:
            break;
        case BCMOLT_ALLOC_TYPE_NSR:
            break;
        case BCMOLT_ALLOC_TYPE_SR:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->weight > 100)
    {
        return BCMOS_FALSE;
    }

    if (this->priority > 7)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_available_bandwidth_set_default(bcmolt_pon_available_bandwidth *this)
{
    this->cbr_bw = 0;
    this->total_bw = 0;
    this->next_onu_total_bw = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_available_bandwidth_pack(const bcmolt_pon_available_bandwidth *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->cbr_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->total_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->next_onu_total_bw))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_available_bandwidth_unpack(bcmolt_pon_available_bandwidth *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->cbr_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->total_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->next_onu_total_bw))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_available_bandwidth_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_available_bandwidth_bounds_check(const bcmolt_pon_available_bandwidth *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_dba_set_default(bcmolt_pon_dba *this)
{
    this->sr_reporting_block_size = 48;
    this->dba_mode = BCMOLT_DBA_MODE_NORMAL;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_dba_pack(const bcmolt_pon_dba *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->sr_reporting_block_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_dba_mode_pack(this->dba_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_dba_unpack(bcmolt_pon_dba *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->sr_reporting_block_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_dba_mode_unpack(&this->dba_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_dba_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_dba_bounds_check(const bcmolt_pon_dba *this)
{
    switch (this->dba_mode)
    {
        case BCMOLT_DBA_MODE_NORMAL:
            break;
        case BCMOLT_DBA_MODE_EXTENDED:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_distance_set_default(bcmolt_pon_distance *this)
{
    this->max_log_distance = 20;
    this->max_diff_reach = 20;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_distance_pack(const bcmolt_pon_distance *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->max_log_distance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->max_diff_reach))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_distance_unpack(bcmolt_pon_distance *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->max_log_distance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->max_diff_reach))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_distance_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_distance_bounds_check(const bcmolt_pon_distance *this)
{
    if (this->max_log_distance < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->max_log_distance > 100)
    {
        return BCMOS_FALSE;
    }

    if (this->max_diff_reach < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->max_diff_reach > 60)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_drift_control_set_default(bcmolt_pon_drift_control *this)
{
    this->drift_interval = 1000;
    this->drift_limit = 4;
    this->transmission_control_limit = 8;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_drift_control_pack(const bcmolt_pon_drift_control *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->drift_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->drift_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->transmission_control_limit))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_drift_control_unpack(bcmolt_pon_drift_control *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->drift_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->drift_limit))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->transmission_control_limit))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_drift_control_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_drift_control_bounds_check(const bcmolt_pon_drift_control *this)
{
    if (this->drift_interval > 60000UL)
    {
        return BCMOS_FALSE;
    }

    if (this->drift_limit < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->drift_limit > 32)
    {
        return BCMOS_FALSE;
    }

    if (this->transmission_control_limit < 1)
    {
        return BCMOS_FALSE;
    }

    if (this->transmission_control_limit > 64)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_onu_id_list_u32_set_default(bcmolt_pon_onu_id_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_onu_id_list_u32_pack(const bcmolt_pon_onu_id_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_pon_onu_id_list_u32\" 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_buf_write_u16(buf, (uint16_t) this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_pon_onu_id_list_u32_get_packed_length(const bcmolt_pon_onu_id_list_u32 *this)
{
    return 4 + (2 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_onu_id_list_u32_unpack(bcmolt_pon_onu_id_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_pon_onu_id_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_pon_onu_id *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_pon_onu_id));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_onu_id_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_pon_onu_id) * len);
    if (!bcmolt_buf_skip(packed, len * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_onu_id_list_u32_bounds_check(const bcmolt_pon_onu_id_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_power_level_set_default(bcmolt_pon_power_level *this)
{
    this->pls_maximum_allocation_size = 120;
    this->mode = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_power_level_pack(const bcmolt_pon_power_level *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->pls_maximum_allocation_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->mode))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_power_level_unpack(bcmolt_pon_power_level *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->pls_maximum_allocation_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->mode))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_power_level_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_power_level_bounds_check(const bcmolt_pon_power_level *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_protection_switching_set_default(bcmolt_pon_protection_switching *this)
{
    this->timeout = 100;
    this->gpio_pin = BCMOLT_GPIO_PIN_UNCONFIGURED;
    this->options = (bcmolt_pon_protection_switching_options) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_pack(const bcmolt_pon_protection_switching *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_pack(this->gpio_pin, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_pon_protection_switching_options_pack(this->options, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_unpack(bcmolt_pon_protection_switching *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_unpack(&this->gpio_pin, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_pon_protection_switching_options_unpack(&this->options, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_protection_switching_bounds_check(const bcmolt_pon_protection_switching *this)
{
    switch (this->gpio_pin)
    {
        case BCMOLT_GPIO_PIN_PIN0:
            break;
        case BCMOLT_GPIO_PIN_PIN1:
            break;
        case BCMOLT_GPIO_PIN_PIN2:
            break;
        case BCMOLT_GPIO_PIN_PIN3:
            break;
        case BCMOLT_GPIO_PIN_PIN4:
            break;
        case BCMOLT_GPIO_PIN_PIN5:
            break;
        case BCMOLT_GPIO_PIN_PIN6:
            break;
        case BCMOLT_GPIO_PIN_PIN7:
            break;
        case BCMOLT_GPIO_PIN_PIN8:
            break;
        case BCMOLT_GPIO_PIN_PIN9:
            break;
        case BCMOLT_GPIO_PIN_PIN10:
            break;
        case BCMOLT_GPIO_PIN_PIN11:
            break;
        case BCMOLT_GPIO_PIN_PIN12:
            break;
        case BCMOLT_GPIO_PIN_PIN13:
            break;
        case BCMOLT_GPIO_PIN_PIN14:
            break;
        case BCMOLT_GPIO_PIN_PIN15:
            break;
        case BCMOLT_GPIO_PIN_PIN16:
            break;
        case BCMOLT_GPIO_PIN_PIN17:
            break;
        case BCMOLT_GPIO_PIN_PIN18:
            break;
        case BCMOLT_GPIO_PIN_PIN19:
            break;
        case BCMOLT_GPIO_PIN_PIN20:
            break;
        case BCMOLT_GPIO_PIN_PIN21:
            break;
        case BCMOLT_GPIO_PIN_PIN22:
            break;
        case BCMOLT_GPIO_PIN_PIN23:
            break;
        case BCMOLT_GPIO_PIN_PIN24:
            break;
        case BCMOLT_GPIO_PIN_PIN25:
            break;
        case BCMOLT_GPIO_PIN_PIN26:
            break;
        case BCMOLT_GPIO_PIN_PIN27:
            break;
        case BCMOLT_GPIO_PIN_PIN28:
            break;
        case BCMOLT_GPIO_PIN_PIN29:
            break;
        case BCMOLT_GPIO_PIN_PIN30:
            break;
        case BCMOLT_GPIO_PIN_PIN31:
            break;
        case BCMOLT_GPIO_PIN_PIN32:
            break;
        case BCMOLT_GPIO_PIN_PIN33:
            break;
        case BCMOLT_GPIO_PIN_PIN34:
            break;
        case BCMOLT_GPIO_PIN_PIN35:
            break;
        case BCMOLT_GPIO_PIN_PIN36:
            break;
        case BCMOLT_GPIO_PIN_PIN37:
            break;
        case BCMOLT_GPIO_PIN_PIN38:
            break;
        case BCMOLT_GPIO_PIN_PIN39:
            break;
        case BCMOLT_GPIO_PIN_PIN40:
            break;
        case BCMOLT_GPIO_PIN_PIN41:
            break;
        case BCMOLT_GPIO_PIN_PIN42:
            break;
        case BCMOLT_GPIO_PIN_PIN43:
            break;
        case BCMOLT_GPIO_PIN_PIN44:
            break;
        case BCMOLT_GPIO_PIN_PIN45:
            break;
        case BCMOLT_GPIO_PIN_PIN46:
            break;
        case BCMOLT_GPIO_PIN_PIN47:
            break;
        case BCMOLT_GPIO_PIN_PIN48:
            break;
        case BCMOLT_GPIO_PIN_PIN49:
            break;
        case BCMOLT_GPIO_PIN_PIN50:
            break;
        case BCMOLT_GPIO_PIN_PIN51:
            break;
        case BCMOLT_GPIO_PIN_PIN52:
            break;
        case BCMOLT_GPIO_PIN_PIN53:
            break;
        case BCMOLT_GPIO_PIN_PIN54:
            break;
        case BCMOLT_GPIO_PIN_PIN55:
            break;
        case BCMOLT_GPIO_PIN_PIN56:
            break;
        case BCMOLT_GPIO_PIN_PIN57:
            break;
        case BCMOLT_GPIO_PIN_PIN58:
            break;
        case BCMOLT_GPIO_PIN_PIN59:
            break;
        case BCMOLT_GPIO_PIN_PIN60:
            break;
        case BCMOLT_GPIO_PIN_PIN61:
            break;
        case BCMOLT_GPIO_PIN_PIN62:
            break;
        case BCMOLT_GPIO_PIN_PIN63:
            break;
        case BCMOLT_GPIO_PIN_PIN64:
            break;
        case BCMOLT_GPIO_PIN_PIN65:
            break;
        case BCMOLT_GPIO_PIN_PIN66:
            break;
        case BCMOLT_GPIO_PIN_PIN67:
            break;
        case BCMOLT_GPIO_PIN_PIN68:
            break;
        case BCMOLT_GPIO_PIN_PIN69:
            break;
        case BCMOLT_GPIO_PIN_PIN70:
            break;
        case BCMOLT_GPIO_PIN_PIN71:
            break;
        case BCMOLT_GPIO_PIN_PIN72:
            break;
        case BCMOLT_GPIO_PIN_PIN73:
            break;
        case BCMOLT_GPIO_PIN_PIN74:
            break;
        case BCMOLT_GPIO_PIN_PIN75:
            break;
        case BCMOLT_GPIO_PIN_PIN76:
            break;
        case BCMOLT_GPIO_PIN_PIN77:
            break;
        case BCMOLT_GPIO_PIN_PIN78:
            break;
        case BCMOLT_GPIO_PIN_PIN79:
            break;
        case BCMOLT_GPIO_PIN_PIN80:
            break;
        case BCMOLT_GPIO_PIN_PIN81:
            break;
        case BCMOLT_GPIO_PIN_PIN82:
            break;
        case BCMOLT_GPIO_PIN_PIN83:
            break;
        case BCMOLT_GPIO_PIN_PIN84:
            break;
        case BCMOLT_GPIO_PIN_PIN85:
            break;
        case BCMOLT_GPIO_PIN_PIN86:
            break;
        case BCMOLT_GPIO_PIN_PIN87:
            break;
        case BCMOLT_GPIO_PIN_PIN88:
            break;
        case BCMOLT_GPIO_PIN_PIN89:
            break;
        case BCMOLT_GPIO_PIN_PIN90:
            break;
        case BCMOLT_GPIO_PIN_PIN91:
            break;
        case BCMOLT_GPIO_PIN_PIN92:
            break;
        case BCMOLT_GPIO_PIN_PIN93:
            break;
        case BCMOLT_GPIO_PIN_PIN94:
            break;
        case BCMOLT_GPIO_PIN_PIN95:
            break;
        case BCMOLT_GPIO_PIN_PIN96:
            break;
        case BCMOLT_GPIO_PIN_PIN97:
            break;
        case BCMOLT_GPIO_PIN_PIN98:
            break;
        case BCMOLT_GPIO_PIN_PIN99:
            break;
        case BCMOLT_GPIO_PIN_PIN100:
            break;
        case BCMOLT_GPIO_PIN_PIN101:
            break;
        case BCMOLT_GPIO_PIN_PIN102:
            break;
        case BCMOLT_GPIO_PIN_PIN103:
            break;
        case BCMOLT_GPIO_PIN_PIN104:
            break;
        case BCMOLT_GPIO_PIN_PIN105:
            break;
        case BCMOLT_GPIO_PIN_PIN106:
            break;
        case BCMOLT_GPIO_PIN_UNCONFIGURED:
            break;
        default:
            return BCMOS_FALSE;
    }

    if ((this->options & 0xFFFFFFFCUL) != 0)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_pon_status_set_default(bcmolt_pon_status *this)
{
    this->state = BCMOLT_PON_STATE_INACTIVE;
    this->los_status = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_status_pack(const bcmolt_pon_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_pon_state_pack(this->state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->los_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_status_unpack(bcmolt_pon_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_pon_state_unpack(&this->state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->los_status, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_pon_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_pon_status_bounds_check(const bcmolt_pon_status *this)
{
    switch (this->state)
    {
        case BCMOLT_PON_STATE_INACTIVE:
            break;
        case BCMOLT_PON_STATE_PROCESSING:
            break;
        case BCMOLT_PON_STATE_ACTIVE_WORKING:
            break;
        case BCMOLT_PON_STATE_ACTIVE_STANDBY:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->los_status)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_prbs_checker_config_set_default(bcmolt_prbs_checker_config *this)
{
    this->polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
    this->mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
    this->data_invert = BCMOS_FALSE;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_config_pack(const bcmolt_prbs_checker_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_prbs_polynomial_pack(this->polynom, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_prbs_checker_mode_pack(this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->data_invert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_config_unpack(bcmolt_prbs_checker_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_prbs_polynomial_unpack(&this->polynom, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_prbs_checker_mode_unpack(&this->mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->data_invert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_checker_config_bounds_check(const bcmolt_prbs_checker_config *this)
{
    switch (this->polynom)
    {
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_7:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_9:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_11:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_15:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_23:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_31:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_58:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->mode)
    {
        case BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC:
            break;
        case BCMOLT_PRBS_CHECKER_MODE_INITIAL_SEED_MODE:
            break;
        case BCMOLT_PRBS_CHECKER_MODE_INITIAL_SEED_MODE_2:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_prbs_generator_config_set_default(bcmolt_prbs_generator_config *this)
{
    this->polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
    this->error_insert = BCMOS_FALSE;
    this->invert = BCMOS_FALSE;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_generator_config_pack(const bcmolt_prbs_generator_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_prbs_polynomial_pack(this->polynom, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->error_insert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->invert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_generator_config_unpack(bcmolt_prbs_generator_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_prbs_polynomial_unpack(&this->polynom, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->error_insert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->invert))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_generator_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_generator_config_bounds_check(const bcmolt_prbs_generator_config *this)
{
    switch (this->polynom)
    {
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_7:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_9:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_11:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_15:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_23:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_31:
            break;
        case BCMOLT_PRBS_POLYNOMIAL_PRBS_58:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_prbs_status_set_default(bcmolt_prbs_status *this)
{
    this->lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
    this->error_counts = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_status_pack(const bcmolt_prbs_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_prbs_lock_state_pack(this->lock_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->error_counts))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_status_unpack(bcmolt_prbs_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_prbs_lock_state_unpack(&this->lock_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->error_counts))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_prbs_status_bounds_check(const bcmolt_prbs_status *this)
{
    switch (this->lock_state)
    {
        case BCMOLT_PRBS_LOCK_STATE_UNLOCKED:
            break;
        case BCMOLT_PRBS_LOCK_STATE_LOCKED:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ranging_control_configuration_set_default(bcmolt_ranging_control_configuration *this)
{
    this->wait_state_1_window_size = 0;
    this->wait_state_2_window_size = 0;
    this->wait_after_resync_4 = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_control_configuration_pack(const bcmolt_ranging_control_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->wait_state_1_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->wait_state_2_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->wait_after_resync_4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_control_configuration_unpack(bcmolt_ranging_control_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->wait_state_1_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->wait_state_2_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->wait_after_resync_4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_control_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_control_configuration_bounds_check(const bcmolt_ranging_control_configuration *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ranging_resync_conditions_set_default(bcmolt_ranging_resync_conditions *this)
{
    this->after_init = BCMOS_FALSE;
    this->after_no_ed = BCMOS_FALSE;
    this->after_ed = BCMOS_FALSE;
    this->after_no_del = BCMOS_FALSE;
    this->after_ranging_access = BCMOS_FALSE;
    this->med_val = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_resync_conditions_pack(const bcmolt_ranging_resync_conditions *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->after_init))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_no_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_no_del))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_ranging_access))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->med_val))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_resync_conditions_unpack(bcmolt_ranging_resync_conditions *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->after_init))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_no_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_no_del))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_ranging_access))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->med_val))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_resync_conditions_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_resync_conditions_bounds_check(const bcmolt_ranging_resync_conditions *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ranging_rssi_control_set_default(bcmolt_ranging_rssi_control *this)
{
    this->after_no_ed = BCMOS_FALSE;
    this->after_ed = BCMOS_FALSE;
    this->after_reset_3 = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_rssi_control_pack(const bcmolt_ranging_rssi_control *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->after_no_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->after_reset_3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_rssi_control_unpack(bcmolt_ranging_rssi_control *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->after_no_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->after_reset_3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_rssi_control_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_ranging_rssi_control_bounds_check(const bcmolt_ranging_rssi_control *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_request_registration_status_set_default(bcmolt_request_registration_status *this)
{
    this->request_registration_state = BCMOLT_CONTROL_STATE_DISABLE;
    this->sma_flag = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_status_pack(const bcmolt_request_registration_status *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->request_registration_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->sma_flag))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_status_unpack(bcmolt_request_registration_status *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->request_registration_state, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->sma_flag))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_status_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_request_registration_status_bounds_check(const bcmolt_request_registration_status *this)
{
    switch (this->request_registration_state)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_rogue_detection_special_map_set_default(bcmolt_rogue_detection_special_map *this)
{
    this->plo_size = 0;
    this->alloc_id = (bcmolt_pon_alloc_id) 0;
    this->onu_id = (bcmolt_pon_onu_id) 0;
    this->access_size = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_pack(const bcmolt_rogue_detection_special_map *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->plo_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->access_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_unpack(bcmolt_rogue_detection_special_map *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->plo_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->access_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_bounds_check(const bcmolt_rogue_detection_special_map *this)
{
    if (this->alloc_id > (bcmolt_pon_alloc_id) 16383)
    {
        return BCMOS_FALSE;
    }

    if (this->onu_id > (bcmolt_pon_onu_id) 511)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_rogue_detection_special_map_list_u32_max_8_set_default(bcmolt_rogue_detection_special_map_list_u32_max_8 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_pack(const bcmolt_rogue_detection_special_map_list_u32_max_8 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_rogue_detection_special_map_list_u32_max_8\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 8)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_rogue_detection_special_map_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_rogue_detection_special_map_list_u32_max_8_get_packed_length(const bcmolt_rogue_detection_special_map_list_u32_max_8 *this)
{
    return 4 + (9 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_unpack(bcmolt_rogue_detection_special_map_list_u32_max_8 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_rogue_detection_special_map_list_u32_max_8\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_rogue_detection_special_map *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_rogue_detection_special_map));
        }
    }

    if (this->len > 8)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_rogue_detection_special_map_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_rogue_detection_special_map) * len);
    if (!bcmolt_buf_skip(packed, len * 9))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_bounds_check(const bcmolt_rogue_detection_special_map_list_u32_max_8 *this)
{
    if (this->len > 8)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_rogue_detection_algorithm_set_default(bcmolt_rogue_detection_algorithm *this)
{
    this->algorithm_type = (bcmolt_rogue_detection_algorithm_type) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_pack(const bcmolt_rogue_detection_algorithm *this, bcmolt_buf *buf)
{
    if (!bcmolt_rogue_detection_algorithm_type_pack(this->algorithm_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->algorithm_type)
    {
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
            {
                if (!bcmolt_rogue_detection_window_pack(this->u.early_rogue_detection.measurement_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_u32(buf, this->u.early_rogue_detection.interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_bool(buf, this->u.early_rogue_detection.second_ranging_window))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_alloc_type_to_scan_pack(this->u.early_rogue_detection.alloc_type_to_scan, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
            {
                if (!bcmolt_rogue_detection_special_map_list_u32_max_8_pack(&this->u.special_map.accesses, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
            {
                if (!bcmolt_buf_write_u32(buf, this->u.extended_guard_time.additional_guard_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_rogue_detection_algorithm_get_packed_length(const bcmolt_rogue_detection_algorithm *this)
{
    uint32_t count = 1;
    switch (this->algorithm_type)
    {
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
            {
                count += 7;
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
            {
                count += bcmolt_rogue_detection_special_map_list_u32_max_8_get_packed_length(&this->u.special_map.accesses);
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
            {
                count += 4;
            }
            break;
        default:
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_unpack(bcmolt_rogue_detection_algorithm *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_rogue_detection_algorithm_type_unpack(&this->algorithm_type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->algorithm_type)
    {
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
            {
                if (!bcmolt_rogue_detection_window_unpack(&this->u.early_rogue_detection.measurement_type, buf))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_u32(buf, &this->u.early_rogue_detection.interval))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_bool(buf, &this->u.early_rogue_detection.second_ranging_window))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_alloc_type_to_scan_unpack(&this->u.early_rogue_detection.alloc_type_to_scan, buf))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
            {
                if (!bcmolt_rogue_detection_special_map_list_u32_max_8_unpack(&this->u.special_map.accesses, buf, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
            {
                if (!bcmolt_buf_read_u32(buf, &this->u.extended_guard_time.additional_guard_time))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_rogue_detection_algorithm_type algorithm_type;
    if (!bcmolt_rogue_detection_algorithm_type_unpack(&algorithm_type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (algorithm_type)
    {
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
            {
                if (!bcmolt_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }

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

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

                if (!bcmolt_buf_skip(packed, 1))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
            {
                if (!bcmolt_rogue_detection_special_map_list_u32_max_8_scan(packed, extra_mem))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
            {
                if (!bcmolt_buf_skip(packed, 4))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_detection_algorithm_bounds_check(const bcmolt_rogue_detection_algorithm *this)
{
    switch (this->algorithm_type)
    {
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION:
            {
                switch (this->u.early_rogue_detection.measurement_type)
                {
                    case BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW:
                        break;
                    case BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW:
                        break;
                    default:
                        return BCMOS_FALSE;
                }

                if (this->u.early_rogue_detection.interval < 1000)
                {
                    return BCMOS_FALSE;
                }

                if (this->u.early_rogue_detection.interval > 10000000UL)
                {
                    return BCMOS_FALSE;
                }

                switch (this->u.early_rogue_detection.alloc_type_to_scan)
                {
                    case BCMOLT_ALLOC_TYPE_TO_SCAN_UNUSED:
                        break;
                    case BCMOLT_ALLOC_TYPE_TO_SCAN_PREVIOUSLY_USED:
                        break;
                    case BCMOLT_ALLOC_TYPE_TO_SCAN_ALL:
                        break;
                    default:
                        return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP:
            {
                if (this->u.special_map.accesses.len > 8)
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_rogue_detection_special_map_list_u32_max_8_bounds_check(&this->u.special_map.accesses))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME:
            {
                if (this->u.extended_guard_time.additional_guard_time > 500)
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_rogue_onu_detection_process_set_default(bcmolt_rogue_onu_detection_process *this)
{
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
    this->detection_algorithm.algorithm_type = BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION;
    this->detection_algorithm.u.early_rogue_detection.measurement_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
    this->detection_algorithm.u.early_rogue_detection.interval = 10000;
    this->detection_algorithm.u.early_rogue_detection.second_ranging_window = BCMOS_FALSE;
    this->detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = BCMOLT_ALLOC_TYPE_TO_SCAN_ALL;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_onu_detection_process_pack(const bcmolt_rogue_onu_detection_process *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_detection_algorithm_pack(&this->detection_algorithm, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_rogue_onu_detection_process_get_packed_length(const bcmolt_rogue_onu_detection_process *this)
{
    return 1 + bcmolt_rogue_detection_algorithm_get_packed_length(&this->detection_algorithm);
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_onu_detection_process_unpack(bcmolt_rogue_onu_detection_process *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_detection_algorithm_unpack(&this->detection_algorithm, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_onu_detection_process_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_buf_skip(packed, 1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_detection_algorithm_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_rogue_onu_detection_process_bounds_check(const bcmolt_rogue_onu_detection_process *this)
{
    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (!bcmolt_rogue_detection_algorithm_bounds_check(&this->detection_algorithm))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_serdes_configuration_set_default(bcmolt_serdes_configuration *this)
{
    this->ranging_mode = BCMOLT_SERDES_RANGING_MODE_BCDR_RESET_MODE;
    this->multi_ed_mode = BCMOS_FALSE;
    this->burst_enable_start_offset = 0;
    this->burst_enable_end_offset = 0;
    this->ed_invertion = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_configuration_pack(const bcmolt_serdes_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_serdes_ranging_mode_pack(this->ranging_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->multi_ed_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->burst_enable_start_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->burst_enable_end_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->ed_invertion))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_configuration_unpack(bcmolt_serdes_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_serdes_ranging_mode_unpack(&this->ranging_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->multi_ed_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->burst_enable_start_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->burst_enable_end_offset))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->ed_invertion))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_serdes_configuration_bounds_check(const bcmolt_serdes_configuration *this)
{
    switch (this->ranging_mode)
    {
        case BCMOLT_SERDES_RANGING_MODE_ED_MODE:
            break;
        case BCMOLT_SERDES_RANGING_MODE_BCDR_RESET_MODE:
            break;
        case BCMOLT_SERDES_RANGING_MODE_FAST_MODE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_serial_number_set_default(bcmolt_serial_number *this)
{
    memset(this->vendor_id, 0, sizeof(this->vendor_id));
    memset(this->vendor_specific, 0, sizeof(this->vendor_specific));
}

/******************************************************************************/
bcmos_bool bcmolt_serial_number_pack(const bcmolt_serial_number *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->vendor_id, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->vendor_specific, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serial_number_unpack(bcmolt_serial_number *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->vendor_id, 4))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->vendor_specific, 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_serial_number_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_serial_number_bounds_check(const bcmolt_serial_number *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_solicited_scheduler_set_default(bcmolt_solicited_scheduler *this)
{
    this->bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
    this->max_burst_size_tq = (bcmolt_time_quanta) 0;
    this->priority = 0;
    this->weight_tq = (bcmolt_time_quanta) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_solicited_scheduler_pack(const bcmolt_solicited_scheduler *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->bandwidth_Kbps))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->max_burst_size_tq))
    {
        return BCMOS_FALSE;
    }

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

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->weight_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_solicited_scheduler_unpack(bcmolt_solicited_scheduler *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->bandwidth_Kbps))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->max_burst_size_tq))
    {
        return BCMOS_FALSE;
    }

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

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->weight_tq))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_solicited_scheduler_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 13);
}

/******************************************************************************/
bcmos_bool bcmolt_solicited_scheduler_bounds_check(const bcmolt_solicited_scheduler *this)
{
    if (this->priority > 7)
    {
        return BCMOS_FALSE;
    }

    if (this->weight_tq > (bcmolt_time_quanta) 262106UL)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_stat_alarm_trigger_config_set_default(bcmolt_stat_alarm_trigger_config *this)
{
    this->type = (bcmolt_stat_condition_type) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_trigger_config_pack(const bcmolt_stat_alarm_trigger_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_stat_condition_type_pack(this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
            {
                if (!bcmolt_buf_write_u64(buf, this->u.rate_threshold.rising))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_u64(buf, this->u.rate_threshold.falling))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
            {
                if (!bcmolt_buf_write_u64(buf, this->u.rate_range.upper))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_write_u64(buf, this->u.rate_range.lower))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
            {
                if (!bcmolt_buf_write_u64(buf, this->u.value_threshold.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_NONE:
            {
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_stat_alarm_trigger_config_get_packed_length(const bcmolt_stat_alarm_trigger_config *this)
{
    uint32_t count = 1;
    switch (this->type)
    {
        case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
            {
                count += 16;
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
            {
                count += 16;
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
            {
                count += 8;
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_NONE:
            {
            }
            break;
        default:
            break;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_trigger_config_unpack(bcmolt_stat_alarm_trigger_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_stat_condition_type_unpack(&this->type, buf))
    {
        return BCMOS_FALSE;
    }

    switch (this->type)
    {
        case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
            {
                if (!bcmolt_buf_read_u64(buf, &this->u.rate_threshold.rising))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_u64(buf, &this->u.rate_threshold.falling))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
            {
                if (!bcmolt_buf_read_u64(buf, &this->u.rate_range.upper))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_read_u64(buf, &this->u.rate_range.lower))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
            {
                if (!bcmolt_buf_read_u64(buf, &this->u.value_threshold.limit))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_NONE:
            {
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_trigger_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    bcmolt_stat_condition_type type;
    if (!bcmolt_stat_condition_type_unpack(&type, packed))
    {
        return BCMOS_FALSE;
    }

    switch (type)
    {
        case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
            {
                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
            {
                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }

                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
            {
                if (!bcmolt_buf_skip(packed, 8))
                {
                    return BCMOS_FALSE;
                }
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_NONE:
            {
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_trigger_config_bounds_check(const bcmolt_stat_alarm_trigger_config *this)
{
    switch (this->type)
    {
        case BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD:
            {
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE:
            {
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD:
            {
            }
            break;
        case BCMOLT_STAT_CONDITION_TYPE_NONE:
            {
            }
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_stat_alarm_soak_config_set_default(bcmolt_stat_alarm_soak_config *this)
{
    this->active_soak_time = 0;
    this->clear_soak_time = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_soak_config_pack(const bcmolt_stat_alarm_soak_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->active_soak_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->clear_soak_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_soak_config_unpack(bcmolt_stat_alarm_soak_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->active_soak_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->clear_soak_time))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_soak_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_soak_config_bounds_check(const bcmolt_stat_alarm_soak_config *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_stat_alarm_config_set_default(bcmolt_stat_alarm_config *this)
{
    this->trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
    this->soak.active_soak_time = 0;
    this->soak.clear_soak_time = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_config_pack(const bcmolt_stat_alarm_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_stat_alarm_trigger_config_pack(&this->trigger, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_stat_alarm_soak_config_pack(&this->soak, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_stat_alarm_config_get_packed_length(const bcmolt_stat_alarm_config *this)
{
    return 8 + bcmolt_stat_alarm_trigger_config_get_packed_length(&this->trigger);
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_config_unpack(bcmolt_stat_alarm_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_stat_alarm_trigger_config_unpack(&this->trigger, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_stat_alarm_soak_config_unpack(&this->soak, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    if (!bcmolt_stat_alarm_trigger_config_scan(packed, extra_mem))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_stat_alarm_config_bounds_check(const bcmolt_stat_alarm_config *this)
{
    if (!bcmolt_stat_alarm_trigger_config_bounds_check(&this->trigger))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_stat_alarm_soak_config_bounds_check(&this->soak))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_str_100_set_default(bcmolt_str_100 *this)
{
    memset(this->str, 0, 100);
}

/******************************************************************************/
bcmos_bool bcmolt_str_100_pack(const bcmolt_str_100 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->str, 100))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_100_unpack(bcmolt_str_100 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->str, 100))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_100_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 100);
}

/******************************************************************************/
bcmos_bool bcmolt_str_100_bounds_check(const bcmolt_str_100 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_str_1000_set_default(bcmolt_str_1000 *this)
{
    memset(this->str, 0, 1000);
}

/******************************************************************************/
bcmos_bool bcmolt_str_1000_pack(const bcmolt_str_1000 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->str, 1000))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_1000_unpack(bcmolt_str_1000 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->str, 1000))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_1000_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 1000);
}

/******************************************************************************/
bcmos_bool bcmolt_str_1000_bounds_check(const bcmolt_str_1000 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_str_2000_set_default(bcmolt_str_2000 *this)
{
    memset(this->str, 0, 2000);
}

/******************************************************************************/
bcmos_bool bcmolt_str_2000_pack(const bcmolt_str_2000 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->str, 2000))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_2000_unpack(bcmolt_str_2000 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->str, 2000))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_2000_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2000);
}

/******************************************************************************/
bcmos_bool bcmolt_str_2000_bounds_check(const bcmolt_str_2000 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_str_256_set_default(bcmolt_str_256 *this)
{
    memset(this->str, 0, 256);
}

/******************************************************************************/
bcmos_bool bcmolt_str_256_pack(const bcmolt_str_256 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->str, 256))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_256_unpack(bcmolt_str_256 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->str, 256))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_256_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 256);
}

/******************************************************************************/
bcmos_bool bcmolt_str_256_bounds_check(const bcmolt_str_256 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_str_64_set_default(bcmolt_str_64 *this)
{
    memset(this->str, 0, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_str_64_pack(const bcmolt_str_64 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->str, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_64_unpack(bcmolt_str_64 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->str, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_str_64_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_str_64_bounds_check(const bcmolt_str_64 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_sw_error_set_default(bcmolt_sw_error *this)
{
    this->first_error_time_us = 0;
    this->last_error_time_us = 0;
    this->line_number = 0;
    this->error_counter = 0;
    this->instance = 0;
    memset(this->filename, 0, 64);
    memset(this->task_name, 0, 64);
}

/******************************************************************************/
bcmos_bool bcmolt_sw_error_pack(const bcmolt_sw_error *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u64(buf, this->first_error_time_us))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u64(buf, this->last_error_time_us))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->line_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->error_counter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->filename, 64))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->task_name, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_sw_error_unpack(bcmolt_sw_error *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u64(buf, &this->first_error_time_us))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u64(buf, &this->last_error_time_us))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->line_number))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->error_counter))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->instance))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->filename, 64))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->task_name, 64))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_sw_error_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 156);
}

/******************************************************************************/
bcmos_bool bcmolt_sw_error_bounds_check(const bcmolt_sw_error *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_system_profile_set_default(bcmolt_system_profile *this)
{
    this->ng_2_sys_id = 0;
    this->version = 0;
    this->channel_spacing = 0;
    this->us_operating_wavelength_bands = BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_WIDE_BAND;
    this->us_mse = 0;
    this->loose_calibration_bound = BCMOLT_CALIBRATION_RECORD_UNSPECIFIED;
    this->fsr = 0;
    this->twdm_channel_count = 8;
}

/******************************************************************************/
bcmos_bool bcmolt_system_profile_pack(const bcmolt_system_profile *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->ng_2_sys_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->channel_spacing))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_us_operating_wavelength_bands_pack(this->us_operating_wavelength_bands, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->us_mse))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_calibration_record_pack(this->loose_calibration_bound, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->fsr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->twdm_channel_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_system_profile_unpack(bcmolt_system_profile *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->ng_2_sys_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->version))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->channel_spacing))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_us_operating_wavelength_bands_unpack(&this->us_operating_wavelength_bands, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->us_mse))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_calibration_record_unpack(&this->loose_calibration_bound, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->fsr))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->twdm_channel_count))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_system_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 12);
}

/******************************************************************************/
bcmos_bool bcmolt_system_profile_bounds_check(const bcmolt_system_profile *this)
{
    if (this->ng_2_sys_id > 1048575UL)
    {
        return BCMOS_FALSE;
    }

    if (this->version > 15)
    {
        return BCMOS_FALSE;
    }

    switch (this->us_operating_wavelength_bands)
    {
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_WIDE_BAND:
            break;
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_REDUCED_BAND:
            break;
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_NARROW_BAND:
            break;
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_WIDE_BAND:
            break;
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_REDUCED_BAND:
            break;
        case BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_NARROW_BAND:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->loose_calibration_bound)
    {
        case BCMOLT_CALIBRATION_RECORD_UNSPECIFIED:
            break;
        case BCMOLT_CALIBRATION_RECORD_UNCALIBRATED:
            break;
        case BCMOLT_CALIBRATION_RECORD_LOOSE:
            break;
        case BCMOLT_CALIBRATION_RECORD_SUFFICIENT:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->twdm_channel_count > 15)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_delimiter_set_default(bcmolt_trx_delimiter *this)
{
    this->pattern[0] = 171;
    this->pattern[1] = 89;
    this->pattern[2] = 131;
    this->size = 3;
    this->window_size = 124;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_delimiter_pack(const bcmolt_trx_delimiter *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write(buf, this->pattern, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->window_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_delimiter_unpack(bcmolt_trx_delimiter *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read(buf, this->pattern, 3))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->window_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_delimiter_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_delimiter_bounds_check(const bcmolt_trx_delimiter *this)
{
    if (this->window_size < 2)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_energy_detect_set_default(bcmolt_trx_energy_detect *this)
{
    this->ranging_ed_source = BCMOLT_ENERGY_DETECT_SOURCE_TRX;
    this->delimiter_ed_source = BCMOLT_ENERGY_DETECT_SOURCE_TRX;
    this->minimum_threshold = 0;
    this->maximum_threshold = 41;
    this->ed_pattern = 170;
    this->ed_pattern_size = 0;
    this->window_size = 124;
    this->inversion = BCMOS_FALSE;
    this->no_ed_threshold = 127;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_energy_detect_pack(const bcmolt_trx_energy_detect *this, bcmolt_buf *buf)
{
    if (!bcmolt_energy_detect_source_pack(this->ranging_ed_source, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_energy_detect_source_pack(this->delimiter_ed_source, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->minimum_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->maximum_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->ed_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->ed_pattern_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->inversion))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->no_ed_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_energy_detect_unpack(bcmolt_trx_energy_detect *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_energy_detect_source_unpack(&this->ranging_ed_source, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_energy_detect_source_unpack(&this->delimiter_ed_source, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->minimum_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->maximum_threshold))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->ed_pattern))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->ed_pattern_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->inversion))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->no_ed_threshold))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_energy_detect_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 9);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_energy_detect_bounds_check(const bcmolt_trx_energy_detect *this)
{
    switch (this->ranging_ed_source)
    {
        case BCMOLT_ENERGY_DETECT_SOURCE_INTERNAL:
            break;
        case BCMOLT_ENERGY_DETECT_SOURCE_TRX:
            break;
        case BCMOLT_ENERGY_DETECT_SOURCE_BCDR:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->delimiter_ed_source)
    {
        case BCMOLT_ENERGY_DETECT_SOURCE_INTERNAL:
            break;
        case BCMOLT_ENERGY_DETECT_SOURCE_TRX:
            break;
        case BCMOLT_ENERGY_DETECT_SOURCE_BCDR:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->window_size < 2)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_preamble_set_default(bcmolt_trx_preamble *this)
{
    this->type_1_size = 0;
    this->type_2_size = 0;
    this->type_3_pre_ranging_size = 50;
    this->type_3_post_ranging_size = 15;
    this->type_3_pattern = 170;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_preamble_pack(const bcmolt_trx_preamble *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->type_1_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->type_2_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->type_3_pre_ranging_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->type_3_post_ranging_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->type_3_pattern))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_preamble_unpack(bcmolt_trx_preamble *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->type_1_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->type_2_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->type_3_pre_ranging_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->type_3_post_ranging_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->type_3_pattern))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_preamble_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_preamble_bounds_check(const bcmolt_trx_preamble *this)
{
    if (this->type_3_post_ranging_size < 5)
    {
        return BCMOS_FALSE;
    }

    if (this->type_3_post_ranging_size > 120)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_rx_configuration_set_default(bcmolt_trx_rx_configuration *this)
{
    this->wait_window_size = 0;
    this->ranging_access_window_size = 15;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_rx_configuration_pack(const bcmolt_trx_rx_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->wait_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->ranging_access_window_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_rx_configuration_unpack(bcmolt_trx_rx_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->wait_window_size))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->ranging_access_window_size))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_rx_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_trx_rx_configuration_bounds_check(const bcmolt_trx_rx_configuration *this)
{
    if (this->ranging_access_window_size < 7)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_u32_list_u32_max_500_hex_set_default(bcmolt_u32_list_u32_max_500_hex *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_u32_list_u32_max_500_hex_pack(const bcmolt_u32_list_u32_max_500_hex *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_u32_list_u32_max_500_hex\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 500)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_write_u32(buf, this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_u32_list_u32_max_500_hex_get_packed_length(const bcmolt_u32_list_u32_max_500_hex *this)
{
    return 4 + (4 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_u32_list_u32_max_500_hex_unpack(bcmolt_u32_list_u32_max_500_hex *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_u32_list_u32_max_500_hex\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint32_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint32_t));
        }
    }

    if (this->len > 500)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_u32(buf, &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u32_list_u32_max_500_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(uint32_t) * len);
    if (!bcmolt_buf_skip(packed, len * 4))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u32_list_u32_max_500_hex_bounds_check(const bcmolt_u32_list_u32_max_500_hex *this)
{
    if (this->len > 500)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_u8_list_u16_hex_set_default(bcmolt_u8_list_u16_hex *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_hex_pack(const bcmolt_u8_list_u16_hex *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(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_u8_list_u16_hex\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_u8_list_u16_hex_get_packed_length(const bcmolt_u8_list_u16_hex *this)
{
    return 2 + this->len;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_hex_unpack(bcmolt_u8_list_u16_hex *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(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_u8_list_u16_hex\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint8_t));
        }
    }

    if (!bcmolt_buf_read(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u16_hex_bounds_check(const bcmolt_u8_list_u16_hex *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_u8_list_u32_set_default(bcmolt_u8_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_pack(const bcmolt_u8_list_u32 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(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_u8_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_u8_list_u32_get_packed_length(const bcmolt_u8_list_u32 *this)
{
    return 4 + this->len;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_unpack(bcmolt_u8_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(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_u8_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint8_t));
        }
    }

    if (!bcmolt_buf_read(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_bounds_check(const bcmolt_u8_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_u8_list_u32_max_2048_set_default(bcmolt_u8_list_u32_max_2048 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_max_2048_pack(const bcmolt_u8_list_u32_max_2048 *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(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_u8_list_u32_max_2048\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_u8_list_u32_max_2048_get_packed_length(const bcmolt_u8_list_u32_max_2048 *this)
{
    return 4 + this->len;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_max_2048_unpack(bcmolt_u8_list_u32_max_2048 *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(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_u8_list_u32_max_2048\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (uint8_t *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(uint8_t));
        }
    }

    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read(buf, this->val, this->len))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_max_2048_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_u8_list_u32_max_2048_bounds_check(const bcmolt_u8_list_u32_max_2048 *this)
{
    if (this->len > 2048)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ubd_info_set_default(bcmolt_ubd_info *this)
{
    this->actual_polling_interval = 0;
    this->actual_grant_threshold_tq = (bcmolt_time_quanta) 0;
    this->actual_min_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) 0;
    this->actual_min_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) 0;
    this->actual_max_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) 0;
    this->actual_max_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_ubd_info_pack(const bcmolt_ubd_info *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->actual_polling_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->actual_grant_threshold_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_actual_schedulershaper_pack(&this->actual_min_schedulershaper, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_actual_schedulershaper_pack(&this->actual_max_schedulershaper, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ubd_info_unpack(bcmolt_ubd_info *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->actual_polling_interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->actual_grant_threshold_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_actual_schedulershaper_unpack(&this->actual_min_schedulershaper, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_actual_schedulershaper_unpack(&this->actual_max_schedulershaper, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ubd_info_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 22);
}

/******************************************************************************/
bcmos_bool bcmolt_ubd_info_bounds_check(const bcmolt_ubd_info *this)
{
    if (!bcmolt_actual_schedulershaper_bounds_check(&this->actual_min_schedulershaper))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_actual_schedulershaper_bounds_check(&this->actual_max_schedulershaper))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_upstream_bandwidth_distribution_set_default(bcmolt_upstream_bandwidth_distribution *this)
{
    this->polling_interval_us = BCMOLT_POLLING_INTERVAL_AUTOMATIC;
    this->grant_threshold_tq = (bcmolt_time_quanta) 0;
    this->min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
    this->min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
    this->min_schedulershaper.priority = 0;
    this->min_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
    this->max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
    this->max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
    this->max_schedulershaper.priority = 0;
    this->max_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
    this->tdm_grant_size_tq = (bcmolt_time_quanta) 0;
    this->tdm_grant_interval_us = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_bandwidth_distribution_pack(const bcmolt_upstream_bandwidth_distribution *this, bcmolt_buf *buf)
{
    if (!bcmolt_polling_interval_pack(this->polling_interval_us, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->grant_threshold_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_pack(&this->min_schedulershaper, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_pack(&this->max_schedulershaper, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, (uint32_t) this->tdm_grant_size_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->tdm_grant_interval_us))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_bandwidth_distribution_unpack(bcmolt_upstream_bandwidth_distribution *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_polling_interval_unpack(&this->polling_interval_us, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->grant_threshold_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_unpack(&this->min_schedulershaper, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_unpack(&this->max_schedulershaper, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->tdm_grant_size_tq))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->tdm_grant_interval_us))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_bandwidth_distribution_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 42);
}

/******************************************************************************/
bcmos_bool bcmolt_upstream_bandwidth_distribution_bounds_check(const bcmolt_upstream_bandwidth_distribution *this)
{
    switch (this->polling_interval_us)
    {
        case BCMOLT_POLLING_INTERVAL_POLLING_DISABLED:
            break;
        case BCMOLT_POLLING_INTERVAL_US_500:
            break;
        case BCMOLT_POLLING_INTERVAL_MS_1:
            break;
        case BCMOLT_POLLING_INTERVAL_MS_2:
            break;
        case BCMOLT_POLLING_INTERVAL_MS_4:
            break;
        case BCMOLT_POLLING_INTERVAL_MS_8:
            break;
        case BCMOLT_POLLING_INTERVAL_MS_16:
            break;
        case BCMOLT_POLLING_INTERVAL_AUTOMATIC:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->grant_threshold_tq > (bcmolt_time_quanta) 65408UL)
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_bounds_check(&this->min_schedulershaper))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_solicited_scheduler_bounds_check(&this->max_schedulershaper))
    {
        return BCMOS_FALSE;
    }

    if (this->tdm_grant_size_tq > (bcmolt_time_quanta) 65408UL)
    {
        return BCMOS_FALSE;
    }

    if (this->tdm_grant_interval_us > 50000UL)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_vlan_tag_set_default(bcmolt_vlan_tag *this)
{
    this->vlan_id = (bcmolt_vlan_id) 0;
    this->pbit = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_tag_pack(const bcmolt_vlan_tag *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->pbit))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_tag_unpack(bcmolt_vlan_tag *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->vlan_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->pbit))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_tag_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_vlan_tag_bounds_check(const bcmolt_vlan_tag *this)
{
    if (this->vlan_id > (bcmolt_vlan_id) 4095)
    {
        return BCMOS_FALSE;
    }

    if (this->pbit > 7)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_with_state_set_default(bcmolt_xgpon_alloc_with_state *this)
{
    this->alloc_id = (bcmolt_xgpon_alloc_id) 0;
    this->state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_pack(const bcmolt_xgpon_alloc_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_unpack(bcmolt_xgpon_alloc_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_bounds_check(const bcmolt_xgpon_alloc_with_state *this)
{
    if (this->alloc_id > (bcmolt_xgpon_alloc_id) 16383)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_ALLOC_STATE_INACTIVE:
            break;
        case BCMOLT_ALLOC_STATE_PROCESSING:
            break;
        case BCMOLT_ALLOC_STATE_ACTIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_with_state_list_u16_max_32_set_default(bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_pack(const bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_xgpon_alloc_with_state_list_u16_max_32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_alloc_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_with_state_list_u16_max_32_get_packed_length(const bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_unpack(bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_xgpon_alloc_with_state_list_u16_max_32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_alloc_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_alloc_with_state));
        }
    }

    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_alloc_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_alloc_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_bounds_check(const bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this)
{
    if (this->len > 32)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ed_state_set_default(bcmolt_xgpon_ed_state *this)
{
    this->reset_on_ed_fail = BCMOS_FALSE;
    this->reset_on_ed_success = BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ed_state_pack(const bcmolt_xgpon_ed_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->reset_on_ed_fail))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->reset_on_ed_success))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ed_state_unpack(bcmolt_xgpon_ed_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->reset_on_ed_fail))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->reset_on_ed_success))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ed_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ed_state_bounds_check(const bcmolt_xgpon_ed_state *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_id_list_u8_max_16_set_default(bcmolt_xgpon_gem_id_list_u8_max_16 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_pack(const bcmolt_xgpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf)
{
    uint8_t i0;
    if (!bcmolt_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_xgpon_gem_id_list_u8_max_16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_id_list_u8_max_16_get_packed_length(const bcmolt_xgpon_gem_id_list_u8_max_16 *this)
{
    return 1 + (2 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_unpack(bcmolt_xgpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint8_t i0;
    if (!bcmolt_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_xgpon_gem_id_list_u8_max_16\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_gem_id *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_gem_id));
        }
    }

    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->val[i0]))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint8_t len;
    if (!bcmolt_buf_read_u8(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_gem_id) * len);
    if (!bcmolt_buf_skip(packed, len * 2))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_bounds_check(const bcmolt_xgpon_gem_id_list_u8_max_16 *this)
{
    if (this->len > 16)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_with_state_set_default(bcmolt_xgpon_gem_port_with_state *this)
{
    this->gem_id = (bcmolt_xgpon_gem_id) 0;
    this->state = BCMOLT_XGPON_GEM_PORT_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_pack(const bcmolt_xgpon_gem_port_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_unpack(bcmolt_xgpon_gem_port_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_bounds_check(const bcmolt_xgpon_gem_port_with_state *this)
{
    if (this->gem_id > (bcmolt_xgpon_gem_id) 65533U)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_XGPON_GEM_PORT_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_XGPON_GEM_PORT_STATE_INACTIVE:
            break;
        case BCMOLT_XGPON_GEM_PORT_STATE_ACTIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_with_state_list_u16_max_128_set_default(bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_128_pack(const bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_xgpon_gem_port_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_gem_port_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_with_state_list_u16_max_128_get_packed_length(const bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_128_unpack(bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_xgpon_gem_port_with_state_list_u16_max_128\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_gem_port_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_gem_port_with_state));
        }
    }

    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_gem_port_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_gem_port_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_128_bounds_check(const bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this)
{
    if (this->len > 128)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_with_state_list_u16_max_256_set_default(bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_256_pack(const bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_xgpon_gem_port_with_state_list_u16_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_gem_port_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_with_state_list_u16_max_256_get_packed_length(const bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_256_unpack(bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_xgpon_gem_port_with_state_list_u16_max_256\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_gem_port_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_gem_port_with_state));
        }
    }

    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_gem_port_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_gem_port_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_256_bounds_check(const bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this)
{
    if (this->len > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_key_exchange_set_default(bcmolt_xgpon_key_exchange *this)
{
    this->interval = 10000;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
    this->encrypted_ports_only = BCMOLT_CONTROL_STATE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_key_exchange_pack(const bcmolt_xgpon_key_exchange *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->encrypted_ports_only, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_key_exchange_unpack(bcmolt_xgpon_key_exchange *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->encrypted_ports_only, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_key_exchange_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_key_exchange_bounds_check(const bcmolt_xgpon_key_exchange *this)
{
    if (this->interval < 10000)
    {
        return BCMOS_FALSE;
    }

    if (this->interval > 3600000UL)
    {
        return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->encrypted_ports_only)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_multicast_key_set_default(bcmolt_xgpon_multicast_key *this)
{
    memset(this->key.bytes, 0, sizeof(this->key.bytes));
    this->key_control = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_multicast_key_pack(const bcmolt_xgpon_multicast_key *this, bcmolt_buf *buf)
{
    if (!bcmolt_aes_key_pack(&this->key, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->key_control))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_multicast_key_unpack(bcmolt_xgpon_multicast_key *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_aes_key_unpack(&this->key, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->key_control))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_multicast_key_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 17);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_multicast_key_bounds_check(const bcmolt_xgpon_multicast_key *this)
{
    if (!bcmolt_aes_key_bounds_check(&this->key))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_debug_set_default(bcmolt_xgpon_ni_debug *this)
{
    this->increase_available_cbr_bw = BCMOS_FALSE;
    this->inter_burst_gap_in_bytes = 512;
    this->number_of_gem_ports_per_onu = 64;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_debug_pack(const bcmolt_xgpon_ni_debug *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->increase_available_cbr_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->inter_burst_gap_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->number_of_gem_ports_per_onu))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_debug_unpack(bcmolt_xgpon_ni_debug *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->increase_available_cbr_bw))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->inter_burst_gap_in_bytes))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->number_of_gem_ports_per_onu))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_debug_bounds_check(const bcmolt_xgpon_ni_debug *this)
{
    if (this->number_of_gem_ports_per_onu < 8)
    {
        return BCMOS_FALSE;
    }

    if (this->number_of_gem_ports_per_onu > 256)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_activation_set_default(bcmolt_xgpon_onu_activation *this)
{
    this->key_exchange = BCMOLT_CONTROL_STATE_DISABLE;
    this->fail_due_to_regis_auto_fail = BCMOLT_CONTROL_STATE_ENABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_activation_pack(const bcmolt_xgpon_onu_activation *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->key_exchange, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->fail_due_to_regis_auto_fail, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_activation_unpack(bcmolt_xgpon_onu_activation *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->key_exchange, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->fail_due_to_regis_auto_fail, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_activation_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_activation_bounds_check(const bcmolt_xgpon_onu_activation *this)
{
    switch (this->key_exchange)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->fail_due_to_regis_auto_fail)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_aes_key_set_default(bcmolt_xgpon_onu_aes_key *this)
{
    memset(this->encryption_key.bytes, 0, sizeof(this->encryption_key.bytes));
    this->key_index = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_aes_key_pack(const bcmolt_xgpon_onu_aes_key *this, bcmolt_buf *buf)
{
    if (!bcmolt_aes_key_pack(&this->encryption_key, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->key_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_aes_key_unpack(bcmolt_xgpon_onu_aes_key *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_aes_key_unpack(&this->encryption_key, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->key_index))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_aes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 17);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_aes_key_bounds_check(const bcmolt_xgpon_onu_aes_key *this)
{
    if (!bcmolt_aes_key_bounds_check(&this->encryption_key))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_alarm_state_set_default(bcmolt_xgpon_onu_alarm_state *this)
{
    this->losi = BCMOLT_STATUS_OFF;
    this->lobi = BCMOLT_STATUS_OFF;
    this->lopci = BCMOLT_STATUS_OFF;
    this->lopci_mic_error = BCMOLT_STATUS_OFF;
    this->looci = BCMOLT_STATUS_OFF;
    this->tiwi = BCMOLT_STATUS_OFF;
    this->dowi = BCMOLT_STATUS_OFF;
    this->sufi = BCMOLT_STATUS_OFF;
    this->sfi = BCMOLT_STATUS_OFF;
    this->sdi = BCMOLT_STATUS_OFF;
    this->dfi = BCMOLT_STATUS_OFF;
    this->dgi = BCMOLT_STATUS_OFF;
    this->pqsi = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarm_state_pack(const bcmolt_xgpon_onu_alarm_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lobi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lopci, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lopci_mic_error, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->looci, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->tiwi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dowi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sufi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->sdi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->dgi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->pqsi, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarm_state_unpack(bcmolt_xgpon_onu_alarm_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lobi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lopci, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lopci_mic_error, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->looci, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->tiwi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dowi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sufi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->sdi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dfi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->dgi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->pqsi, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 13);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarm_state_bounds_check(const bcmolt_xgpon_onu_alarm_state *this)
{
    switch (this->losi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lobi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lopci)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lopci_mic_error)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->looci)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->tiwi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dowi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sufi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sfi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->sdi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dfi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->dgi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->pqsi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_alarms_set_default(bcmolt_xgpon_onu_alarms *this)
{
    this->losi = BCMOLT_STATUS_OFF;
    this->lobi = BCMOLT_STATUS_OFF;
    this->lopci_miss = BCMOLT_STATUS_OFF;
    this->lopci_mic_error = BCMOLT_STATUS_OFF;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_pack(const bcmolt_xgpon_onu_alarms *this, bcmolt_buf *buf)
{
    if (!bcmolt_status_pack(this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lobi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lopci_miss, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_pack(this->lopci_mic_error, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_unpack(bcmolt_xgpon_onu_alarms *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_status_unpack(&this->losi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lobi, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lopci_miss, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_status_unpack(&this->lopci_mic_error, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_bounds_check(const bcmolt_xgpon_onu_alarms *this)
{
    switch (this->losi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lobi)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lopci_miss)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->lopci_mic_error)
    {
        case BCMOLT_STATUS_OFF:
            break;
        case BCMOLT_STATUS_ON:
            break;
        case BCMOLT_STATUS_NO_CHANGE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_alarms_thresholds_set_default(bcmolt_xgpon_onu_alarms_thresholds *this)
{
    this->losi = 4;
    this->lobi = 4;
    this->looci = 3;
    this->lopci = 3;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_pack(const bcmolt_xgpon_onu_alarms_thresholds *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u8(buf, this->losi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->lobi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->looci))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->lopci))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_unpack(bcmolt_xgpon_onu_alarms_thresholds *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u8(buf, &this->losi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->lobi))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->looci))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->lopci))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_bounds_check(const bcmolt_xgpon_onu_alarms_thresholds *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_eqd_set_default(bcmolt_xgpon_onu_eqd *this)
{
    this->onu_id = (bcmolt_xgpon_onu_id) 0;
    this->eqd = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_pack(const bcmolt_xgpon_onu_eqd *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->eqd))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_unpack(bcmolt_xgpon_onu_eqd *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->eqd))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 6);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_bounds_check(const bcmolt_xgpon_onu_eqd *this)
{
    if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_eqd_list_u32_set_default(bcmolt_xgpon_onu_eqd_list_u32 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_pack(const bcmolt_xgpon_onu_eqd_list_u32 *this, bcmolt_buf *buf)
{
    uint32_t i0;
    if (!bcmolt_buf_write_u32(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_xgpon_onu_eqd_list_u32\" 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_xgpon_onu_eqd_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_eqd_list_u32_get_packed_length(const bcmolt_xgpon_onu_eqd_list_u32 *this)
{
    return 4 + (6 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_unpack(bcmolt_xgpon_onu_eqd_list_u32 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint32_t i0;
    if (!bcmolt_buf_read_u32(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_xgpon_onu_eqd_list_u32\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_onu_eqd *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_onu_eqd));
        }
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_onu_eqd_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint32_t len;
    if (!bcmolt_buf_read_u32(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_onu_eqd) * len);
    if (!bcmolt_buf_skip(packed, len * 6))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_bounds_check(const bcmolt_xgpon_onu_eqd_list_u32 *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_registration_keys_set_default(bcmolt_xgpon_onu_registration_keys *this)
{
    memset(this->ploam_ik.bytes, 0, sizeof(this->ploam_ik.bytes));
    memset(this->omci_ik.bytes, 0, sizeof(this->omci_ik.bytes));
    memset(this->omci_k1.bytes, 0, sizeof(this->omci_k1.bytes));
    memset(this->omci_k2.bytes, 0, sizeof(this->omci_k2.bytes));
    memset(this->kek.bytes, 0, sizeof(this->kek.bytes));
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_keys_pack(const bcmolt_xgpon_onu_registration_keys *this, bcmolt_buf *buf)
{
    if (!bcmolt_aes_key_pack(&this->ploam_ik, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_pack(&this->omci_ik, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_pack(&this->omci_k1, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_pack(&this->omci_k2, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_pack(&this->kek, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_keys_unpack(bcmolt_xgpon_onu_registration_keys *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_aes_key_unpack(&this->ploam_ik, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_unpack(&this->omci_ik, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_unpack(&this->omci_k1, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_unpack(&this->omci_k2, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_unpack(&this->kek, buf, extra_mem))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_keys_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 80);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_keys_bounds_check(const bcmolt_xgpon_onu_registration_keys *this)
{
    if (!bcmolt_aes_key_bounds_check(&this->ploam_ik))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_bounds_check(&this->omci_ik))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_bounds_check(&this->omci_k1))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_bounds_check(&this->omci_k2))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_aes_key_bounds_check(&this->kek))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_with_state_set_default(bcmolt_xgpon_onu_with_state *this)
{
    this->onu_id = (bcmolt_xgpon_onu_id) 0;
    this->state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_pack(const bcmolt_xgpon_onu_with_state *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_unpack(bcmolt_xgpon_onu_with_state *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
    {
        return BCMOS_FALSE;
    }

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

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 3);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_bounds_check(const bcmolt_xgpon_onu_with_state *this)
{
    if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
    {
        return BCMOS_FALSE;
    }

    switch (this->state)
    {
        case BCMOLT_ONU_STATE_NOT_CONFIGURED:
            break;
        case BCMOLT_ONU_STATE_INACTIVE:
            break;
        case BCMOLT_ONU_STATE_ACTIVE:
            break;
        case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
            break;
        case BCMOLT_ONU_STATE_DISABLED:
            break;
        case BCMOLT_ONU_STATE_AWAKE_FREE:
            break;
        case BCMOLT_ONU_STATE_PROCESSING:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
            break;
        case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
            break;
        case BCMOLT_ONU_STATE_UNAWARE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_with_state_list_u16_max_510_set_default(bcmolt_xgpon_onu_with_state_list_u16_max_510 *this)
{
    this->len = 0;
    this->val = NULL;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_pack(const bcmolt_xgpon_onu_with_state_list_u16_max_510 *this, bcmolt_buf *buf)
{
    uint16_t i0;
    if (!bcmolt_buf_write_u16(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_xgpon_onu_with_state_list_u16_max_510\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
        return BCMOS_FALSE;
    }

    if (this->len > 510)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_onu_with_state_pack(&this->val[i0], buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_with_state_list_u16_max_510_get_packed_length(const bcmolt_xgpon_onu_with_state_list_u16_max_510 *this)
{
    return 2 + (3 * this->len);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_unpack(bcmolt_xgpon_onu_with_state_list_u16_max_510 *this, bcmolt_buf *buf, void **extra_mem)
{
    uint16_t i0;
    if (!bcmolt_buf_read_u16(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_xgpon_onu_with_state_list_u16_max_510\" is uninitialized (NULL).  You must allocate memory for this pointer before sending/receiving the message.\n");
            return BCMOS_FALSE;
        }
        else
        {
            this->val = (bcmolt_xgpon_onu_with_state *) *extra_mem;
            *extra_mem = ((uint8_t *) *extra_mem) + BCMOS_ROUND_TO_WORD(this->len * sizeof(bcmolt_xgpon_onu_with_state));
        }
    }

    if (this->len > 510)
    {
        return BCMOS_FALSE;
    }

    for (i0 = 0; i0 < this->len; i0++)
    {
        if (!bcmolt_xgpon_onu_with_state_unpack(&this->val[i0], buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    uint16_t len;
    if (!bcmolt_buf_read_u16(packed, &len))
    {
        return BCMOS_FALSE;
    }

    *extra_mem += BCMOS_ROUND_TO_WORD(sizeof(bcmolt_xgpon_onu_with_state) * len);
    if (!bcmolt_buf_skip(packed, len * 3))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_bounds_check(const bcmolt_xgpon_onu_with_state_list_u16_max_510 *this)
{
    if (this->len > 510)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ploam_handling_set_default(bcmolt_xgpon_ploam_handling *this)
{
    this->ack_timeout = 2000;
    this->retrans_ranging_time = 0;
    this->retrans_assign_alloc_id = 0;
    this->retrans_key_control = 0;
    this->retrans_request_registration = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ploam_handling_pack(const bcmolt_xgpon_ploam_handling *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->ack_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->retrans_ranging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->retrans_assign_alloc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->retrans_key_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->retrans_request_registration))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ploam_handling_unpack(bcmolt_xgpon_ploam_handling *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->ack_timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->retrans_ranging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->retrans_assign_alloc_id))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->retrans_key_control))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->retrans_request_registration))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ploam_handling_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 8);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ploam_handling_bounds_check(const bcmolt_xgpon_ploam_handling *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_protection_switching_set_default(bcmolt_xgpon_protection_switching *this)
{
    this->timeout = 100;
    this->gpio_pin = BCMOLT_GPIO_PIN_UNCONFIGURED;
    this->fast_ranging = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_pack(const bcmolt_xgpon_protection_switching *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_pack(this->gpio_pin, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->fast_ranging))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_unpack(bcmolt_xgpon_protection_switching *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->timeout))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_gpio_pin_unpack(&this->gpio_pin, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->fast_ranging))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 4);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_bounds_check(const bcmolt_xgpon_protection_switching *this)
{
    switch (this->gpio_pin)
    {
        case BCMOLT_GPIO_PIN_PIN0:
            break;
        case BCMOLT_GPIO_PIN_PIN1:
            break;
        case BCMOLT_GPIO_PIN_PIN2:
            break;
        case BCMOLT_GPIO_PIN_PIN3:
            break;
        case BCMOLT_GPIO_PIN_PIN4:
            break;
        case BCMOLT_GPIO_PIN_PIN5:
            break;
        case BCMOLT_GPIO_PIN_PIN6:
            break;
        case BCMOLT_GPIO_PIN_PIN7:
            break;
        case BCMOLT_GPIO_PIN_PIN8:
            break;
        case BCMOLT_GPIO_PIN_PIN9:
            break;
        case BCMOLT_GPIO_PIN_PIN10:
            break;
        case BCMOLT_GPIO_PIN_PIN11:
            break;
        case BCMOLT_GPIO_PIN_PIN12:
            break;
        case BCMOLT_GPIO_PIN_PIN13:
            break;
        case BCMOLT_GPIO_PIN_PIN14:
            break;
        case BCMOLT_GPIO_PIN_PIN15:
            break;
        case BCMOLT_GPIO_PIN_PIN16:
            break;
        case BCMOLT_GPIO_PIN_PIN17:
            break;
        case BCMOLT_GPIO_PIN_PIN18:
            break;
        case BCMOLT_GPIO_PIN_PIN19:
            break;
        case BCMOLT_GPIO_PIN_PIN20:
            break;
        case BCMOLT_GPIO_PIN_PIN21:
            break;
        case BCMOLT_GPIO_PIN_PIN22:
            break;
        case BCMOLT_GPIO_PIN_PIN23:
            break;
        case BCMOLT_GPIO_PIN_PIN24:
            break;
        case BCMOLT_GPIO_PIN_PIN25:
            break;
        case BCMOLT_GPIO_PIN_PIN26:
            break;
        case BCMOLT_GPIO_PIN_PIN27:
            break;
        case BCMOLT_GPIO_PIN_PIN28:
            break;
        case BCMOLT_GPIO_PIN_PIN29:
            break;
        case BCMOLT_GPIO_PIN_PIN30:
            break;
        case BCMOLT_GPIO_PIN_PIN31:
            break;
        case BCMOLT_GPIO_PIN_PIN32:
            break;
        case BCMOLT_GPIO_PIN_PIN33:
            break;
        case BCMOLT_GPIO_PIN_PIN34:
            break;
        case BCMOLT_GPIO_PIN_PIN35:
            break;
        case BCMOLT_GPIO_PIN_PIN36:
            break;
        case BCMOLT_GPIO_PIN_PIN37:
            break;
        case BCMOLT_GPIO_PIN_PIN38:
            break;
        case BCMOLT_GPIO_PIN_PIN39:
            break;
        case BCMOLT_GPIO_PIN_PIN40:
            break;
        case BCMOLT_GPIO_PIN_PIN41:
            break;
        case BCMOLT_GPIO_PIN_PIN42:
            break;
        case BCMOLT_GPIO_PIN_PIN43:
            break;
        case BCMOLT_GPIO_PIN_PIN44:
            break;
        case BCMOLT_GPIO_PIN_PIN45:
            break;
        case BCMOLT_GPIO_PIN_PIN46:
            break;
        case BCMOLT_GPIO_PIN_PIN47:
            break;
        case BCMOLT_GPIO_PIN_PIN48:
            break;
        case BCMOLT_GPIO_PIN_PIN49:
            break;
        case BCMOLT_GPIO_PIN_PIN50:
            break;
        case BCMOLT_GPIO_PIN_PIN51:
            break;
        case BCMOLT_GPIO_PIN_PIN52:
            break;
        case BCMOLT_GPIO_PIN_PIN53:
            break;
        case BCMOLT_GPIO_PIN_PIN54:
            break;
        case BCMOLT_GPIO_PIN_PIN55:
            break;
        case BCMOLT_GPIO_PIN_PIN56:
            break;
        case BCMOLT_GPIO_PIN_PIN57:
            break;
        case BCMOLT_GPIO_PIN_PIN58:
            break;
        case BCMOLT_GPIO_PIN_PIN59:
            break;
        case BCMOLT_GPIO_PIN_PIN60:
            break;
        case BCMOLT_GPIO_PIN_PIN61:
            break;
        case BCMOLT_GPIO_PIN_PIN62:
            break;
        case BCMOLT_GPIO_PIN_PIN63:
            break;
        case BCMOLT_GPIO_PIN_PIN64:
            break;
        case BCMOLT_GPIO_PIN_PIN65:
            break;
        case BCMOLT_GPIO_PIN_PIN66:
            break;
        case BCMOLT_GPIO_PIN_PIN67:
            break;
        case BCMOLT_GPIO_PIN_PIN68:
            break;
        case BCMOLT_GPIO_PIN_PIN69:
            break;
        case BCMOLT_GPIO_PIN_PIN70:
            break;
        case BCMOLT_GPIO_PIN_PIN71:
            break;
        case BCMOLT_GPIO_PIN_PIN72:
            break;
        case BCMOLT_GPIO_PIN_PIN73:
            break;
        case BCMOLT_GPIO_PIN_PIN74:
            break;
        case BCMOLT_GPIO_PIN_PIN75:
            break;
        case BCMOLT_GPIO_PIN_PIN76:
            break;
        case BCMOLT_GPIO_PIN_PIN77:
            break;
        case BCMOLT_GPIO_PIN_PIN78:
            break;
        case BCMOLT_GPIO_PIN_PIN79:
            break;
        case BCMOLT_GPIO_PIN_PIN80:
            break;
        case BCMOLT_GPIO_PIN_PIN81:
            break;
        case BCMOLT_GPIO_PIN_PIN82:
            break;
        case BCMOLT_GPIO_PIN_PIN83:
            break;
        case BCMOLT_GPIO_PIN_PIN84:
            break;
        case BCMOLT_GPIO_PIN_PIN85:
            break;
        case BCMOLT_GPIO_PIN_PIN86:
            break;
        case BCMOLT_GPIO_PIN_PIN87:
            break;
        case BCMOLT_GPIO_PIN_PIN88:
            break;
        case BCMOLT_GPIO_PIN_PIN89:
            break;
        case BCMOLT_GPIO_PIN_PIN90:
            break;
        case BCMOLT_GPIO_PIN_PIN91:
            break;
        case BCMOLT_GPIO_PIN_PIN92:
            break;
        case BCMOLT_GPIO_PIN_PIN93:
            break;
        case BCMOLT_GPIO_PIN_PIN94:
            break;
        case BCMOLT_GPIO_PIN_PIN95:
            break;
        case BCMOLT_GPIO_PIN_PIN96:
            break;
        case BCMOLT_GPIO_PIN_PIN97:
            break;
        case BCMOLT_GPIO_PIN_PIN98:
            break;
        case BCMOLT_GPIO_PIN_PIN99:
            break;
        case BCMOLT_GPIO_PIN_PIN100:
            break;
        case BCMOLT_GPIO_PIN_PIN101:
            break;
        case BCMOLT_GPIO_PIN_PIN102:
            break;
        case BCMOLT_GPIO_PIN_PIN103:
            break;
        case BCMOLT_GPIO_PIN_PIN104:
            break;
        case BCMOLT_GPIO_PIN_PIN105:
            break;
        case BCMOLT_GPIO_PIN_PIN106:
            break;
        case BCMOLT_GPIO_PIN_UNCONFIGURED:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_protection_switching_debug_set_default(bcmolt_xgpon_protection_switching_debug *this)
{
    this->data_map_delay_ms = 0;
    this->rerange_send_ranging_time = BCMOS_FALSE;
    this->rerange_send_ranging_time_delay = 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_debug_pack(const bcmolt_xgpon_protection_switching_debug *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u16(buf, this->data_map_delay_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->rerange_send_ranging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->rerange_send_ranging_time_delay))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_debug_unpack(bcmolt_xgpon_protection_switching_debug *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u16(buf, &this->data_map_delay_ms))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->rerange_send_ranging_time))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->rerange_send_ranging_time_delay))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 5);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_protection_switching_debug_bounds_check(const bcmolt_xgpon_protection_switching_debug *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_rssi_normal_config_set_default(bcmolt_xgpon_rssi_normal_config *this)
{
    this->polarity = BCMOLT_POLARITY_LOW;
    this->location = 35;
    this->location_sign = BCMOLT_SIGN_POSITIVE;
    this->pulse_width = 80;
    this->minimum_burst = 200;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_normal_config_pack(const bcmolt_xgpon_rssi_normal_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_polarity_pack(this->polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_sign_pack(this->location_sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->pulse_width))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->minimum_burst))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_normal_config_unpack(bcmolt_xgpon_rssi_normal_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_polarity_unpack(&this->polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_sign_unpack(&this->location_sign, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->pulse_width))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->minimum_burst))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_normal_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_normal_config_bounds_check(const bcmolt_xgpon_rssi_normal_config *this)
{
    switch (this->polarity)
    {
        case BCMOLT_POLARITY_LOW:
            break;
        case BCMOLT_POLARITY_HIGH:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->location_sign)
    {
        case BCMOLT_SIGN_POSITIVE:
            break;
        case BCMOLT_SIGN_NEGATIVE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_rssi_ranging_config_set_default(bcmolt_xgpon_rssi_ranging_config *this)
{
    this->start_on_ed = BCMOS_TRUE;
    this->frame_delay = 0;
    this->word_delay = 20;
    this->frame_delay_after_ed = 0;
    this->word_delay_after_ed = 1;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_ranging_config_pack(const bcmolt_xgpon_rssi_ranging_config *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->start_on_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->frame_delay))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->word_delay))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->frame_delay_after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u16(buf, this->word_delay_after_ed))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_ranging_config_unpack(bcmolt_xgpon_rssi_ranging_config *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->start_on_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->frame_delay))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->word_delay))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->frame_delay_after_ed))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u16(buf, &this->word_delay_after_ed))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_ranging_config_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rssi_ranging_config_bounds_check(const bcmolt_xgpon_rssi_ranging_config *this)
{
    if (this->frame_delay > 31)
    {
        return BCMOS_FALSE;
    }

    if (this->word_delay > 16383)
    {
        return BCMOS_FALSE;
    }

    if (this->frame_delay_after_ed > 31)
    {
        return BCMOS_FALSE;
    }

    if (this->word_delay_after_ed > 16383)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_rx_ranging_sm_pattern_set_default(bcmolt_xgpon_rx_ranging_sm_pattern *this)
{
    this->trx_reset_pattern_first = 0;
    this->trx_reset_pattern_middle = 0;
    this->trx_reset_pattern_last = 0;
    this->trx_reset_middle_repeats = 0;
    this->trx_reset_location = 0;
    this->bcdr_reset_pattern_first = 0;
    this->bcdr_reset_pattern_middle = 0;
    this->bcdr_reset_pattern_last = 0;
    this->bcdr_reset_middle_repeats = 0;
    this->bcdr_reset_location = 0;
    this->bcdr_reset_polarity = BCMOS_FALSE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_pack(const bcmolt_xgpon_rx_ranging_sm_pattern *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->trx_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->trx_reset_middle_repeats))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->trx_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u32(buf, this->bcdr_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->bcdr_reset_middle_repeats))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, this->bcdr_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_bool(buf, this->bcdr_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_unpack(bcmolt_xgpon_rx_ranging_sm_pattern *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->trx_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->trx_reset_middle_repeats))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->trx_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_first))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_middle))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u32(buf, &this->bcdr_reset_pattern_last))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->bcdr_reset_middle_repeats))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, &this->bcdr_reset_location))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_bool(buf, &this->bcdr_reset_polarity))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 29);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_bounds_check(const bcmolt_xgpon_rx_ranging_sm_pattern *this)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_serdes_configuration_set_default(bcmolt_xgpon_serdes_configuration *this)
{
    this->multi_ed_mode = BCMOS_FALSE;
    this->ranging_mode = BCMOLT_XGPON_SERDES_RANGING_MODE_BCDR;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_configuration_pack(const bcmolt_xgpon_serdes_configuration *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_bool(buf, this->multi_ed_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xgpon_serdes_ranging_mode_pack(this->ranging_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_configuration_unpack(bcmolt_xgpon_serdes_configuration *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_bool(buf, &this->multi_ed_mode))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_xgpon_serdes_ranging_mode_unpack(&this->ranging_mode, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_serdes_configuration_bounds_check(const bcmolt_xgpon_serdes_configuration *this)
{
    switch (this->ranging_mode)
    {
        case BCMOLT_XGPON_SERDES_RANGING_MODE_ED:
            break;
        case BCMOLT_XGPON_SERDES_RANGING_MODE_BCDR:
            break;
        case BCMOLT_XGPON_SERDES_RANGING_MODE_FAST_RANGING1:
            break;
        case BCMOLT_XGPON_SERDES_RANGING_MODE_FAST_RANGING2:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_sn_acquisition_set_default(bcmolt_xgpon_sn_acquisition *this)
{
    this->interval = 1000;
    this->control = BCMOLT_CONTROL_STATE_DISABLE;
    this->onu_post_discovery_mode = BCMOLT_ONU_POST_DISCOVERY_MODE_NONE;
    this->burst_profile = (bcmolt_burst_profile_index) 0;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_sn_acquisition_pack(const bcmolt_xgpon_sn_acquisition *this, bcmolt_buf *buf)
{
    if (!bcmolt_buf_write_u32(buf, this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_onu_post_discovery_mode_pack(this->onu_post_discovery_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_write_u8(buf, (uint8_t) this->burst_profile))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_sn_acquisition_unpack(bcmolt_xgpon_sn_acquisition *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_buf_read_u32(buf, &this->interval))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->control, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_onu_post_discovery_mode_unpack(&this->onu_post_discovery_mode, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->burst_profile))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_sn_acquisition_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 7);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_sn_acquisition_bounds_check(const bcmolt_xgpon_sn_acquisition *this)
{
    if (this->interval < 1000)
    {
        return BCMOS_FALSE;
    }

    if (this->interval > 2147483UL)
    {
        return BCMOS_FALSE;
    }

    switch (this->control)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->onu_post_discovery_mode)
    {
        case BCMOLT_ONU_POST_DISCOVERY_MODE_NONE:
            break;
        case BCMOLT_ONU_POST_DISCOVERY_MODE_ACTIVATE:
            break;
        case BCMOLT_ONU_POST_DISCOVERY_MODE_DISABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    if (this->burst_profile > (bcmolt_burst_profile_index) 3)
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_trx_debug_set_default(bcmolt_xgpon_trx_debug *this)
{
    this->rx_reversed_polarity = BCMOLT_CONTROL_STATE_DISABLE;
    this->neg_out_bit = BCMOLT_CONTROL_STATE_DISABLE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_debug_pack(const bcmolt_xgpon_trx_debug *this, bcmolt_buf *buf)
{
    if (!bcmolt_control_state_pack(this->rx_reversed_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_pack(this->neg_out_bit, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_debug_unpack(bcmolt_xgpon_trx_debug *this, bcmolt_buf *buf, void **extra_mem)
{
    if (!bcmolt_control_state_unpack(&this->rx_reversed_polarity, buf))
    {
        return BCMOS_FALSE;
    }

    if (!bcmolt_control_state_unpack(&this->neg_out_bit, buf))
    {
        return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem)
{
    (void)extra_mem;
    return bcmolt_buf_skip(packed, 2);
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_debug_bounds_check(const bcmolt_xgpon_trx_debug *this)
{
    switch (this->rx_reversed_polarity)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    switch (this->neg_out_bit)
    {
        case BCMOLT_CONTROL_STATE_DISABLE:
            break;
        case BCMOLT_CONTROL_STATE_ENABLE:
            break;
        default:
            return BCMOS_FALSE;
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_ni_key_set_default(bcmolt_ae_ni_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_KEY_ID_AE_NI)) != 0)
    {
        this->ae_ni = (bcmolt_ae_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_pack(const bcmolt_ae_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_ni_key_get_packed_length(const bcmolt_ae_ni_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_NI_KEY_ID_AE_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_unpack(bcmolt_ae_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_key_bounds_check(const bcmolt_ae_ni_key *this, bcmolt_presence_mask fields_present, bcmolt_ae_ni_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_ni_cfg_data_set_default(bcmolt_ae_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        this->mac_address.u8[0] = 0x0000;
        this->mac_address.u8[1] = 0x000D;
        this->mac_address.u8[2] = 0x00B6;
        this->mac_address.u8[3] = 0x0000;
        this->mac_address.u8[4] = 0x0000;
        this->mac_address.u8[5] = 0x0000;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        this->ae_ni_en = BCMOLT_AE_NI_EN_STATE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        this->mtu_10g = 1536;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        this->prbs_generator.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_generator.error_insert = BCMOS_FALSE;
        this->prbs_generator.invert = BCMOS_FALSE;
        this->prbs_generator.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        this->prbs_checker.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_checker.mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
        this->prbs_checker.data_invert = BCMOS_FALSE;
        this->prbs_checker.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        this->prbs_status.lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
        this->prbs_status.error_counts = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_data_pack(const bcmolt_ae_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        if (!bcmolt_ae_ni_en_state_pack(this->ae_ni_en, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mtu_10g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_pack(&this->prbs_generator, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_pack(&this->prbs_checker, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_pack(&this->prbs_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_ni_cfg_data_get_packed_length(const bcmolt_ae_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        count += 5;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_data_unpack(bcmolt_ae_ni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        if (!bcmolt_ae_ni_en_state_unpack(&this->ae_ni_en, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mtu_10g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_unpack(&this->prbs_generator, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_unpack(&this->prbs_checker, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_unpack(&this->prbs_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_cfg_data_bounds_check(const bcmolt_ae_ni_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_ni_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN)) != 0)
    {
        switch (this->ae_ni_en)
        {
            case BCMOLT_AE_NI_EN_STATE_DISABLED:
                break;
            case BCMOLT_AE_NI_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_AE_NI_CFG_ID_AE_NI_EN;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (this->mtu_10g < 64)
        {
            *failed_prop = BCMOLT_AE_NI_CFG_ID_MTU_10G;
            return BCMOS_FALSE;
        }

        if (this->mtu_10g > 10000)
        {
            *failed_prop = BCMOLT_AE_NI_CFG_ID_MTU_10G;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_bounds_check(&this->prbs_generator))
        {
            *failed_prop = BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_bounds_check(&this->prbs_checker))
        {
            *failed_prop = BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_bounds_check(&this->prbs_status))
        {
            *failed_prop = BCMOLT_AE_NI_CFG_ID_PRBS_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_ni_set_ae_ni_en_state_data_set_default(bcmolt_ae_ni_set_ae_ni_en_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_AE_NI_EN_STATE_DISABLED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_data_pack(const bcmolt_ae_ni_set_ae_ni_en_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_ae_ni_en_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_ni_set_ae_ni_en_state_data_get_packed_length(const bcmolt_ae_ni_set_ae_ni_en_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_data_unpack(bcmolt_ae_ni_set_ae_ni_en_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_ae_ni_en_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_data_bounds_check(const bcmolt_ae_ni_set_ae_ni_en_state_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_ni_set_ae_ni_en_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_AE_NI_EN_STATE_DISABLED:
                break;
            case BCMOLT_AE_NI_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_key_set_default(bcmolt_ae_path_ds_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_KEY_ID_AE_NI)) != 0)
    {
        this->ae_ni = (bcmolt_ae_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_pack(const bcmolt_ae_path_ds_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_key_get_packed_length(const bcmolt_ae_path_ds_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_KEY_ID_AE_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_unpack(bcmolt_ae_path_ds_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_key_bounds_check(const bcmolt_ae_path_ds_key *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_stat_data_set_default(bcmolt_ae_path_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_data_pack(const bcmolt_ae_path_ds_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_stat_data_get_packed_length(const bcmolt_ae_path_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_data_unpack(bcmolt_ae_path_ds_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_data_bounds_check(const bcmolt_ae_path_ds_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_stat_cfg_data_set_default(bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_data_pack(const bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_stat_cfg_data_get_packed_length(const bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_data_unpack(bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_cfg_data_bounds_check(const bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_stat_alarm_cleared_data_set_default(bcmolt_ae_path_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_AE_PATH_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_data_pack(const bcmolt_ae_path_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_stat_alarm_cleared_data_get_packed_length(const bcmolt_ae_path_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_data_unpack(bcmolt_ae_path_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_data_bounds_check(const bcmolt_ae_path_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_AE_PATH_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_stat_alarm_raised_data_set_default(bcmolt_ae_path_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_AE_PATH_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_data_pack(const bcmolt_ae_path_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_stat_alarm_raised_data_get_packed_length(const bcmolt_ae_path_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_data_unpack(bcmolt_ae_path_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_data_bounds_check(const bcmolt_ae_path_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_AE_PATH_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_ds_auto_cfg_data_set_default(bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_data_pack(const bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_ds_auto_cfg_data_get_packed_length(const bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_data_unpack(bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_ds_auto_cfg_data_bounds_check(const bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_ds_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_key_set_default(bcmolt_ae_path_us_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_KEY_ID_AE_NI)) != 0)
    {
        this->ae_ni = (bcmolt_ae_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_pack(const bcmolt_ae_path_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_key_get_packed_length(const bcmolt_ae_path_us_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_KEY_ID_AE_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_unpack(bcmolt_ae_path_us_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->ae_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_KEY_ID_AE_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_key_bounds_check(const bcmolt_ae_path_us_key *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_stat_data_set_default(bcmolt_ae_path_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR)) != 0)
    {
        this->fcs_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        this->oversize_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        this->runt_error = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_data_pack(const bcmolt_ae_path_us_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_stat_data_get_packed_length(const bcmolt_ae_path_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_data_unpack(bcmolt_ae_path_us_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_data_bounds_check(const bcmolt_ae_path_us_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_stat_cfg_data_set_default(bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_data_pack(const bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_stat_cfg_data_get_packed_length(const bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_data_unpack(bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_cfg_data_bounds_check(const bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_stat_alarm_cleared_data_set_default(bcmolt_ae_path_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_AE_PATH_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_data_pack(const bcmolt_ae_path_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_stat_alarm_cleared_data_get_packed_length(const bcmolt_ae_path_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_data_unpack(bcmolt_ae_path_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_data_bounds_check(const bcmolt_ae_path_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_AE_PATH_US_STAT_ID_BYTES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_stat_alarm_raised_data_set_default(bcmolt_ae_path_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_AE_PATH_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_data_pack(const bcmolt_ae_path_us_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_stat_alarm_raised_data_get_packed_length(const bcmolt_ae_path_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_data_unpack(bcmolt_ae_path_us_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_ae_path_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_data_bounds_check(const bcmolt_ae_path_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_AE_PATH_US_STAT_ID_BYTES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_ae_path_us_auto_cfg_data_set_default(bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_data_pack(const bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_ae_path_us_auto_cfg_data_get_packed_length(const bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_data_unpack(bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_ae_path_us_auto_cfg_data_bounds_check(const bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_ae_path_us_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_channel_key_set_default(bcmolt_channel_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_pon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_pack(const bcmolt_channel_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_channel_key_get_packed_length(const bcmolt_channel_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_unpack(bcmolt_channel_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_key_bounds_check(const bcmolt_channel_key *this, bcmolt_presence_mask fields_present, bcmolt_channel_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_pon_ni) 15)
        {
            *failed_prop = BCMOLT_CHANNEL_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_channel_cfg_data_set_default(bcmolt_channel_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        this->operation_control.re = 0;
        this->operation_control.odn_class = BCMOLT_ODN_CLASS_N1;
        this->operation_control.ds_fec_mode = BCMOLT_CONTROL_STATE_ENABLE;
        this->operation_control.protocol = BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_989_P_3;
        this->operation_control.ds_link_type = BCMOLT_LINK_TYPE_UNSPECIFIED;
        this->operation_control.pon_id.administrative_label = 0;
        this->operation_control.pon_id.dwlch_id = 0;
        this->operation_control.c = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        this->tol = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        this->system_profile.ng_2_sys_id = 0;
        this->system_profile.version = 0;
        this->system_profile.channel_spacing = 0;
        this->system_profile.us_operating_wavelength_bands = BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_WIDE_BAND;
        this->system_profile.us_mse = 0;
        this->system_profile.loose_calibration_bound = BCMOLT_CALIBRATION_RECORD_UNSPECIFIED;
        this->system_profile.fsr = 0;
        this->system_profile.twdm_channel_count = 8;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        memset(this->channel_profile.arr, 0, sizeof(this->channel_profile.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_data_pack(const bcmolt_channel_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        if (!bcmolt_operation_control_pack(&this->operation_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->tol))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        if (!bcmolt_system_profile_pack(&this->system_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        if (!bcmolt_arr_channel_profile_8_pack(&this->channel_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_channel_cfg_data_get_packed_length(const bcmolt_channel_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        count += 11;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        count += 120;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_data_unpack(bcmolt_channel_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        if (!bcmolt_operation_control_unpack(&this->operation_control, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->tol))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        if (!bcmolt_system_profile_unpack(&this->system_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        if (!bcmolt_arr_channel_profile_8_unpack(&this->channel_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 11))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 120))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_channel_cfg_data_bounds_check(const bcmolt_channel_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_channel_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL)) != 0)
    {
        if (!bcmolt_operation_control_bounds_check(&this->operation_control))
        {
            *failed_prop = BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_TOL)) != 0)
    {
        if (this->tol > 511)
        {
            *failed_prop = BCMOLT_CHANNEL_CFG_ID_TOL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE)) != 0)
    {
        if (!bcmolt_system_profile_bounds_check(&this->system_profile))
        {
            *failed_prop = BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE)) != 0)
    {
        if (!bcmolt_arr_channel_profile_8_bounds_check(&this->channel_profile))
        {
            *failed_prop = BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_key_set_default(bcmolt_debug_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_pack(const bcmolt_debug_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_debug_key_get_packed_length(const bcmolt_debug_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEBUG_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_unpack(bcmolt_debug_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_key_bounds_check(const bcmolt_debug_key *this, bcmolt_presence_mask fields_present, bcmolt_debug_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_cfg_data_set_default(bcmolt_debug_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        this->console_redirection = BCMOLT_CONSOLE_REDIRECTION_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        this->indications_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) != 0)
    {
        this->file_used_percent = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        this->api_capture_cfg.location = BCMOLT_API_CAPTURE_LOCATION_DEVICE;
        this->api_capture_cfg.buffer_size_bytes = 16384;
        this->api_capture_cfg.buffer_mode = BCMOLT_API_CAPTURE_BUFFER_MODE_WRAP;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        this->api_capture_stats.buffer_used_bytes = 0;
        this->api_capture_stats.buffer_wrap_count = 0;
        this->api_capture_stats.events_recorded = 0;
        this->api_capture_stats.events_dropped = 0;
        this->api_capture_stats.readable_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        this->api_capture_buffer_read.offset = 0;
        this->api_capture_buffer_read.size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        this->api_capture_buffer.len = 0;
        this->api_capture_buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_data_pack(const bcmolt_debug_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        if (!bcmolt_console_redirection_pack(this->console_redirection, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->indications_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->file_used_percent))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        if (!bcmolt_api_capture_config_pack(&this->api_capture_cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        if (!bcmolt_api_capture_stats_pack(&this->api_capture_stats, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        if (!bcmolt_api_capture_buffer_reader_pack(&this->api_capture_buffer_read, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->api_capture_buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_debug_cfg_data_get_packed_length(const bcmolt_debug_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        count += 20;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->api_capture_buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_data_unpack(bcmolt_debug_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        if (!bcmolt_console_redirection_unpack(&this->console_redirection, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->indications_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->file_used_percent))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        if (!bcmolt_api_capture_config_unpack(&this->api_capture_cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        if (!bcmolt_api_capture_stats_unpack(&this->api_capture_stats, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        if (!bcmolt_api_capture_buffer_reader_unpack(&this->api_capture_buffer_read, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->api_capture_buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 20))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cfg_data_bounds_check(const bcmolt_debug_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_debug_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION)) != 0)
    {
        switch (this->console_redirection)
        {
            case BCMOLT_CONSOLE_REDIRECTION_NONE:
                break;
            case BCMOLT_CONSOLE_REDIRECTION_REDIRECT:
                break;
            case BCMOLT_CONSOLE_REDIRECTION_CLONE:
                break;
            default:
                *failed_prop = BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG)) != 0)
    {
        if (!bcmolt_api_capture_config_bounds_check(&this->api_capture_cfg))
        {
            *failed_prop = BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) != 0)
    {
        if (!bcmolt_api_capture_stats_bounds_check(&this->api_capture_stats))
        {
            *failed_prop = BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ)) != 0)
    {
        if (!bcmolt_api_capture_buffer_reader_bounds_check(&this->api_capture_buffer_read))
        {
            *failed_prop = BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->api_capture_buffer))
        {
            *failed_prop = BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_cli_output_data_set_default(bcmolt_debug_cli_output_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        this->data.len = 0;
        this->data.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_data_pack(const bcmolt_debug_cli_output_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->data, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_debug_cli_output_data_get_packed_length(const bcmolt_debug_cli_output_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->data);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_data_unpack(bcmolt_debug_cli_output_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->data, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_output_data_bounds_check(const bcmolt_debug_cli_output_data *this, bcmolt_presence_mask fields_present, bcmolt_debug_cli_output_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->data))
        {
            *failed_prop = BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_auto_cfg_data_set_default(bcmolt_debug_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT)) != 0)
    {
        this->cli_output = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL)) != 0)
    {
        this->file_almost_full = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_data_pack(const bcmolt_debug_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->cli_output))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->file_almost_full))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_debug_auto_cfg_data_get_packed_length(const bcmolt_debug_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_data_unpack(bcmolt_debug_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->cli_output))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->file_almost_full))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_auto_cfg_data_bounds_check(const bcmolt_debug_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_debug_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_debug_cli_input_data_set_default(bcmolt_debug_cli_input_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        this->data.len = 0;
        this->data.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_data_pack(const bcmolt_debug_cli_input_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->data, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_debug_cli_input_data_get_packed_length(const bcmolt_debug_cli_input_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->data);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_data_unpack(bcmolt_debug_cli_input_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->data, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_debug_cli_input_data_bounds_check(const bcmolt_debug_cli_input_data *this, bcmolt_presence_mask fields_present, bcmolt_debug_cli_input_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEBUG_CLI_INPUT_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->data))
        {
            *failed_prop = BCMOLT_DEBUG_CLI_INPUT_ID_DATA;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_key_set_default(bcmolt_device_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_pack(const bcmolt_device_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_key_get_packed_length(const bcmolt_device_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_unpack(bcmolt_device_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_key_bounds_check(const bcmolt_device_key *this, bcmolt_presence_mask fields_present, bcmolt_device_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_cfg_data_set_default(bcmolt_device_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        this->system_mode = BCMOLT_SYSTEM_MODE_GPON__16_X;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        this->keepalive_interval = 5;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        this->keepalive_tolerance = 3;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        this->firmware_sw_version.major = 0;
        this->firmware_sw_version.minor = 0;
        this->firmware_sw_version.revision = 0;
        this->firmware_sw_version.model = 0;
        memset(this->firmware_sw_version.build_time, 0, 32);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        this->host_sw_version.major = 0;
        this->host_sw_version.minor = 0;
        this->host_sw_version.revision = 0;
        this->host_sw_version.model = 0;
        memset(this->host_sw_version.build_time, 0, 32);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        this->chip_revision = (bcmolt_device_chip_revision) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        this->state = BCMOLT_DEVICE_STATE_DISCONNECTED;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        this->debug.host_dma_rx_queue_size = 128;
        this->debug.host_dma_tx_queue_size = 128;
        this->debug.avs_control = BCMOS_FALSE;
        this->debug.use_prev_pon_serdes_firmware = BCMOS_FALSE;
        this->debug.use_prev_nni_serdes_firmware = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        this->nni_speed.first_half = BCMOLT_NNI_SPEED_GBPS_1;
        this->nni_speed.second_half = BCMOLT_NNI_SPEED_GBPS_1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        this->protection_switching_ext_irq = BCMOLT_EXT_IRQ_UNCONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY)) != 0)
    {
        this->epon_clock_transport_sample_delay = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        this->indication_shaping.enabled = BCMOS_FALSE;
        this->indication_shaping.max_rate = 1000;
        this->indication_shaping.max_burst = 100;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) != 0)
    {
        this->chip_temperature = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        this->gpon_xgpon_tod_enable = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        this->gpon_xgpon_tod_gpio_pin = BCMOLT_GPIO_PIN_UNCONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY)) != 0)
    {
        this->gpon_xgpon_tod_connected_internally = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        memset(this->epon_8021_as_tod_format.str, 0, 256);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        this->epon_shaper_mode = BCMOLT_SHAPER_MODE_LAYER_1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        this->embedded_image_list.len = 0;
        this->embedded_image_list.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE)) != 0)
    {
        this->chip_voltage = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        memset(this->epon_tod_string.str, 0, 256);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        this->xgpon_num_of_onus = BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_256_ONUS;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS)) != 0)
    {
        bcmos_ipv4_address_init(&this->device_ip_address);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT)) != 0)
    {
        this->device_udp_port = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        this->tod_uart_baudrate = BCMOLT_UART_BAUDRATE_UART_RATE_9600;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        this->gpon_xgpon_tod_string_length = 16;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_data_pack(const bcmolt_device_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_system_mode_pack(this->system_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->keepalive_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->keepalive_tolerance))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_pack(&this->firmware_sw_version, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        if (!bcmolt_host_sw_version_pack(&this->host_sw_version, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_device_chip_revision_pack(this->chip_revision, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_device_state_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_debug_device_cfg_pack(&this->debug, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_pack(&this->nni_speed, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        if (!bcmolt_ext_irq_pack(this->protection_switching_ext_irq, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->epon_clock_transport_sample_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        if (!bcmolt_indication_shaping_pack(&this->indication_shaping, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->chip_temperature))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->gpon_xgpon_tod_enable, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_gpio_pin_pack(this->gpon_xgpon_tod_gpio_pin, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->gpon_xgpon_tod_connected_internally))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        if (!bcmolt_str_256_pack(&this->epon_8021_as_tod_format, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        if (!bcmolt_shaper_mode_pack(this->epon_shaper_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        if (!bcmolt_embedded_image_entry_list_u8_pack(&this->embedded_image_list, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->chip_voltage))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_256_pack(&this->epon_tod_string, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_num_of_onus_pack(this->xgpon_num_of_onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_ipv4_address(buf, this->device_ip_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->device_udp_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        if (!bcmolt_uart_baudrate_pack(this->tod_uart_baudrate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->gpon_xgpon_tod_string_length))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_cfg_data_get_packed_length(const bcmolt_device_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        count += 39;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        count += 39;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        count += 9;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        count += 256;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        count += bcmolt_embedded_image_entry_list_u8_get_packed_length(&this->embedded_image_list);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        count += 256;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_data_unpack(bcmolt_device_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_system_mode_unpack(&this->system_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->keepalive_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->keepalive_tolerance))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_unpack(&this->firmware_sw_version, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        if (!bcmolt_host_sw_version_unpack(&this->host_sw_version, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_device_chip_revision_unpack(&this->chip_revision, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_device_state_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_debug_device_cfg_unpack(&this->debug, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_unpack(&this->nni_speed, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        if (!bcmolt_ext_irq_unpack(&this->protection_switching_ext_irq, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->epon_clock_transport_sample_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        if (!bcmolt_indication_shaping_unpack(&this->indication_shaping, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->chip_temperature))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->gpon_xgpon_tod_enable, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_gpio_pin_unpack(&this->gpon_xgpon_tod_gpio_pin, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->gpon_xgpon_tod_connected_internally))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        if (!bcmolt_str_256_unpack(&this->epon_8021_as_tod_format, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        if (!bcmolt_shaper_mode_unpack(&this->epon_shaper_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        if (!bcmolt_embedded_image_entry_list_u8_unpack(&this->embedded_image_list, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->chip_voltage))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_256_unpack(&this->epon_tod_string, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_num_of_onus_unpack(&this->xgpon_num_of_onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_ipv4_address(buf, &this->device_ip_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->device_udp_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        if (!bcmolt_uart_baudrate_unpack(&this->tod_uart_baudrate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->gpon_xgpon_tod_string_length))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 39))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 39))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 9))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 256))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        if (!bcmolt_embedded_image_entry_list_u8_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 256))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_cfg_data_bounds_check(const bcmolt_device_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_device_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE)) != 0)
    {
        switch (this->system_mode)
        {
            case BCMOLT_SYSTEM_MODE_GPON__16_X:
                break;
            case BCMOLT_SYSTEM_MODE_GPON__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_GPON__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__16_X:
                break;
            case BCMOLT_SYSTEM_MODE_XGPON_1__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X_COEXISTENCE_TDMA:
                break;
            case BCMOLT_SYSTEM_MODE_AE_8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X_COEXISTENCE_TDMA:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_XGS__2_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G:
                break;
            case BCMOLT_SYSTEM_MODE_XGPON_1__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__2_X_10_G:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL)) != 0)
    {
        if (this->keepalive_interval > 15)
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE)) != 0)
    {
        if (this->keepalive_tolerance > 5)
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_bounds_check(&this->firmware_sw_version))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) != 0)
    {
        if (!bcmolt_host_sw_version_bounds_check(&this->host_sw_version))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) != 0)
    {
        switch (this->chip_revision)
        {
            case BCMOLT_DEVICE_CHIP_REVISION_A0:
                break;
            case BCMOLT_DEVICE_CHIP_REVISION_B0:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_CHIP_REVISION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_DEVICE_STATE_DISCONNECTED:
                break;
            case BCMOLT_DEVICE_STATE_CONNECTING:
                break;
            case BCMOLT_DEVICE_STATE_READY:
                break;
            case BCMOLT_DEVICE_STATE_WAITING_FOR_DEVICE:
                break;
            case BCMOLT_DEVICE_STATE_TESTING_DDR:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_debug_device_cfg_bounds_check(&this->debug))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_DEBUG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_bounds_check(&this->nni_speed))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_NNI_SPEED;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ)) != 0)
    {
        switch (this->protection_switching_ext_irq)
        {
            case BCMOLT_EXT_IRQ_EXT_IRQ0:
                break;
            case BCMOLT_EXT_IRQ_EXT_IRQ1:
                break;
            case BCMOLT_EXT_IRQ_EXT_IRQ2:
                break;
            case BCMOLT_EXT_IRQ_EXT_IRQ3:
                break;
            case BCMOLT_EXT_IRQ_EXT_IRQ4:
                break;
            case BCMOLT_EXT_IRQ_EXT_IRQ5:
                break;
            case BCMOLT_EXT_IRQ_UNCONFIGURED:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING)) != 0)
    {
        if (!bcmolt_indication_shaping_bounds_check(&this->indication_shaping))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE)) != 0)
    {
        switch (this->gpon_xgpon_tod_enable)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN)) != 0)
    {
        switch (this->gpon_xgpon_tod_gpio_pin)
        {
            case BCMOLT_GPIO_PIN_PIN0:
                break;
            case BCMOLT_GPIO_PIN_PIN1:
                break;
            case BCMOLT_GPIO_PIN_PIN2:
                break;
            case BCMOLT_GPIO_PIN_PIN3:
                break;
            case BCMOLT_GPIO_PIN_PIN4:
                break;
            case BCMOLT_GPIO_PIN_PIN5:
                break;
            case BCMOLT_GPIO_PIN_PIN6:
                break;
            case BCMOLT_GPIO_PIN_PIN7:
                break;
            case BCMOLT_GPIO_PIN_PIN8:
                break;
            case BCMOLT_GPIO_PIN_PIN9:
                break;
            case BCMOLT_GPIO_PIN_PIN10:
                break;
            case BCMOLT_GPIO_PIN_PIN11:
                break;
            case BCMOLT_GPIO_PIN_PIN12:
                break;
            case BCMOLT_GPIO_PIN_PIN13:
                break;
            case BCMOLT_GPIO_PIN_PIN14:
                break;
            case BCMOLT_GPIO_PIN_PIN15:
                break;
            case BCMOLT_GPIO_PIN_PIN16:
                break;
            case BCMOLT_GPIO_PIN_PIN17:
                break;
            case BCMOLT_GPIO_PIN_PIN18:
                break;
            case BCMOLT_GPIO_PIN_PIN19:
                break;
            case BCMOLT_GPIO_PIN_PIN20:
                break;
            case BCMOLT_GPIO_PIN_PIN21:
                break;
            case BCMOLT_GPIO_PIN_PIN22:
                break;
            case BCMOLT_GPIO_PIN_PIN23:
                break;
            case BCMOLT_GPIO_PIN_PIN24:
                break;
            case BCMOLT_GPIO_PIN_PIN25:
                break;
            case BCMOLT_GPIO_PIN_PIN26:
                break;
            case BCMOLT_GPIO_PIN_PIN27:
                break;
            case BCMOLT_GPIO_PIN_PIN28:
                break;
            case BCMOLT_GPIO_PIN_PIN29:
                break;
            case BCMOLT_GPIO_PIN_PIN30:
                break;
            case BCMOLT_GPIO_PIN_PIN31:
                break;
            case BCMOLT_GPIO_PIN_PIN32:
                break;
            case BCMOLT_GPIO_PIN_PIN33:
                break;
            case BCMOLT_GPIO_PIN_PIN34:
                break;
            case BCMOLT_GPIO_PIN_PIN35:
                break;
            case BCMOLT_GPIO_PIN_PIN36:
                break;
            case BCMOLT_GPIO_PIN_PIN37:
                break;
            case BCMOLT_GPIO_PIN_PIN38:
                break;
            case BCMOLT_GPIO_PIN_PIN39:
                break;
            case BCMOLT_GPIO_PIN_PIN40:
                break;
            case BCMOLT_GPIO_PIN_PIN41:
                break;
            case BCMOLT_GPIO_PIN_PIN42:
                break;
            case BCMOLT_GPIO_PIN_PIN43:
                break;
            case BCMOLT_GPIO_PIN_PIN44:
                break;
            case BCMOLT_GPIO_PIN_PIN45:
                break;
            case BCMOLT_GPIO_PIN_PIN46:
                break;
            case BCMOLT_GPIO_PIN_PIN47:
                break;
            case BCMOLT_GPIO_PIN_PIN48:
                break;
            case BCMOLT_GPIO_PIN_PIN49:
                break;
            case BCMOLT_GPIO_PIN_PIN50:
                break;
            case BCMOLT_GPIO_PIN_PIN51:
                break;
            case BCMOLT_GPIO_PIN_PIN52:
                break;
            case BCMOLT_GPIO_PIN_PIN53:
                break;
            case BCMOLT_GPIO_PIN_PIN54:
                break;
            case BCMOLT_GPIO_PIN_PIN55:
                break;
            case BCMOLT_GPIO_PIN_PIN56:
                break;
            case BCMOLT_GPIO_PIN_PIN57:
                break;
            case BCMOLT_GPIO_PIN_PIN58:
                break;
            case BCMOLT_GPIO_PIN_PIN59:
                break;
            case BCMOLT_GPIO_PIN_PIN60:
                break;
            case BCMOLT_GPIO_PIN_PIN61:
                break;
            case BCMOLT_GPIO_PIN_PIN62:
                break;
            case BCMOLT_GPIO_PIN_PIN63:
                break;
            case BCMOLT_GPIO_PIN_PIN64:
                break;
            case BCMOLT_GPIO_PIN_PIN65:
                break;
            case BCMOLT_GPIO_PIN_PIN66:
                break;
            case BCMOLT_GPIO_PIN_PIN67:
                break;
            case BCMOLT_GPIO_PIN_PIN68:
                break;
            case BCMOLT_GPIO_PIN_PIN69:
                break;
            case BCMOLT_GPIO_PIN_PIN70:
                break;
            case BCMOLT_GPIO_PIN_PIN71:
                break;
            case BCMOLT_GPIO_PIN_PIN72:
                break;
            case BCMOLT_GPIO_PIN_PIN73:
                break;
            case BCMOLT_GPIO_PIN_PIN74:
                break;
            case BCMOLT_GPIO_PIN_PIN75:
                break;
            case BCMOLT_GPIO_PIN_PIN76:
                break;
            case BCMOLT_GPIO_PIN_PIN77:
                break;
            case BCMOLT_GPIO_PIN_PIN78:
                break;
            case BCMOLT_GPIO_PIN_PIN79:
                break;
            case BCMOLT_GPIO_PIN_PIN80:
                break;
            case BCMOLT_GPIO_PIN_PIN81:
                break;
            case BCMOLT_GPIO_PIN_PIN82:
                break;
            case BCMOLT_GPIO_PIN_PIN83:
                break;
            case BCMOLT_GPIO_PIN_PIN84:
                break;
            case BCMOLT_GPIO_PIN_PIN85:
                break;
            case BCMOLT_GPIO_PIN_PIN86:
                break;
            case BCMOLT_GPIO_PIN_PIN87:
                break;
            case BCMOLT_GPIO_PIN_PIN88:
                break;
            case BCMOLT_GPIO_PIN_PIN89:
                break;
            case BCMOLT_GPIO_PIN_PIN90:
                break;
            case BCMOLT_GPIO_PIN_PIN91:
                break;
            case BCMOLT_GPIO_PIN_PIN92:
                break;
            case BCMOLT_GPIO_PIN_PIN93:
                break;
            case BCMOLT_GPIO_PIN_PIN94:
                break;
            case BCMOLT_GPIO_PIN_PIN95:
                break;
            case BCMOLT_GPIO_PIN_PIN96:
                break;
            case BCMOLT_GPIO_PIN_PIN97:
                break;
            case BCMOLT_GPIO_PIN_PIN98:
                break;
            case BCMOLT_GPIO_PIN_PIN99:
                break;
            case BCMOLT_GPIO_PIN_PIN100:
                break;
            case BCMOLT_GPIO_PIN_PIN101:
                break;
            case BCMOLT_GPIO_PIN_PIN102:
                break;
            case BCMOLT_GPIO_PIN_PIN103:
                break;
            case BCMOLT_GPIO_PIN_PIN104:
                break;
            case BCMOLT_GPIO_PIN_PIN105:
                break;
            case BCMOLT_GPIO_PIN_PIN106:
                break;
            case BCMOLT_GPIO_PIN_UNCONFIGURED:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT)) != 0)
    {
        if (!bcmolt_str_256_bounds_check(&this->epon_8021_as_tod_format))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE)) != 0)
    {
        switch (this->epon_shaper_mode)
        {
            case BCMOLT_SHAPER_MODE_LAYER_1:
                break;
            case BCMOLT_SHAPER_MODE_LAYER_2:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) != 0)
    {
        if (!bcmolt_embedded_image_entry_list_u8_bounds_check(&this->embedded_image_list))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_256_bounds_check(&this->epon_tod_string))
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS)) != 0)
    {
        switch (this->xgpon_num_of_onus)
        {
            case BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_256_ONUS:
                break;
            case BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE)) != 0)
    {
        switch (this->tod_uart_baudrate)
        {
            case BCMOLT_UART_BAUDRATE_UART_RATE_4800:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_9600:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_14400:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_19200:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_38400:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_57600:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_115200:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_230400:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_380400:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_460800:
                break;
            case BCMOLT_UART_BAUDRATE_UART_RATE_921600:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH)) != 0)
    {
        if (this->gpon_xgpon_tod_string_length > 64)
        {
            *failed_prop = BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_connection_complete_data_set_default(bcmolt_device_connection_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE)) != 0)
    {
        this->standalone = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_data_pack(const bcmolt_device_connection_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->standalone))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_connection_complete_data_get_packed_length(const bcmolt_device_connection_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_data_unpack(bcmolt_device_connection_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->standalone))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_complete_data_bounds_check(const bcmolt_device_connection_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_device_connection_complete_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_connection_failure_data_set_default(bcmolt_device_connection_failure_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        this->reason = BCMOLT_HOST_CONNECTION_FAIL_REASON_TIMEOUT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_data_pack(const bcmolt_device_connection_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        if (!bcmolt_host_connection_fail_reason_pack(this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_connection_failure_data_get_packed_length(const bcmolt_device_connection_failure_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_data_unpack(bcmolt_device_connection_failure_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        if (!bcmolt_host_connection_fail_reason_unpack(&this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_connection_failure_data_bounds_check(const bcmolt_device_connection_failure_data *this, bcmolt_presence_mask fields_present, bcmolt_device_connection_failure_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON)) != 0)
    {
        switch (this->reason)
        {
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_TIMEOUT:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_KEEPALIVE:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_USER_CALLBACK_ERROR:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_SOFTWARE_VERSION_MISMATCH:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_MISMATCH:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_NNI_SPEED_MISMATCH:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_RECONNECT_TIMEOUT:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_INTERNAL_ERROR:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_NOT_SUPPORTED:
                break;
            case BCMOLT_HOST_CONNECTION_FAIL_REASON_PARAMETER:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_ddr_test_complete_data_set_default(bcmolt_device_ddr_test_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        this->ddr_test.status = BCMOLT_DDR_TEST_STATUS_COMPLETED;
        this->ddr_test.u.completed.cpu_result = BCMOLT_DDR_TEST_RESULT_SUCCESS;
        this->ddr_test.u.completed.ras_0_result = BCMOLT_DDR_TEST_RESULT_SUCCESS;
        this->ddr_test.u.completed.ras_1_result = BCMOLT_DDR_TEST_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_data_pack(const bcmolt_device_ddr_test_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        if (!bcmolt_ddr_test_completed_pack(&this->ddr_test, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_ddr_test_complete_data_get_packed_length(const bcmolt_device_ddr_test_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        count += bcmolt_ddr_test_completed_get_packed_length(&this->ddr_test);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_data_unpack(bcmolt_device_ddr_test_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        if (!bcmolt_ddr_test_completed_unpack(&this->ddr_test, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        if (!bcmolt_ddr_test_completed_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_ddr_test_complete_data_bounds_check(const bcmolt_device_ddr_test_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_device_ddr_test_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST)) != 0)
    {
        if (!bcmolt_ddr_test_completed_bounds_check(&this->ddr_test))
        {
            *failed_prop = BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_device_keep_alive_data_set_default(bcmolt_device_device_keep_alive_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        this->sequence_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        this->time_stamp = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_data_pack(const bcmolt_device_device_keep_alive_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->sequence_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->time_stamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_device_keep_alive_data_get_packed_length(const bcmolt_device_device_keep_alive_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_data_unpack(bcmolt_device_device_keep_alive_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->sequence_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->time_stamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_keep_alive_data_bounds_check(const bcmolt_device_device_keep_alive_data *this, bcmolt_presence_mask fields_present, bcmolt_device_device_keep_alive_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_device_ready_data_set_default(bcmolt_device_device_ready_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        this->firmware_sw_version.major = 0;
        this->firmware_sw_version.minor = 0;
        this->firmware_sw_version.revision = 0;
        this->firmware_sw_version.model = 0;
        memset(this->firmware_sw_version.build_time, 0, 32);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        this->system_mode = BCMOLT_SYSTEM_MODE_GPON__16_X;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        this->nni_speed.first_half = BCMOLT_NNI_SPEED_GBPS_1;
        this->nni_speed.second_half = BCMOLT_NNI_SPEED_GBPS_1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        this->chip_revision = (bcmolt_device_chip_revision) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        this->tod_enable = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        this->tod_gpio_pin = BCMOLT_GPIO_PIN_PIN0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_data_pack(const bcmolt_device_device_ready_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_pack(&this->firmware_sw_version, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_system_mode_pack(this->system_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_pack(&this->nni_speed, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_device_chip_revision_pack(this->chip_revision, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->tod_enable, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_gpio_pin_pack(this->tod_gpio_pin, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_device_ready_data_get_packed_length(const bcmolt_device_device_ready_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        count += 39;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_data_unpack(bcmolt_device_device_ready_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_unpack(&this->firmware_sw_version, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_system_mode_unpack(&this->system_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_unpack(&this->nni_speed, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_device_chip_revision_unpack(&this->chip_revision, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->tod_enable, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_gpio_pin_unpack(&this->tod_gpio_pin, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 39))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_device_ready_data_bounds_check(const bcmolt_device_device_ready_data *this, bcmolt_presence_mask fields_present, bcmolt_device_device_ready_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION)) != 0)
    {
        if (!bcmolt_firmware_sw_version_bounds_check(&this->firmware_sw_version))
        {
            *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE)) != 0)
    {
        switch (this->system_mode)
        {
            case BCMOLT_SYSTEM_MODE_GPON__16_X:
                break;
            case BCMOLT_SYSTEM_MODE_GPON__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_GPON__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__16_X:
                break;
            case BCMOLT_SYSTEM_MODE_XGPON_1__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X_COEXISTENCE_TDMA:
                break;
            case BCMOLT_SYSTEM_MODE_AE_8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__8_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X_COEXISTENCE_TDMA:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__4_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_XGS__2_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G:
                break;
            case BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G:
                break;
            case BCMOLT_SYSTEM_MODE_XGPON_1__4_X:
                break;
            case BCMOLT_SYSTEM_MODE_EPON__2_X_10_G:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED)) != 0)
    {
        if (!bcmolt_device_nni_speed_bounds_check(&this->nni_speed))
        {
            *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION)) != 0)
    {
        switch (this->chip_revision)
        {
            case BCMOLT_DEVICE_CHIP_REVISION_A0:
                break;
            case BCMOLT_DEVICE_CHIP_REVISION_B0:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE)) != 0)
    {
        switch (this->tod_enable)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN)) != 0)
    {
        switch (this->tod_gpio_pin)
        {
            case BCMOLT_GPIO_PIN_PIN0:
                break;
            case BCMOLT_GPIO_PIN_PIN1:
                break;
            case BCMOLT_GPIO_PIN_PIN2:
                break;
            case BCMOLT_GPIO_PIN_PIN3:
                break;
            case BCMOLT_GPIO_PIN_PIN4:
                break;
            case BCMOLT_GPIO_PIN_PIN5:
                break;
            case BCMOLT_GPIO_PIN_PIN6:
                break;
            case BCMOLT_GPIO_PIN_PIN7:
                break;
            case BCMOLT_GPIO_PIN_PIN8:
                break;
            case BCMOLT_GPIO_PIN_PIN9:
                break;
            case BCMOLT_GPIO_PIN_PIN10:
                break;
            case BCMOLT_GPIO_PIN_PIN11:
                break;
            case BCMOLT_GPIO_PIN_PIN12:
                break;
            case BCMOLT_GPIO_PIN_PIN13:
                break;
            case BCMOLT_GPIO_PIN_PIN14:
                break;
            case BCMOLT_GPIO_PIN_PIN15:
                break;
            case BCMOLT_GPIO_PIN_PIN16:
                break;
            case BCMOLT_GPIO_PIN_PIN17:
                break;
            case BCMOLT_GPIO_PIN_PIN18:
                break;
            case BCMOLT_GPIO_PIN_PIN19:
                break;
            case BCMOLT_GPIO_PIN_PIN20:
                break;
            case BCMOLT_GPIO_PIN_PIN21:
                break;
            case BCMOLT_GPIO_PIN_PIN22:
                break;
            case BCMOLT_GPIO_PIN_PIN23:
                break;
            case BCMOLT_GPIO_PIN_PIN24:
                break;
            case BCMOLT_GPIO_PIN_PIN25:
                break;
            case BCMOLT_GPIO_PIN_PIN26:
                break;
            case BCMOLT_GPIO_PIN_PIN27:
                break;
            case BCMOLT_GPIO_PIN_PIN28:
                break;
            case BCMOLT_GPIO_PIN_PIN29:
                break;
            case BCMOLT_GPIO_PIN_PIN30:
                break;
            case BCMOLT_GPIO_PIN_PIN31:
                break;
            case BCMOLT_GPIO_PIN_PIN32:
                break;
            case BCMOLT_GPIO_PIN_PIN33:
                break;
            case BCMOLT_GPIO_PIN_PIN34:
                break;
            case BCMOLT_GPIO_PIN_PIN35:
                break;
            case BCMOLT_GPIO_PIN_PIN36:
                break;
            case BCMOLT_GPIO_PIN_PIN37:
                break;
            case BCMOLT_GPIO_PIN_PIN38:
                break;
            case BCMOLT_GPIO_PIN_PIN39:
                break;
            case BCMOLT_GPIO_PIN_PIN40:
                break;
            case BCMOLT_GPIO_PIN_PIN41:
                break;
            case BCMOLT_GPIO_PIN_PIN42:
                break;
            case BCMOLT_GPIO_PIN_PIN43:
                break;
            case BCMOLT_GPIO_PIN_PIN44:
                break;
            case BCMOLT_GPIO_PIN_PIN45:
                break;
            case BCMOLT_GPIO_PIN_PIN46:
                break;
            case BCMOLT_GPIO_PIN_PIN47:
                break;
            case BCMOLT_GPIO_PIN_PIN48:
                break;
            case BCMOLT_GPIO_PIN_PIN49:
                break;
            case BCMOLT_GPIO_PIN_PIN50:
                break;
            case BCMOLT_GPIO_PIN_PIN51:
                break;
            case BCMOLT_GPIO_PIN_PIN52:
                break;
            case BCMOLT_GPIO_PIN_PIN53:
                break;
            case BCMOLT_GPIO_PIN_PIN54:
                break;
            case BCMOLT_GPIO_PIN_PIN55:
                break;
            case BCMOLT_GPIO_PIN_PIN56:
                break;
            case BCMOLT_GPIO_PIN_PIN57:
                break;
            case BCMOLT_GPIO_PIN_PIN58:
                break;
            case BCMOLT_GPIO_PIN_PIN59:
                break;
            case BCMOLT_GPIO_PIN_PIN60:
                break;
            case BCMOLT_GPIO_PIN_PIN61:
                break;
            case BCMOLT_GPIO_PIN_PIN62:
                break;
            case BCMOLT_GPIO_PIN_PIN63:
                break;
            case BCMOLT_GPIO_PIN_PIN64:
                break;
            case BCMOLT_GPIO_PIN_PIN65:
                break;
            case BCMOLT_GPIO_PIN_PIN66:
                break;
            case BCMOLT_GPIO_PIN_PIN67:
                break;
            case BCMOLT_GPIO_PIN_PIN68:
                break;
            case BCMOLT_GPIO_PIN_PIN69:
                break;
            case BCMOLT_GPIO_PIN_PIN70:
                break;
            case BCMOLT_GPIO_PIN_PIN71:
                break;
            case BCMOLT_GPIO_PIN_PIN72:
                break;
            case BCMOLT_GPIO_PIN_PIN73:
                break;
            case BCMOLT_GPIO_PIN_PIN74:
                break;
            case BCMOLT_GPIO_PIN_PIN75:
                break;
            case BCMOLT_GPIO_PIN_PIN76:
                break;
            case BCMOLT_GPIO_PIN_PIN77:
                break;
            case BCMOLT_GPIO_PIN_PIN78:
                break;
            case BCMOLT_GPIO_PIN_PIN79:
                break;
            case BCMOLT_GPIO_PIN_PIN80:
                break;
            case BCMOLT_GPIO_PIN_PIN81:
                break;
            case BCMOLT_GPIO_PIN_PIN82:
                break;
            case BCMOLT_GPIO_PIN_PIN83:
                break;
            case BCMOLT_GPIO_PIN_PIN84:
                break;
            case BCMOLT_GPIO_PIN_PIN85:
                break;
            case BCMOLT_GPIO_PIN_PIN86:
                break;
            case BCMOLT_GPIO_PIN_PIN87:
                break;
            case BCMOLT_GPIO_PIN_PIN88:
                break;
            case BCMOLT_GPIO_PIN_PIN89:
                break;
            case BCMOLT_GPIO_PIN_PIN90:
                break;
            case BCMOLT_GPIO_PIN_PIN91:
                break;
            case BCMOLT_GPIO_PIN_PIN92:
                break;
            case BCMOLT_GPIO_PIN_PIN93:
                break;
            case BCMOLT_GPIO_PIN_PIN94:
                break;
            case BCMOLT_GPIO_PIN_PIN95:
                break;
            case BCMOLT_GPIO_PIN_PIN96:
                break;
            case BCMOLT_GPIO_PIN_PIN97:
                break;
            case BCMOLT_GPIO_PIN_PIN98:
                break;
            case BCMOLT_GPIO_PIN_PIN99:
                break;
            case BCMOLT_GPIO_PIN_PIN100:
                break;
            case BCMOLT_GPIO_PIN_PIN101:
                break;
            case BCMOLT_GPIO_PIN_PIN102:
                break;
            case BCMOLT_GPIO_PIN_PIN103:
                break;
            case BCMOLT_GPIO_PIN_PIN104:
                break;
            case BCMOLT_GPIO_PIN_PIN105:
                break;
            case BCMOLT_GPIO_PIN_PIN106:
                break;
            case BCMOLT_GPIO_PIN_UNCONFIGURED:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_image_transfer_complete_data_set_default(bcmolt_device_image_transfer_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        this->image_type = BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER)) != 0)
    {
        this->block_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_IMAGE_TRANSFER_STATUS_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_data_pack(const bcmolt_device_image_transfer_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_device_image_type_pack(this->image_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->block_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_image_transfer_status_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_image_transfer_complete_data_get_packed_length(const bcmolt_device_image_transfer_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_data_unpack(bcmolt_device_image_transfer_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_device_image_type_unpack(&this->image_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->block_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_image_transfer_status_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_complete_data_bounds_check(const bcmolt_device_image_transfer_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_device_image_transfer_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE)) != 0)
    {
        switch (this->image_type)
        {
            case BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_APPLICATION:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_ITU_PON_ONU_FIRMWARE:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_EPON_ONU_FIRMWARE:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_IMAGE_TRANSFER_STATUS_SUCCESS:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_MEMORY_ALLOCATION_FAILURE:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_UNSUPPORTED_FILE_TYPE:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_CRC_ERROR:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_BLOCK_OUT_OF_SYNC:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_INTERNAL_ERROR:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_INVALID_STATE:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_PREMATURE_TERMINATION:
                break;
            case BCMOLT_IMAGE_TRANSFER_STATUS_ACK_TIMEOUT:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_indications_dropped_data_set_default(bcmolt_device_indications_dropped_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT)) != 0)
    {
        this->total_count = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_data_pack(const bcmolt_device_indications_dropped_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->total_count))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_indications_dropped_data_get_packed_length(const bcmolt_device_indications_dropped_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_data_unpack(bcmolt_device_indications_dropped_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->total_count))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_indications_dropped_data_bounds_check(const bcmolt_device_indications_dropped_data *this, bcmolt_presence_mask fields_present, bcmolt_device_indications_dropped_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_sw_error_data_set_default(bcmolt_device_sw_error_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        memset(this->task_name.str, 0, 100);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        memset(this->file_name.str, 0, 100);
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER)) != 0)
    {
        this->line_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_PON_NI)) != 0)
    {
        this->pon_ni = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_data_pack(const bcmolt_device_sw_error_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        if (!bcmolt_str_100_pack(&this->task_name, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        if (!bcmolt_str_100_pack(&this->file_name, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->line_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_sw_error_data_get_packed_length(const bcmolt_device_sw_error_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        count += 100;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        count += 100;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_data_unpack(bcmolt_device_sw_error_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        if (!bcmolt_str_100_unpack(&this->task_name, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        if (!bcmolt_str_100_unpack(&this->file_name, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->line_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 100))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 100))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_error_data_bounds_check(const bcmolt_device_sw_error_data *this, bcmolt_presence_mask fields_present, bcmolt_device_sw_error_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME)) != 0)
    {
        if (!bcmolt_str_100_bounds_check(&this->task_name))
        {
            *failed_prop = BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME)) != 0)
    {
        if (!bcmolt_str_100_bounds_check(&this->file_name))
        {
            *failed_prop = BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_sw_exception_data_set_default(bcmolt_device_sw_exception_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID)) != 0)
    {
        this->cpu_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        memset(this->text.str, 0, 2000);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_data_pack(const bcmolt_device_sw_exception_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->cpu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        if (!bcmolt_str_2000_pack(&this->text, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_sw_exception_data_get_packed_length(const bcmolt_device_sw_exception_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        count += 2000;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_data_unpack(bcmolt_device_sw_exception_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->cpu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        if (!bcmolt_str_2000_unpack(&this->text, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2000))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_sw_exception_data_bounds_check(const bcmolt_device_sw_exception_data *this, bcmolt_presence_mask fields_present, bcmolt_device_sw_exception_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT)) != 0)
    {
        if (!bcmolt_str_2000_bounds_check(&this->text))
        {
            *failed_prop = BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_auto_cfg_data_set_default(bcmolt_device_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE)) != 0)
    {
        this->connection_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED)) != 0)
    {
        this->connection_established = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE)) != 0)
    {
        this->connection_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE)) != 0)
    {
        this->ddr_test_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE)) != 0)
    {
        this->device_keep_alive = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY)) != 0)
    {
        this->device_ready = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE)) != 0)
    {
        this->disconnection_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE)) != 0)
    {
        this->image_transfer_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        this->indications_dropped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR)) != 0)
    {
        this->sw_error = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION)) != 0)
    {
        this->sw_exception = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_data_pack(const bcmolt_device_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->connection_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->connection_established))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->connection_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ddr_test_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->device_keep_alive))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->device_ready))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->disconnection_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->image_transfer_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->indications_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sw_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sw_exception))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_auto_cfg_data_get_packed_length(const bcmolt_device_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_data_unpack(bcmolt_device_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->connection_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->connection_established))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->connection_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ddr_test_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->device_keep_alive))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->device_ready))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->disconnection_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->image_transfer_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->indications_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sw_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sw_exception))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_auto_cfg_data_bounds_check(const bcmolt_device_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_device_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_host_keep_alive_data_set_default(bcmolt_device_host_keep_alive_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        this->sequence_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        this->time_stamp = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_data_pack(const bcmolt_device_host_keep_alive_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->sequence_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->time_stamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_host_keep_alive_data_get_packed_length(const bcmolt_device_host_keep_alive_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_data_unpack(bcmolt_device_host_keep_alive_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->sequence_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->time_stamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_host_keep_alive_data_bounds_check(const bcmolt_device_host_keep_alive_data *this, bcmolt_presence_mask fields_present, bcmolt_device_host_keep_alive_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_image_transfer_data_data_set_default(bcmolt_device_image_transfer_data_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER)) != 0)
    {
        this->block_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA)) != 0)
    {
        this->more_data = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        this->data.len = 0;
        this->data.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_data_pack(const bcmolt_device_image_transfer_data_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->block_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->more_data))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u16_hex_pack(&this->data, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_image_transfer_data_data_get_packed_length(const bcmolt_device_image_transfer_data_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        count += bcmolt_u8_list_u16_hex_get_packed_length(&this->data);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_data_unpack(bcmolt_device_image_transfer_data_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->block_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->more_data))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u16_hex_unpack(&this->data, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u16_hex_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_data_data_bounds_check(const bcmolt_device_image_transfer_data_data *this, bcmolt_presence_mask fields_present, bcmolt_device_image_transfer_data_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u16_hex_bounds_check(&this->data))
        {
            *failed_prop = BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_image_transfer_start_data_set_default(bcmolt_device_image_transfer_start_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        this->image_type = BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE)) != 0)
    {
        this->image_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32)) != 0)
    {
        this->crc32 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        memset(this->image_name.str, 0, 64);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_data_pack(const bcmolt_device_image_transfer_start_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_device_image_type_pack(this->image_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->image_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->crc32))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        if (!bcmolt_str_64_pack(&this->image_name, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_image_transfer_start_data_get_packed_length(const bcmolt_device_image_transfer_start_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        count += 64;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_data_unpack(bcmolt_device_image_transfer_start_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_device_image_type_unpack(&this->image_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->image_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->crc32))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        if (!bcmolt_str_64_unpack(&this->image_name, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 64))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_image_transfer_start_data_bounds_check(const bcmolt_device_image_transfer_start_data *this, bcmolt_presence_mask fields_present, bcmolt_device_image_transfer_start_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE)) != 0)
    {
        switch (this->image_type)
        {
            case BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_APPLICATION:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_ITU_PON_ONU_FIRMWARE:
                break;
            case BCMOLT_DEVICE_IMAGE_TYPE_EPON_ONU_FIRMWARE:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME)) != 0)
    {
        if (!bcmolt_str_64_bounds_check(&this->image_name))
        {
            *failed_prop = BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_reset_data_set_default(bcmolt_device_reset_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        this->mode = (bcmolt_device_reset_mode) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_data_pack(const bcmolt_device_reset_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        if (!bcmolt_device_reset_mode_pack(this->mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_reset_data_get_packed_length(const bcmolt_device_reset_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_data_unpack(bcmolt_device_reset_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        if (!bcmolt_device_reset_mode_unpack(&this->mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_reset_data_bounds_check(const bcmolt_device_reset_data *this, bcmolt_presence_mask fields_present, bcmolt_device_reset_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RESET_ID_MODE)) != 0)
    {
        switch (this->mode)
        {
            case BCMOLT_DEVICE_RESET_MODE_DEVICE:
                break;
            case BCMOLT_DEVICE_RESET_MODE_HOST:
                break;
            case BCMOLT_DEVICE_RESET_MODE_ALL:
                break;
            default:
                *failed_prop = BCMOLT_DEVICE_RESET_ID_MODE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_device_run_ddr_test_data_set_default(bcmolt_device_run_ddr_test_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU)) != 0)
    {
        this->cpu = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0)) != 0)
    {
        this->ras_0 = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1)) != 0)
    {
        this->ras_1 = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_data_pack(const bcmolt_device_run_ddr_test_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ras_0))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ras_1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_device_run_ddr_test_data_get_packed_length(const bcmolt_device_run_ddr_test_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_data_unpack(bcmolt_device_run_ddr_test_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ras_0))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ras_1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_device_run_ddr_test_data_bounds_check(const bcmolt_device_run_ddr_test_data *this, bcmolt_presence_mask fields_present, bcmolt_device_run_ddr_test_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_key_set_default(bcmolt_epon_denied_link_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_pack(const bcmolt_epon_denied_link_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_key_get_packed_length(const bcmolt_epon_denied_link_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_unpack(bcmolt_epon_denied_link_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_key_bounds_check(const bcmolt_epon_denied_link_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_cfg_data_set_default(bcmolt_epon_denied_link_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        this->alarm_state.unknown_link_violation.link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
        this->alarm_state.unknown_link_violation.alarm_status = BCMOLT_STATUS_OFF;
        this->alarm_state.overhead_profile_violation = BCMOLT_STATUS_OFF;
        this->alarm_state.max_link_violation = BCMOLT_STATUS_OFF;
        this->alarm_state.llid_pool_empty_violation = BCMOLT_STATUS_OFF;
        this->alarm_state.laser_on_off_violation.laser_on_time = (bcmolt_time_quanta) 0;
        this->alarm_state.laser_on_off_violation.laser_off_time = (bcmolt_time_quanta) 0;
        this->alarm_state.laser_on_off_violation.alarm_status = BCMOLT_STATUS_OFF;
        this->alarm_state.system_resource_violation = BCMOLT_STATUS_OFF;
        this->alarm_state.range_violation.range = (bcmolt_time_quanta) 0;
        this->alarm_state.range_violation.alarm_status = BCMOLT_STATUS_OFF;
        this->alarm_state.tdm_channels_exhausted = BCMOLT_STATUS_OFF;
        this->alarm_state.rogue_violation.denied_llid = (bcmolt_epon_llid) 0;
        this->alarm_state.rogue_violation.denied_range = (bcmolt_time_quanta) 0;
        this->alarm_state.rogue_violation.alarm_status = BCMOLT_STATUS_OFF;
        this->alarm_state.upstream_bandwidth_violation = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_data_pack(const bcmolt_epon_denied_link_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_denied_link_alarm_state_pack(&this->alarm_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_cfg_data_get_packed_length(const bcmolt_epon_denied_link_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        count += 30;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_data_unpack(bcmolt_epon_denied_link_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_denied_link_alarm_state_unpack(&this->alarm_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 30))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_cfg_data_bounds_check(const bcmolt_epon_denied_link_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_denied_link_alarm_state_bounds_check(&this->alarm_state))
        {
            *failed_prop = BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_laser_on_off_violation_data_set_default(bcmolt_epon_denied_link_laser_on_off_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status.laser_on_time = (bcmolt_time_quanta) 0;
        this->alarm_status.laser_off_time = (bcmolt_time_quanta) 0;
        this->alarm_status.alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_data_pack(const bcmolt_epon_denied_link_laser_on_off_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_laser_on_off_status_pack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_laser_on_off_violation_data_get_packed_length(const bcmolt_epon_denied_link_laser_on_off_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 9;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_data_unpack(bcmolt_epon_denied_link_laser_on_off_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_laser_on_off_status_unpack(&this->alarm_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 9))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_data_bounds_check(const bcmolt_epon_denied_link_laser_on_off_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_laser_on_off_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_laser_on_off_status_bounds_check(&this->alarm_status))
        {
            *failed_prop = BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_llid_pool_empty_violation_data_set_default(bcmolt_epon_denied_link_llid_pool_empty_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_data_pack(const bcmolt_epon_denied_link_llid_pool_empty_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_llid_pool_empty_violation_data_get_packed_length(const bcmolt_epon_denied_link_llid_pool_empty_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_data_unpack(bcmolt_epon_denied_link_llid_pool_empty_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_data_bounds_check(const bcmolt_epon_denied_link_llid_pool_empty_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_llid_pool_empty_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_max_link_violation_data_set_default(bcmolt_epon_denied_link_max_link_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_data_pack(const bcmolt_epon_denied_link_max_link_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_max_link_violation_data_get_packed_length(const bcmolt_epon_denied_link_max_link_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_data_unpack(bcmolt_epon_denied_link_max_link_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_max_link_violation_data_bounds_check(const bcmolt_epon_denied_link_max_link_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_max_link_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_overhead_profile_violation_data_set_default(bcmolt_epon_denied_link_overhead_profile_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_data_pack(const bcmolt_epon_denied_link_overhead_profile_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_overhead_profile_violation_data_get_packed_length(const bcmolt_epon_denied_link_overhead_profile_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_data_unpack(bcmolt_epon_denied_link_overhead_profile_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_data_bounds_check(const bcmolt_epon_denied_link_overhead_profile_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_overhead_profile_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_range_violation_data_set_default(bcmolt_epon_denied_link_range_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status.range = (bcmolt_time_quanta) 0;
        this->alarm_status.alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_data_pack(const bcmolt_epon_denied_link_range_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_range_status_pack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_range_violation_data_get_packed_length(const bcmolt_epon_denied_link_range_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 5;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_data_unpack(bcmolt_epon_denied_link_range_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_range_status_unpack(&this->alarm_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_range_violation_data_bounds_check(const bcmolt_epon_denied_link_range_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_range_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_range_status_bounds_check(&this->alarm_status))
        {
            *failed_prop = BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_rogue_violation_data_set_default(bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status.denied_llid = (bcmolt_epon_llid) 0;
        this->alarm_status.denied_range = (bcmolt_time_quanta) 0;
        this->alarm_status.alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_data_pack(const bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_rogue_status_pack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_rogue_violation_data_get_packed_length(const bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 7;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_data_unpack(bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_rogue_status_unpack(&this->alarm_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_rogue_violation_data_bounds_check(const bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_rogue_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_rogue_status_bounds_check(&this->alarm_status))
        {
            *failed_prop = BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_system_resource_violation_data_set_default(bcmolt_epon_denied_link_system_resource_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_data_pack(const bcmolt_epon_denied_link_system_resource_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_system_resource_violation_data_get_packed_length(const bcmolt_epon_denied_link_system_resource_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_data_unpack(bcmolt_epon_denied_link_system_resource_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_system_resource_violation_data_bounds_check(const bcmolt_epon_denied_link_system_resource_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_system_resource_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_tdm_channels_exhausted_data_set_default(bcmolt_epon_denied_link_tdm_channels_exhausted_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_data_pack(const bcmolt_epon_denied_link_tdm_channels_exhausted_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_tdm_channels_exhausted_data_get_packed_length(const bcmolt_epon_denied_link_tdm_channels_exhausted_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_data_unpack(bcmolt_epon_denied_link_tdm_channels_exhausted_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_data_bounds_check(const bcmolt_epon_denied_link_tdm_channels_exhausted_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_tdm_channels_exhausted_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_unknown_link_violation_data_set_default(bcmolt_epon_denied_link_unknown_link_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status.link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
        this->alarm_status.alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_data_pack(const bcmolt_epon_denied_link_unknown_link_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_unknown_link_status_pack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_unknown_link_violation_data_get_packed_length(const bcmolt_epon_denied_link_unknown_link_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 3;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_data_unpack(bcmolt_epon_denied_link_unknown_link_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_unknown_link_status_unpack(&this->alarm_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_data_bounds_check(const bcmolt_epon_denied_link_unknown_link_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_unknown_link_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_unknown_link_status_bounds_check(&this->alarm_status))
        {
            *failed_prop = BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_upstream_bandwidth_violation_data_set_default(bcmolt_epon_denied_link_upstream_bandwidth_violation_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_data_pack(const bcmolt_epon_denied_link_upstream_bandwidth_violation_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_upstream_bandwidth_violation_data_get_packed_length(const bcmolt_epon_denied_link_upstream_bandwidth_violation_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_data_unpack(bcmolt_epon_denied_link_upstream_bandwidth_violation_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_data_bounds_check(const bcmolt_epon_denied_link_upstream_bandwidth_violation_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_upstream_bandwidth_violation_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_denied_link_auto_cfg_data_set_default(bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION)) != 0)
    {
        this->laser_on_off_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION)) != 0)
    {
        this->llid_pool_empty_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION)) != 0)
    {
        this->max_link_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION)) != 0)
    {
        this->overhead_profile_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION)) != 0)
    {
        this->range_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION)) != 0)
    {
        this->rogue_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION)) != 0)
    {
        this->system_resource_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED)) != 0)
    {
        this->tdm_channels_exhausted = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION)) != 0)
    {
        this->unknown_link_violation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION)) != 0)
    {
        this->upstream_bandwidth_violation = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_data_pack(const bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->laser_on_off_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->llid_pool_empty_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->max_link_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->overhead_profile_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->range_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->system_resource_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tdm_channels_exhausted))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->unknown_link_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->upstream_bandwidth_violation))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_denied_link_auto_cfg_data_get_packed_length(const bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_data_unpack(bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->laser_on_off_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->llid_pool_empty_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->max_link_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->overhead_profile_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->range_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->system_resource_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tdm_channels_exhausted))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->unknown_link_violation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->upstream_bandwidth_violation))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_denied_link_auto_cfg_data_bounds_check(const bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_denied_link_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_key_set_default(bcmolt_epon_link_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_pack(const bcmolt_epon_link_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_key_get_packed_length(const bcmolt_epon_link_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_unpack(bcmolt_epon_link_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_bounds_check(const bcmolt_epon_link_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_cfg_data_set_default(bcmolt_epon_link_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        this->link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        this->state_flags = (bcmolt_epon_link_state_flags) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) != 0)
    {
        this->llid = (bcmolt_epon_llid) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) != 0)
    {
        this->laser_on_time_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) != 0)
    {
        this->laser_off_time_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) != 0)
    {
        this->range_value_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) != 0)
    {
        this->distance = (bcmolt_meters) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        this->alarm_state.key_exchange_failure = BCMOLT_STATUS_OFF;
        this->alarm_state.invalid_mpcp_report_received = BCMOLT_STATUS_OFF;
        this->alarm_state.mpcp_report_timeout = BCMOLT_STATUS_OFF;
        this->alarm_state.oam_keepalive_timeout = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        this->tunnel_id = (bcmolt_epon_tunnel_id) 2164260864UL;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_epon_onu_id) 255;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        this->min_laser_overhead.laser_on_time = (bcmolt_time_quanta) 32;
        this->min_laser_overhead.laser_off_time = (bcmolt_time_quanta) 32;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        this->key_exchange_config.oam_type = BCMOLT_EPON_OAM_TYPE_BROADCOM;
        this->key_exchange_config.period = 0;
        this->key_exchange_config.direction = BCMOLT_EPON_ENCRYPTION_DIRECTION_DOWNSTREAM_ONLY;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        this->epon_encryption.downstream_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
        this->epon_encryption.downstream_key_choice = BCMOLT_EPON_KEY_CHOICE_KEY_0;
        this->epon_encryption.downstream_encryption_information.format = BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB;
        memset(this->epon_encryption.downstream_encryption_information.u.cfb.key, 0, sizeof(this->epon_encryption.downstream_encryption_information.u.cfb.key));
        this->epon_encryption.upstream_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
        this->epon_encryption.upstream_key_choice = BCMOLT_EPON_KEY_CHOICE_KEY_0;
        this->epon_encryption.upstream_encryption_information.format = BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB;
        memset(this->epon_encryption.upstream_encryption_information.u.cfb.key, 0, sizeof(this->epon_encryption.upstream_encryption_information.u.cfb.key));
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        this->fec_enable.upstream = BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT;
        this->fec_enable.downstream = BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        this->oam_heartbeat_config.send_period = 0;
        this->oam_heartbeat_config.transmit_frame.len = 0;
        this->oam_heartbeat_config.transmit_frame.val = NULL;
        this->oam_heartbeat_config.ignored_receive_frame_template.frame_octets.len = 0;
        this->oam_heartbeat_config.ignored_receive_frame_template.frame_octets.val = NULL;
        this->oam_heartbeat_config.ignored_receive_frame_template.mask_octets.len = 0;
        this->oam_heartbeat_config.ignored_receive_frame_template.mask_octets.val = NULL;
        this->oam_heartbeat_config.receive_timeout = 1;
        this->oam_heartbeat_config.maximum_receive_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        this->upstream_bandwidth.polling_interval_us = BCMOLT_POLLING_INTERVAL_AUTOMATIC;
        this->upstream_bandwidth.grant_threshold_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
        this->upstream_bandwidth.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.min_schedulershaper.priority = 0;
        this->upstream_bandwidth.min_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
        this->upstream_bandwidth.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.max_schedulershaper.priority = 0;
        this->upstream_bandwidth.max_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.tdm_grant_size_tq = (bcmolt_time_quanta) 0;
        this->upstream_bandwidth.tdm_grant_interval_us = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        this->ubd_info.actual_polling_interval = 0;
        this->ubd_info.actual_grant_threshold_tq = (bcmolt_time_quanta) 0;
        this->ubd_info.actual_min_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) 0;
        this->ubd_info.actual_min_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) 0;
        this->ubd_info.actual_max_schedulershaper.actual_mbs_tq = (bcmolt_time_quanta) 0;
        this->ubd_info.actual_max_schedulershaper.actual_weight_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE)) != 0)
    {
        this->clock_transport_enable = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) != 0)
    {
        this->pending_grants = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        this->link_type = BCMOLT_EPON_LINK_TYPE_SYSTEM;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_data_pack(const bcmolt_epon_link_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        if (!bcmolt_epon_link_state_flags_pack(this->state_flags, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_on_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laser_off_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->distance))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_link_alarm_state_pack(&this->alarm_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->tunnel_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        if (!bcmolt_epon_laser_overhead_parameters_pack(&this->min_laser_overhead, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        if (!bcmolt_epon_key_exchange_config_pack(&this->key_exchange_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        if (!bcmolt_epon_encryption_config_pack(&this->epon_encryption, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        if (!bcmolt_epon_link_fec_en_pack(&this->fec_enable, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        if (!bcmolt_oam_heartbeat_config_pack(&this->oam_heartbeat_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_pack(&this->upstream_bandwidth, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        if (!bcmolt_ubd_info_pack(&this->ubd_info, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->clock_transport_enable))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->pending_grants))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        if (!bcmolt_epon_link_type_pack(this->link_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_cfg_data_get_packed_length(const bcmolt_epon_link_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        count += bcmolt_epon_encryption_config_get_packed_length(&this->epon_encryption);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        count += bcmolt_oam_heartbeat_config_get_packed_length(&this->oam_heartbeat_config);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        count += 42;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        count += 22;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_data_unpack(bcmolt_epon_link_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        if (!bcmolt_epon_link_state_flags_unpack(&this->state_flags, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_on_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laser_off_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->distance))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_link_alarm_state_unpack(&this->alarm_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->tunnel_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        if (!bcmolt_epon_laser_overhead_parameters_unpack(&this->min_laser_overhead, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        if (!bcmolt_epon_key_exchange_config_unpack(&this->key_exchange_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        if (!bcmolt_epon_encryption_config_unpack(&this->epon_encryption, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        if (!bcmolt_epon_link_fec_en_unpack(&this->fec_enable, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        if (!bcmolt_oam_heartbeat_config_unpack(&this->oam_heartbeat_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_unpack(&this->upstream_bandwidth, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        if (!bcmolt_ubd_info_unpack(&this->ubd_info, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->clock_transport_enable))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->pending_grants))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        if (!bcmolt_epon_link_type_unpack(&this->link_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        if (!bcmolt_epon_encryption_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        if (!bcmolt_oam_heartbeat_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 42))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 22))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_cfg_data_bounds_check(const bcmolt_epon_link_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE)) != 0)
    {
        switch (this->link_rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_CFG_ID_LINK_RATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) != 0)
    {
        if ((this->state_flags & 0x00FE) != 0)
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_link_alarm_state_bounds_check(&this->alarm_state))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID)) != 0)
    {
        if (this->tunnel_id < (bcmolt_epon_tunnel_id) 2164260864UL)
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID;
            return BCMOS_FALSE;
        }

        if (this->tunnel_id > (bcmolt_epon_tunnel_id) 2164264959UL)
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_epon_onu_id) 127)
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD)) != 0)
    {
        if (!bcmolt_epon_laser_overhead_parameters_bounds_check(&this->min_laser_overhead))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG)) != 0)
    {
        if (!bcmolt_epon_key_exchange_config_bounds_check(&this->key_exchange_config))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION)) != 0)
    {
        if (!bcmolt_epon_encryption_config_bounds_check(&this->epon_encryption))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE)) != 0)
    {
        if (!bcmolt_epon_link_fec_en_bounds_check(&this->fec_enable))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG)) != 0)
    {
        if (!bcmolt_oam_heartbeat_config_bounds_check(&this->oam_heartbeat_config))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_bounds_check(&this->upstream_bandwidth))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) != 0)
    {
        if (!bcmolt_ubd_info_bounds_check(&this->ubd_info))
        {
            *failed_prop = BCMOLT_EPON_LINK_CFG_ID_UBD_INFO;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE)) != 0)
    {
        switch (this->link_type)
        {
            case BCMOLT_EPON_LINK_TYPE_SYSTEM:
                break;
            case BCMOLT_EPON_LINK_TYPE_DOWNSTREAM_ONLY:
                break;
            case BCMOLT_EPON_LINK_TYPE_BIDIRECTIONAL:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_stat_data_set_default(bcmolt_epon_link_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES)) != 0)
    {
        this->rx_data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES)) != 0)
    {
        this->rx_data_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64)) != 0)
    {
        this->rx_frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        this->rx_frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        this->rx_frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        this->rx_frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        this->rx_frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        this->rx_frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        this->rx_frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        this->rx_frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        this->rx_frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        this->rx_frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES)) != 0)
    {
        this->rx_oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES)) != 0)
    {
        this->rx_oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES)) != 0)
    {
        this->rx_mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        this->rx_broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        this->rx_unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        this->rx_multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES)) != 0)
    {
        this->rx_report_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR)) != 0)
    {
        this->rx_fcs_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR)) != 0)
    {
        this->rx_oversize_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR)) != 0)
    {
        this->rx_runt_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR)) != 0)
    {
        this->rx_line_code_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX)) != 0)
    {
        this->rx_line_code_error_max = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES)) != 0)
    {
        this->tx_data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES)) != 0)
    {
        this->tx_data_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64)) != 0)
    {
        this->tx_frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        this->tx_frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        this->tx_frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        this->tx_frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        this->tx_frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        this->tx_frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        this->tx_frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        this->tx_frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        this->tx_frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        this->tx_frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES)) != 0)
    {
        this->tx_oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES)) != 0)
    {
        this->tx_oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES)) != 0)
    {
        this->tx_mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        this->tx_broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        this->tx_unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        this->tx_multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_GATES)) != 0)
    {
        this->tx_gates = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_data_pack(const bcmolt_epon_link_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_data_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_line_code_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_line_code_error_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_data_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_GATES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_gates))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_stat_data_get_packed_length(const bcmolt_epon_link_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_GATES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_data_unpack(bcmolt_epon_link_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_data_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_line_code_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_line_code_error_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_data_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_GATES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_gates))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ID_TX_GATES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_data_bounds_check(const bcmolt_epon_link_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_stat_cfg_data_set_default(bcmolt_epon_link_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_data_pack(const bcmolt_epon_link_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_stat_cfg_data_get_packed_length(const bcmolt_epon_link_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_data_unpack(bcmolt_epon_link_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_cfg_data_bounds_check(const bcmolt_epon_link_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_LINK_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_duplicate_mpcp_registration_request_data_set_default(bcmolt_epon_link_duplicate_mpcp_registration_request_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ)) != 0)
    {
        this->initial_range_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ)) != 0)
    {
        this->current_range_tq = (bcmolt_time_quanta) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_data_pack(const bcmolt_epon_link_duplicate_mpcp_registration_request_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->initial_range_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->current_range_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_duplicate_mpcp_registration_request_data_get_packed_length(const bcmolt_epon_link_duplicate_mpcp_registration_request_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_data_unpack(bcmolt_epon_link_duplicate_mpcp_registration_request_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->initial_range_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->current_range_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_data_bounds_check(const bcmolt_epon_link_duplicate_mpcp_registration_request_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_duplicate_mpcp_registration_request_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_key_exchange_failure_data_set_default(bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_data_pack(const bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_key_exchange_failure_data_get_packed_length(const bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_data_unpack(bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_failure_data_bounds_check(const bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_key_exchange_failure_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_link_speed_mismatch_data_set_default(bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        this->previous_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        this->current_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_data_pack(const bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->previous_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->current_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_link_speed_mismatch_data_get_packed_length(const bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_data_unpack(bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->previous_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->current_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_link_speed_mismatch_data_bounds_check(const bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_link_speed_mismatch_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE)) != 0)
    {
        switch (this->previous_rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE)) != 0)
    {
        switch (this->current_rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_mpcp_discovered_data_set_default(bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        this->link_info.link_status = (bcmolt_epon_link_status) 0;
        this->link_info.rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
        this->link_info.llid = (bcmolt_epon_llid) 0;
        this->link_info.mpcp_discovery_info = (bcmolt_mpcp_discovery_info) 0;
        this->link_info.onu_laser_on_time_tq = (bcmolt_time_quanta) 0;
        this->link_info.onu_laser_off_time_tq = (bcmolt_time_quanta) 0;
        this->link_info.pending_grants = 0;
        this->link_info.range_value_tq = (bcmolt_time_quanta) 0;
        this->link_info.tunnel_id = (bcmolt_epon_tunnel_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_data_pack(const bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_pack(&this->link_info, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_mpcp_discovered_data_get_packed_length(const bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        count += 24;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_data_unpack(bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_unpack(&this->link_info, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 24))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_discovered_data_bounds_check(const bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_mpcp_discovered_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_bounds_check(&this->link_info))
        {
            *failed_prop = BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_mpcp_report_timeout_data_set_default(bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_data_pack(const bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_mpcp_report_timeout_data_get_packed_length(const bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_data_unpack(bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_mpcp_report_timeout_data_bounds_check(const bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_mpcp_report_timeout_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_oam_keepalive_timeout_data_set_default(bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_data_pack(const bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_oam_keepalive_timeout_data_get_packed_length(const bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_data_unpack(bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_data_bounds_check(const bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_oam_keepalive_timeout_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_preprovisioned_link_created_data_set_default(bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        this->link_info.link_status = (bcmolt_epon_link_status) 0;
        this->link_info.rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
        this->link_info.llid = (bcmolt_epon_llid) 0;
        this->link_info.mpcp_discovery_info = (bcmolt_mpcp_discovery_info) 0;
        this->link_info.onu_laser_on_time_tq = (bcmolt_time_quanta) 0;
        this->link_info.onu_laser_off_time_tq = (bcmolt_time_quanta) 0;
        this->link_info.pending_grants = 0;
        this->link_info.range_value_tq = (bcmolt_time_quanta) 0;
        this->link_info.tunnel_id = (bcmolt_epon_tunnel_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_data_pack(const bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_pack(&this->link_info, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_preprovisioned_link_created_data_get_packed_length(const bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        count += 24;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_data_unpack(bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_unpack(&this->link_info, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 24))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_preprovisioned_link_created_data_bounds_check(const bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_preprovisioned_link_created_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_bounds_check(&this->link_info))
        {
            *failed_prop = BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_protection_switch_occurred_data_set_default(bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        this->protection_status = BCMOLT_EPON_PROTECTION_STATE_UNPROTECTED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ)) != 0)
    {
        this->range_value_tq = (bcmolt_time_quanta) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_data_pack(const bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        if (!bcmolt_epon_protection_state_pack(this->protection_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_protection_switch_occurred_data_get_packed_length(const bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_data_unpack(bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        if (!bcmolt_epon_protection_state_unpack(&this->protection_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_protection_switch_occurred_data_bounds_check(const bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_protection_switch_occurred_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS)) != 0)
    {
        switch (this->protection_status)
        {
            case BCMOLT_EPON_PROTECTION_STATE_UNPROTECTED:
                break;
            case BCMOLT_EPON_PROTECTION_STATE_PROTECTED_STANDBY:
                break;
            case BCMOLT_EPON_PROTECTION_STATE_PROTECTED_WORKING:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_range_value_changed_data_set_default(bcmolt_epon_link_range_value_changed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ)) != 0)
    {
        this->range_value_tq = (bcmolt_time_quanta) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_data_pack(const bcmolt_epon_link_range_value_changed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_range_value_changed_data_get_packed_length(const bcmolt_epon_link_range_value_changed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_data_unpack(bcmolt_epon_link_range_value_changed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_range_value_changed_data_bounds_check(const bcmolt_epon_link_range_value_changed_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_range_value_changed_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_stat_alarm_cleared_data_set_default(bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_data_pack(const bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_link_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_data_unpack(bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_link_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_GATES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_stat_alarm_raised_data_set_default(bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_data_pack(const bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_link_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_data_unpack(bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_link_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_stat_alarm_raised_data_bounds_check(const bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_LINK_STAT_ID_TX_GATES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_auto_cfg_data_set_default(bcmolt_epon_link_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST)) != 0)
    {
        this->duplicate_mpcp_registration_request = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED)) != 0)
    {
        this->encryption_enabled = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE)) != 0)
    {
        this->key_exchange_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED)) != 0)
    {
        this->key_exchange_started = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED)) != 0)
    {
        this->key_exchange_stopped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED)) != 0)
    {
        this->link_deleted = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH)) != 0)
    {
        this->link_speed_mismatch = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED)) != 0)
    {
        this->mpcp_deregistered = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED)) != 0)
    {
        this->mpcp_discovered = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT)) != 0)
    {
        this->mpcp_reg_ack_timeout = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        this->mpcp_report_timeout = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT)) != 0)
    {
        this->oam_keepalive_timeout = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED)) != 0)
    {
        this->oam_keepalive_timer_started = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED)) != 0)
    {
        this->oam_keepalive_timer_stopped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED)) != 0)
    {
        this->preprovisioned_link_created = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED)) != 0)
    {
        this->protection_switch_occurred = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED)) != 0)
    {
        this->range_value_changed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        this->rerange_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE)) != 0)
    {
        this->static_registration_done = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_data_pack(const bcmolt_epon_link_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->duplicate_mpcp_registration_request))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->encryption_enabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_started))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_stopped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->link_deleted))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->link_speed_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_deregistered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_reg_ack_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_report_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->oam_keepalive_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->oam_keepalive_timer_started))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->oam_keepalive_timer_stopped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->preprovisioned_link_created))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switch_occurred))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->range_value_changed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rerange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->static_registration_done))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_auto_cfg_data_get_packed_length(const bcmolt_epon_link_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_data_unpack(bcmolt_epon_link_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->duplicate_mpcp_registration_request))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->encryption_enabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_started))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_stopped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->link_deleted))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->link_speed_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_deregistered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_reg_ack_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_report_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->oam_keepalive_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->oam_keepalive_timer_started))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->oam_keepalive_timer_stopped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->preprovisioned_link_created))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switch_occurred))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->range_value_changed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rerange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->static_registration_done))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_auto_cfg_data_bounds_check(const bcmolt_epon_link_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_key_exchange_start_data_set_default(bcmolt_epon_link_key_exchange_start_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        this->period = 1;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_data_pack(const bcmolt_epon_link_key_exchange_start_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_key_exchange_start_data_get_packed_length(const bcmolt_epon_link_key_exchange_start_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_data_unpack(bcmolt_epon_link_key_exchange_start_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_key_exchange_start_data_bounds_check(const bcmolt_epon_link_key_exchange_start_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_key_exchange_start_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD)) != 0)
    {
        if (this->period < 1)
        {
            *failed_prop = BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_oam_keepalive_timer_start_data_set_default(bcmolt_epon_link_oam_keepalive_timer_start_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        this->send_period = 1;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_data_pack(const bcmolt_epon_link_oam_keepalive_timer_start_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->send_period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_oam_keepalive_timer_start_data_get_packed_length(const bcmolt_epon_link_oam_keepalive_timer_start_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_data_unpack(bcmolt_epon_link_oam_keepalive_timer_start_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->send_period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_data_bounds_check(const bcmolt_epon_link_oam_keepalive_timer_start_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_oam_keepalive_timer_start_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD)) != 0)
    {
        if (this->send_period < 1)
        {
            *failed_prop = BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_static_registration_data_set_default(bcmolt_epon_link_static_registration_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ)) != 0)
    {
        this->laseron_time_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ)) != 0)
    {
        this->laseroff_time_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ)) != 0)
    {
        this->range_value_tq = (bcmolt_time_quanta) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS)) != 0)
    {
        this->pending_grants = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_data_pack(const bcmolt_epon_link_static_registration_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laseron_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->laseroff_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->pending_grants))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_static_registration_data_get_packed_length(const bcmolt_epon_link_static_registration_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_data_unpack(bcmolt_epon_link_static_registration_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laseron_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->laseroff_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->pending_grants))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_static_registration_data_bounds_check(const bcmolt_epon_link_static_registration_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_static_registration_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_inject_frame_data_set_default(bcmolt_epon_link_inject_frame_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        this->frame.frame_octets.len = 0;
        this->frame.frame_octets.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_data_pack(const bcmolt_epon_link_inject_frame_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        if (!bcmolt_ethernet_frame_unmasked_pack(&this->frame, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_inject_frame_data_get_packed_length(const bcmolt_epon_link_inject_frame_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        count += bcmolt_ethernet_frame_unmasked_get_packed_length(&this->frame);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_data_unpack(bcmolt_epon_link_inject_frame_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        if (!bcmolt_ethernet_frame_unmasked_unpack(&this->frame, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        if (!bcmolt_ethernet_frame_unmasked_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_inject_frame_data_bounds_check(const bcmolt_epon_link_inject_frame_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_inject_frame_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME)) != 0)
    {
        if (!bcmolt_ethernet_frame_unmasked_bounds_check(&this->frame))
        {
            *failed_prop = BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_link_frame_captured_data_set_default(bcmolt_epon_link_frame_captured_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        this->frame.len = 0;
        this->frame.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_data_pack(const bcmolt_epon_link_frame_captured_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->frame, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_link_frame_captured_data_get_packed_length(const bcmolt_epon_link_frame_captured_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->frame);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_data_unpack(bcmolt_epon_link_frame_captured_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->frame, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_link_frame_captured_data_bounds_check(const bcmolt_epon_link_frame_captured_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_link_frame_captured_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->frame))
        {
            *failed_prop = BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_key_set_default(bcmolt_epon_ni_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_pack(const bcmolt_epon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_key_get_packed_length(const bcmolt_epon_ni_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_unpack(bcmolt_epon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_key_bounds_check(const bcmolt_epon_ni_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_cfg_data_set_default(bcmolt_epon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        this->mac_address.u8[0] = 0x0000;
        this->mac_address.u8[1] = 0x000D;
        this->mac_address.u8[2] = 0x00B6;
        this->mac_address.u8[3] = 0x0000;
        this->mac_address.u8[4] = 0x0000;
        this->mac_address.u8[5] = 0x0000;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        this->epon_ni_en = BCMOLT_EPON_NI_EN_STATE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        this->registration_behavior = BCMOLT_REGISTRATION_BEHAVIOR_AUTOMATIC;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        this->mtu_1g = 1536;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        this->mtu_10g = 1536;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH)) != 0)
    {
        this->minimum_fiber_length = (bcmolt_meters) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH)) != 0)
    {
        this->maximum_fiber_length = (bcmolt_meters) 20000;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        this->grant_spacing_tq = (bcmolt_time_quanta) 32;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        this->epon_logical_link_options.registration_gate_mode.registration_gate_mode = BCMOLT_MPCP_GATE_MODE_TEKNOVUS;
        this->epon_logical_link_options.registration_gate_mode.u.teknovus.reg_ack_timeout_ms = 100;
        this->epon_logical_link_options.reporting_mode = BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_A;
        this->epon_logical_link_options.max_links = 512;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        this->mpcp_discovery_period_ms = 1000;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        this->alarm_state.no_reports = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        this->all_links.len = 0;
        this->all_links.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        this->encryption_cfg.downstream_encryption_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
        this->encryption_cfg.upstream_encryption_mode = BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        this->protection_switching_cfg.protection_type = BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_NO_PROTECTION_SWTICHING;
        this->protection_switching_cfg.protection_switching_options = (bcmolt_protection_switching_detection_options) 0;
        this->protection_switching_cfg.rerange_options = BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_NONE;
        this->protection_switching_cfg.rerange_attempts = 0;
        this->protection_switching_cfg.rerange_interval = 0;
        this->protection_switching_cfg.sync_gate_duration = 0;
        this->protection_switching_cfg.gpio_input = BCMOLT_GPIO_PIN_UNCONFIGURED;
        this->protection_switching_cfg.gpio_input_polarity = BCMOLT_GPIO_POLARITY_ACTIVE_HIGH;
        this->protection_switching_cfg.gpio_output = BCMOLT_GPIO_PIN_UNCONFIGURED;
        this->protection_switching_cfg.gpio_output_polarity = BCMOLT_GPIO_POLARITY_ACTIVE_HIGH;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        this->clock_transport_cfg.epon_clock_transport_mode = BCMOLT_EPON_CLOCK_TRANSPORT_MODE_HOST_DRIVEN;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        memset(this->dropdown_weights.arr, 0, sizeof(this->dropdown_weights.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        memset(this->approximate_solicited_usage.arr, 0, sizeof(this->approximate_solicited_usage.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) != 0)
    {
        this->approximate_tdm_usage = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        this->no_reports_soak_time = 25;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        this->pon_aggregate_shaper.bandwidth_kbps = 0;
        this->pon_aggregate_shaper.mbs_kB = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        memset(this->estimated_pon_latency_tq.arr, 0, sizeof(this->estimated_pon_latency_tq.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        this->onu_upgrade_params.oam_extension_type = BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE;
        this->onu_upgrade_params.u.dpoe.response_timeout_ms = 1000;
        this->onu_upgrade_params.u.dpoe.block_size = 60;
        this->onu_upgrade_params.u.dpoe.final_ack_response_timeout = 15;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN)) != 0)
    {
        this->auto_rogue_detect_10g_en = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN)) != 0)
    {
        this->auto_rogue_detect_1g_en = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD)) != 0)
    {
        this->auto_rogue_detect_10g_threshold = 128;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_data_pack(const bcmolt_epon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_pack(this->epon_ni_en, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        if (!bcmolt_registration_behavior_pack(this->registration_behavior, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mtu_1g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mtu_10g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->minimum_fiber_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->maximum_fiber_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->grant_spacing_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        if (!bcmolt_epon_logical_link_options_pack(&this->epon_logical_link_options, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->mpcp_discovery_period_ms))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_alarm_state_pack(&this->alarm_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_pack(&this->all_links, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        if (!bcmolt_epon_ni_encryption_cfg_pack(&this->encryption_cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        if (!bcmolt_epon_protection_switching_configuration_pack(&this->protection_switching_cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        if (!bcmolt_epon_clock_transport_configuration_pack(&this->clock_transport_cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        if (!bcmolt_arr_u16_7_pack(&this->dropdown_weights, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        if (!bcmolt_arr_bounds_8_pack(&this->approximate_solicited_usage, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->approximate_tdm_usage))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->no_reports_soak_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        if (!bcmolt_pon_aggregate_shaper_pack(&this->pon_aggregate_shaper, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        if (!bcmolt_arr_bounds_8_pack(&this->estimated_pon_latency_tq, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_params_pack(&this->onu_upgrade_params, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->auto_rogue_detect_10g_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->auto_rogue_detect_1g_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->auto_rogue_detect_10g_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_cfg_data_get_packed_length(const bcmolt_epon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        count += bcmolt_epon_logical_link_options_get_packed_length(&this->epon_logical_link_options);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        count += bcmolt_macaddress_list_u32_max_2048_get_packed_length(&this->all_links);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        count += 14;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        count += 64;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        count += 64;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        count += bcmolt_epon_onu_upgrade_params_get_packed_length(&this->onu_upgrade_params);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_data_unpack(bcmolt_epon_ni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_unpack(&this->epon_ni_en, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        if (!bcmolt_registration_behavior_unpack(&this->registration_behavior, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mtu_1g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mtu_10g))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->minimum_fiber_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->maximum_fiber_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->grant_spacing_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        if (!bcmolt_epon_logical_link_options_unpack(&this->epon_logical_link_options, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->mpcp_discovery_period_ms))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_alarm_state_unpack(&this->alarm_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_unpack(&this->all_links, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        if (!bcmolt_epon_ni_encryption_cfg_unpack(&this->encryption_cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        if (!bcmolt_epon_protection_switching_configuration_unpack(&this->protection_switching_cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        if (!bcmolt_epon_clock_transport_configuration_unpack(&this->clock_transport_cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        if (!bcmolt_arr_u16_7_unpack(&this->dropdown_weights, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        if (!bcmolt_arr_bounds_8_unpack(&this->approximate_solicited_usage, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->approximate_tdm_usage))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->no_reports_soak_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        if (!bcmolt_pon_aggregate_shaper_unpack(&this->pon_aggregate_shaper, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        if (!bcmolt_arr_bounds_8_unpack(&this->estimated_pon_latency_tq, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_params_unpack(&this->onu_upgrade_params, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->auto_rogue_detect_10g_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->auto_rogue_detect_1g_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->auto_rogue_detect_10g_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        if (!bcmolt_epon_logical_link_options_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 14))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_params_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_cfg_data_bounds_check(const bcmolt_epon_ni_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN)) != 0)
    {
        switch (this->epon_ni_en)
        {
            case BCMOLT_EPON_NI_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_ENABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_WORKING:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_STANDBY:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROCESSING:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR)) != 0)
    {
        switch (this->registration_behavior)
        {
            case BCMOLT_REGISTRATION_BEHAVIOR_AUTOMATIC:
                break;
            case BCMOLT_REGISTRATION_BEHAVIOR_NOTIFY_UNKNOWN:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_1G)) != 0)
    {
        if (this->mtu_1g < 64)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_MTU_1G;
            return BCMOS_FALSE;
        }

        if (this->mtu_1g > 2000)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_MTU_1G;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MTU_10G)) != 0)
    {
        if (this->mtu_10g < 64)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_MTU_10G;
            return BCMOS_FALSE;
        }

        if (this->mtu_10g > 10000)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_MTU_10G;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ)) != 0)
    {
        if (this->grant_spacing_tq > (bcmolt_time_quanta) 65535UL)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS)) != 0)
    {
        if (!bcmolt_epon_logical_link_options_bounds_check(&this->epon_logical_link_options))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS)) != 0)
    {
        if (this->mpcp_discovery_period_ms < 100)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_alarm_state_bounds_check(&this->alarm_state))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_ALARM_STATE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) != 0)
    {
        if (this->all_links.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_macaddress_list_u32_max_2048_bounds_check(&this->all_links))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_ALL_LINKS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG)) != 0)
    {
        if (!bcmolt_epon_ni_encryption_cfg_bounds_check(&this->encryption_cfg))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG)) != 0)
    {
        if (!bcmolt_epon_protection_switching_configuration_bounds_check(&this->protection_switching_cfg))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG)) != 0)
    {
        if (!bcmolt_epon_clock_transport_configuration_bounds_check(&this->clock_transport_cfg))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS)) != 0)
    {
        if (!bcmolt_arr_u16_7_bounds_check(&this->dropdown_weights))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) != 0)
    {
        if (!bcmolt_arr_bounds_8_bounds_check(&this->approximate_solicited_usage))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME)) != 0)
    {
        if (this->no_reports_soak_time > 67)
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER)) != 0)
    {
        if (!bcmolt_pon_aggregate_shaper_bounds_check(&this->pon_aggregate_shaper))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ)) != 0)
    {
        if (!bcmolt_arr_bounds_8_bounds_check(&this->estimated_pon_latency_tq))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_params_bounds_check(&this->onu_upgrade_params))
        {
            *failed_prop = BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_llid_quarantined_data_set_default(bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID)) != 0)
    {
        this->llid = (bcmolt_epon_llid) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        this->link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC)) != 0)
    {
        bcmos_mac_address_init(&this->link_mac);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ)) != 0)
    {
        this->range_value_tq = (bcmolt_time_quanta) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_data_pack(const bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->link_mac))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_llid_quarantined_data_get_packed_length(const bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_data_unpack(bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->link_mac))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->range_value_tq))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_llid_quarantined_data_bounds_check(const bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_llid_quarantined_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE)) != 0)
    {
        switch (this->link_rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_mpcp_timestamp_changed_data_set_default(bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP)) != 0)
    {
        this->mpcp_timestamp = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_data_pack(const bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->mpcp_timestamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_mpcp_timestamp_changed_data_get_packed_length(const bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_data_unpack(bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->mpcp_timestamp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_data_bounds_check(const bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_mpcp_timestamp_changed_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_no_reports_data_set_default(bcmolt_epon_ni_no_reports_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_data_pack(const bcmolt_epon_ni_no_reports_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_no_reports_data_get_packed_length(const bcmolt_epon_ni_no_reports_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_data_unpack(bcmolt_epon_ni_no_reports_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_no_reports_data_bounds_check(const bcmolt_epon_ni_no_reports_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_no_reports_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_onu_upgrade_complete_data_set_default(bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        this->status = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        this->list_of_failed_entities.len = 0;
        this->list_of_failed_entities.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_data_pack(const bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_status_list_u32_pack(&this->list_of_failed_entities, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_onu_upgrade_complete_data_get_packed_length(const bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        count += bcmolt_epon_onu_upgrade_status_list_u32_get_packed_length(&this->list_of_failed_entities);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_data_unpack(bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_status_list_u32_unpack(&this->list_of_failed_entities, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_status_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_data_bounds_check(const bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_onu_upgrade_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_epon_onu_upgrade_status_list_u32_bounds_check(&this->list_of_failed_entities))
        {
            *failed_prop = BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_rogue_scan_complete_data_set_default(bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        this->return_ind_status = BCMOLT_ROGUE_SCAN_STATUS_COMPLETE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_data_pack(const bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        if (!bcmolt_rogue_scan_status_pack(this->return_ind_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_rogue_scan_complete_data_get_packed_length(const bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_data_unpack(bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        if (!bcmolt_rogue_scan_status_unpack(&this->return_ind_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_scan_complete_data_bounds_check(const bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_rogue_scan_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS)) != 0)
    {
        switch (this->return_ind_status)
        {
            case BCMOLT_ROGUE_SCAN_STATUS_COMPLETE:
                break;
            case BCMOLT_ROGUE_SCAN_STATUS_LLID_STATE_IS_BAD:
                break;
            case BCMOLT_ROGUE_SCAN_STATUS_LLID_IS_OOR:
                break;
            case BCMOLT_ROGUE_SCAN_STATUS_SCAN_ERR_NORES:
                break;
            case BCMOLT_ROGUE_SCAN_STATUS_SCAN_ERR_INTERNAL:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_rssi_measurement_completed_data_set_default(bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID)) != 0)
    {
        this->llid = (bcmolt_epon_llid) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC)) != 0)
    {
        bcmos_mac_address_init(&this->link_mac);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_data_pack(const bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->link_mac))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_rssi_measurement_completed_data_get_packed_length(const bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC)) != 0)
    {
        count += 6;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_data_unpack(bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->link_mac))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_data_bounds_check(const bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_rssi_measurement_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_state_change_completed_data_set_default(bcmolt_epon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_EPON_NI_EN_STATE_DISABLED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_data_pack(const bcmolt_epon_ni_state_change_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_state_change_completed_data_get_packed_length(const bcmolt_epon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_data_unpack(bcmolt_epon_ni_state_change_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_state_change_completed_data_bounds_check(const bcmolt_epon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_state_change_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_EPON_NI_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_ENABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_WORKING:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_STANDBY:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROCESSING:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_auto_cfg_data_set_default(bcmolt_epon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE)) != 0)
    {
        this->auto_rogue_scan_10g_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE)) != 0)
    {
        this->auto_rogue_scan_1g_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED)) != 0)
    {
        this->llid_quarantined = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED)) != 0)
    {
        this->mpcp_timestamp_changed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS)) != 0)
    {
        this->no_reports = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        this->onu_upgrade_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        this->rerange_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE)) != 0)
    {
        this->rogue_scan_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        this->rssi_measurement_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        this->state_change_completed = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_data_pack(const bcmolt_epon_ni_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->auto_rogue_scan_10g_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->auto_rogue_scan_1g_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->llid_quarantined))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_timestamp_changed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->no_reports))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rerange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_scan_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_auto_cfg_data_get_packed_length(const bcmolt_epon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_data_unpack(bcmolt_epon_ni_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->auto_rogue_scan_10g_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->auto_rogue_scan_1g_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->llid_quarantined))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_timestamp_changed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->no_reports))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rerange_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_scan_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_auto_cfg_data_bounds_check(const bcmolt_epon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_add_link_data_set_default(bcmolt_epon_ni_add_link_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        this->rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_data_pack(const bcmolt_epon_ni_add_link_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_add_link_data_get_packed_length(const bcmolt_epon_ni_add_link_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_data_unpack(bcmolt_epon_ni_add_link_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_link_data_bounds_check(const bcmolt_epon_ni_add_link_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_add_link_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_LINK_ID_RATE)) != 0)
    {
        switch (this->rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_ADD_LINK_ID_RATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_add_multicast_link_data_set_default(bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        this->rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_data_pack(const bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_add_multicast_link_data_get_packed_length(const bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_data_unpack(bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_multicast_link_data_bounds_check(const bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_add_multicast_link_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE)) != 0)
    {
        switch (this->rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_add_protected_standby_link_data_set_default(bcmolt_epon_ni_add_protected_standby_link_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        this->working_link_info.link_status = (bcmolt_epon_link_status) 0;
        this->working_link_info.rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
        this->working_link_info.llid = (bcmolt_epon_llid) 0;
        this->working_link_info.mpcp_discovery_info = (bcmolt_mpcp_discovery_info) 0;
        this->working_link_info.onu_laser_on_time_tq = (bcmolt_time_quanta) 0;
        this->working_link_info.onu_laser_off_time_tq = (bcmolt_time_quanta) 0;
        this->working_link_info.pending_grants = 0;
        this->working_link_info.range_value_tq = (bcmolt_time_quanta) 0;
        this->working_link_info.tunnel_id = (bcmolt_epon_tunnel_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_data_pack(const bcmolt_epon_ni_add_protected_standby_link_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_pack(&this->working_link_info, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_add_protected_standby_link_data_get_packed_length(const bcmolt_epon_ni_add_protected_standby_link_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        count += 24;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_data_unpack(bcmolt_epon_ni_add_protected_standby_link_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_unpack(&this->working_link_info, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 24))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_add_protected_standby_link_data_bounds_check(const bcmolt_epon_ni_add_protected_standby_link_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_add_protected_standby_link_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO)) != 0)
    {
        if (!bcmolt_epon_link_info_bounds_check(&this->working_link_info))
        {
            *failed_prop = BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_issue_rssi_grant_data_set_default(bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK)) != 0)
    {
        bcmos_mac_address_init(&this->granted_link);
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        this->trigger_width = 32;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        this->trigger_delay = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        this->sample_period = 500;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_data_pack(const bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->granted_link))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->trigger_width))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->trigger_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->sample_period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_issue_rssi_grant_data_get_packed_length(const bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_data_unpack(bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->granted_link))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->trigger_width))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->trigger_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->sample_period))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_issue_rssi_grant_data_bounds_check(const bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_issue_rssi_grant_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH)) != 0)
    {
        if (this->trigger_width < 32)
        {
            *failed_prop = BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH;
            return BCMOS_FALSE;
        }

        if (this->trigger_width > 3000)
        {
            *failed_prop = BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY)) != 0)
    {
        if (this->trigger_delay > 1500)
        {
            *failed_prop = BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD)) != 0)
    {
        if (this->sample_period < 100)
        {
            *failed_prop = BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD;
            return BCMOS_FALSE;
        }

        if (this->sample_period > 900)
        {
            *failed_prop = BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_set_default(bcmolt_epon_ni_protection_switching_apply_rerange_delta_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA)) != 0)
    {
        this->rerange_delta = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_pack(const bcmolt_epon_ni_protection_switching_apply_rerange_delta_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->rerange_delta))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_get_packed_length(const bcmolt_epon_ni_protection_switching_apply_rerange_delta_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_unpack(bcmolt_epon_ni_protection_switching_apply_rerange_delta_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->rerange_delta))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_bounds_check(const bcmolt_epon_ni_protection_switching_apply_rerange_delta_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_protection_switching_apply_rerange_delta_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_rogue_llid_scan_data_set_default(bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE)) != 0)
    {
        this->mode = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID)) != 0)
    {
        this->llid = (bcmolt_epon_llid) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_data_pack(const bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mode))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_rogue_llid_scan_data_get_packed_length(const bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_data_unpack(bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mode))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->llid))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_rogue_llid_scan_data_bounds_check(const bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_rogue_llid_scan_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_set_epon_ni_en_state_data_set_default(bcmolt_epon_ni_set_epon_ni_en_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_EPON_NI_EN_STATE_DISABLED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_data_pack(const bcmolt_epon_ni_set_epon_ni_en_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_set_epon_ni_en_state_data_get_packed_length(const bcmolt_epon_ni_set_epon_ni_en_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_data_unpack(bcmolt_epon_ni_set_epon_ni_en_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_epon_ni_en_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_data_bounds_check(const bcmolt_epon_ni_set_epon_ni_en_state_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_set_epon_ni_en_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_EPON_NI_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_ENABLED:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_WORKING:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROTECTED_STANDBY:
                break;
            case BCMOLT_EPON_NI_EN_STATE_PROCESSING:
                break;
            default:
                *failed_prop = BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_ni_start_onu_upgrade_data_set_default(bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        this->list_of_onu_ids.len = 0;
        this->list_of_onu_ids.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_data_pack(const bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_pack(&this->list_of_onu_ids, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_ni_start_onu_upgrade_data_get_packed_length(const bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        count += bcmolt_macaddress_list_u32_get_packed_length(&this->list_of_onu_ids);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_data_unpack(bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_unpack(&this->list_of_onu_ids, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_ni_start_onu_upgrade_data_bounds_check(const bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_ni_start_onu_upgrade_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_bounds_check(&this->list_of_onu_ids))
        {
            *failed_prop = BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_key_set_default(bcmolt_epon_onu_10g_us_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_epon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_pack(const bcmolt_epon_onu_10g_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_key_get_packed_length(const bcmolt_epon_onu_10g_us_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_unpack(bcmolt_epon_onu_10g_us_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_key_bounds_check(const bcmolt_epon_onu_10g_us_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_epon_onu_id) 127)
        {
            *failed_prop = BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_cfg_data_set_default(bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        this->all_links.len = 0;
        this->all_links.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_data_pack(const bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_pack(&this->all_links, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_cfg_data_get_packed_length(const bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        count += bcmolt_macaddress_list_u32_max_2048_get_packed_length(&this->all_links);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_data_unpack(bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_unpack(&this->all_links, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_cfg_data_bounds_check(const bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (this->all_links.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_macaddress_list_u32_max_2048_bounds_check(&this->all_links))
        {
            *failed_prop = BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_stat_data_set_default(bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL)) != 0)
    {
        this->fec_code_words_total = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS)) != 0)
    {
        this->fec_code_words_decode_fails = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED)) != 0)
    {
        this->fec_zeroes_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED)) != 0)
    {
        this->fec_ones_corrected = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_data_pack(const bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_code_words_total))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_code_words_decode_fails))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_zeroes_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_ones_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_stat_data_get_packed_length(const bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_data_unpack(bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_code_words_total))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_code_words_decode_fails))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_zeroes_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_ones_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_data_bounds_check(const bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_stat_cfg_data_set_default(bcmolt_epon_onu_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_data_pack(const bcmolt_epon_onu_10g_us_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_stat_cfg_data_get_packed_length(const bcmolt_epon_onu_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_data_unpack(bcmolt_epon_onu_10g_us_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_data_bounds_check(const bcmolt_epon_onu_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_set_default(bcmolt_epon_onu_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_pack(const bcmolt_epon_onu_10g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_10g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_onu_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_unpack(bcmolt_epon_onu_10g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_10g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_onu_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_stat_alarm_raised_data_set_default(bcmolt_epon_onu_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_data_pack(const bcmolt_epon_onu_10g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_10g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_onu_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_data_unpack(bcmolt_epon_onu_10g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_10g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_data_bounds_check(const bcmolt_epon_onu_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED:
                break;
            case BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_10g_us_auto_cfg_data_set_default(bcmolt_epon_onu_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_data_pack(const bcmolt_epon_onu_10g_us_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_10g_us_auto_cfg_data_get_packed_length(const bcmolt_epon_onu_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_data_unpack(bcmolt_epon_onu_10g_us_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_data_bounds_check(const bcmolt_epon_onu_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_10g_us_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_key_set_default(bcmolt_epon_onu_1g_us_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_epon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_pack(const bcmolt_epon_onu_1g_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_key_get_packed_length(const bcmolt_epon_onu_1g_us_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_unpack(bcmolt_epon_onu_1g_us_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_key_bounds_check(const bcmolt_epon_onu_1g_us_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_epon_onu_id) 127)
        {
            *failed_prop = BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_cfg_data_set_default(bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        this->all_links.len = 0;
        this->all_links.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_data_pack(const bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_pack(&this->all_links, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_cfg_data_get_packed_length(const bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        count += bcmolt_macaddress_list_u32_get_packed_length(&this->all_links);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_data_unpack(bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_unpack(&this->all_links, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_cfg_data_bounds_check(const bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS)) != 0)
    {
        if (!bcmolt_macaddress_list_u32_bounds_check(&this->all_links))
        {
            *failed_prop = BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_stat_data_set_default(bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES)) != 0)
    {
        this->good_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES)) != 0)
    {
        this->good_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES)) != 0)
    {
        this->oversz_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES)) != 0)
    {
        this->non_fec_good_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES)) != 0)
    {
        this->non_fec_good_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES)) != 0)
    {
        this->fec_good_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES)) != 0)
    {
        this->fec_good_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS)) != 0)
    {
        this->fec_frames_exc_errs = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS)) != 0)
    {
        this->fec_blks_no_errs = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS)) != 0)
    {
        this->fec_blks_corr_errs = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS)) != 0)
    {
        this->fec_blks_uncorr_errs = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES)) != 0)
    {
        this->fec_corr_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES)) != 0)
    {
        this->fec_corr_zeroes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES)) != 0)
    {
        this->fec_corr_ones = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES)) != 0)
    {
        this->undersz_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES)) != 0)
    {
        this->errorsz_frames = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_data_pack(const bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oversz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->non_fec_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->non_fec_good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_frames_exc_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_blks_no_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_blks_corr_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_blks_uncorr_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corr_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corr_zeroes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corr_ones))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->undersz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->errorsz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_stat_data_get_packed_length(const bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_data_unpack(bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oversz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->non_fec_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->non_fec_good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_good_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_frames_exc_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_blks_no_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_blks_corr_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_blks_uncorr_errs))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corr_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corr_zeroes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corr_ones))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->undersz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->errorsz_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_data_bounds_check(const bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_stat_cfg_data_set_default(bcmolt_epon_onu_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_data_pack(const bcmolt_epon_onu_1g_us_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_stat_cfg_data_get_packed_length(const bcmolt_epon_onu_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_data_unpack(bcmolt_epon_onu_1g_us_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_data_bounds_check(const bcmolt_epon_onu_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_set_default(bcmolt_epon_onu_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_pack(const bcmolt_epon_onu_1g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_1g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_onu_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_unpack(bcmolt_epon_onu_1g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_1g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_onu_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_stat_alarm_raised_data_set_default(bcmolt_epon_onu_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_data_pack(const bcmolt_epon_onu_1g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_1g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_onu_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_data_unpack(bcmolt_epon_onu_1g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_onu_1g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_data_bounds_check(const bcmolt_epon_onu_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES:
                break;
            case BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_onu_1g_us_auto_cfg_data_set_default(bcmolt_epon_onu_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_data_pack(const bcmolt_epon_onu_1g_us_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_onu_1g_us_auto_cfg_data_get_packed_length(const bcmolt_epon_onu_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_data_unpack(bcmolt_epon_onu_1g_us_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_data_bounds_check(const bcmolt_epon_onu_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_onu_1g_us_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_key_set_default(bcmolt_epon_path_10g_ds_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_pack(const bcmolt_epon_path_10g_ds_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_key_get_packed_length(const bcmolt_epon_path_10g_ds_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_unpack(bcmolt_epon_path_10g_ds_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_key_bounds_check(const bcmolt_epon_path_10g_ds_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_cfg_data_set_default(bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        this->fec_state = BCMOLT_EPON_FEC_EN_STATE_ENABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        this->prbs_generator.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_generator.error_insert = BCMOS_FALSE;
        this->prbs_generator.invert = BCMOS_FALSE;
        this->prbs_generator.control = BCMOLT_CONTROL_STATE_DISABLE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_data_pack(const bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_pack(this->fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_pack(&this->prbs_generator, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_cfg_data_get_packed_length(const bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_data_unpack(bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_unpack(&this->fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_unpack(&this->prbs_generator, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_cfg_data_bounds_check(const bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE)) != 0)
    {
        switch (this->fec_state)
        {
            case BCMOLT_EPON_FEC_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_FEC_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_bounds_check(&this->prbs_generator))
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_stat_data_set_default(bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        this->oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        this->oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        this->gate_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        this->mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_data_pack(const bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->gate_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_stat_data_get_packed_length(const bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_data_unpack(bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->gate_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_data_bounds_check(const bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_stat_cfg_data_set_default(bcmolt_epon_path_10g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_data_pack(const bcmolt_epon_path_10g_ds_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_stat_cfg_data_get_packed_length(const bcmolt_epon_path_10g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_data_unpack(bcmolt_epon_path_10g_ds_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_data_bounds_check(const bcmolt_epon_path_10g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_set_default(bcmolt_epon_path_10g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_pack(const bcmolt_epon_path_10g_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_path_10g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_unpack(bcmolt_epon_path_10g_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_path_10g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_stat_alarm_raised_data_set_default(bcmolt_epon_path_10g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_data_pack(const bcmolt_epon_path_10g_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_path_10g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_data_unpack(bcmolt_epon_path_10g_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_data_bounds_check(const bcmolt_epon_path_10g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_ds_auto_cfg_data_set_default(bcmolt_epon_path_10g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_data_pack(const bcmolt_epon_path_10g_ds_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_ds_auto_cfg_data_get_packed_length(const bcmolt_epon_path_10g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_data_unpack(bcmolt_epon_path_10g_ds_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_data_bounds_check(const bcmolt_epon_path_10g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_ds_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_key_set_default(bcmolt_epon_path_10g_us_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_pack(const bcmolt_epon_path_10g_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_key_get_packed_length(const bcmolt_epon_path_10g_us_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_unpack(bcmolt_epon_path_10g_us_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_key_bounds_check(const bcmolt_epon_path_10g_us_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_cfg_data_set_default(bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        this->fec_state = BCMOLT_EPON_FEC_EN_STATE_ENABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        this->sync_time_tq = (bcmolt_time_quanta) 32;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        this->prbs_checker.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_checker.mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
        this->prbs_checker.data_invert = BCMOS_FALSE;
        this->prbs_checker.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        this->prbs_status.lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
        this->prbs_status.error_counts = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_data_pack(const bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_pack(this->fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->sync_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_pack(&this->prbs_checker, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_pack(&this->prbs_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_cfg_data_get_packed_length(const bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        count += 5;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_data_unpack(bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_unpack(&this->fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->sync_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_unpack(&this->prbs_checker, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_unpack(&this->prbs_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_cfg_data_bounds_check(const bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE)) != 0)
    {
        switch (this->fec_state)
        {
            case BCMOLT_EPON_FEC_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_FEC_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (this->sync_time_tq > (bcmolt_time_quanta) 65535UL)
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_bounds_check(&this->prbs_checker))
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_bounds_check(&this->prbs_status))
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_stat_data_set_default(bcmolt_epon_path_10g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        this->mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        this->oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        this->oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        this->report_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        this->fcs_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        this->crc_8_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        this->out_of_slot = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        this->oversize_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        this->runt_error = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_data_pack(const bcmolt_epon_path_10g_us_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->crc_8_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->out_of_slot))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_stat_data_get_packed_length(const bcmolt_epon_path_10g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_data_unpack(bcmolt_epon_path_10g_us_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->crc_8_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->out_of_slot))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_data_bounds_check(const bcmolt_epon_path_10g_us_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_stat_cfg_data_set_default(bcmolt_epon_path_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_data_pack(const bcmolt_epon_path_10g_us_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_stat_cfg_data_get_packed_length(const bcmolt_epon_path_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_data_unpack(bcmolt_epon_path_10g_us_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_data_bounds_check(const bcmolt_epon_path_10g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_stat_alarm_cleared_data_set_default(bcmolt_epon_path_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_data_pack(const bcmolt_epon_path_10g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_path_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_data_unpack(bcmolt_epon_path_10g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_path_10g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_stat_alarm_raised_data_set_default(bcmolt_epon_path_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_data_pack(const bcmolt_epon_path_10g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_path_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_data_unpack(bcmolt_epon_path_10g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_10g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_data_bounds_check(const bcmolt_epon_path_10g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_10g_us_auto_cfg_data_set_default(bcmolt_epon_path_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_data_pack(const bcmolt_epon_path_10g_us_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_10g_us_auto_cfg_data_get_packed_length(const bcmolt_epon_path_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_data_unpack(bcmolt_epon_path_10g_us_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_data_bounds_check(const bcmolt_epon_path_10g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_10g_us_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_key_set_default(bcmolt_epon_path_1g_ds_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_pack(const bcmolt_epon_path_1g_ds_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_key_get_packed_length(const bcmolt_epon_path_1g_ds_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_unpack(bcmolt_epon_path_1g_ds_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_key_bounds_check(const bcmolt_epon_path_1g_ds_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_cfg_data_set_default(bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        this->default_fec_state = BCMOLT_EPON_FEC_EN_STATE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        this->raman_mode = BCMOLT_RAMAN_MITIGATION_MODE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        this->turbo_2g_mode = BCMOLT_EPON_1G_TURBO_MODE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        this->prbs_generator.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_generator.error_insert = BCMOS_FALSE;
        this->prbs_generator.invert = BCMOS_FALSE;
        this->prbs_generator.control = BCMOLT_CONTROL_STATE_DISABLE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_data_pack(const bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_pack(this->default_fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        if (!bcmolt_raman_mitigation_mode_pack(this->raman_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        if (!bcmolt_epon_1g_turbo_mode_pack(this->turbo_2g_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_pack(&this->prbs_generator, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_cfg_data_get_packed_length(const bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_data_unpack(bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_unpack(&this->default_fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        if (!bcmolt_raman_mitigation_mode_unpack(&this->raman_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        if (!bcmolt_epon_1g_turbo_mode_unpack(&this->turbo_2g_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_unpack(&this->prbs_generator, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_cfg_data_bounds_check(const bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        switch (this->default_fec_state)
        {
            case BCMOLT_EPON_FEC_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_FEC_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE)) != 0)
    {
        switch (this->raman_mode)
        {
            case BCMOLT_RAMAN_MITIGATION_MODE_DISABLED:
                break;
            case BCMOLT_RAMAN_MITIGATION_MODE_RANDOM:
                break;
            case BCMOLT_RAMAN_MITIGATION_MODE_FIXED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE)) != 0)
    {
        switch (this->turbo_2g_mode)
        {
            case BCMOLT_EPON_1G_TURBO_MODE_DISABLED:
                break;
            case BCMOLT_EPON_1G_TURBO_MODE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_bounds_check(&this->prbs_generator))
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_stat_data_set_default(bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        this->oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        this->oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        this->gate_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        this->mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_data_pack(const bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->gate_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_stat_data_get_packed_length(const bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_data_unpack(bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->gate_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_data_bounds_check(const bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_stat_cfg_data_set_default(bcmolt_epon_path_1g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_data_pack(const bcmolt_epon_path_1g_ds_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_stat_cfg_data_get_packed_length(const bcmolt_epon_path_1g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_data_unpack(bcmolt_epon_path_1g_ds_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_data_bounds_check(const bcmolt_epon_path_1g_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_set_default(bcmolt_epon_path_1g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_pack(const bcmolt_epon_path_1g_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_path_1g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_unpack(bcmolt_epon_path_1g_ds_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_path_1g_ds_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_stat_alarm_raised_data_set_default(bcmolt_epon_path_1g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_data_pack(const bcmolt_epon_path_1g_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_ds_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_path_1g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_data_unpack(bcmolt_epon_path_1g_ds_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_ds_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_data_bounds_check(const bcmolt_epon_path_1g_ds_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_ds_auto_cfg_data_set_default(bcmolt_epon_path_1g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_data_pack(const bcmolt_epon_path_1g_ds_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_ds_auto_cfg_data_get_packed_length(const bcmolt_epon_path_1g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_data_unpack(bcmolt_epon_path_1g_ds_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_data_bounds_check(const bcmolt_epon_path_1g_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_ds_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_key_set_default(bcmolt_epon_path_1g_us_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_pack(const bcmolt_epon_path_1g_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_key_get_packed_length(const bcmolt_epon_path_1g_us_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_unpack(bcmolt_epon_path_1g_us_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_key_bounds_check(const bcmolt_epon_path_1g_us_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_cfg_data_set_default(bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        this->default_fec_state = BCMOLT_EPON_FEC_EN_STATE_DISABLED;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        this->sync_time_tq = (bcmolt_time_quanta) 32;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        this->prbs_checker.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_checker.mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
        this->prbs_checker.data_invert = BCMOS_FALSE;
        this->prbs_checker.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        this->prbs_status.lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
        this->prbs_status.error_counts = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_data_pack(const bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_pack(this->default_fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->sync_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_pack(&this->prbs_checker, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_pack(&this->prbs_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_cfg_data_get_packed_length(const bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        count += 5;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_data_unpack(bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_epon_fec_en_state_unpack(&this->default_fec_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->sync_time_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_unpack(&this->prbs_checker, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_unpack(&this->prbs_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_cfg_data_bounds_check(const bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE)) != 0)
    {
        switch (this->default_fec_state)
        {
            case BCMOLT_EPON_FEC_EN_STATE_DISABLED:
                break;
            case BCMOLT_EPON_FEC_EN_STATE_ENABLED:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ)) != 0)
    {
        if (this->sync_time_tq > (bcmolt_time_quanta) 65535UL)
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_bounds_check(&this->prbs_checker))
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_bounds_check(&this->prbs_status))
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_stat_data_set_default(bcmolt_epon_path_1g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES)) != 0)
    {
        this->bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES)) != 0)
    {
        this->frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64)) != 0)
    {
        this->frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        this->frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        this->frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        this->frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        this->frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        this->frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        this->frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        this->frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        this->frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        this->frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        this->broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        this->data_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        this->multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        this->unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        this->mpcp_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        this->oam_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        this->oam_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        this->report_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        this->abort_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        this->fcs_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        this->crc_8_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        this->out_of_slot = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        this->oversize_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        this->runt_error = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_data_pack(const bcmolt_epon_path_1g_us_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->crc_8_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->out_of_slot))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_stat_data_get_packed_length(const bcmolt_epon_path_1g_us_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_data_unpack(bcmolt_epon_path_1g_us_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->data_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->mpcp_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oam_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->report_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->abort_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fcs_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->crc_8_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->out_of_slot))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->oversize_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->runt_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_data_bounds_check(const bcmolt_epon_path_1g_us_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_stat_cfg_data_set_default(bcmolt_epon_path_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_data_pack(const bcmolt_epon_path_1g_us_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_stat_cfg_data_get_packed_length(const bcmolt_epon_path_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_data_unpack(bcmolt_epon_path_1g_us_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_data_bounds_check(const bcmolt_epon_path_1g_us_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_stat_alarm_cleared_data_set_default(bcmolt_epon_path_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_data_pack(const bcmolt_epon_path_1g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_stat_alarm_cleared_data_get_packed_length(const bcmolt_epon_path_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_data_unpack(bcmolt_epon_path_1g_us_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_data_bounds_check(const bcmolt_epon_path_1g_us_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_stat_alarm_raised_data_set_default(bcmolt_epon_path_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_data_pack(const bcmolt_epon_path_1g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_us_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_stat_alarm_raised_data_get_packed_length(const bcmolt_epon_path_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_data_unpack(bcmolt_epon_path_1g_us_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_epon_path_1g_us_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_data_bounds_check(const bcmolt_epon_path_1g_us_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR:
                break;
            case BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR:
                break;
            default:
                *failed_prop = BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_path_1g_us_auto_cfg_data_set_default(bcmolt_epon_path_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_data_pack(const bcmolt_epon_path_1g_us_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_path_1g_us_auto_cfg_data_get_packed_length(const bcmolt_epon_path_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_data_unpack(bcmolt_epon_path_1g_us_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_data_bounds_check(const bcmolt_epon_path_1g_us_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_path_1g_us_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_rp_key_set_default(bcmolt_epon_rp_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_EPON_NI)) != 0)
    {
        this->epon_ni = (bcmolt_epon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        this->link_rate = BCMOLT_EPON_LINK_RATE_TEN_TEN;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_pack(const bcmolt_epon_rp_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_pack(this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_rp_key_get_packed_length(const bcmolt_epon_rp_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_EPON_NI)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_unpack(bcmolt_epon_rp_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->epon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_epon_link_rate_unpack(&this->link_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_EPON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_key_bounds_check(const bcmolt_epon_rp_key *this, bcmolt_presence_mask fields_present, bcmolt_epon_rp_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_KEY_ID_LINK_RATE)) != 0)
    {
        switch (this->link_rate)
        {
            case BCMOLT_EPON_LINK_RATE_TEN_TEN:
                break;
            case BCMOLT_EPON_LINK_RATE_TEN_ONE:
                break;
            case BCMOLT_EPON_LINK_RATE_ONE_ONE:
                break;
            default:
                *failed_prop = BCMOLT_EPON_RP_KEY_ID_LINK_RATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_epon_rp_cfg_data_set_default(bcmolt_epon_rp_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        this->base_llid = (bcmolt_epon_llid) 15360;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN)) != 0)
    {
        this->mpcp_disc_en = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        this->mpcp_disc_gnt_len_tq = (bcmolt_time_quanta) 8160;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        this->mpcp_report_timeout = 50;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW)) != 0)
    {
        this->max_mpcp_reg_per_disc_window = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        this->max_links = 256;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        this->default_upstream_bandwidth.polling_interval_us = BCMOLT_POLLING_INTERVAL_AUTOMATIC;
        this->default_upstream_bandwidth.grant_threshold_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.min_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
        this->default_upstream_bandwidth.min_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.min_schedulershaper.priority = 0;
        this->default_upstream_bandwidth.min_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.max_schedulershaper.bandwidth_Kbps = (bcmolt_bandwidth_Kbps) 0;
        this->default_upstream_bandwidth.max_schedulershaper.max_burst_size_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.max_schedulershaper.priority = 0;
        this->default_upstream_bandwidth.max_schedulershaper.weight_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.tdm_grant_size_tq = (bcmolt_time_quanta) 0;
        this->default_upstream_bandwidth.tdm_grant_interval_us = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION)) != 0)
    {
        this->rate_of_refraction = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_data_pack(const bcmolt_epon_rp_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->base_llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mpcp_disc_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->mpcp_disc_gnt_len_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mpcp_report_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->max_mpcp_reg_per_disc_window))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->max_links))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_pack(&this->default_upstream_bandwidth, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION)) != 0)
    {
        if (!bcmolt_buf_write_double(buf, this->rate_of_refraction))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_epon_rp_cfg_data_get_packed_length(const bcmolt_epon_rp_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        count += 42;
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_data_unpack(bcmolt_epon_rp_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->base_llid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mpcp_disc_en))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->mpcp_disc_gnt_len_tq))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mpcp_report_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->max_mpcp_reg_per_disc_window))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->max_links))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_unpack(&this->default_upstream_bandwidth, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION)) != 0)
    {
        if (!bcmolt_buf_read_double(buf, &this->rate_of_refraction))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 42))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_epon_rp_cfg_data_bounds_check(const bcmolt_epon_rp_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_epon_rp_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_BASE_LLID)) != 0)
    {
        if (this->base_llid > (bcmolt_epon_llid) 32511)
        {
            *failed_prop = BCMOLT_EPON_RP_CFG_ID_BASE_LLID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ)) != 0)
    {
        if (this->mpcp_disc_gnt_len_tq < (bcmolt_time_quanta) 5)
        {
            *failed_prop = BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ;
            return BCMOS_FALSE;
        }

        if (this->mpcp_disc_gnt_len_tq > (bcmolt_time_quanta) 65535UL)
        {
            *failed_prop = BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_MAX_LINKS)) != 0)
    {
        if (this->max_links > 2046)
        {
            *failed_prop = BCMOLT_EPON_RP_CFG_ID_MAX_LINKS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH)) != 0)
    {
        if (!bcmolt_upstream_bandwidth_distribution_bounds_check(&this->default_upstream_bandwidth))
        {
            *failed_prop = BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpio_key_set_default(bcmolt_gpio_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        this->gpio_id = BCMOLT_GPIO_PIN_PIN0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_pack(const bcmolt_gpio_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        if (!bcmolt_gpio_pin_pack(this->gpio_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpio_key_get_packed_length(const bcmolt_gpio_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_unpack(bcmolt_gpio_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        if (!bcmolt_gpio_pin_unpack(&this->gpio_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_key_bounds_check(const bcmolt_gpio_key *this, bcmolt_presence_mask fields_present, bcmolt_gpio_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_KEY_ID_GPIO_ID)) != 0)
    {
        switch (this->gpio_id)
        {
            case BCMOLT_GPIO_PIN_PIN0:
                break;
            case BCMOLT_GPIO_PIN_PIN1:
                break;
            case BCMOLT_GPIO_PIN_PIN2:
                break;
            case BCMOLT_GPIO_PIN_PIN3:
                break;
            case BCMOLT_GPIO_PIN_PIN4:
                break;
            case BCMOLT_GPIO_PIN_PIN5:
                break;
            case BCMOLT_GPIO_PIN_PIN6:
                break;
            case BCMOLT_GPIO_PIN_PIN7:
                break;
            case BCMOLT_GPIO_PIN_PIN8:
                break;
            case BCMOLT_GPIO_PIN_PIN9:
                break;
            case BCMOLT_GPIO_PIN_PIN10:
                break;
            case BCMOLT_GPIO_PIN_PIN11:
                break;
            case BCMOLT_GPIO_PIN_PIN12:
                break;
            case BCMOLT_GPIO_PIN_PIN13:
                break;
            case BCMOLT_GPIO_PIN_PIN14:
                break;
            case BCMOLT_GPIO_PIN_PIN15:
                break;
            case BCMOLT_GPIO_PIN_PIN16:
                break;
            case BCMOLT_GPIO_PIN_PIN17:
                break;
            case BCMOLT_GPIO_PIN_PIN18:
                break;
            case BCMOLT_GPIO_PIN_PIN19:
                break;
            case BCMOLT_GPIO_PIN_PIN20:
                break;
            case BCMOLT_GPIO_PIN_PIN21:
                break;
            case BCMOLT_GPIO_PIN_PIN22:
                break;
            case BCMOLT_GPIO_PIN_PIN23:
                break;
            case BCMOLT_GPIO_PIN_PIN24:
                break;
            case BCMOLT_GPIO_PIN_PIN25:
                break;
            case BCMOLT_GPIO_PIN_PIN26:
                break;
            case BCMOLT_GPIO_PIN_PIN27:
                break;
            case BCMOLT_GPIO_PIN_PIN28:
                break;
            case BCMOLT_GPIO_PIN_PIN29:
                break;
            case BCMOLT_GPIO_PIN_PIN30:
                break;
            case BCMOLT_GPIO_PIN_PIN31:
                break;
            case BCMOLT_GPIO_PIN_PIN32:
                break;
            case BCMOLT_GPIO_PIN_PIN33:
                break;
            case BCMOLT_GPIO_PIN_PIN34:
                break;
            case BCMOLT_GPIO_PIN_PIN35:
                break;
            case BCMOLT_GPIO_PIN_PIN36:
                break;
            case BCMOLT_GPIO_PIN_PIN37:
                break;
            case BCMOLT_GPIO_PIN_PIN38:
                break;
            case BCMOLT_GPIO_PIN_PIN39:
                break;
            case BCMOLT_GPIO_PIN_PIN40:
                break;
            case BCMOLT_GPIO_PIN_PIN41:
                break;
            case BCMOLT_GPIO_PIN_PIN42:
                break;
            case BCMOLT_GPIO_PIN_PIN43:
                break;
            case BCMOLT_GPIO_PIN_PIN44:
                break;
            case BCMOLT_GPIO_PIN_PIN45:
                break;
            case BCMOLT_GPIO_PIN_PIN46:
                break;
            case BCMOLT_GPIO_PIN_PIN47:
                break;
            case BCMOLT_GPIO_PIN_PIN48:
                break;
            case BCMOLT_GPIO_PIN_PIN49:
                break;
            case BCMOLT_GPIO_PIN_PIN50:
                break;
            case BCMOLT_GPIO_PIN_PIN51:
                break;
            case BCMOLT_GPIO_PIN_PIN52:
                break;
            case BCMOLT_GPIO_PIN_PIN53:
                break;
            case BCMOLT_GPIO_PIN_PIN54:
                break;
            case BCMOLT_GPIO_PIN_PIN55:
                break;
            case BCMOLT_GPIO_PIN_PIN56:
                break;
            case BCMOLT_GPIO_PIN_PIN57:
                break;
            case BCMOLT_GPIO_PIN_PIN58:
                break;
            case BCMOLT_GPIO_PIN_PIN59:
                break;
            case BCMOLT_GPIO_PIN_PIN60:
                break;
            case BCMOLT_GPIO_PIN_PIN61:
                break;
            case BCMOLT_GPIO_PIN_PIN62:
                break;
            case BCMOLT_GPIO_PIN_PIN63:
                break;
            case BCMOLT_GPIO_PIN_PIN64:
                break;
            case BCMOLT_GPIO_PIN_PIN65:
                break;
            case BCMOLT_GPIO_PIN_PIN66:
                break;
            case BCMOLT_GPIO_PIN_PIN67:
                break;
            case BCMOLT_GPIO_PIN_PIN68:
                break;
            case BCMOLT_GPIO_PIN_PIN69:
                break;
            case BCMOLT_GPIO_PIN_PIN70:
                break;
            case BCMOLT_GPIO_PIN_PIN71:
                break;
            case BCMOLT_GPIO_PIN_PIN72:
                break;
            case BCMOLT_GPIO_PIN_PIN73:
                break;
            case BCMOLT_GPIO_PIN_PIN74:
                break;
            case BCMOLT_GPIO_PIN_PIN75:
                break;
            case BCMOLT_GPIO_PIN_PIN76:
                break;
            case BCMOLT_GPIO_PIN_PIN77:
                break;
            case BCMOLT_GPIO_PIN_PIN78:
                break;
            case BCMOLT_GPIO_PIN_PIN79:
                break;
            case BCMOLT_GPIO_PIN_PIN80:
                break;
            case BCMOLT_GPIO_PIN_PIN81:
                break;
            case BCMOLT_GPIO_PIN_PIN82:
                break;
            case BCMOLT_GPIO_PIN_PIN83:
                break;
            case BCMOLT_GPIO_PIN_PIN84:
                break;
            case BCMOLT_GPIO_PIN_PIN85:
                break;
            case BCMOLT_GPIO_PIN_PIN86:
                break;
            case BCMOLT_GPIO_PIN_PIN87:
                break;
            case BCMOLT_GPIO_PIN_PIN88:
                break;
            case BCMOLT_GPIO_PIN_PIN89:
                break;
            case BCMOLT_GPIO_PIN_PIN90:
                break;
            case BCMOLT_GPIO_PIN_PIN91:
                break;
            case BCMOLT_GPIO_PIN_PIN92:
                break;
            case BCMOLT_GPIO_PIN_PIN93:
                break;
            case BCMOLT_GPIO_PIN_PIN94:
                break;
            case BCMOLT_GPIO_PIN_PIN95:
                break;
            case BCMOLT_GPIO_PIN_PIN96:
                break;
            case BCMOLT_GPIO_PIN_PIN97:
                break;
            case BCMOLT_GPIO_PIN_PIN98:
                break;
            case BCMOLT_GPIO_PIN_PIN99:
                break;
            case BCMOLT_GPIO_PIN_PIN100:
                break;
            case BCMOLT_GPIO_PIN_PIN101:
                break;
            case BCMOLT_GPIO_PIN_PIN102:
                break;
            case BCMOLT_GPIO_PIN_PIN103:
                break;
            case BCMOLT_GPIO_PIN_PIN104:
                break;
            case BCMOLT_GPIO_PIN_PIN105:
                break;
            case BCMOLT_GPIO_PIN_PIN106:
                break;
            case BCMOLT_GPIO_PIN_UNCONFIGURED:
                break;
            default:
                *failed_prop = BCMOLT_GPIO_KEY_ID_GPIO_ID;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpio_cfg_data_set_default(bcmolt_gpio_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        this->direction = BCMOLT_GPIO_PIN_DIR_INPUT;
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        this->value = BCMOLT_GPIO_VALUE_CLEAR;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_data_pack(const bcmolt_gpio_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        if (!bcmolt_gpio_pin_dir_pack(this->direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        if (!bcmolt_gpio_value_pack(this->value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpio_cfg_data_get_packed_length(const bcmolt_gpio_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_data_unpack(bcmolt_gpio_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        if (!bcmolt_gpio_pin_dir_unpack(&this->direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        if (!bcmolt_gpio_value_unpack(&this->value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpio_cfg_data_bounds_check(const bcmolt_gpio_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpio_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_DIRECTION)) != 0)
    {
        switch (this->direction)
        {
            case BCMOLT_GPIO_PIN_DIR_INPUT:
                break;
            case BCMOLT_GPIO_PIN_DIR_OUTPUT:
                break;
            default:
                *failed_prop = BCMOLT_GPIO_CFG_ID_DIRECTION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPIO_CFG_ID_VALUE)) != 0)
    {
        switch (this->value)
        {
            case BCMOLT_GPIO_VALUE_CLEAR:
                break;
            case BCMOLT_GPIO_VALUE_SET:
                break;
            default:
                *failed_prop = BCMOLT_GPIO_CFG_ID_VALUE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_key_set_default(bcmolt_gpon_alloc_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_gpon_alloc_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_pack(const bcmolt_gpon_alloc_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_key_get_packed_length(const bcmolt_gpon_alloc_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_unpack(bcmolt_gpon_alloc_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_key_bounds_check(const bcmolt_gpon_alloc_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_ALLOC_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_gpon_alloc_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_cfg_data_set_default(bcmolt_gpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        this->state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        this->sla.cbr_rt_bw = 0;
        this->sla.cbr_nrt_bw = 0;
        this->sla.guaranteed_bw = 0;
        this->sla.maximum_bw = 0;
        this->sla.additional_bw_eligibility = BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NONE;
        this->sla.cbr_rt_compensation = BCMOS_FALSE;
        this->sla.cbr_rt_ap_index = 0;
        this->sla.cbr_nrt_ap_index = 0;
        this->sla.alloc_type = BCMOLT_ALLOC_TYPE_NONE;
        this->sla.weight = 0;
        this->sla.priority = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        this->collect_stats = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_data_pack(const bcmolt_gpon_alloc_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_pack(&this->sla, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->collect_stats))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_cfg_data_get_packed_length(const bcmolt_gpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        count += 23;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_data_unpack(bcmolt_gpon_alloc_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_unpack(&this->sla, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->collect_stats))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 23))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_cfg_data_bounds_check(const bcmolt_gpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ALLOC_STATE_INACTIVE:
                break;
            case BCMOLT_ALLOC_STATE_PROCESSING:
                break;
            case BCMOLT_ALLOC_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_CFG_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_bounds_check(&this->sla))
        {
            *failed_prop = BCMOLT_GPON_ALLOC_CFG_ID_SLA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_stat_data_set_default(bcmolt_gpon_alloc_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_data_pack(const bcmolt_gpon_alloc_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_stat_data_get_packed_length(const bcmolt_gpon_alloc_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_data_unpack(bcmolt_gpon_alloc_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_data_bounds_check(const bcmolt_gpon_alloc_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_stat_cfg_data_set_default(bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_data_pack(const bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_stat_cfg_data_get_packed_length(const bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_data_unpack(bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_cfg_data_bounds_check(const bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_configuration_completed_data_set_default(bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_data_pack(const bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_configuration_completed_data_get_packed_length(const bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_data_unpack(bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_configuration_completed_data_bounds_check(const bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_configuration_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ALLOC_STATE_INACTIVE:
                break;
            case BCMOLT_ALLOC_STATE_PROCESSING:
                break;
            case BCMOLT_ALLOC_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_get_alloc_stats_completed_data_set_default(bcmolt_gpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        this->average_nsr_used = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        this->average_nsr_allocated = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        this->average_sr_report = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_data_pack(const bcmolt_gpon_alloc_get_alloc_stats_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_nsr_used))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_nsr_allocated))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_sr_report))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_get_alloc_stats_completed_data_get_packed_length(const bcmolt_gpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_data_unpack(bcmolt_gpon_alloc_get_alloc_stats_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_nsr_used))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_nsr_allocated))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_sr_report))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_data_bounds_check(const bcmolt_gpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_get_alloc_stats_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_stat_alarm_cleared_data_set_default(bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_data_pack(const bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_alloc_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_stat_alarm_cleared_data_get_packed_length(const bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_data_unpack(bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_alloc_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_data_bounds_check(const bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_stat_alarm_raised_data_set_default(bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_data_pack(const bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_alloc_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_stat_alarm_raised_data_get_packed_length(const bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_data_unpack(bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_alloc_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_data_bounds_check(const bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_auto_cfg_data_set_default(bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        this->configuration_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        this->get_alloc_stats_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_data_pack(const bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->get_alloc_stats_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_auto_cfg_data_get_packed_length(const bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_data_unpack(bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->get_alloc_stats_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_auto_cfg_data_bounds_check(const bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_get_stats_data_set_default(bcmolt_gpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        this->num_of_cycles = 1;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_data_pack(const bcmolt_gpon_alloc_get_stats_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->num_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_get_stats_data_get_packed_length(const bcmolt_gpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_data_unpack(bcmolt_gpon_alloc_get_stats_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->num_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_get_stats_data_bounds_check(const bcmolt_gpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_get_stats_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (this->num_of_cycles < 1)
        {
            *failed_prop = BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_alloc_set_state_data_set_default(bcmolt_gpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        this->state = BCMOLT_ALLOC_OPERATION_ACTIVATE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_data_pack(const bcmolt_gpon_alloc_set_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_operation_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_alloc_set_state_data_get_packed_length(const bcmolt_gpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_data_unpack(bcmolt_gpon_alloc_set_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_operation_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_alloc_set_state_data_bounds_check(const bcmolt_gpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_alloc_set_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_ALLOC_OPERATION_ACTIVATE:
                break;
            case BCMOLT_ALLOC_OPERATION_DEACTIVATE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_key_set_default(bcmolt_gpon_gem_port_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_gpon_gem_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_pack(const bcmolt_gpon_gem_port_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_key_get_packed_length(const bcmolt_gpon_gem_port_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_unpack(bcmolt_gpon_gem_port_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_key_bounds_check(const bcmolt_gpon_gem_port_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_cfg_data_set_default(bcmolt_gpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        this->configuration.direction = BCMOLT_GEM_PORT_DIRECTION_DOWNSTREAM;
        this->configuration.type = BCMOLT_GEM_PORT_TYPE_UNICAST;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        this->gem_port_state = BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        this->downstream_encryption_mode = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        this->upstream_destination_queue = BCMOLT_US_GEM_PORT_DESTINATION_DATA;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        this->debug_flow_config.untagged_flow = BCMOLT_CONTROL_STATE_DISABLE;
        this->debug_flow_config.untagged_vid = (bcmolt_vlan_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        this->mac_table_entry_limit = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_data_pack(const bcmolt_gpon_gem_port_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_pack(&this->configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_gpon_gem_port_state_pack(this->gem_port_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->downstream_encryption_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_us_gem_port_destination_pack(this->upstream_destination_queue, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_debug_flow_config_pack(&this->debug_flow_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mac_table_entry_limit))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_cfg_data_get_packed_length(const bcmolt_gpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_data_unpack(bcmolt_gpon_gem_port_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_unpack(&this->configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_gpon_gem_port_state_unpack(&this->gem_port_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->downstream_encryption_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_us_gem_port_destination_unpack(&this->upstream_destination_queue, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_debug_flow_config_unpack(&this->debug_flow_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mac_table_entry_limit))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_cfg_data_bounds_check(const bcmolt_gpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_bounds_check(&this->configuration))
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        switch (this->gem_port_state)
        {
            case BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_INACTIVE:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_PROCESSING:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE)) != 0)
    {
        switch (this->downstream_encryption_mode)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        switch (this->upstream_destination_queue)
        {
            case BCMOLT_US_GEM_PORT_DESTINATION_DATA:
                break;
            case BCMOLT_US_GEM_PORT_DESTINATION_CPU:
                break;
            case BCMOLT_US_GEM_PORT_DESTINATION_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_debug_flow_config_bounds_check(&this->debug_flow_config))
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT)) != 0)
    {
        if (this->mac_table_entry_limit > 128)
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_stat_data_set_default(bcmolt_gpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        this->rx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        this->tx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        this->tx_bytes = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_data_pack(const bcmolt_gpon_gem_port_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_stat_data_get_packed_length(const bcmolt_gpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_data_unpack(bcmolt_gpon_gem_port_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_data_bounds_check(const bcmolt_gpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_stat_cfg_data_set_default(bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_data_pack(const bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_stat_cfg_data_get_packed_length(const bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_data_unpack(bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_cfg_data_bounds_check(const bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_configuration_completed_data_set_default(bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_data_pack(const bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_gpon_gem_port_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_configuration_completed_data_get_packed_length(const bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_data_unpack(bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_gpon_gem_port_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_configuration_completed_data_bounds_check(const bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_configuration_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_INACTIVE:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_PROCESSING:
                break;
            case BCMOLT_GPON_GEM_PORT_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_stat_alarm_cleared_data_set_default(bcmolt_gpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_data_pack(const bcmolt_gpon_gem_port_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_gem_port_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_stat_alarm_cleared_data_get_packed_length(const bcmolt_gpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_data_unpack(bcmolt_gpon_gem_port_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_gem_port_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_data_bounds_check(const bcmolt_gpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_stat_alarm_raised_data_set_default(bcmolt_gpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_data_pack(const bcmolt_gpon_gem_port_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_gem_port_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_stat_alarm_raised_data_get_packed_length(const bcmolt_gpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_data_unpack(bcmolt_gpon_gem_port_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_gem_port_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_data_bounds_check(const bcmolt_gpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_auto_cfg_data_set_default(bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        this->configuration_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_data_pack(const bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_auto_cfg_data_get_packed_length(const bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_data_unpack(bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_auto_cfg_data_bounds_check(const bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_gem_port_set_state_data_set_default(bcmolt_gpon_gem_port_set_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        this->state = BCMOLT_GEM_PORT_OPERATION_ACTIVATE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_data_pack(const bcmolt_gpon_gem_port_set_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_gem_port_operation_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_gem_port_set_state_data_get_packed_length(const bcmolt_gpon_gem_port_set_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_data_unpack(bcmolt_gpon_gem_port_set_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_gem_port_operation_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_gem_port_set_state_data_bounds_check(const bcmolt_gpon_gem_port_set_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_gem_port_set_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_GEM_PORT_OPERATION_ACTIVATE:
                break;
            case BCMOLT_GEM_PORT_OPERATION_DEACTIVATE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_key_set_default(bcmolt_gpon_iwf_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_pack(const bcmolt_gpon_iwf_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_key_get_packed_length(const bcmolt_gpon_iwf_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_unpack(bcmolt_gpon_iwf_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_key_bounds_check(const bcmolt_gpon_iwf_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_IWF_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_cfg_data_set_default(bcmolt_gpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        this->iwf_mode = BCMOLT_IWF_MODE_DIRECT_MAPPING_MODE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        this->us_tpid_per_flow.arr[0] = 33024U;
        this->us_tpid_per_flow.arr[1] = 33024U;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        this->us_otag_direct_tpid = 33024U;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        this->us_otag_direct_pbit = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        this->ds_tpid.arr[0] = 33024U;
        this->ds_tpid.arr[1] = 34984U;
        this->ds_tpid.arr[2] = 37120U;
        this->ds_tpid.arr[3] = 37376U;
        this->ds_tpid.arr[4] = 33024U;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        this->mac_table_configuration.miss_fallback = BCMOLT_MAC_TABLE_MISS_FALLBACK_DROP;
        this->mac_table_configuration.default_flow_id = (bcmolt_flow_id) 0;
        this->mac_table_configuration.aging_time = 30;
        this->mac_table_configuration.learning_mode = BCMOLT_MAC_TABLE_LEARNING_MODE_NORMAL;
        this->mac_table_configuration.automatic_mac_learning = BCMOLT_CONTROL_STATE_DISABLE;
        this->mac_table_configuration.automatic_mac_aging = BCMOLT_CONTROL_STATE_DISABLE;
        this->mac_table_configuration.automatic_mac_move = BCMOLT_CONTROL_STATE_DISABLE;
        this->mac_table_configuration.automatic_static_mode = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        this->debug_flow_configuration.learn_untagged_flow_vids = BCMOS_FALSE;
        this->debug_flow_configuration.untagged_flow_shaping_ms_per_sec = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT)) != 0)
    {
        this->mac_table_count = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START)) != 0)
    {
        this->forbidden_vlan_flow_gem_range_start = 128;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_data_pack(const bcmolt_gpon_iwf_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        if (!bcmolt_iwf_mode_pack(this->iwf_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        if (!bcmolt_arr_u16_2_hex_pack(&this->us_tpid_per_flow, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->us_otag_direct_tpid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->us_otag_direct_pbit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_pack(&this->ds_tpid, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        if (!bcmolt_mac_table_configuration_pack(&this->mac_table_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gpon_iwf_debug_flow_config_pack(&this->debug_flow_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->mac_table_count))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->forbidden_vlan_flow_gem_range_start))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_cfg_data_get_packed_length(const bcmolt_gpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        count += 10;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_data_unpack(bcmolt_gpon_iwf_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        if (!bcmolt_iwf_mode_unpack(&this->iwf_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        if (!bcmolt_arr_u16_2_hex_unpack(&this->us_tpid_per_flow, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->us_otag_direct_tpid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->us_otag_direct_pbit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_unpack(&this->ds_tpid, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        if (!bcmolt_mac_table_configuration_unpack(&this->mac_table_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gpon_iwf_debug_flow_config_unpack(&this->debug_flow_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->mac_table_count))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->forbidden_vlan_flow_gem_range_start))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_cfg_data_bounds_check(const bcmolt_gpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_IWF_MODE)) != 0)
    {
        switch (this->iwf_mode)
        {
            case BCMOLT_IWF_MODE_DIRECT_MAPPING_MODE:
                break;
            case BCMOLT_IWF_MODE_PER_FLOW_MODE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_CFG_ID_IWF_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW)) != 0)
    {
        if (!bcmolt_arr_u16_2_hex_bounds_check(&this->us_tpid_per_flow))
        {
            *failed_prop = BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT)) != 0)
    {
        if (this->us_otag_direct_pbit > 7)
        {
            *failed_prop = BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_bounds_check(&this->ds_tpid))
        {
            *failed_prop = BCMOLT_GPON_IWF_CFG_ID_DS_TPID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION)) != 0)
    {
        if (!bcmolt_mac_table_configuration_bounds_check(&this->mac_table_configuration))
        {
            *failed_prop = BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gpon_iwf_debug_flow_config_bounds_check(&this->debug_flow_configuration))
        {
            *failed_prop = BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_stat_data_set_default(bcmolt_gpon_iwf_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT)) != 0)
    {
        this->ds_hit_event = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT)) != 0)
    {
        this->ds_miss_event = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT)) != 0)
    {
        this->ds_drop_due_to_miss_event = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT)) != 0)
    {
        this->ds_drop_due_to_hit_event = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM)) != 0)
    {
        this->ds_drop_to_disabled_gem = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED)) != 0)
    {
        this->new_mac_discovered = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT)) != 0)
    {
        this->move_event = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL)) != 0)
    {
        this->new_mac_drop_due_to_fifo_full = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_data_pack(const bcmolt_gpon_iwf_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ds_hit_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ds_miss_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ds_drop_due_to_miss_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ds_drop_due_to_hit_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ds_drop_to_disabled_gem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->new_mac_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->move_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->new_mac_drop_due_to_fifo_full))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_stat_data_get_packed_length(const bcmolt_gpon_iwf_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_data_unpack(bcmolt_gpon_iwf_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ds_hit_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ds_miss_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ds_drop_due_to_miss_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ds_drop_due_to_hit_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ds_drop_to_disabled_gem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->new_mac_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->move_event))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->new_mac_drop_due_to_fifo_full))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_data_bounds_check(const bcmolt_gpon_iwf_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_stat_cfg_data_set_default(bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_data_pack(const bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_stat_cfg_data_get_packed_length(const bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_data_unpack(bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_cfg_data_bounds_check(const bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_GPON_IWF_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_scan_mac_table_completed_data_set_default(bcmolt_gpon_iwf_scan_mac_table_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        this->entries.len = 0;
        this->entries.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_data_pack(const bcmolt_gpon_iwf_scan_mac_table_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        if (!bcmolt_gpon_mac_table_scan_result_list_u16_pack(&this->entries, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_scan_mac_table_completed_data_get_packed_length(const bcmolt_gpon_iwf_scan_mac_table_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        count += bcmolt_gpon_mac_table_scan_result_list_u16_get_packed_length(&this->entries);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_data_unpack(bcmolt_gpon_iwf_scan_mac_table_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        if (!bcmolt_gpon_mac_table_scan_result_list_u16_unpack(&this->entries, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        if (!bcmolt_gpon_mac_table_scan_result_list_u16_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_data_bounds_check(const bcmolt_gpon_iwf_scan_mac_table_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_scan_mac_table_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES)) != 0)
    {
        if (!bcmolt_gpon_mac_table_scan_result_list_u16_bounds_check(&this->entries))
        {
            *failed_prop = BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_stat_alarm_cleared_data_set_default(bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_data_pack(const bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_iwf_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_stat_alarm_cleared_data_get_packed_length(const bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_data_unpack(bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_iwf_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_data_bounds_check(const bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_stat_alarm_raised_data_set_default(bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_data_pack(const bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_iwf_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_stat_alarm_raised_data_get_packed_length(const bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_data_unpack(bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_iwf_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_data_bounds_check(const bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT:
                break;
            case BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_auto_cfg_data_set_default(bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED)) != 0)
    {
        this->flush_mac_table_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED)) != 0)
    {
        this->scan_mac_table_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_data_pack(const bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->flush_mac_table_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->scan_mac_table_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_auto_cfg_data_get_packed_length(const bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_data_unpack(bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->flush_mac_table_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->scan_mac_table_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_auto_cfg_data_bounds_check(const bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_flush_mac_table_data_set_default(bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_FLUSH_MAC_TABLE_OPTION_ALL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        this->vid = (bcmolt_vlan_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_data_pack(const bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        if (!bcmolt_flush_mac_table_option_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->vid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_flush_mac_table_data_get_packed_length(const bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_data_unpack(bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        if (!bcmolt_flush_mac_table_option_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->vid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_flush_mac_table_data_bounds_check(const bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_flush_mac_table_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_FLUSH_MAC_TABLE_OPTION_ALL:
                break;
            case BCMOLT_FLUSH_MAC_TABLE_OPTION_PER_VID:
                break;
            case BCMOLT_FLUSH_MAC_TABLE_OPTION_PER_FLOW:
                break;
            case BCMOLT_FLUSH_MAC_TABLE_OPTION_VID_PLUS_FLOW:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID)) != 0)
    {
        if (this->vid > (bcmolt_vlan_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_scan_mac_table_data_set_default(bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_data_pack(const bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_scan_mac_table_data_get_packed_length(const bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_data_unpack(bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_scan_mac_table_data_bounds_check(const bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_scan_mac_table_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_ds_egress_flow_key_set_default(bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_pack(const bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_ds_egress_flow_key_get_packed_length(const bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_unpack(bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_bounds_check(const bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_ds_egress_flow_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_ds_egress_flow_cfg_data_set_default(bcmolt_gpon_iwf_ds_egress_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        this->gem_port = (bcmolt_gpon_gem_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL)) != 0)
    {
        this->pbit_control = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_data_pack(const bcmolt_gpon_iwf_ds_egress_flow_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->pbit_control))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_ds_egress_flow_cfg_data_get_packed_length(const bcmolt_gpon_iwf_ds_egress_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_data_unpack(bcmolt_gpon_iwf_ds_egress_flow_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->pbit_control))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_data_bounds_check(const bcmolt_gpon_iwf_ds_egress_flow_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_ds_egress_flow_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT)) != 0)
    {
        if (this->gem_port > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_ds_ingress_flow_key_set_default(bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        this->vlan_id = (bcmolt_vlan_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_pack(const bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->vlan_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_ds_ingress_flow_key_get_packed_length(const bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_unpack(bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->vlan_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_bounds_check(const bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_ds_ingress_flow_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID)) != 0)
    {
        if (this->vlan_id > (bcmolt_vlan_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_set_default(bcmolt_gpon_iwf_ds_ingress_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        this->mapping_method = BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD_VID;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        this->mapping_tag = BCMOLT_MAPPING_TAG_METHOD_OUTER_VID;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        this->vlan_action = BCMOLT_DS_VLAN_ACTION_REMOVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_pack(const bcmolt_gpon_iwf_ds_ingress_flow_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        if (!bcmolt_vlan_to_flow_mapping_method_pack(this->mapping_method, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        if (!bcmolt_mapping_tag_method_pack(this->mapping_tag, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_ds_vlan_action_pack(this->vlan_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_get_packed_length(const bcmolt_gpon_iwf_ds_ingress_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_unpack(bcmolt_gpon_iwf_ds_ingress_flow_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        if (!bcmolt_vlan_to_flow_mapping_method_unpack(&this->mapping_method, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        if (!bcmolt_mapping_tag_method_unpack(&this->mapping_tag, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_ds_vlan_action_unpack(&this->vlan_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_bounds_check(const bcmolt_gpon_iwf_ds_ingress_flow_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_ds_ingress_flow_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD)) != 0)
    {
        switch (this->mapping_method)
        {
            case BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD_VID:
                break;
            case BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD_MACPLUSVID:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG)) != 0)
    {
        switch (this->mapping_tag)
        {
            case BCMOLT_MAPPING_TAG_METHOD_OUTER_VID:
                break;
            case BCMOLT_MAPPING_TAG_METHOD_INNER_VID:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        switch (this->vlan_action)
        {
            case BCMOLT_DS_VLAN_ACTION_REMOVE:
                break;
            case BCMOLT_DS_VLAN_ACTION_TRANSPARENT:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_key_set_default(bcmolt_gpon_iwf_mac_table_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN)) != 0)
    {
        this->vlan = (bcmolt_vlan_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_pack(const bcmolt_gpon_iwf_mac_table_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->vlan))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_key_get_packed_length(const bcmolt_gpon_iwf_mac_table_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_unpack(bcmolt_gpon_iwf_mac_table_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->vlan))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_key_bounds_check(const bcmolt_gpon_iwf_mac_table_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_cfg_data_set_default(bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT)) != 0)
    {
        this->stat = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_gpon_gem_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_data_pack(const bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_cfg_data_get_packed_length(const bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_data_unpack(bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_data_bounds_check(const bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_mac_dropped_data_set_default(bcmolt_gpon_iwf_mac_table_mac_dropped_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_data_pack(const bcmolt_gpon_iwf_mac_table_mac_dropped_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_mac_dropped_data_get_packed_length(const bcmolt_gpon_iwf_mac_table_mac_dropped_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_data_unpack(bcmolt_gpon_iwf_mac_table_mac_dropped_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_data_bounds_check(const bcmolt_gpon_iwf_mac_table_mac_dropped_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_mac_dropped_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_mac_move_data_set_default(bcmolt_gpon_iwf_mac_table_mac_move_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        this->old_flow_id = (bcmolt_flow_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        this->new_flow_id = (bcmolt_flow_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_data_pack(const bcmolt_gpon_iwf_mac_table_mac_move_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->old_flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->new_flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_mac_move_data_get_packed_length(const bcmolt_gpon_iwf_mac_table_mac_move_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_data_unpack(bcmolt_gpon_iwf_mac_table_mac_move_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->old_flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->new_flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_data_bounds_check(const bcmolt_gpon_iwf_mac_table_mac_move_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_mac_move_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID)) != 0)
    {
        if (this->old_flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID)) != 0)
    {
        if (this->new_flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_new_mac_data_set_default(bcmolt_gpon_iwf_mac_table_new_mac_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_data_pack(const bcmolt_gpon_iwf_mac_table_new_mac_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_new_mac_data_get_packed_length(const bcmolt_gpon_iwf_mac_table_new_mac_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_data_unpack(bcmolt_gpon_iwf_mac_table_new_mac_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_data_bounds_check(const bcmolt_gpon_iwf_mac_table_new_mac_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_new_mac_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_mac_table_auto_cfg_data_set_default(bcmolt_gpon_iwf_mac_table_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED)) != 0)
    {
        this->mac_aged = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED)) != 0)
    {
        this->mac_dropped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE)) != 0)
    {
        this->mac_move = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC)) != 0)
    {
        this->new_mac = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_data_pack(const bcmolt_gpon_iwf_mac_table_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mac_aged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mac_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mac_move))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->new_mac))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_mac_table_auto_cfg_data_get_packed_length(const bcmolt_gpon_iwf_mac_table_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_data_unpack(bcmolt_gpon_iwf_mac_table_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mac_aged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mac_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mac_move))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->new_mac))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_data_bounds_check(const bcmolt_gpon_iwf_mac_table_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_mac_table_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_us_flow_key_set_default(bcmolt_gpon_iwf_us_flow_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_gpon_gem_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_pack(const bcmolt_gpon_iwf_us_flow_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_us_flow_key_get_packed_length(const bcmolt_gpon_iwf_us_flow_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_unpack(bcmolt_gpon_iwf_us_flow_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_key_bounds_check(const bcmolt_gpon_iwf_us_flow_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_us_flow_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_iwf_us_flow_cfg_data_set_default(bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        this->flow_id = (bcmolt_flow_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING)) != 0)
    {
        this->mac_learning = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        this->vlan_action = BCMOLT_US_VLAN_ACTION_ADD;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        this->vlan_tag.vlan_id = (bcmolt_vlan_id) 0;
        this->vlan_tag.pbit = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        this->tpid_index = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_data_pack(const bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->mac_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_us_vlan_action_pack(this->vlan_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        if (!bcmolt_vlan_tag_pack(&this->vlan_tag, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tpid_index))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_iwf_us_flow_cfg_data_get_packed_length(const bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_data_unpack(bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->flow_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->mac_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_us_vlan_action_unpack(&this->vlan_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        if (!bcmolt_vlan_tag_unpack(&this->vlan_tag, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tpid_index))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_data_bounds_check(const bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_iwf_us_flow_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID)) != 0)
    {
        if (this->flow_id > (bcmolt_flow_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION)) != 0)
    {
        switch (this->vlan_action)
        {
            case BCMOLT_US_VLAN_ACTION_ADD:
                break;
            case BCMOLT_US_VLAN_ACTION_TRANSPARENT:
                break;
            default:
                *failed_prop = BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG)) != 0)
    {
        if (!bcmolt_vlan_tag_bounds_check(&this->vlan_tag))
        {
            *failed_prop = BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX)) != 0)
    {
        if (this->tpid_index > 1)
        {
            *failed_prop = BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_key_set_default(bcmolt_gpon_ni_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_pack(const bcmolt_gpon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_key_get_packed_length(const bcmolt_gpon_ni_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_unpack(bcmolt_gpon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_key_bounds_check(const bcmolt_gpon_ni_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_NI_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_cfg_data_set_default(bcmolt_gpon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        this->pon_status.state = BCMOLT_PON_STATE_INACTIVE;
        this->pon_status.los_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        this->available_bandwidth.cbr_bw = 0;
        this->available_bandwidth.total_bw = 0;
        this->available_bandwidth.next_onu_total_bw = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        this->number_of_active_onus = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) != 0)
    {
        this->number_of_active_standby_onus = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        this->prbs_status.lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
        this->prbs_status.error_counts = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        this->pon_distance.max_log_distance = 20;
        this->pon_distance.max_diff_reach = 20;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        this->ranging_window_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        this->preassigned_equalization_delay = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        this->eqd_cycles_number = 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        this->power_level.pls_maximum_allocation_size = 120;
        this->power_level.mode = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        this->ds_fec_mode = BCMOLT_CONTROL_STATE_ENABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        this->drift_control.drift_interval = 1000;
        this->drift_control.drift_limit = 4;
        this->drift_control.transmission_control_limit = 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        this->ds_ber_reporting_interval = (bcmolt_ber_interval) 5000;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        this->los_alarm_threshold = 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        this->los_initial_value = BCMOLT_STATUS_ON;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        this->onu_alarms_thresholds.losi = 4;
        this->onu_alarms_thresholds.lofi = 4;
        this->onu_alarms_thresholds.loami = 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        this->ber_monitor.us_ber_interval = 5000;
        this->ber_monitor.sf_threshold = 3;
        this->ber_monitor.sd_threshold = 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT)) != 0)
    {
        this->ploam_ack_timeout = 2000;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        this->onu_activation.key_exchange = BCMOLT_CONTROL_STATE_DISABLE;
        this->onu_activation.password_authentication = BCMOLT_CONTROL_STATE_ENABLE;
        this->onu_activation.fail_due_to_password_authentication_failure = BCMOLT_CONTROL_STATE_ENABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        this->sn_acquisition.interval = 1000;
        this->sn_acquisition.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->sn_acquisition.onu_post_discovery_mode = BCMOLT_ONU_POST_DISCOVERY_MODE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        this->key_exchange.interval = 10000;
        this->key_exchange.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->key_exchange.mode = BCMOLT_KEY_EXCHANGE_MODE_NORMAL;
        this->key_exchange.encrypted_ports_only = BCMOLT_CONTROL_STATE_ENABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        this->protection_switching.timeout = 100;
        this->protection_switching.gpio_pin = BCMOLT_GPIO_PIN_UNCONFIGURED;
        this->protection_switching.options = (bcmolt_pon_protection_switching_options) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        this->cbr_rt_allocation_profile.ma_7 = 64;
        this->cbr_rt_allocation_profile.ma_3 = 256;
        this->cbr_rt_allocation_profile.ma_1 = 512;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        this->cbr_nrt_allocation_profile.arr[0] = 4096;
        this->cbr_nrt_allocation_profile.arr[1] = 8192;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        this->dba.sr_reporting_block_size = 48;
        this->dba.dba_mode = BCMOLT_DBA_MODE_NORMAL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        this->power_management.ilowpower = 1600;
        this->power_management.iaware = 160;
        this->power_management.itransinit = 80;
        this->power_management.itxinit = 40;
        this->power_management.irxoff = 1600;
        this->power_management.low_power_clobi = 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        this->rogue_onu_detection_process.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->rogue_onu_detection_process.detection_algorithm.algorithm_type = BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.measurement_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.interval = 10000;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.second_ranging_window = BCMOS_FALSE;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = BCMOLT_ALLOC_TYPE_TO_SCAN_ALL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        this->periodic_standby_pon_monitoring.interval = 5000;
        this->periodic_standby_pon_monitoring.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        this->prbs_checker.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_checker.mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
        this->prbs_checker.data_invert = BCMOS_FALSE;
        this->prbs_checker.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        this->prbs_generator.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_generator.error_insert = BCMOS_FALSE;
        this->prbs_generator.invert = BCMOS_FALSE;
        this->prbs_generator.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        this->min_data_alloc_id = (bcmolt_gpon_alloc_id) 256;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        this->automatic_onu_deactivation.los = BCMOS_TRUE;
        this->automatic_onu_deactivation.onu_alarms = BCMOS_TRUE;
        this->automatic_onu_deactivation.tiwi = BCMOS_TRUE;
        this->automatic_onu_deactivation.ack_timeout = BCMOS_TRUE;
        this->automatic_onu_deactivation.sfi = BCMOS_TRUE;
        this->automatic_onu_deactivation.loki = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        this->us_bandwidth_limit = 155520000UL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        this->all_onus.len = 0;
        this->all_onus.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        this->all_mcast_gem_ports.len = 0;
        this->all_mcast_gem_ports.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        this->debug.number_of_gem_ports_per_onu = 64;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        this->onu_upgrade_params.response_timeout_ms = 1000;
        this->onu_upgrade_params.max_retry_count = 23;
        this->onu_upgrade_params.omci_format = BCMOLT_OMCI_DEVICE_ID_EXTENDED;
        this->onu_upgrade_params.window_size = 32;
        this->onu_upgrade_params.activate_commit = BCMOS_FALSE;
        this->onu_upgrade_params.delay_for_commit_ms = 40000UL;
        this->onu_upgrade_params.max_activation_attempts = 23;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT)) != 0)
    {
        this->ps_c_wait_before_deactivation_timeout = 1000;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        this->bip32_indication_control = BCMOLT_CONTROL_STATE_ENABLE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_data_pack(const bcmolt_gpon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_pack(&this->pon_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_pack(&this->available_bandwidth, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->number_of_active_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->number_of_active_standby_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_pack(&this->prbs_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_pack(&this->pon_distance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_window_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->preassigned_equalization_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->eqd_cycles_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_pon_power_level_pack(&this->power_level, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->ds_fec_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_pack(&this->drift_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->ds_ber_reporting_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->los_alarm_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_status_pack(this->los_initial_value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_thresholds_pack(&this->onu_alarms_thresholds, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_pack(&this->ber_monitor, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->ploam_ack_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_gpon_onu_activation_pack(&this->onu_activation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_gpon_sn_acquisition_pack(&this->sn_acquisition, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_gpon_key_exchange_pack(&this->key_exchange, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_pon_protection_switching_pack(&this->protection_switching, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_pack(&this->cbr_rt_allocation_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_pack(&this->cbr_nrt_allocation_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        if (!bcmolt_pon_dba_pack(&this->dba, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_pack(&this->power_management, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_pack(&this->rogue_onu_detection_process, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_pack(&this->periodic_standby_pon_monitoring, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_pack(&this->prbs_checker, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_pack(&this->prbs_generator, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->min_data_alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_pack(&this->automatic_onu_deactivation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->us_bandwidth_limit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_with_state_list_u16_max_128_pack(&this->all_onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_128_pack(&this->all_mcast_gem_ports, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_gpon_ni_debug_pack(&this->debug, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_pack(&this->onu_upgrade_params, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->ps_c_wait_before_deactivation_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_pack(this->bip32_indication_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_cfg_data_get_packed_length(const bcmolt_gpon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        count += 18;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        count += bcmolt_rogue_onu_detection_process_get_packed_length(&this->rogue_onu_detection_process);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        count += bcmolt_gpon_onu_with_state_list_u16_max_128_get_packed_length(&this->all_onus);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        count += bcmolt_gpon_gem_port_with_state_list_u16_max_128_get_packed_length(&this->all_mcast_gem_ports);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        count += 14;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_data_unpack(bcmolt_gpon_ni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_unpack(&this->pon_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_unpack(&this->available_bandwidth, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->number_of_active_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->number_of_active_standby_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_unpack(&this->prbs_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_unpack(&this->pon_distance, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_window_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->preassigned_equalization_delay))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->eqd_cycles_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_pon_power_level_unpack(&this->power_level, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->ds_fec_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_unpack(&this->drift_control, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->ds_ber_reporting_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->los_alarm_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_status_unpack(&this->los_initial_value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_thresholds_unpack(&this->onu_alarms_thresholds, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_unpack(&this->ber_monitor, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->ploam_ack_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_gpon_onu_activation_unpack(&this->onu_activation, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_gpon_sn_acquisition_unpack(&this->sn_acquisition, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_gpon_key_exchange_unpack(&this->key_exchange, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_pon_protection_switching_unpack(&this->protection_switching, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_unpack(&this->cbr_rt_allocation_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_unpack(&this->cbr_nrt_allocation_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        if (!bcmolt_pon_dba_unpack(&this->dba, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_unpack(&this->power_management, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_unpack(&this->rogue_onu_detection_process, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_unpack(&this->periodic_standby_pon_monitoring, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_unpack(&this->prbs_checker, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_unpack(&this->prbs_generator, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->min_data_alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_unpack(&this->automatic_onu_deactivation, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->us_bandwidth_limit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_with_state_list_u16_max_128_unpack(&this->all_onus, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_128_unpack(&this->all_mcast_gem_ports, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_gpon_ni_debug_unpack(&this->debug, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_unpack(&this->onu_upgrade_params, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->ps_c_wait_before_deactivation_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->bip32_indication_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 18))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_with_state_list_u16_max_128_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_128_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 14))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cfg_data_bounds_check(const bcmolt_gpon_ni_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_bounds_check(&this->pon_status))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PON_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_bounds_check(&this->available_bandwidth))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_bounds_check(&this->prbs_status))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_bounds_check(&this->pon_distance))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY)) != 0)
    {
        if (this->preassigned_equalization_delay > 16776960UL)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (this->eqd_cycles_number > 255)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_pon_power_level_bounds_check(&this->power_level))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        switch (this->ds_fec_mode)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_bounds_check(&this->drift_control))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (this->ds_ber_reporting_interval > (bcmolt_ber_interval) 536870911UL)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        switch (this->los_initial_value)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_thresholds_bounds_check(&this->onu_alarms_thresholds))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_bounds_check(&this->ber_monitor))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_BER_MONITOR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_gpon_onu_activation_bounds_check(&this->onu_activation))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_gpon_sn_acquisition_bounds_check(&this->sn_acquisition))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_gpon_key_exchange_bounds_check(&this->key_exchange))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_pon_protection_switching_bounds_check(&this->protection_switching))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_bounds_check(&this->cbr_rt_allocation_profile))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_bounds_check(&this->cbr_nrt_allocation_profile))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DBA)) != 0)
    {
        if (!bcmolt_pon_dba_bounds_check(&this->dba))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_DBA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_bounds_check(&this->power_management))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_bounds_check(&this->rogue_onu_detection_process))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_bounds_check(&this->periodic_standby_pon_monitoring))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_bounds_check(&this->prbs_checker))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_bounds_check(&this->prbs_generator))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (this->min_data_alloc_id < (bcmolt_gpon_alloc_id) 256)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID;
            return BCMOS_FALSE;
        }

        if (this->min_data_alloc_id > (bcmolt_gpon_alloc_id) 3200)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_bounds_check(&this->automatic_onu_deactivation))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (this->us_bandwidth_limit < 800000UL)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT;
            return BCMOS_FALSE;
        }

        if (this->us_bandwidth_limit > 155520000UL)
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (this->all_onus.len > 128)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_onu_with_state_list_u16_max_128_bounds_check(&this->all_onus))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ALL_ONUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (this->all_mcast_gem_ports.len > 128)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_128_bounds_check(&this->all_mcast_gem_ports))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_gpon_ni_debug_bounds_check(&this->debug))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_DEBUG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_bounds_check(&this->onu_upgrade_params))
        {
            *failed_prop = BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL)) != 0)
    {
        switch (this->bip32_indication_control)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_stat_data_set_default(bcmolt_gpon_ni_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        this->fec_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        this->fec_codewords_uncorrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES)) != 0)
    {
        this->bip8_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS)) != 0)
    {
        this->bip8_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS)) != 0)
    {
        this->rx_gem_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED)) != 0)
    {
        this->rx_gem_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE)) != 0)
    {
        this->rx_gem_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED)) != 0)
    {
        this->rx_gem_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL)) != 0)
    {
        this->rx_gem_illegal = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        this->rx_allocations_valid = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        this->rx_allocations_invalid = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        this->rx_allocations_disabled = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        this->rx_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        this->rx_ploams_non_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        this->rx_ploams_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        this->rx_ploams_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        this->rx_cpu = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        this->rx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        this->rx_omci_packets_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        this->rx_dropped_too_short = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        this->rx_dropped_too_long = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS)) != 0)
    {
        this->rx_crc_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS)) != 0)
    {
        this->rx_key_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS)) != 0)
    {
        this->rx_fragments_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        this->rx_packets_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM)) != 0)
    {
        this->tx_gem = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        this->tx_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS)) != 0)
    {
        this->tx_gem_fragments = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        this->tx_cpu = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        this->tx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        this->tx_cpu_omci_packets_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        this->tx_dropped_illegal_length = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        this->tx_dropped_tpid_miss = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        this->tx_dropped_vid_miss = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_data_pack(const bcmolt_gpon_ni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip8_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_gem_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_gem_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_gem_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_gem_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_gem_illegal))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_valid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_invalid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_disabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_dropped_too_short))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_dropped_too_long))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_crc_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_key_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_fragments_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_gem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_gem_fragments))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_cpu_omci_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_illegal_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_tpid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_vid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_stat_data_get_packed_length(const bcmolt_gpon_ni_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_data_unpack(bcmolt_gpon_ni_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip8_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_gem_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_gem_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_gem_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_gem_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_gem_illegal))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_valid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_invalid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_disabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_dropped_too_short))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_dropped_too_long))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_crc_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_key_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_fragments_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_gem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_gem_fragments))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_cpu_omci_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_illegal_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_tpid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_vid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_data_bounds_check(const bcmolt_gpon_ni_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_stat_cfg_data_set_default(bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_data_pack(const bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_stat_cfg_data_get_packed_length(const bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_data_unpack(bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_cfg_data_bounds_check(const bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_GPON_NI_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_cpu_packets_failure_data_set_default(bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        this->error = BCMOLT_PACKET_INJECTION_ERROR_GEM_PORT_NOT_ACTIVE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_gpon_gem_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_data_pack(const bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_packet_injection_error_pack(this->error, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_cpu_packets_failure_data_get_packed_length(const bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_data_unpack(bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_packet_injection_error_unpack(&this->error, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_data_bounds_check(const bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_cpu_packets_failure_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        switch (this->error)
        {
            case BCMOLT_PACKET_INJECTION_ERROR_GEM_PORT_NOT_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_los_data_set_default(bcmolt_gpon_ni_los_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_data_pack(const bcmolt_gpon_ni_los_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_los_data_get_packed_length(const bcmolt_gpon_ni_los_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_data_unpack(bcmolt_gpon_ni_los_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_los_data_bounds_check(const bcmolt_gpon_ni_los_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_los_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_LOS_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_LOS_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_onu_discovered_data_set_default(bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        this->ranging_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_data_pack(const bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_onu_discovered_data_get_packed_length(const bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_data_unpack(bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_discovered_data_bounds_check(const bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_onu_discovered_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_onu_upgrade_complete_data_set_default(bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        this->status = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        this->list_of_failed_entities.len = 0;
        this->list_of_failed_entities.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_data_pack(const bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_pack(&this->list_of_failed_entities, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_onu_upgrade_complete_data_get_packed_length(const bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        count += bcmolt_gpon_onu_upgrade_status_list_u32_get_packed_length(&this->list_of_failed_entities);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_data_unpack(bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_unpack(&this->list_of_failed_entities, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_data_bounds_check(const bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_onu_upgrade_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_bounds_check(&this->list_of_failed_entities))
        {
            *failed_prop = BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_protection_switching_onus_ranged_data_set_default(bcmolt_gpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        this->onus.len = 0;
        this->onus.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_data_pack(const bcmolt_gpon_ni_protection_switching_onus_ranged_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_eqd_list_u32_pack(&this->onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_protection_switching_onus_ranged_data_get_packed_length(const bcmolt_gpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        count += bcmolt_gpon_onu_eqd_list_u32_get_packed_length(&this->onus);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_data_unpack(bcmolt_gpon_ni_protection_switching_onus_ranged_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_eqd_list_u32_unpack(&this->onus, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_eqd_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_data_bounds_check(const bcmolt_gpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_protection_switching_onus_ranged_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_gpon_onu_eqd_list_u32_bounds_check(&this->onus))
        {
            *failed_prop = BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_protection_switching_switchover_completed_data_set_default(bcmolt_gpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_data_pack(const bcmolt_gpon_ni_protection_switching_switchover_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_protection_switching_switchover_completed_data_get_packed_length(const bcmolt_gpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_data_unpack(bcmolt_gpon_ni_protection_switching_switchover_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_data_bounds_check(const bcmolt_gpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_protection_switching_switchover_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_protection_switching_traffic_resume_data_set_default(bcmolt_gpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_TRAFFIC_RESUME_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_data_pack(const bcmolt_gpon_ni_protection_switching_traffic_resume_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_traffic_resume_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_protection_switching_traffic_resume_data_get_packed_length(const bcmolt_gpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_data_unpack(bcmolt_gpon_ni_protection_switching_traffic_resume_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_traffic_resume_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_data_bounds_check(const bcmolt_gpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_protection_switching_traffic_resume_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_TRAFFIC_RESUME_RESULT_SUCCESS:
                break;
            case BCMOLT_TRAFFIC_RESUME_RESULT_FAILURE:
                break;
            case BCMOLT_TRAFFIC_RESUME_RESULT_SUSPECTED_LOS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_rogue_detection_completed_data_set_default(bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        this->window_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        this->measurement_status = BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_COMPLETE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_gpon_alloc_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        this->is_delineation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        this->is_ed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        this->rx_data.len = 0;
        this->rx_data.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        this->ploam_received_onu_id = (bcmolt_gpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR)) != 0)
    {
        this->ploam_received_crc_error = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_data_pack(const bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_pack(this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_rogue_measurement_result_pack(this->measurement_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->is_delineation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->is_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->rx_data, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->ploam_received_onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ploam_received_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_rogue_detection_completed_data_get_packed_length(const bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->rx_data);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_data_unpack(bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_unpack(&this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_rogue_measurement_result_unpack(&this->measurement_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->is_delineation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->is_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->rx_data, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->ploam_received_onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ploam_received_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_data_bounds_check(const bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_rogue_detection_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        switch (this->window_type)
        {
            case BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW:
                break;
            case BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        switch (this->measurement_status)
        {
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_COMPLETE:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_NOT_PERFORMED:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_ROGUE_CYCLE_STOP:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_ERROR:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_NOT_COMPLETE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_gpon_alloc_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->rx_data))
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (this->ploam_received_onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_set_default(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        this->number_of_detected_delimiter = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        this->energy_detect_signal = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_pack(const bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->number_of_detected_delimiter))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_status_pack(this->energy_detect_signal, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_get_packed_length(const bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_unpack(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->number_of_detected_delimiter))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_status_unpack(&this->energy_detect_signal, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_bounds_check(const bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        switch (this->energy_detect_signal)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_stat_alarm_cleared_data_set_default(bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_data_pack(const bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_ni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_stat_alarm_cleared_data_get_packed_length(const bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_data_unpack(bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_ni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_data_bounds_check(const bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES:
                break;
            case BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_CPU:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_GEM:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_CPU:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_OMCI:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_stat_alarm_raised_data_set_default(bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_data_pack(const bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_ni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_stat_alarm_raised_data_get_packed_length(const bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_data_unpack(bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_ni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_data_bounds_check(const bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES:
                break;
            case BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_CPU:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_GEM:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_CPU:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_OMCI:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
                break;
            case BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_state_change_completed_data_set_default(bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        this->previous_state = BCMOLT_PON_STATE_INACTIVE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_PON_STATE_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_data_pack(const bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_pon_state_pack(this->previous_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_pon_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_state_change_completed_data_get_packed_length(const bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_data_unpack(bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_pon_state_unpack(&this->previous_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_pon_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_state_change_completed_data_bounds_check(const bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_state_change_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        switch (this->previous_state)
        {
            case BCMOLT_PON_STATE_INACTIVE:
                break;
            case BCMOLT_PON_STATE_PROCESSING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_PON_STATE_INACTIVE:
                break;
            case BCMOLT_PON_STATE_PROCESSING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_tod_request_completed_data_set_default(bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        memset(this->tod_string.str, 0, 64);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        this->sfc = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        this->rtc_offset_sec = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        this->rtc_offset_nsec = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_data_pack(const bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_pack(&this->tod_string, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->sfc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rtc_offset_sec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->rtc_offset_nsec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_tod_request_completed_data_get_packed_length(const bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        count += 64;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_data_unpack(bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_unpack(&this->tod_string, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->sfc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rtc_offset_sec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->rtc_offset_nsec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_tod_request_completed_data_bounds_check(const bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_tod_request_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_bounds_check(&this->tod_string))
        {
            *failed_prop = BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_auto_cfg_data_set_default(bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->activate_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        this->cpu_packets_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->deactivate_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->disable_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->enable_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        this->los = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        this->onu_discovered = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        this->onu_upgrade_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        this->protection_switching_onus_ranged = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        this->protection_switching_switchover_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        this->protection_switching_traffic_resume = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        this->rogue_detection_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        this->rogue_onu_special_map_cycle_start = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        this->serial_number_acquisition_cycle_start = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        this->standby_pon_monitoring_cycle_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        this->state_change_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        this->tod_request_completed = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_data_pack(const bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->activate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->cpu_packets_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->deactivate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->disable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->enable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->los))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_onus_ranged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_switchover_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_traffic_resume))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_detection_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_onu_special_map_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->serial_number_acquisition_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->standby_pon_monitoring_cycle_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tod_request_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_auto_cfg_data_get_packed_length(const bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_data_unpack(bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->activate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->cpu_packets_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->deactivate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->disable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->enable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->los))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_onus_ranged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_switchover_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_traffic_resume))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_detection_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_onu_special_map_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->serial_number_acquisition_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->standby_pon_monitoring_cycle_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tod_request_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_auto_cfg_data_bounds_check(const bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_disable_serial_number_data_set_default(bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_data_pack(const bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_disable_serial_number_control_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_disable_serial_number_data_get_packed_length(const bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_data_unpack(bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_disable_serial_number_control_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_disable_serial_number_data_bounds_check(const bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_disable_serial_number_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_DISABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_ENABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_ENABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_DISABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_DISABLE_DISCOVERY:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_set_default(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE_ACTIVE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        this->onu_list.len = 0;
        this->onu_list.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_pack(const bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_switch_over_type_c_onu_state_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        if (!bcmolt_gpon_onu_id_list_u32_max_256_pack(&this->onu_list, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_get_packed_length(const bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        count += bcmolt_gpon_onu_id_list_u32_max_256_get_packed_length(&this->onu_list);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_unpack(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_switch_over_type_c_onu_state_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        if (!bcmolt_gpon_onu_id_list_u32_max_256_unpack(&this->onu_list, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        if (!bcmolt_gpon_onu_id_list_u32_max_256_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_bounds_check(const bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST)) != 0)
    {
        if (this->onu_list.len > 256)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_onu_id_list_u32_max_256_bounds_check(&this->onu_list))
        {
            *failed_prop = BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_rogue_detection_window_data_set_default(bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        this->window_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_gpon_alloc_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        this->second_ranging_window = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_data_pack(const bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_pack(this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->second_ranging_window))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_rogue_detection_window_data_get_packed_length(const bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_data_unpack(bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_unpack(&this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->second_ranging_window))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_rogue_detection_window_data_bounds_check(const bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_rogue_detection_window_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        switch (this->window_type)
        {
            case BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW:
                break;
            case BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_gpon_alloc_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_set_onu_state_data_set_default(bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_data_pack(const bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_set_onu_state_data_get_packed_length(const bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_data_unpack(bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_onu_state_data_bounds_check(const bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_set_onu_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_OPERATION_INACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_DISABLE:
                break;
            case BCMOLT_ONU_OPERATION_ENABLE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_OPERATION_AWAKE_FREE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_set_pon_state_data_set_default(bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        this->pon_state = BCMOLT_PON_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_data_pack(const bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_pon_operation_pack(this->pon_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_set_pon_state_data_get_packed_length(const bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_data_unpack(bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_pon_operation_unpack(&this->pon_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_set_pon_state_data_bounds_check(const bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_set_pon_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        switch (this->pon_state)
        {
            case BCMOLT_PON_OPERATION_INACTIVE:
                break;
            case BCMOLT_PON_OPERATION_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_OPERATION_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_start_onu_upgrade_data_set_default(bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        this->list_of_onu_ids.len = 0;
        this->list_of_onu_ids.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_data_pack(const bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_pack(&this->list_of_onu_ids, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_start_onu_upgrade_data_get_packed_length(const bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        count += bcmolt_pon_onu_id_list_u32_get_packed_length(&this->list_of_onu_ids);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_data_unpack(bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_unpack(&this->list_of_onu_ids, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_data_bounds_check(const bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_start_onu_upgrade_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_bounds_check(&this->list_of_onu_ids))
        {
            *failed_prop = BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_broadcast_ploam_packet_data_set_default(bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        memset(this->ploam.arr, 0, sizeof(this->ploam.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_data_pack(const bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_pack(&this->ploam, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_broadcast_ploam_packet_data_get_packed_length(const bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        count += 12;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_data_unpack(bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_unpack(&this->ploam, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_data_bounds_check(const bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_broadcast_ploam_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_bounds_check(&this->ploam))
        {
            *failed_prop = BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_ni_cpu_packets_data_set_default(bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        this->packet_type = BCMOLT_PACKET_TYPE_CPU;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        this->calc_crc = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        this->gem_port_list.len = 0;
        this->gem_port_list.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_data_pack(const bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_pack(this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_gpon_gem_id_list_u8_max_16_pack(&this->gem_port_list, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_ni_cpu_packets_data_get_packed_length(const bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        count += bcmolt_gpon_gem_id_list_u8_max_16_get_packed_length(&this->gem_port_list);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_max_2048_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_data_unpack(bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_unpack(&this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_gpon_gem_id_list_u8_max_16_unpack(&this->gem_port_list, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_gpon_gem_id_list_u8_max_16_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_ni_cpu_packets_data_bounds_check(const bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_ni_cpu_packets_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        switch (this->packet_type)
        {
            case BCMOLT_PACKET_TYPE_CPU:
                break;
            case BCMOLT_PACKET_TYPE_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (this->gem_port_list.len > 16)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_gem_id_list_u8_max_16_bounds_check(&this->gem_port_list))
        {
            *failed_prop = BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (this->buffer.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u8_list_u32_max_2048_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_key_set_default(bcmolt_gpon_onu_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_gpon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_pack(const bcmolt_gpon_onu_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_key_get_packed_length(const bcmolt_gpon_onu_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_unpack(bcmolt_gpon_onu_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_bounds_check(const bcmolt_gpon_onu_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_gpon_onu_id) 127)
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_cfg_data_set_default(bcmolt_gpon_onu_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        memset(this->password.arr, 0, sizeof(this->password.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING)) != 0)
    {
        this->auto_password_learning = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_US_FEC)) != 0)
    {
        this->us_fec = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        this->omci_port_id = (bcmolt_gpon_gem_id) 65535U;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        this->ds_ber_reporting_interval = (bcmolt_ber_interval) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        memset(this->aes_encryption_key.bytes, 0, sizeof(this->aes_encryption_key.bytes));
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        this->alarm_state.losi = BCMOLT_STATUS_OFF;
        this->alarm_state.lofi = BCMOLT_STATUS_OFF;
        this->alarm_state.loami = BCMOLT_STATUS_OFF;
        this->alarm_state.dgi = BCMOLT_STATUS_OFF;
        this->alarm_state.tiwi = BCMOLT_STATUS_OFF;
        this->alarm_state.dowi = BCMOLT_STATUS_OFF;
        this->alarm_state.sufi = BCMOLT_STATUS_OFF;
        this->alarm_state.sfi = BCMOLT_STATUS_OFF;
        this->alarm_state.sdi = BCMOLT_STATUS_OFF;
        this->alarm_state.dfi = BCMOLT_STATUS_OFF;
        this->alarm_state.loai = BCMOLT_STATUS_OFF;
        this->alarm_state.loki = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        this->ranging_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        this->disabled_after_discovery = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        this->deactivation_reason = BCMOLT_DEACTIVATION_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        this->all_gem_ports.len = 0;
        this->all_gem_ports.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        this->all_allocs.len = 0;
        this->all_allocs.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C)) != 0)
    {
        this->onu_ps_type_c = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        this->extended_guard_time.additional_preburst_guard_time = 0;
        this->extended_guard_time.additional_postburst_guard_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_data_pack(const bcmolt_gpon_onu_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_pack(&this->password, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->auto_password_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_US_FEC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->us_fec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->omci_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->ds_ber_reporting_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->aes_encryption_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_gpon_onu_alarm_state_pack(&this->alarm_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_status_pack(this->disabled_after_discovery, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_deactivation_reason_pack(this->deactivation_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_256_pack(&this->all_gem_ports, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_gpon_alloc_with_state_list_u16_max_32_pack(&this->all_allocs, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_ps_type_c))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_pack(&this->extended_guard_time, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_cfg_data_get_packed_length(const bcmolt_gpon_onu_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        count += 10;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_US_FEC)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        count += 16;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        count += bcmolt_gpon_gem_port_with_state_list_u16_max_256_get_packed_length(&this->all_gem_ports);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        count += bcmolt_gpon_alloc_with_state_list_u16_max_32_get_packed_length(&this->all_allocs);
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_data_unpack(bcmolt_gpon_onu_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_unpack(&this->password, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->auto_password_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_US_FEC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->us_fec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->omci_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->ds_ber_reporting_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->aes_encryption_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_gpon_onu_alarm_state_unpack(&this->alarm_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_status_unpack(&this->disabled_after_discovery, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_deactivation_reason_unpack(&this->deactivation_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_256_unpack(&this->all_gem_ports, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_gpon_alloc_with_state_list_u16_max_32_unpack(&this->all_allocs, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_ps_type_c))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_unpack(&this->extended_guard_time, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_US_FEC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_256_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_gpon_alloc_with_state_list_u16_max_32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cfg_data_bounds_check(const bcmolt_gpon_onu_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_CFG_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_bounds_check(&this->password))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_PASSWORD;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID)) != 0)
    {
        if (this->omci_port_id > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL)) != 0)
    {
        if (this->ds_ber_reporting_interval > (bcmolt_ber_interval) 536870911UL)
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->aes_encryption_key))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_gpon_onu_alarm_state_bounds_check(&this->alarm_state))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        switch (this->disabled_after_discovery)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        switch (this->deactivation_reason)
        {
            case BCMOLT_DEACTIVATION_REASON_NONE:
                break;
            case BCMOLT_DEACTIVATION_REASON_DEACTIVATION:
                break;
            case BCMOLT_DEACTIVATION_REASON_ACK_TIMEOUT:
                break;
            case BCMOLT_DEACTIVATION_REASON_SFI:
                break;
            case BCMOLT_DEACTIVATION_REASON_TIWI:
                break;
            case BCMOLT_DEACTIVATION_REASON_PASSWORD_AUTHENTICATION:
                break;
            case BCMOLT_DEACTIVATION_REASON_ONU_ALARM:
                break;
            case BCMOLT_DEACTIVATION_REASON_LOS:
                break;
            case BCMOLT_DEACTIVATION_REASON_LOKI:
                break;
            case BCMOLT_DEACTIVATION_REASON_RERANGE_FAILURE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (this->all_gem_ports.len > 256)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_gem_port_with_state_list_u16_max_256_bounds_check(&this->all_gem_ports))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (this->all_allocs.len > 32)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_gpon_alloc_with_state_list_u16_max_32_bounds_check(&this->all_allocs))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_bounds_check(&this->extended_guard_time))
        {
            *failed_prop = BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_stat_data_set_default(bcmolt_gpon_onu_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        this->fec_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED)) != 0)
    {
        this->fec_bytes_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED)) != 0)
    {
        this->fec_codewords_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        this->fec_codewords_uncorrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES)) != 0)
    {
        this->bip8_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS)) != 0)
    {
        this->bip8_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR)) != 0)
    {
        this->rx_ploams_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        this->rx_ploams_non_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        this->positive_drift = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        this->negative_drift = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        this->rx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        this->rx_omci_packets_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED)) != 0)
    {
        this->ber_reported = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST)) != 0)
    {
        this->unreceived_burst = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS)) != 0)
    {
        this->lcdg_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS)) != 0)
    {
        this->rdi_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        this->rx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        this->tx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        this->tx_packets = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_data_pack(const bcmolt_gpon_onu_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_bytes_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip8_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->positive_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->negative_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->ber_reported))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->unreceived_burst))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->lcdg_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rdi_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_stat_data_get_packed_length(const bcmolt_gpon_onu_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_data_unpack(bcmolt_gpon_onu_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_bytes_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip8_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->positive_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->negative_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->ber_reported))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->unreceived_burst))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->lcdg_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rdi_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_data_bounds_check(const bcmolt_gpon_onu_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_stat_cfg_data_set_default(bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_data_pack(const bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_stat_cfg_data_get_packed_length(const bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_data_unpack(bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_cfg_data_bounds_check(const bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_GPON_ONU_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_ber_interval_configuration_completed_data_set_default(bcmolt_gpon_onu_ber_interval_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL)) != 0)
    {
        this->ber_interval = (bcmolt_ber_interval) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_data_pack(const bcmolt_gpon_onu_ber_interval_configuration_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, (uint32_t) this->ber_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_ber_interval_configuration_completed_data_get_packed_length(const bcmolt_gpon_onu_ber_interval_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_data_unpack(bcmolt_gpon_onu_ber_interval_configuration_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, (uint32_t *) &this->ber_interval))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_data_bounds_check(const bcmolt_gpon_onu_ber_interval_configuration_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_ber_interval_configuration_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_dfi_data_set_default(bcmolt_gpon_onu_dfi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_data_pack(const bcmolt_gpon_onu_dfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_dfi_data_get_packed_length(const bcmolt_gpon_onu_dfi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_data_unpack(bcmolt_gpon_onu_dfi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dfi_data_bounds_check(const bcmolt_gpon_onu_dfi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_dfi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_dgi_data_set_default(bcmolt_gpon_onu_dgi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_data_pack(const bcmolt_gpon_onu_dgi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_dgi_data_get_packed_length(const bcmolt_gpon_onu_dgi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_data_unpack(bcmolt_gpon_onu_dgi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dgi_data_bounds_check(const bcmolt_gpon_onu_dgi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_dgi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_dowi_data_set_default(bcmolt_gpon_onu_dowi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        this->drift_value = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        this->new_eqd = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_data_pack(const bcmolt_gpon_onu_dowi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->new_eqd))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_dowi_data_get_packed_length(const bcmolt_gpon_onu_dowi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_data_unpack(bcmolt_gpon_onu_dowi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->new_eqd))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_dowi_data_bounds_check(const bcmolt_gpon_onu_dowi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_dowi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_err_data_set_default(bcmolt_gpon_onu_err_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS)) != 0)
    {
        this->bip8_errors = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_data_pack(const bcmolt_gpon_onu_err_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_err_data_get_packed_length(const bcmolt_gpon_onu_err_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_data_unpack(bcmolt_gpon_onu_err_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_err_data_bounds_check(const bcmolt_gpon_onu_err_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_err_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_invalid_dbru_report_data_set_default(bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_gpon_alloc_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_data_pack(const bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_invalid_dbru_report_data_get_packed_length(const bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_data_unpack(bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_data_bounds_check(const bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_invalid_dbru_report_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_gpon_alloc_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_key_exchange_completed_data_set_default(bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        memset(this->new_key.bytes, 0, sizeof(this->new_key.bytes));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_data_pack(const bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->new_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_key_exchange_completed_data_get_packed_length(const bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        count += 16;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_data_unpack(bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->new_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_completed_data_bounds_check(const bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_key_exchange_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->new_key))
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_key_exchange_decrypt_required_data_set_default(bcmolt_gpon_onu_key_exchange_decrypt_required_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        memset(this->new_key.bytes, 0, sizeof(this->new_key.bytes));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_data_pack(const bcmolt_gpon_onu_key_exchange_decrypt_required_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->new_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_key_exchange_decrypt_required_data_get_packed_length(const bcmolt_gpon_onu_key_exchange_decrypt_required_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        count += 16;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_data_unpack(bcmolt_gpon_onu_key_exchange_decrypt_required_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->new_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_data_bounds_check(const bcmolt_gpon_onu_key_exchange_decrypt_required_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_key_exchange_decrypt_required_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->new_key))
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_key_exchange_key_mismatch_data_set_default(bcmolt_gpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        memset(this->expected_key.bytes, 0, sizeof(this->expected_key.bytes));
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        memset(this->received_key.bytes, 0, sizeof(this->received_key.bytes));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_data_pack(const bcmolt_gpon_onu_key_exchange_key_mismatch_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->expected_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->received_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_key_exchange_key_mismatch_data_get_packed_length(const bcmolt_gpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        count += 16;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        count += 16;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_data_unpack(bcmolt_gpon_onu_key_exchange_key_mismatch_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->expected_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->received_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_data_bounds_check(const bcmolt_gpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_key_exchange_key_mismatch_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->expected_key))
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->received_key))
        {
            *failed_prop = BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_set_default(bcmolt_gpon_onu_key_exchange_unconsecutive_index_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX)) != 0)
    {
        this->expected_index = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX)) != 0)
    {
        this->actual_index = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_pack(const bcmolt_gpon_onu_key_exchange_unconsecutive_index_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->expected_index))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->actual_index))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_get_packed_length(const bcmolt_gpon_onu_key_exchange_unconsecutive_index_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_unpack(bcmolt_gpon_onu_key_exchange_unconsecutive_index_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->expected_index))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->actual_index))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_bounds_check(const bcmolt_gpon_onu_key_exchange_unconsecutive_index_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_key_exchange_unconsecutive_index_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_loai_data_set_default(bcmolt_gpon_onu_loai_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_data_pack(const bcmolt_gpon_onu_loai_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_loai_data_get_packed_length(const bcmolt_gpon_onu_loai_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_data_unpack(bcmolt_gpon_onu_loai_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loai_data_bounds_check(const bcmolt_gpon_onu_loai_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_loai_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_loki_data_set_default(bcmolt_gpon_onu_loki_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_data_pack(const bcmolt_gpon_onu_loki_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_loki_data_get_packed_length(const bcmolt_gpon_onu_loki_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_data_unpack(bcmolt_gpon_onu_loki_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_loki_data_bounds_check(const bcmolt_gpon_onu_loki_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_loki_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_memi_data_set_default(bcmolt_gpon_onu_memi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        memset(this->ploam_buffer.arr, 0, sizeof(this->ploam_buffer.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_data_pack(const bcmolt_gpon_onu_memi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        if (!bcmolt_arr_u8_13_pack(&this->ploam_buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_memi_data_get_packed_length(const bcmolt_gpon_onu_memi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        count += 13;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_data_unpack(bcmolt_gpon_onu_memi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        if (!bcmolt_arr_u8_13_unpack(&this->ploam_buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 13))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_memi_data_bounds_check(const bcmolt_gpon_onu_memi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_memi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER)) != 0)
    {
        if (!bcmolt_arr_u8_13_bounds_check(&this->ploam_buffer))
        {
            *failed_prop = BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_omci_port_id_configuration_completed_data_set_default(bcmolt_gpon_onu_omci_port_id_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        this->gem_port = (bcmolt_gpon_gem_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        this->operation = BCMOLT_OMCI_PORT_ID_OPERATION_CONFIGURE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_data_pack(const bcmolt_gpon_onu_omci_port_id_configuration_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        if (!bcmolt_omci_port_id_operation_pack(this->operation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_omci_port_id_configuration_completed_data_get_packed_length(const bcmolt_gpon_onu_omci_port_id_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_data_unpack(bcmolt_gpon_onu_omci_port_id_configuration_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        if (!bcmolt_omci_port_id_operation_unpack(&this->operation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_data_bounds_check(const bcmolt_gpon_onu_omci_port_id_configuration_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_omci_port_id_configuration_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT)) != 0)
    {
        if (this->gem_port > (bcmolt_gpon_gem_id) 4095)
        {
            *failed_prop = BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION)) != 0)
    {
        switch (this->operation)
        {
            case BCMOLT_OMCI_PORT_ID_OPERATION_CONFIGURE:
                break;
            case BCMOLT_OMCI_PORT_ID_OPERATION_REMOVE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_activation_completed_data_set_default(bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_ACTIVATION_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_data_pack(const bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_activation_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_activation_completed_data_get_packed_length(const bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_data_unpack(bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_activation_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_completed_data_bounds_check(const bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_activation_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_ACTIVATION_FAIL_REASON_NONE:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_RANGING:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_LOS:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_ONU_ALARM:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_activation_standby_completed_data_set_default(bcmolt_gpon_onu_onu_activation_standby_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_data_pack(const bcmolt_gpon_onu_onu_activation_standby_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_activation_standby_completed_data_get_packed_length(const bcmolt_gpon_onu_onu_activation_standby_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_data_unpack(bcmolt_gpon_onu_onu_activation_standby_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_data_bounds_check(const bcmolt_gpon_onu_onu_activation_standby_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_activation_standby_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_alarm_data_set_default(bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        this->onu_alarm.losi = BCMOLT_STATUS_OFF;
        this->onu_alarm.lofi = BCMOLT_STATUS_OFF;
        this->onu_alarm.loami = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_data_pack(const bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_pack(&this->onu_alarm, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_alarm_data_get_packed_length(const bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        count += 3;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_data_unpack(bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_unpack(&this->onu_alarm, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_alarm_data_bounds_check(const bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_alarm_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_gpon_onu_alarms_bounds_check(&this->onu_alarm))
        {
            *failed_prop = BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_deactivation_completed_data_set_default(bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_data_pack(const bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_deactivation_completed_data_get_packed_length(const bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_data_unpack(bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_data_bounds_check(const bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_deactivation_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_disable_completed_data_set_default(bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_data_pack(const bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_disable_completed_data_get_packed_length(const bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_data_unpack(bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_disable_completed_data_bounds_check(const bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_disable_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_onu_enable_completed_data_set_default(bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_data_pack(const bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_onu_enable_completed_data_get_packed_length(const bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_data_unpack(bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_onu_enable_completed_data_bounds_check(const bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_onu_enable_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_password_authentication_completed_data_set_default(bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        memset(this->password.arr, 0, sizeof(this->password.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_data_pack(const bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_password_authentication_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_pack(&this->password, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_password_authentication_completed_data_get_packed_length(const bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        count += 10;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_data_unpack(bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_password_authentication_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_unpack(&this->password, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_password_authentication_completed_data_bounds_check(const bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_password_authentication_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_NONE:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_INCONSISTENCY:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_MISMATCH:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_AUTHENTICATION_TIMEOUT:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_ONU_ALARM:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_LOS_EVENT:
                break;
            case BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_DISABLE_EVENT:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD)) != 0)
    {
        if (!bcmolt_arr_u8_10_bounds_check(&this->password))
        {
            *failed_prop = BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_pee_data_set_default(bcmolt_gpon_onu_pee_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_data_pack(const bcmolt_gpon_onu_pee_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_pee_data_get_packed_length(const bcmolt_gpon_onu_pee_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_data_unpack(bcmolt_gpon_onu_pee_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pee_data_bounds_check(const bcmolt_gpon_onu_pee_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_pee_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_possible_drift_data_set_default(bcmolt_gpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        this->estimated_drift = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_data_pack(const bcmolt_gpon_onu_possible_drift_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->estimated_drift))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_possible_drift_data_get_packed_length(const bcmolt_gpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_data_unpack(bcmolt_gpon_onu_possible_drift_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->estimated_drift))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_possible_drift_data_bounds_check(const bcmolt_gpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_possible_drift_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_power_management_state_change_data_set_default(bcmolt_gpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        this->old_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        this->reason = BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_ENABLED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_data_pack(const bcmolt_gpon_onu_power_management_state_change_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_power_management_transition_reason_pack(this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_power_management_state_change_data_get_packed_length(const bcmolt_gpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_data_unpack(bcmolt_gpon_onu_power_management_state_change_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_power_management_transition_reason_unpack(&this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_power_management_state_change_data_bounds_check(const bcmolt_gpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_power_management_state_change_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        switch (this->old_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        switch (this->reason)
        {
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_ENABLED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_DISABLED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_AWAKE:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_DOZE:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_SLEEP:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_WATCH:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TERI_EXPIRED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TALERTED_EXPIRED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_ALARM:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_pst_data_set_default(bcmolt_gpon_onu_pst_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER)) != 0)
    {
        this->link_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K1)) != 0)
    {
        this->k1 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K2)) != 0)
    {
        this->k2 = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_data_pack(const bcmolt_gpon_onu_pst_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->link_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K1)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->k1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K2)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->k2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_pst_data_get_packed_length(const bcmolt_gpon_onu_pst_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K1)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K2)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_data_unpack(bcmolt_gpon_onu_pst_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->link_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K1)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->k1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K2)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->k2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PST_ID_K2)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_pst_data_bounds_check(const bcmolt_gpon_onu_pst_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_pst_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_ranging_completed_data_set_default(bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_RANGING_FAIL_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        this->number_of_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        this->eqd = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        this->power_level = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_data_pack(const bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_ranging_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->eqd))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->power_level))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_ranging_completed_data_get_packed_length(const bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_data_unpack(bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_ranging_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->eqd))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->power_level))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ranging_completed_data_bounds_check(const bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_ranging_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_RANGING_FAIL_REASON_NONE:
                break;
            case BCMOLT_RANGING_FAIL_REASON_RANGING_ACK_TIMEOUT:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_DATA_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_TYPE_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_ONU_ID_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_DRIFT_EXCEEDED:
                break;
            case BCMOLT_RANGING_FAIL_REASON_NO_PLOAM_RECEIVED:
                break;
            case BCMOLT_RANGING_FAIL_REASON_LOS:
                break;
            case BCMOLT_RANGING_FAIL_REASON_ALARMS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_rei_data_set_default(bcmolt_gpon_onu_rei_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS)) != 0)
    {
        this->bip8_errors = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_data_pack(const bcmolt_gpon_onu_rei_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_rei_data_get_packed_length(const bcmolt_gpon_onu_rei_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_data_unpack(bcmolt_gpon_onu_rei_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->bip8_errors))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rei_data_bounds_check(const bcmolt_gpon_onu_rei_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_rei_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_rssi_measurement_completed_data_set_default(bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_data_pack(const bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_rssi_measurement_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_rssi_measurement_completed_data_get_packed_length(const bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_data_unpack(bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_rssi_measurement_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_data_bounds_check(const bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_rssi_measurement_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NONE:
                break;
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_DELIMITER:
                break;
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_ACCESS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_sdi_data_set_default(bcmolt_gpon_onu_sdi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_BER)) != 0)
    {
        this->ber = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_data_pack(const bcmolt_gpon_onu_sdi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_sdi_data_get_packed_length(const bcmolt_gpon_onu_sdi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_BER)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_data_unpack(bcmolt_gpon_onu_sdi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sdi_data_bounds_check(const bcmolt_gpon_onu_sdi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_sdi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_sfi_data_set_default(bcmolt_gpon_onu_sfi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_BER)) != 0)
    {
        this->ber = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_data_pack(const bcmolt_gpon_onu_sfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_sfi_data_get_packed_length(const bcmolt_gpon_onu_sfi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_BER)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_data_unpack(bcmolt_gpon_onu_sfi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sfi_data_bounds_check(const bcmolt_gpon_onu_sfi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_sfi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_stat_alarm_cleared_data_set_default(bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_data_pack(const bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_onu_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_stat_alarm_cleared_data_get_packed_length(const bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_data_unpack(bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_onu_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_data_bounds_check(const bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_stat_alarm_raised_data_set_default(bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_data_pack(const bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_onu_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_stat_alarm_raised_data_get_packed_length(const bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_data_unpack(bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_gpon_onu_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_data_bounds_check(const bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_sufi_data_set_default(bcmolt_gpon_onu_sufi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_data_pack(const bcmolt_gpon_onu_sufi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_sufi_data_get_packed_length(const bcmolt_gpon_onu_sufi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_data_unpack(bcmolt_gpon_onu_sufi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_sufi_data_bounds_check(const bcmolt_gpon_onu_sufi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_sufi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_tiwi_data_set_default(bcmolt_gpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        this->drift_value = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_data_pack(const bcmolt_gpon_onu_tiwi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_tiwi_data_get_packed_length(const bcmolt_gpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_data_unpack(bcmolt_gpon_onu_tiwi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_tiwi_data_bounds_check(const bcmolt_gpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_tiwi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_auto_cfg_data_set_default(bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED)) != 0)
    {
        this->ber_interval_configuration_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        this->dfi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        this->dgi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        this->dowi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR)) != 0)
    {
        this->err = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        this->invalid_dbru_report = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        this->key_exchange_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        this->key_exchange_cycle_skipped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED)) != 0)
    {
        this->key_exchange_decrypt_required = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        this->key_exchange_key_mismatch = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        this->key_exchange_key_request_timeout = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX)) != 0)
    {
        this->key_exchange_unconsecutive_index = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI)) != 0)
    {
        this->loai = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI)) != 0)
    {
        this->loki = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI)) != 0)
    {
        this->memi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        this->omci_port_id_configuration_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        this->onu_activation_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED)) != 0)
    {
        this->onu_activation_standby_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        this->onu_alarm = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        this->onu_deactivation_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        this->onu_disable_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        this->onu_enable_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        this->optical_reflection = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED)) != 0)
    {
        this->password_authentication_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE)) != 0)
    {
        this->pee = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        this->possible_drift = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        this->power_management_state_change = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PST)) != 0)
    {
        this->pst = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        this->ranging_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_REI)) != 0)
    {
        this->rei = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        this->rssi_measurement_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        this->sdi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        this->sfi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        this->sufi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        this->tiwi = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_data_pack(const bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ber_interval_configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dgi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dowi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->err))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->invalid_dbru_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_cycle_skipped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_decrypt_required))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_key_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_key_request_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_unconsecutive_index))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->loai))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->loki))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->memi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->omci_port_id_configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_activation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_activation_standby_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_alarm))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_deactivation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_disable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_enable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->optical_reflection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->password_authentication_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->pee))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->possible_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->power_management_state_change))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PST)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->pst))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ranging_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_REI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rei))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sdi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sufi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tiwi))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_auto_cfg_data_get_packed_length(const bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PST)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_REI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_data_unpack(bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ber_interval_configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dgi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dowi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->err))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->invalid_dbru_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_cycle_skipped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_decrypt_required))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_key_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_key_request_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_unconsecutive_index))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->loai))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->loki))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->memi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->omci_port_id_configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_activation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_activation_standby_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_alarm))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_deactivation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_disable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_enable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->optical_reflection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->password_authentication_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->pee))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->possible_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->power_management_state_change))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PST)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->pst))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ranging_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_REI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rei))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sdi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sufi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tiwi))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_PST)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_REI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_auto_cfg_data_bounds_check(const bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_change_power_level_data_set_default(bcmolt_gpon_onu_change_power_level_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        this->power_level_action = BCMOLT_ONU_POWER_LEVEL_INCREASE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_data_pack(const bcmolt_gpon_onu_change_power_level_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        if (!bcmolt_onu_power_level_pack(this->power_level_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_change_power_level_data_get_packed_length(const bcmolt_gpon_onu_change_power_level_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_data_unpack(bcmolt_gpon_onu_change_power_level_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        if (!bcmolt_onu_power_level_unpack(&this->power_level_action, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_change_power_level_data_bounds_check(const bcmolt_gpon_onu_change_power_level_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_change_power_level_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION)) != 0)
    {
        switch (this->power_level_action)
        {
            case BCMOLT_ONU_POWER_LEVEL_INCREASE:
                break;
            case BCMOLT_ONU_POWER_LEVEL_DECREASE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_set_onu_state_data_set_default(bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_data_pack(const bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_set_onu_state_data_get_packed_length(const bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_data_unpack(bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_set_onu_state_data_bounds_check(const bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_set_onu_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_OPERATION_INACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_DISABLE:
                break;
            case BCMOLT_ONU_OPERATION_ENABLE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_OPERATION_AWAKE_FREE:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_cpu_packets_data_set_default(bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        this->packet_type = BCMOLT_PACKET_TYPE_CPU;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        this->calc_crc = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        this->number_of_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_data_pack(const bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_pack(this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_cpu_packets_data_get_packed_length(const bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_max_2048_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_data_unpack(bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_unpack(&this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packets_data_bounds_check(const bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_cpu_packets_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        switch (this->packet_type)
        {
            case BCMOLT_PACKET_TYPE_CPU:
                break;
            case BCMOLT_PACKET_TYPE_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (this->number_of_packets > 32)
        {
            *failed_prop = BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (this->packet_size > 2000)
        {
            *failed_prop = BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (this->buffer.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u8_list_u32_max_2048_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_ploam_packet_data_set_default(bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        memset(this->ploam.arr, 0, sizeof(this->ploam.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_data_pack(const bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_pack(&this->ploam, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_ploam_packet_data_get_packed_length(const bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        count += 12;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_data_unpack(bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_unpack(&this->ploam, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_ploam_packet_data_bounds_check(const bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_ploam_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_12_bounds_check(&this->ploam))
        {
            *failed_prop = BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_cpu_packet_data_set_default(bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        this->port_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        this->crc_ok = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_data_pack(const bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_cpu_packet_data_get_packed_length(const bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_data_unpack(bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_cpu_packet_data_bounds_check(const bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_cpu_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_onu_omci_packet_data_set_default(bcmolt_gpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        this->port_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        this->crc_ok = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_data_pack(const bcmolt_gpon_onu_omci_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_onu_omci_packet_data_get_packed_length(const bcmolt_gpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_data_unpack(bcmolt_gpon_onu_omci_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_onu_omci_packet_data_bounds_check(const bcmolt_gpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_onu_omci_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_trx_key_set_default(bcmolt_gpon_trx_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_gpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_pack(const bcmolt_gpon_trx_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_trx_key_get_packed_length(const bcmolt_gpon_trx_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_unpack(bcmolt_gpon_trx_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_key_bounds_check(const bcmolt_gpon_trx_key *this, bcmolt_presence_mask fields_present, bcmolt_gpon_trx_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_gpon_ni) 15)
        {
            *failed_prop = BCMOLT_GPON_TRX_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_gpon_trx_cfg_data_set_default(bcmolt_gpon_trx_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        this->transceiver_type = BCMOLT_TRX_TYPE_LTE_3680_M;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        this->la_configuration.resync_control.start_pattern = 15;
        this->la_configuration.resync_control.middle_pattern = 15;
        this->la_configuration.resync_control.last_pattern = 15;
        this->la_configuration.resync_control.middle_repetition = 0;
        this->la_configuration.resync_control.location = 40;
        this->la_configuration.ranging_resync_control.start_pattern = 15;
        this->la_configuration.ranging_resync_control.middle_pattern = 15;
        this->la_configuration.ranging_resync_control.last_pattern = 15;
        this->la_configuration.ranging_resync_control.middle_repetition = 0;
        this->la_configuration.ranging_resync_control.location = 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        this->bcdr.resync_control.start_pattern = 15;
        this->bcdr.resync_control.middle_pattern = 0;
        this->bcdr.resync_control.last_pattern = 0;
        this->bcdr.resync_control.middle_repetition = 0;
        this->bcdr.resync_control.location = 34;
        this->bcdr.ranging_resync_control.start_pattern = 15;
        this->bcdr.ranging_resync_control.middle_pattern = 0;
        this->bcdr.ranging_resync_control.last_pattern = 0;
        this->bcdr.ranging_resync_control.middle_repetition = 0;
        this->bcdr.ranging_resync_control.location = 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        this->la_ranging_after_no_ed_resync.start_pattern = 0;
        this->la_ranging_after_no_ed_resync.middle_pattern = 0;
        this->la_ranging_after_no_ed_resync.last_pattern = 0;
        this->la_ranging_after_no_ed_resync.middle_repetition = 0;
        this->la_ranging_after_no_ed_resync.location = 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        this->bcdr_ranging_after_no_ed_resync.start_pattern = 0;
        this->bcdr_ranging_after_no_ed_resync.middle_pattern = 0;
        this->bcdr_ranging_after_no_ed_resync.last_pattern = 0;
        this->bcdr_ranging_after_no_ed_resync.middle_repetition = 0;
        this->bcdr_ranging_after_no_ed_resync.location = 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        this->la_ranging_after_ed_resync.start_pattern = 0;
        this->la_ranging_after_ed_resync.middle_pattern = 0;
        this->la_ranging_after_ed_resync.last_pattern = 0;
        this->la_ranging_after_ed_resync.middle_repetition = 0;
        this->la_ranging_after_ed_resync.location = 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        this->bcdr_ranging_after_ed_resync.start_pattern = 15;
        this->bcdr_ranging_after_ed_resync.middle_pattern = 0;
        this->bcdr_ranging_after_ed_resync.last_pattern = 0;
        this->bcdr_ranging_after_ed_resync.middle_repetition = 0;
        this->bcdr_ranging_after_ed_resync.location = 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        this->la_resync_polarity = BCMOLT_POLARITY_LOW;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        this->bcdr_resync_polarity = BCMOLT_POLARITY_LOW;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        this->bcdr_ranging_resync_conditions.after_init = BCMOS_FALSE;
        this->bcdr_ranging_resync_conditions.after_no_ed = BCMOS_FALSE;
        this->bcdr_ranging_resync_conditions.after_ed = BCMOS_TRUE;
        this->bcdr_ranging_resync_conditions.after_no_del = BCMOS_FALSE;
        this->bcdr_ranging_resync_conditions.after_ranging_access = BCMOS_FALSE;
        this->bcdr_ranging_resync_conditions.med_val = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        this->la_ranging_resync_conditions.after_init = BCMOS_TRUE;
        this->la_ranging_resync_conditions.after_no_ed = BCMOS_FALSE;
        this->la_ranging_resync_conditions.after_ed = BCMOS_FALSE;
        this->la_ranging_resync_conditions.after_no_del = BCMOS_FALSE;
        this->la_ranging_resync_conditions.after_ranging_access = BCMOS_TRUE;
        this->la_ranging_resync_conditions.med_val = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        this->rx_configuration.wait_window_size = 0;
        this->rx_configuration.ranging_access_window_size = 15;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        this->ranging_control_stages_configuration.wait_state_1_window_size = 0;
        this->ranging_control_stages_configuration.wait_state_2_window_size = 0;
        this->ranging_control_stages_configuration.wait_after_resync_4 = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        this->energy_detect.ranging_ed_source = BCMOLT_ENERGY_DETECT_SOURCE_TRX;
        this->energy_detect.delimiter_ed_source = BCMOLT_ENERGY_DETECT_SOURCE_TRX;
        this->energy_detect.minimum_threshold = 0;
        this->energy_detect.maximum_threshold = 41;
        this->energy_detect.ed_pattern = 170;
        this->energy_detect.ed_pattern_size = 0;
        this->energy_detect.window_size = 124;
        this->energy_detect.inversion = BCMOS_FALSE;
        this->energy_detect.no_ed_threshold = 127;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        this->end_of_burst_data_pattern.start_pattern = 15;
        this->end_of_burst_data_pattern.middle_pattern = 15;
        this->end_of_burst_data_pattern.last_pattern = 15;
        this->end_of_burst_data_pattern.middle_repetition = 0;
        this->end_of_burst_data_pattern.location = 11;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        this->end_of_burst_ranging_pattern.start_pattern = 0;
        this->end_of_burst_ranging_pattern.middle_pattern = 0;
        this->end_of_burst_ranging_pattern.last_pattern = 0;
        this->end_of_burst_ranging_pattern.middle_repetition = 0;
        this->end_of_burst_ranging_pattern.location = 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        this->preamble.type_1_size = 0;
        this->preamble.type_2_size = 0;
        this->preamble.type_3_pre_ranging_size = 50;
        this->preamble.type_3_post_ranging_size = 15;
        this->preamble.type_3_pattern = 170;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        this->delimiter.pattern[0] = 171;
        this->delimiter.pattern[1] = 89;
        this->delimiter.pattern[2] = 131;
        this->delimiter.size = 3;
        this->delimiter.window_size = 124;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS)) != 0)
    {
        this->guard_bits = 64;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        this->serdes_configuration.ranging_mode = BCMOLT_SERDES_RANGING_MODE_BCDR_RESET_MODE;
        this->serdes_configuration.multi_ed_mode = BCMOS_FALSE;
        this->serdes_configuration.burst_enable_start_offset = 0;
        this->serdes_configuration.burst_enable_end_offset = 0;
        this->serdes_configuration.ed_invertion = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING)) != 0)
    {
        this->plo_ranging = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA)) != 0)
    {
        this->plo_data = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        this->rssi_normal_config.location = 20;
        this->rssi_normal_config.location_sign = BCMOLT_RSSI_LOCATION_SIGN_BEFORE;
        this->rssi_normal_config.start_pattern = 15;
        this->rssi_normal_config.middle_pattern = 15;
        this->rssi_normal_config.last_pattern = 15;
        this->rssi_normal_config.middle_repertition = 50;
        this->rssi_normal_config.minimum_burst = 55;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        this->ranging_rssi_resync_control.after_no_ed = BCMOS_FALSE;
        this->ranging_rssi_resync_control.after_ed = BCMOS_FALSE;
        this->ranging_rssi_resync_control.after_reset_3 = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_data_pack(const bcmolt_gpon_trx_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_trx_type_pack(this->transceiver_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        if (!bcmolt_la_resync_pattern_configuration_pack(&this->la_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        if (!bcmolt_bcdr_resync_pattern_configuration_pack(&this->bcdr, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->la_ranging_after_no_ed_resync, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->bcdr_ranging_after_no_ed_resync, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->la_ranging_after_ed_resync, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->bcdr_ranging_after_ed_resync, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_polarity_pack(this->la_resync_polarity, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_polarity_pack(this->bcdr_resync_polarity, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_pack(&this->bcdr_ranging_resync_conditions, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_pack(&this->la_ranging_resync_conditions, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        if (!bcmolt_trx_rx_configuration_pack(&this->rx_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_ranging_control_configuration_pack(&this->ranging_control_stages_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        if (!bcmolt_trx_energy_detect_pack(&this->energy_detect, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->end_of_burst_data_pattern, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_pack(&this->end_of_burst_ranging_pattern, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        if (!bcmolt_trx_preamble_pack(&this->preamble, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        if (!bcmolt_trx_delimiter_pack(&this->delimiter, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->guard_bits))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_serdes_configuration_pack(&this->serdes_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->plo_ranging))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->plo_data))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_rssi_general_configuration_pack(&this->rssi_normal_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        if (!bcmolt_ranging_rssi_control_pack(&this->ranging_rssi_resync_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_gpon_trx_cfg_data_get_packed_length(const bcmolt_gpon_trx_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        count += 10;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        count += 10;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        count += 9;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        count += 3;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_data_unpack(bcmolt_gpon_trx_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_trx_type_unpack(&this->transceiver_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        if (!bcmolt_la_resync_pattern_configuration_unpack(&this->la_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        if (!bcmolt_bcdr_resync_pattern_configuration_unpack(&this->bcdr, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->la_ranging_after_no_ed_resync, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->bcdr_ranging_after_no_ed_resync, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->la_ranging_after_ed_resync, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->bcdr_ranging_after_ed_resync, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_polarity_unpack(&this->la_resync_polarity, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_polarity_unpack(&this->bcdr_resync_polarity, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_unpack(&this->bcdr_ranging_resync_conditions, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_unpack(&this->la_ranging_resync_conditions, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        if (!bcmolt_trx_rx_configuration_unpack(&this->rx_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_ranging_control_configuration_unpack(&this->ranging_control_stages_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        if (!bcmolt_trx_energy_detect_unpack(&this->energy_detect, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->end_of_burst_data_pattern, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_unpack(&this->end_of_burst_ranging_pattern, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        if (!bcmolt_trx_preamble_unpack(&this->preamble, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        if (!bcmolt_trx_delimiter_unpack(&this->delimiter, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->guard_bits))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_serdes_configuration_unpack(&this->serdes_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->plo_ranging))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->plo_data))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_rssi_general_configuration_unpack(&this->rssi_normal_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        if (!bcmolt_ranging_rssi_control_unpack(&this->ranging_rssi_resync_control, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 9))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_gpon_trx_cfg_data_bounds_check(const bcmolt_gpon_trx_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_gpon_trx_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        switch (this->transceiver_type)
        {
            case BCMOLT_TRX_TYPE_SPS_43_48_H_HP_CDE_SD_2013:
                break;
            case BCMOLT_TRX_TYPE_SOG_4321_PSGB:
                break;
            case BCMOLT_TRX_TYPE_LTE_3680_M:
                break;
            case BCMOLT_TRX_TYPE_SOURCE_PHOTONICS:
                break;
            case BCMOLT_TRX_TYPE_LTE_3680_P_TYPE_C_PLUS:
                break;
            case BCMOLT_TRX_TYPE_ANY:
                break;
            case BCMOLT_TRX_TYPE_ANY_RESET_GUARD:
                break;
            case BCMOLT_TRX_TYPE_ANY_RESET_PREAMBLE:
                break;
            case BCMOLT_TRX_TYPE_WTD_RTXM_167_526_CPLUS:
                break;
            case BCMOLT_TRX_TYPE_WTD_RTXM_167_522_BPLUS:
                break;
            case BCMOLT_TRX_TYPE_LTE_3680_P_BC:
                break;
            case BCMOLT_TRX_TYPE_SOGQ_4321_PSGB_C_PLUS:
                break;
            case BCMOLT_TRX_TYPE_WTD_RTXM167_521:
                break;
            case BCMOLT_TRX_TYPE_LTE3678:
                break;
            case BCMOLT_TRX_TYPE_SOGP_4321_PSGA:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_1:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_2:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_3:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_4:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_5:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_6:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_7:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_8:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_9:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_10:
                break;
            case BCMOLT_TRX_TYPE_GPON_GENERAL_11:
                break;
            default:
                *failed_prop = BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION)) != 0)
    {
        if (!bcmolt_la_resync_pattern_configuration_bounds_check(&this->la_configuration))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR)) != 0)
    {
        if (!bcmolt_bcdr_resync_pattern_configuration_bounds_check(&this->bcdr))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_BCDR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->la_ranging_after_no_ed_resync))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->bcdr_ranging_after_no_ed_resync))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->la_ranging_after_ed_resync))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->bcdr_ranging_after_ed_resync))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY)) != 0)
    {
        switch (this->la_resync_polarity)
        {
            case BCMOLT_POLARITY_LOW:
                break;
            case BCMOLT_POLARITY_HIGH:
                break;
            default:
                *failed_prop = BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY)) != 0)
    {
        switch (this->bcdr_resync_polarity)
        {
            case BCMOLT_POLARITY_LOW:
                break;
            case BCMOLT_POLARITY_HIGH:
                break;
            default:
                *failed_prop = BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_bounds_check(&this->bcdr_ranging_resync_conditions))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS)) != 0)
    {
        if (!bcmolt_ranging_resync_conditions_bounds_check(&this->la_ranging_resync_conditions))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION)) != 0)
    {
        if (!bcmolt_trx_rx_configuration_bounds_check(&this->rx_configuration))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_ranging_control_configuration_bounds_check(&this->ranging_control_stages_configuration))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT)) != 0)
    {
        if (!bcmolt_trx_energy_detect_bounds_check(&this->energy_detect))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->end_of_burst_data_pattern))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN)) != 0)
    {
        if (!bcmolt_resync_control_bounds_check(&this->end_of_burst_ranging_pattern))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_PREAMBLE)) != 0)
    {
        if (!bcmolt_trx_preamble_bounds_check(&this->preamble))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_PREAMBLE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_DELIMITER)) != 0)
    {
        if (!bcmolt_trx_delimiter_bounds_check(&this->delimiter))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_DELIMITER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_serdes_configuration_bounds_check(&this->serdes_configuration))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_gpon_rssi_general_configuration_bounds_check(&this->rssi_normal_config))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL)) != 0)
    {
        if (!bcmolt_ranging_rssi_control_bounds_check(&this->ranging_rssi_resync_control))
        {
            *failed_prop = BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_key_set_default(bcmolt_log_entry_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID)) != 0)
    {
        this->log_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        memset(this->name.str, 0, 100);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_pack(const bcmolt_log_entry_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->log_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        if (!bcmolt_str_100_pack(&this->name, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_key_get_packed_length(const bcmolt_log_entry_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_RESERVED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        count += 100;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_unpack(bcmolt_log_entry_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->log_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        if (!bcmolt_str_100_unpack(&this->name, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 100))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_key_bounds_check(const bcmolt_log_entry_key *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_KEY_ID_NAME)) != 0)
    {
        if (!bcmolt_str_100_bounds_check(&this->name))
        {
            *failed_prop = BCMOLT_LOG_ENTRY_KEY_ID_NAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_cfg_data_set_default(bcmolt_log_entry_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        this->default_log_level = BCMOLT_LOG_LEVEL_NO_LOG;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        this->default_log_type = BCMOLT_LOG_TYPE_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        this->log_level_print = BCMOLT_LOG_LEVEL_NO_LOG;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        this->log_level_save = BCMOLT_LOG_LEVEL_NO_LOG;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        this->log_type = BCMOLT_LOG_TYPE_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        this->log_style = BCMOLT_LOG_STYLE_NORMAL;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        memset(this->log_name.str, 0, 100);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_data_pack(const bcmolt_log_entry_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        if (!bcmolt_log_level_pack(this->default_log_level, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        if (!bcmolt_log_type_pack(this->default_log_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        if (!bcmolt_log_level_pack(this->log_level_print, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        if (!bcmolt_log_level_pack(this->log_level_save, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        if (!bcmolt_log_type_pack(this->log_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        if (!bcmolt_log_style_pack(this->log_style, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        if (!bcmolt_str_100_pack(&this->log_name, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_cfg_data_get_packed_length(const bcmolt_log_entry_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        count += 100;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_data_unpack(bcmolt_log_entry_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        if (!bcmolt_log_level_unpack(&this->default_log_level, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        if (!bcmolt_log_type_unpack(&this->default_log_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        if (!bcmolt_log_level_unpack(&this->log_level_print, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        if (!bcmolt_log_level_unpack(&this->log_level_save, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        if (!bcmolt_log_type_unpack(&this->log_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        if (!bcmolt_log_style_unpack(&this->log_style, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        if (!bcmolt_str_100_unpack(&this->log_name, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 100))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_cfg_data_bounds_check(const bcmolt_log_entry_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL)) != 0)
    {
        switch (this->default_log_level)
        {
            case BCMOLT_LOG_LEVEL_NO_LOG:
                break;
            case BCMOLT_LOG_LEVEL_FATAL:
                break;
            case BCMOLT_LOG_LEVEL_ERROR:
                break;
            case BCMOLT_LOG_LEVEL_WARNING:
                break;
            case BCMOLT_LOG_LEVEL_INFO:
                break;
            case BCMOLT_LOG_LEVEL_DEBUG:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) != 0)
    {
        switch (this->default_log_type)
        {
            case BCMOLT_LOG_TYPE_NONE:
                break;
            case BCMOLT_LOG_TYPE_PRINT:
                break;
            case BCMOLT_LOG_TYPE_SAVE:
                break;
            case BCMOLT_LOG_TYPE_BOTH:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT)) != 0)
    {
        switch (this->log_level_print)
        {
            case BCMOLT_LOG_LEVEL_NO_LOG:
                break;
            case BCMOLT_LOG_LEVEL_FATAL:
                break;
            case BCMOLT_LOG_LEVEL_ERROR:
                break;
            case BCMOLT_LOG_LEVEL_WARNING:
                break;
            case BCMOLT_LOG_LEVEL_INFO:
                break;
            case BCMOLT_LOG_LEVEL_DEBUG:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE)) != 0)
    {
        switch (this->log_level_save)
        {
            case BCMOLT_LOG_LEVEL_NO_LOG:
                break;
            case BCMOLT_LOG_LEVEL_FATAL:
                break;
            case BCMOLT_LOG_LEVEL_ERROR:
                break;
            case BCMOLT_LOG_LEVEL_WARNING:
                break;
            case BCMOLT_LOG_LEVEL_INFO:
                break;
            case BCMOLT_LOG_LEVEL_DEBUG:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE)) != 0)
    {
        switch (this->log_type)
        {
            case BCMOLT_LOG_TYPE_NONE:
                break;
            case BCMOLT_LOG_TYPE_PRINT:
                break;
            case BCMOLT_LOG_TYPE_SAVE:
                break;
            case BCMOLT_LOG_TYPE_BOTH:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE)) != 0)
    {
        switch (this->log_style)
        {
            case BCMOLT_LOG_STYLE_NORMAL:
                break;
            case BCMOLT_LOG_STYLE_BOLD:
                break;
            case BCMOLT_LOG_STYLE_UNDERLINE:
                break;
            case BCMOLT_LOG_STYLE_BLINK:
                break;
            case BCMOLT_LOG_STYLE_REVERSE_VIDEO:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME)) != 0)
    {
        if (!bcmolt_str_100_bounds_check(&this->log_name))
        {
            *failed_prop = BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_stat_data_set_default(bcmolt_log_entry_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        memset(this->msg_count.arr, 0, sizeof(this->msg_count.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT)) != 0)
    {
        this->lost_msg_count = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_data_pack(const bcmolt_log_entry_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        if (!bcmolt_arr_u32_6_pack(&this->msg_count, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->lost_msg_count))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_stat_data_get_packed_length(const bcmolt_log_entry_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        count += 24;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_data_unpack(bcmolt_log_entry_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        if (!bcmolt_arr_u32_6_unpack(&this->msg_count, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->lost_msg_count))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 24))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_data_bounds_check(const bcmolt_log_entry_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_stat_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT)) != 0)
    {
        if (!bcmolt_arr_u32_6_bounds_check(&this->msg_count))
        {
            *failed_prop = BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_stat_cfg_data_set_default(bcmolt_log_entry_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_data_pack(const bcmolt_log_entry_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_stat_cfg_data_get_packed_length(const bcmolt_log_entry_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_data_unpack(bcmolt_log_entry_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_cfg_data_bounds_check(const bcmolt_log_entry_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_stat_alarm_cleared_data_set_default(bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_data_pack(const bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_log_entry_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_stat_alarm_cleared_data_get_packed_length(const bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_data_unpack(bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_log_entry_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_cleared_data_bounds_check(const bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT:
                break;
            case BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_stat_alarm_raised_data_set_default(bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_data_pack(const bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_log_entry_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_stat_alarm_raised_data_get_packed_length(const bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_data_unpack(bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_log_entry_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_stat_alarm_raised_data_bounds_check(const bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT:
                break;
            case BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT:
                break;
            default:
                *failed_prop = BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_log_entry_auto_cfg_data_set_default(bcmolt_log_entry_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_data_pack(const bcmolt_log_entry_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_log_entry_auto_cfg_data_get_packed_length(const bcmolt_log_entry_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_data_unpack(bcmolt_log_entry_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_log_entry_auto_cfg_data_bounds_check(const bcmolt_log_entry_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_log_entry_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_key_set_default(bcmolt_logger_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        this->file_id = BCMOLT_LOG_FILE_ID_SRAM;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_pack(const bcmolt_logger_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        if (!bcmolt_log_file_id_pack(this->file_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_key_get_packed_length(const bcmolt_logger_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_unpack(bcmolt_logger_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        if (!bcmolt_log_file_id_unpack(&this->file_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_key_bounds_check(const bcmolt_logger_key *this, bcmolt_presence_mask fields_present, bcmolt_logger_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_KEY_ID_FILE_ID)) != 0)
    {
        switch (this->file_id)
        {
            case BCMOLT_LOG_FILE_ID_SRAM:
                break;
            case BCMOLT_LOG_FILE_ID_DDR:
                break;
            default:
                *failed_prop = BCMOLT_LOGGER_KEY_ID_FILE_ID;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_cfg_data_set_default(bcmolt_logger_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        memset(this->buffer.buff, 0, 2048);
        this->buffer.msg_to_read = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_WRAP_AROUND)) != 0)
    {
        this->wrap_around = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ)) != 0)
    {
        this->clear_after_read = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_ENABLE_LOG)) != 0)
    {
        this->enable_log = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        memset(this->log_names.str, 0, 1000);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_data_pack(const bcmolt_logger_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        if (!bcmolt_log_buffer_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_WRAP_AROUND)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->wrap_around))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->clear_after_read))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_ENABLE_LOG)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->enable_log))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        if (!bcmolt_str_1000_pack(&this->log_names, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_cfg_data_get_packed_length(const bcmolt_logger_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        count += 2052;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_WRAP_AROUND)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_ENABLE_LOG)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        count += 1000;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_data_unpack(bcmolt_logger_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        if (!bcmolt_log_buffer_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_WRAP_AROUND)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->wrap_around))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->clear_after_read))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_ENABLE_LOG)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->enable_log))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        if (!bcmolt_str_1000_unpack(&this->log_names, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2052))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_WRAP_AROUND)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_ENABLE_LOG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1000))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_cfg_data_bounds_check(const bcmolt_logger_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER)) != 0)
    {
        if (!bcmolt_log_buffer_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_LOGGER_CFG_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES)) != 0)
    {
        if (!bcmolt_str_1000_bounds_check(&this->log_names))
        {
            *failed_prop = BCMOLT_LOGGER_CFG_ID_LOG_NAMES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_stat_data_set_default(bcmolt_logger_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG)) != 0)
    {
        this->lines_in_log = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_data_pack(const bcmolt_logger_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->lines_in_log))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_stat_data_get_packed_length(const bcmolt_logger_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_data_unpack(bcmolt_logger_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->lines_in_log))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_data_bounds_check(const bcmolt_logger_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_stat_cfg_data_set_default(bcmolt_logger_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_data_pack(const bcmolt_logger_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_stat_cfg_data_get_packed_length(const bcmolt_logger_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_data_unpack(bcmolt_logger_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_cfg_data_bounds_check(const bcmolt_logger_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_LOGGER_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_stat_alarm_cleared_data_set_default(bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_data_pack(const bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_logger_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_stat_alarm_cleared_data_get_packed_length(const bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_data_unpack(bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_logger_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_cleared_data_bounds_check(const bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG:
                break;
            default:
                *failed_prop = BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_stat_alarm_raised_data_set_default(bcmolt_logger_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_data_pack(const bcmolt_logger_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_logger_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_stat_alarm_raised_data_get_packed_length(const bcmolt_logger_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_data_unpack(bcmolt_logger_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_logger_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_stat_alarm_raised_data_bounds_check(const bcmolt_logger_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG:
                break;
            default:
                *failed_prop = BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_logger_auto_cfg_data_set_default(bcmolt_logger_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_data_pack(const bcmolt_logger_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_logger_auto_cfg_data_get_packed_length(const bcmolt_logger_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_data_unpack(bcmolt_logger_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_logger_auto_cfg_data_bounds_check(const bcmolt_logger_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_logger_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_key_set_default(bcmolt_nni_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_pon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_pack(const bcmolt_nni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_key_get_packed_length(const bcmolt_nni_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_unpack(bcmolt_nni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_key_bounds_check(const bcmolt_nni_key *this, bcmolt_presence_mask fields_present, bcmolt_nni_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_pon_ni) 15)
        {
            *failed_prop = BCMOLT_NNI_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_cfg_data_set_default(bcmolt_nni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        this->remote_loopback = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        this->line_loopback = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        bcmos_mac_address_init(&this->mac_address);
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        this->nni_status.link_status = BCMOLT_TRIVALENT_FALSE;
        this->nni_status.signal_detected = BCMOLT_TRIVALENT_FALSE;
        this->nni_status.pmd_locked = BCMOLT_TRIVALENT_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        this->nni_backup_status.link_status = BCMOLT_TRIVALENT_FALSE;
        this->nni_backup_status.signal_detected = BCMOLT_TRIVALENT_FALSE;
        this->nni_backup_status.pmd_locked = BCMOLT_TRIVALENT_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        this->active_nni = BCMOLT_NNI_CONNECTION_PRIMARY;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        this->nni_status_polling_interval_ms = 50;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_AUTOSWITCH)) != 0)
    {
        this->autoswitch = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        this->flow_control = BCMOLT_CONTROL_STATE_ENABLE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_data_pack(const bcmolt_nni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        if (!bcmolt_control_state_pack(this->remote_loopback, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        if (!bcmolt_control_state_pack(this->line_loopback, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_write_mac_address(buf, this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_pack(&this->nni_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_pack(&this->nni_backup_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        if (!bcmolt_nni_connection_pack(this->active_nni, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->nni_status_polling_interval_ms))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_AUTOSWITCH)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->autoswitch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_pack(this->flow_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_cfg_data_get_packed_length(const bcmolt_nni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        count += 3;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_AUTOSWITCH)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_data_unpack(bcmolt_nni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->remote_loopback, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->line_loopback, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_read_mac_address(buf, &this->mac_address))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_unpack(&this->nni_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_unpack(&this->nni_backup_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        if (!bcmolt_nni_connection_unpack(&this->active_nni, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->nni_status_polling_interval_ms))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_AUTOSWITCH)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->autoswitch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->flow_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_MAC_ADDRESS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_AUTOSWITCH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_cfg_data_bounds_check(const bcmolt_nni_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK)) != 0)
    {
        switch (this->remote_loopback)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_LINE_LOOPBACK)) != 0)
    {
        switch (this->line_loopback)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_NNI_CFG_ID_LINE_LOOPBACK;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_bounds_check(&this->nni_status))
        {
            *failed_prop = BCMOLT_NNI_CFG_ID_NNI_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS)) != 0)
    {
        if (!bcmolt_nni_link_status_bounds_check(&this->nni_backup_status))
        {
            *failed_prop = BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_ACTIVE_NNI)) != 0)
    {
        switch (this->active_nni)
        {
            case BCMOLT_NNI_CONNECTION_PRIMARY:
                break;
            case BCMOLT_NNI_CONNECTION_BACKUP:
                break;
            default:
                *failed_prop = BCMOLT_NNI_CFG_ID_ACTIVE_NNI;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS)) != 0)
    {
        if (this->nni_status_polling_interval_ms > 3600000UL)
        {
            *failed_prop = BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_CFG_ID_FLOW_CONTROL)) != 0)
    {
        switch (this->flow_control)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_NNI_CFG_ID_FLOW_CONTROL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_stat_data_set_default(bcmolt_nni_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_64)) != 0)
    {
        this->rx_frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        this->rx_frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        this->rx_frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        this->rx_frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        this->rx_frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        this->rx_frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        this->rx_frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        this->rx_frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        this->rx_frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        this->rx_frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES)) != 0)
    {
        this->rx_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES)) != 0)
    {
        this->rx_good_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        this->rx_unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        this->rx_multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        this->rx_broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS)) != 0)
    {
        this->rx_fcs_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES)) != 0)
    {
        this->rx_control_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES)) != 0)
    {
        this->rx_pause_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES)) != 0)
    {
        this->rx_pfc_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE)) != 0)
    {
        this->rx_unsupported_opcode = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA)) != 0)
    {
        this->rx_unsupported_da = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS)) != 0)
    {
        this->rx_alignment_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE)) != 0)
    {
        this->rx_length_out_of_range = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS)) != 0)
    {
        this->rx_code_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES)) != 0)
    {
        this->rx_oversized_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES)) != 0)
    {
        this->rx_jabber_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS)) != 0)
    {
        this->rx_mtu_check_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES)) != 0)
    {
        this->rx_promiscuous_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES)) != 0)
    {
        this->rx_vlan_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        this->rx_double_vlan_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES)) != 0)
    {
        this->rx_truncated_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES)) != 0)
    {
        this->rx_undersize_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES)) != 0)
    {
        this->rx_fragmented_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES)) != 0)
    {
        this->rx_runt_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_64)) != 0)
    {
        this->tx_frames_64 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        this->tx_frames_65_127 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        this->tx_frames_128_255 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        this->tx_frames_256_511 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        this->tx_frames_512_1023 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        this->tx_frames_1024_1518 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        this->tx_frames_1519_2047 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        this->tx_frames_2048_4095 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        this->tx_frames_4096_9216 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        this->tx_frames_9217_16383 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES)) != 0)
    {
        this->tx_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BYTES)) != 0)
    {
        this->tx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES)) != 0)
    {
        this->tx_good_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        this->tx_unicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        this->tx_multicast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        this->tx_broadcast_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES)) != 0)
    {
        this->tx_pause_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES)) != 0)
    {
        this->tx_pfc_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES)) != 0)
    {
        this->tx_jabber_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS)) != 0)
    {
        this->tx_fcs_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES)) != 0)
    {
        this->tx_control_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES)) != 0)
    {
        this->tx_oversize_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES)) != 0)
    {
        this->tx_fragmented_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES)) != 0)
    {
        this->tx_error_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES)) != 0)
    {
        this->tx_vlan_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        this->tx_double_vlan_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES)) != 0)
    {
        this->tx_runt_frames = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES)) != 0)
    {
        this->tx_underrun_frames = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_data_pack(const bcmolt_nni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_fcs_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_control_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_pause_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_pfc_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_unsupported_opcode))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_unsupported_da))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_alignment_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_length_out_of_range))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_code_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_oversized_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_jabber_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_mtu_check_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_promiscuous_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_double_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_truncated_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_undersize_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_fragmented_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_runt_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_pause_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_pfc_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_jabber_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_fcs_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_control_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_oversize_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_fragmented_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_error_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_double_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_runt_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_underrun_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_stat_data_get_packed_length(const bcmolt_nni_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_64)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_data_unpack(bcmolt_nni_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_fcs_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_control_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_pause_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_pfc_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_unsupported_opcode))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_unsupported_da))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_alignment_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_length_out_of_range))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_code_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_oversized_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_jabber_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_mtu_check_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_promiscuous_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_double_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_truncated_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_undersize_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_fragmented_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_runt_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_65_127))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_128_255))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_256_511))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_512_1023))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_1024_1518))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_1519_2047))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_2048_4095))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_4096_9216))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames_9217_16383))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_good_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_unicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_multicast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_broadcast_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_pause_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_pfc_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_jabber_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_fcs_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_control_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_oversize_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_fragmented_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_error_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_double_vlan_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_runt_frames))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_underrun_frames))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_64)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_data_bounds_check(const bcmolt_nni_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_stat_cfg_data_set_default(bcmolt_nni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_data_pack(const bcmolt_nni_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_stat_cfg_data_get_packed_length(const bcmolt_nni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_data_unpack(bcmolt_nni_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_cfg_data_bounds_check(const bcmolt_nni_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_NNI_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_stat_alarm_cleared_data_set_default(bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_NNI_STAT_ID_RX_FRAMES_64;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_data_pack(const bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_nni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_stat_alarm_cleared_data_get_packed_length(const bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_data_unpack(bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_nni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_cleared_data_bounds_check(const bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_64:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA:
                break;
            case BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE:
                break;
            case BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_64:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_stat_alarm_raised_data_set_default(bcmolt_nni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_NNI_STAT_ID_RX_FRAMES_64;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_data_pack(const bcmolt_nni_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_nni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_stat_alarm_raised_data_get_packed_length(const bcmolt_nni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_data_unpack(bcmolt_nni_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_nni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_stat_alarm_raised_data_bounds_check(const bcmolt_nni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_64:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA:
                break;
            case BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE:
                break;
            case BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_64:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS:
                break;
            case BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES:
                break;
            case BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_status_changed_data_set_default(bcmolt_nni_status_changed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        this->new_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        this->link = BCMOLT_NNI_CONNECTION_PRIMARY;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        this->previous_active = BCMOLT_NNI_CONNECTION_PRIMARY;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        this->new_active = BCMOLT_NNI_CONNECTION_PRIMARY;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_data_pack(const bcmolt_nni_status_changed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->new_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        if (!bcmolt_nni_connection_pack(this->link, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        if (!bcmolt_nni_connection_pack(this->previous_active, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        if (!bcmolt_nni_connection_pack(this->new_active, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_status_changed_data_get_packed_length(const bcmolt_nni_status_changed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_data_unpack(bcmolt_nni_status_changed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->new_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        if (!bcmolt_nni_connection_unpack(&this->link, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        if (!bcmolt_nni_connection_unpack(&this->previous_active, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        if (!bcmolt_nni_connection_unpack(&this->new_active, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_status_changed_data_bounds_check(const bcmolt_nni_status_changed_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_status_changed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS)) != 0)
    {
        switch (this->new_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_LINK)) != 0)
    {
        switch (this->link)
        {
            case BCMOLT_NNI_CONNECTION_PRIMARY:
                break;
            case BCMOLT_NNI_CONNECTION_BACKUP:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STATUS_CHANGED_ID_LINK;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE)) != 0)
    {
        switch (this->previous_active)
        {
            case BCMOLT_NNI_CONNECTION_PRIMARY:
                break;
            case BCMOLT_NNI_CONNECTION_BACKUP:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE)) != 0)
    {
        switch (this->new_active)
        {
            case BCMOLT_NNI_CONNECTION_PRIMARY:
                break;
            case BCMOLT_NNI_CONNECTION_BACKUP:
                break;
            default:
                *failed_prop = BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_auto_cfg_data_set_default(bcmolt_nni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED)) != 0)
    {
        this->status_changed = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_data_pack(const bcmolt_nni_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->status_changed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_auto_cfg_data_get_packed_length(const bcmolt_nni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_data_unpack(bcmolt_nni_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->status_changed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_auto_cfg_data_bounds_check(const bcmolt_nni_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_serdes_key_set_default(bcmolt_nni_serdes_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_pon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        this->instance = BCMOLT_SERDES_INSTANCE_INSTANCE_0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_pack(const bcmolt_nni_serdes_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_serdes_instance_pack(this->instance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_serdes_key_get_packed_length(const bcmolt_nni_serdes_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_unpack(bcmolt_nni_serdes_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_serdes_instance_unpack(&this->instance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_key_bounds_check(const bcmolt_nni_serdes_key *this, bcmolt_presence_mask fields_present, bcmolt_nni_serdes_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_pon_ni) 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        switch (this->instance)
        {
            case BCMOLT_SERDES_INSTANCE_INSTANCE_0:
                break;
            case BCMOLT_SERDES_INSTANCE_INSTANCE_1:
                break;
            default:
                *failed_prop = BCMOLT_NNI_SERDES_KEY_ID_INSTANCE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_nni_serdes_cfg_data_set_default(bcmolt_nni_serdes_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        this->rx_vga = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        this->rx_pf = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        this->rx_lfpf = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        this->rx_dfe1 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        this->rx_dfe2 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        this->rx_dfe3 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        this->rx_dfe4 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        this->rx_dfe5 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        this->tx_pre = 12;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        this->tx_main = 102;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        this->tx_post1 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        this->tx_post2 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        this->tx_post3 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        this->tx_amp = 12;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_data_pack(const bcmolt_nni_serdes_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_vga))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_pf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_lfpf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_dfe1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_pre))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_main))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_post1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->tx_post2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->tx_post3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_amp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_nni_serdes_cfg_data_get_packed_length(const bcmolt_nni_serdes_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_data_unpack(bcmolt_nni_serdes_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_vga))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_pf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_lfpf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_dfe1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_pre))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_main))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_post1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->tx_post2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->tx_post3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_amp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_nni_serdes_cfg_data_bounds_check(const bcmolt_nni_serdes_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_nni_serdes_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (this->rx_vga > 45)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_VGA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (this->rx_pf > 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_PF;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (this->rx_lfpf > 7)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (this->rx_dfe1 > 63)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (this->rx_dfe2 < -31)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe2 > 31)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (this->rx_dfe3 < -31)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe3 > 31)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (this->rx_dfe4 < -15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe4 > 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (this->rx_dfe5 < -15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe5 > 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (this->tx_pre > 31)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_PRE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (this->tx_main > 112)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (this->tx_post1 > 63)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_POST1;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (this->tx_post2 < -15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_POST2;
            return BCMOS_FALSE;
        }

        if (this->tx_post2 > 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_POST2;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (this->tx_post3 < -7)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_POST3;
            return BCMOS_FALSE;
        }

        if (this->tx_post3 > 7)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_POST3;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_NNI_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (this->tx_amp > 15)
        {
            *failed_prop = BCMOLT_NNI_SERDES_CFG_ID_TX_AMP;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_software_error_key_set_default(bcmolt_software_error_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX)) != 0)
    {
        this->idx = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_pack(const bcmolt_software_error_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->idx))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_software_error_key_get_packed_length(const bcmolt_software_error_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_unpack(bcmolt_software_error_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->idx))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_key_bounds_check(const bcmolt_software_error_key *this, bcmolt_presence_mask fields_present, bcmolt_software_error_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_software_error_cfg_data_set_default(bcmolt_software_error_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        this->entry.first_error_time_us = 0;
        this->entry.last_error_time_us = 0;
        this->entry.line_number = 0;
        this->entry.error_counter = 0;
        this->entry.instance = 0;
        memset(this->entry.filename, 0, 64);
        memset(this->entry.task_name, 0, 64);
    }
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_data_pack(const bcmolt_software_error_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        if (!bcmolt_sw_error_pack(&this->entry, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_software_error_cfg_data_get_packed_length(const bcmolt_software_error_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        count += 156;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_data_unpack(bcmolt_software_error_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        if (!bcmolt_sw_error_unpack(&this->entry, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 156))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_software_error_cfg_data_bounds_check(const bcmolt_software_error_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_software_error_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY)) != 0)
    {
        if (!bcmolt_sw_error_bounds_check(&this->entry))
        {
            *failed_prop = BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_calibration_key_set_default(bcmolt_trx_calibration_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED)) != 0)
    {
        this->reserved = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_pack(const bcmolt_trx_calibration_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_trx_calibration_key_get_packed_length(const bcmolt_trx_calibration_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_unpack(bcmolt_trx_calibration_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->reserved))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_key_bounds_check(const bcmolt_trx_calibration_key *this, bcmolt_presence_mask fields_present, bcmolt_trx_calibration_key_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_calibration_capture_window_and_statistic_completed_data_set_default(bcmolt_trx_calibration_capture_window_and_statistic_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        this->data_window.len = 0;
        this->data_window.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        this->strobe_window.len = 0;
        this->strobe_window.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN)) != 0)
    {
        this->edge_rise_min_min = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX)) != 0)
    {
        this->edge_rise_min_max = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN)) != 0)
    {
        this->edge_rise_max_min = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX)) != 0)
    {
        this->edge_rise_max_max = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN)) != 0)
    {
        this->edge_fall_min_min = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX)) != 0)
    {
        this->edge_fall_min_max = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN)) != 0)
    {
        this->edge_fall_max_min = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX)) != 0)
    {
        this->edge_fall_max_max = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_data_pack(const bcmolt_trx_calibration_capture_window_and_statistic_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_pack(&this->data_window, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_pack(&this->strobe_window, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_rise_min_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_rise_min_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_rise_max_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_rise_max_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_fall_min_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_fall_min_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_fall_max_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->edge_fall_max_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_trx_calibration_capture_window_and_statistic_completed_data_get_packed_length(const bcmolt_trx_calibration_capture_window_and_statistic_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        count += bcmolt_u32_list_u32_max_500_hex_get_packed_length(&this->data_window);
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        count += bcmolt_u32_list_u32_max_500_hex_get_packed_length(&this->strobe_window);
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_data_unpack(bcmolt_trx_calibration_capture_window_and_statistic_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_unpack(&this->data_window, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_unpack(&this->strobe_window, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_rise_min_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_rise_min_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_rise_max_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_rise_max_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_fall_min_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_fall_min_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_fall_max_min))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->edge_fall_max_max))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        if (!bcmolt_u32_list_u32_max_500_hex_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_data_bounds_check(const bcmolt_trx_calibration_capture_window_and_statistic_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_trx_calibration_capture_window_and_statistic_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW)) != 0)
    {
        if (this->data_window.len < 2)
        {
            return BCMOS_FALSE;
        }

        if (this->data_window.len > 500)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u32_list_u32_max_500_hex_bounds_check(&this->data_window))
        {
            *failed_prop = BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW)) != 0)
    {
        if (this->strobe_window.len < 2)
        {
            return BCMOS_FALSE;
        }

        if (this->strobe_window.len > 500)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u32_list_u32_max_500_hex_bounds_check(&this->strobe_window))
        {
            *failed_prop = BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_calibration_auto_cfg_data_set_default(bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED)) != 0)
    {
        this->capture_window_and_statistic_completed = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_data_pack(const bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->capture_window_and_statistic_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_trx_calibration_auto_cfg_data_get_packed_length(const bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_data_unpack(bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->capture_window_and_statistic_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_auto_cfg_data_bounds_check(const bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_trx_calibration_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_calibration_start_capture_window_data_set_default(bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        this->pon_ni = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        this->trigger = BCMOLT_TRX_CALIBRATION_TRIGGER_EPON_STAT;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        this->strobe = BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_BCDR_RESET;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        this->window_mode = BCMOLT_TRX_CALIBRATION_WINDOW_MODE_RANGING;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID)) != 0)
    {
        this->onu_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        this->trigger_position = BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION_RISING;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE)) != 0)
    {
        this->stop_due_to_corrupt_strobe = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET)) != 0)
    {
        this->start_offset = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET)) != 0)
    {
        this->end_offset = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES)) != 0)
    {
        this->number_of_cycles = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_data_pack(const bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        if (!bcmolt_trx_calibration_trigger_pack(this->trigger, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        if (!bcmolt_capture_strobe_signal_pack(this->strobe, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        if (!bcmolt_trx_calibration_window_mode_pack(this->window_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        if (!bcmolt_trx_calibration_trigger_position_pack(this->trigger_position, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stop_due_to_corrupt_strobe))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->start_offset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->end_offset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_trx_calibration_start_capture_window_data_get_packed_length(const bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_data_unpack(bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        if (!bcmolt_trx_calibration_trigger_unpack(&this->trigger, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        if (!bcmolt_capture_strobe_signal_unpack(&this->strobe, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        if (!bcmolt_trx_calibration_window_mode_unpack(&this->window_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        if (!bcmolt_trx_calibration_trigger_position_unpack(&this->trigger_position, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stop_due_to_corrupt_strobe))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->start_offset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->end_offset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_start_capture_window_data_bounds_check(const bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_presence_mask fields_present, bcmolt_trx_calibration_start_capture_window_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER)) != 0)
    {
        switch (this->trigger)
        {
            case BCMOLT_TRX_CALIBRATION_TRIGGER_EPON_STAT:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_BCDR_RESET:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_TRX_RESET:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_TRX_ED:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_RSSI:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_EOB:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_RANGING:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_SERDES_BURST_EN:
                break;
            default:
                *failed_prop = BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE)) != 0)
    {
        switch (this->strobe)
        {
            case BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_BCDR_RESET:
                break;
            case BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_TRX_ED:
                break;
            case BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_RSSI:
                break;
            case BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_EOB:
                break;
            case BCMOLT_CAPTURE_STROBE_SIGNAL_SERDES_BURST_EN:
                break;
            case BCMOLT_CAPTURE_STROBE_SIGNAL_SERDES_RX_LOCK:
                break;
            default:
                *failed_prop = BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE)) != 0)
    {
        switch (this->window_mode)
        {
            case BCMOLT_TRX_CALIBRATION_WINDOW_MODE_RANGING:
                break;
            case BCMOLT_TRX_CALIBRATION_WINDOW_MODE_NON_RANGING:
                break;
            case BCMOLT_TRX_CALIBRATION_WINDOW_MODE_BOTH:
                break;
            default:
                *failed_prop = BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION)) != 0)
    {
        switch (this->trigger_position)
        {
            case BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION_RISING:
                break;
            case BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION_FALLING:
                break;
            default:
                *failed_prop = BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_trx_calibration_stop_capture_window_data_set_default(bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        this->pon_ni = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_data_pack(const bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_trx_calibration_stop_capture_window_data_get_packed_length(const bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_data_unpack(bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_trx_calibration_stop_capture_window_data_bounds_check(const bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_presence_mask fields_present, bcmolt_trx_calibration_stop_capture_window_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_key_set_default(bcmolt_xgpon_alloc_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_xgpon_alloc_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_pack(const bcmolt_xgpon_alloc_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_key_get_packed_length(const bcmolt_xgpon_alloc_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_unpack(bcmolt_xgpon_alloc_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_key_bounds_check(const bcmolt_xgpon_alloc_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_xgpon_alloc_id) 16383)
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_cfg_data_set_default(bcmolt_xgpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        this->state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        this->sla.cbr_rt_bw = 0;
        this->sla.cbr_nrt_bw = 0;
        this->sla.guaranteed_bw = 0;
        this->sla.maximum_bw = 0;
        this->sla.additional_bw_eligibility = BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NONE;
        this->sla.cbr_rt_compensation = BCMOS_FALSE;
        this->sla.cbr_rt_ap_index = 0;
        this->sla.cbr_nrt_ap_index = 0;
        this->sla.alloc_type = BCMOLT_ALLOC_TYPE_NONE;
        this->sla.weight = 0;
        this->sla.priority = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        this->collect_stats = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_data_pack(const bcmolt_xgpon_alloc_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_pack(&this->sla, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->collect_stats))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        count += 23;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_data_unpack(bcmolt_xgpon_alloc_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_unpack(&this->sla, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->collect_stats))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 23))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_cfg_data_bounds_check(const bcmolt_xgpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ALLOC_STATE_INACTIVE:
                break;
            case BCMOLT_ALLOC_STATE_PROCESSING:
                break;
            case BCMOLT_ALLOC_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_CFG_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_SLA)) != 0)
    {
        if (!bcmolt_pon_alloc_sla_bounds_check(&this->sla))
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_CFG_ID_SLA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_stat_data_set_default(bcmolt_xgpon_alloc_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_data_pack(const bcmolt_xgpon_alloc_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_stat_data_get_packed_length(const bcmolt_xgpon_alloc_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_data_unpack(bcmolt_xgpon_alloc_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_data_bounds_check(const bcmolt_xgpon_alloc_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_stat_cfg_data_set_default(bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_data_pack(const bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_stat_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_data_unpack(bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_cfg_data_bounds_check(const bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_configuration_completed_data_set_default(bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_ALLOC_STATE_NOT_CONFIGURED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_data_pack(const bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_configuration_completed_data_get_packed_length(const bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_data_unpack(bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_alloc_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_configuration_completed_data_bounds_check(const bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_configuration_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_ALLOC_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ALLOC_STATE_INACTIVE:
                break;
            case BCMOLT_ALLOC_STATE_PROCESSING:
                break;
            case BCMOLT_ALLOC_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_get_alloc_stats_completed_data_set_default(bcmolt_xgpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        this->average_nsr_used = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        this->average_nsr_allocated = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        this->average_sr_report = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_data_pack(const bcmolt_xgpon_alloc_get_alloc_stats_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_nsr_used))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_nsr_allocated))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->average_sr_report))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_get_alloc_stats_completed_data_get_packed_length(const bcmolt_xgpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_data_unpack(bcmolt_xgpon_alloc_get_alloc_stats_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_nsr_used))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_nsr_allocated))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->average_sr_report))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_data_bounds_check(const bcmolt_xgpon_alloc_get_alloc_stats_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_get_alloc_stats_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_stat_alarm_cleared_data_set_default(bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_data_pack(const bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_alloc_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_stat_alarm_cleared_data_get_packed_length(const bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_data_unpack(bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_alloc_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_data_bounds_check(const bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_stat_alarm_raised_data_set_default(bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_data_pack(const bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_alloc_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_stat_alarm_raised_data_get_packed_length(const bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_data_unpack(bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_alloc_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_data_bounds_check(const bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_auto_cfg_data_set_default(bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        this->configuration_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        this->get_alloc_stats_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_data_pack(const bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->get_alloc_stats_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_auto_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_data_unpack(bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->configuration_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->get_alloc_stats_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_auto_cfg_data_bounds_check(const bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_get_stats_data_set_default(bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        this->num_of_cycles = 1;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_data_pack(const bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->num_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_get_stats_data_get_packed_length(const bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_data_unpack(bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->num_of_cycles))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_get_stats_data_bounds_check(const bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_get_stats_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES)) != 0)
    {
        if (this->num_of_cycles < 1)
        {
            *failed_prop = BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_alloc_set_state_data_set_default(bcmolt_xgpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        this->state = BCMOLT_ALLOC_OPERATION_ACTIVATE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_data_pack(const bcmolt_xgpon_alloc_set_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_operation_pack(this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_alloc_set_state_data_get_packed_length(const bcmolt_xgpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_data_unpack(bcmolt_xgpon_alloc_set_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_alloc_operation_unpack(&this->state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_alloc_set_state_data_bounds_check(const bcmolt_xgpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_alloc_set_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE)) != 0)
    {
        switch (this->state)
        {
            case BCMOLT_ALLOC_OPERATION_ACTIVATE:
                break;
            case BCMOLT_ALLOC_OPERATION_DEACTIVATE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_key_set_default(bcmolt_xgpon_gem_port_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_xgpon_gem_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_pack(const bcmolt_xgpon_gem_port_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_key_get_packed_length(const bcmolt_xgpon_gem_port_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_unpack(bcmolt_xgpon_gem_port_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_key_bounds_check(const bcmolt_xgpon_gem_port_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_xgpon_gem_id) 65533U)
        {
            *failed_prop = BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_cfg_data_set_default(bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        this->configuration.direction = BCMOLT_GEM_PORT_DIRECTION_DOWNSTREAM;
        this->configuration.type = BCMOLT_GEM_PORT_TYPE_UNICAST;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        this->gem_port_state = BCMOLT_XGPON_GEM_PORT_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        this->encryption_mode = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        this->upstream_destination_queue = BCMOLT_US_GEM_PORT_DESTINATION_DATA;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_CONTROL_STATE_DISABLE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_data_pack(const bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_pack(&this->configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_state_pack(this->gem_port_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->encryption_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_us_gem_port_destination_pack(this->upstream_destination_queue, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_cfg_data_get_packed_length(const bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_data_unpack(bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_unpack(&this->configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_state_unpack(&this->gem_port_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->encryption_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_us_gem_port_destination_unpack(&this->upstream_destination_queue, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_cfg_data_bounds_check(const bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION)) != 0)
    {
        if (!bcmolt_gem_port_configuration_bounds_check(&this->configuration))
        {
            *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE)) != 0)
    {
        switch (this->gem_port_state)
        {
            case BCMOLT_XGPON_GEM_PORT_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_XGPON_GEM_PORT_STATE_INACTIVE:
                break;
            case BCMOLT_XGPON_GEM_PORT_STATE_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE)) != 0)
    {
        switch (this->encryption_mode)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE)) != 0)
    {
        switch (this->upstream_destination_queue)
        {
            case BCMOLT_US_GEM_PORT_DESTINATION_DATA:
                break;
            case BCMOLT_US_GEM_PORT_DESTINATION_CPU:
                break;
            case BCMOLT_US_GEM_PORT_DESTINATION_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_stat_data_set_default(bcmolt_xgpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        this->tx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        this->tx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        this->rx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_data_pack(const bcmolt_xgpon_gem_port_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_stat_data_get_packed_length(const bcmolt_xgpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_data_unpack(bcmolt_xgpon_gem_port_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_data_bounds_check(const bcmolt_xgpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_stat_cfg_data_set_default(bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_data_pack(const bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_stat_cfg_data_get_packed_length(const bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_data_unpack(bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_data_bounds_check(const bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_stat_alarm_cleared_data_set_default(bcmolt_xgpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_data_pack(const bcmolt_xgpon_gem_port_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_stat_alarm_cleared_data_get_packed_length(const bcmolt_xgpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_data_unpack(bcmolt_xgpon_gem_port_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_data_bounds_check(const bcmolt_xgpon_gem_port_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_stat_alarm_raised_data_set_default(bcmolt_xgpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_data_pack(const bcmolt_xgpon_gem_port_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_stat_alarm_raised_data_get_packed_length(const bcmolt_xgpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_data_unpack(bcmolt_xgpon_gem_port_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_data_bounds_check(const bcmolt_xgpon_gem_port_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_gem_port_auto_cfg_data_set_default(bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_data_pack(const bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_gem_port_auto_cfg_data_get_packed_length(const bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_data_unpack(bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_data_bounds_check(const bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_gem_port_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_iwf_key_set_default(bcmolt_xgpon_iwf_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_pack(const bcmolt_xgpon_iwf_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_iwf_key_get_packed_length(const bcmolt_xgpon_iwf_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_unpack(bcmolt_xgpon_iwf_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_key_bounds_check(const bcmolt_xgpon_iwf_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_iwf_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_IWF_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_iwf_cfg_data_set_default(bcmolt_xgpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        this->us_otag_direct_tpid = 33024U;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        this->ds_tpid.arr[0] = 33024U;
        this->ds_tpid.arr[1] = 34984U;
        this->ds_tpid.arr[2] = 37120U;
        this->ds_tpid.arr[3] = 37376U;
        this->ds_tpid.arr[4] = 33024U;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_data_pack(const bcmolt_xgpon_iwf_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->us_otag_direct_tpid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_pack(&this->ds_tpid, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_iwf_cfg_data_get_packed_length(const bcmolt_xgpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        count += 10;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_data_unpack(bcmolt_xgpon_iwf_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->us_otag_direct_tpid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_unpack(&this->ds_tpid, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 10))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_iwf_cfg_data_bounds_check(const bcmolt_xgpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_iwf_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_IWF_CFG_ID_DS_TPID)) != 0)
    {
        if (!bcmolt_arr_u16_5_hex_bounds_check(&this->ds_tpid))
        {
            *failed_prop = BCMOLT_XGPON_IWF_CFG_ID_DS_TPID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_key_set_default(bcmolt_xgpon_ni_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_pack(const bcmolt_xgpon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_key_get_packed_length(const bcmolt_xgpon_ni_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_unpack(bcmolt_xgpon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_key_bounds_check(const bcmolt_xgpon_ni_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_NI_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_cfg_data_set_default(bcmolt_xgpon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        this->hw_pon_id.pon_id_1 = 0;
        this->hw_pon_id.pon_id_2 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        this->available_bandwidth.cbr_bw = 0;
        this->available_bandwidth.total_bw = 0;
        this->available_bandwidth.next_onu_total_bw = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        this->number_of_active_onus = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        this->pon_status.state = BCMOLT_PON_STATE_INACTIVE;
        this->pon_status.los_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        this->pon_distance.max_log_distance = 20;
        this->pon_distance.max_diff_reach = 20;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        this->ranging_window_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        this->eqd_cycles_number = 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        this->drift_control.drift_interval = 1000;
        this->drift_control.drift_limit = 8;
        this->drift_control.transmission_control_limit = 16;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        this->los_alarm_threshold = 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        this->los_initial_value = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        this->onu_alarms_thresholds.losi = 4;
        this->onu_alarms_thresholds.lobi = 4;
        this->onu_alarms_thresholds.looci = 3;
        this->onu_alarms_thresholds.lopci = 3;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        this->ber_monitor.us_ber_interval = 5000;
        this->ber_monitor.sf_threshold = 3;
        this->ber_monitor.sd_threshold = 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        this->onu_activation.key_exchange = BCMOLT_CONTROL_STATE_DISABLE;
        this->onu_activation.fail_due_to_regis_auto_fail = BCMOLT_CONTROL_STATE_ENABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        this->sn_acquisition.interval = 1000;
        this->sn_acquisition.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->sn_acquisition.onu_post_discovery_mode = BCMOLT_ONU_POST_DISCOVERY_MODE_NONE;
        this->sn_acquisition.burst_profile = (bcmolt_burst_profile_index) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        this->key_exchange.interval = 10000;
        this->key_exchange.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->key_exchange.encrypted_ports_only = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        this->protection_switching.timeout = 100;
        this->protection_switching.gpio_pin = BCMOLT_GPIO_PIN_UNCONFIGURED;
        this->protection_switching.fast_ranging = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        this->protection_switching_debug.data_map_delay_ms = 0;
        this->protection_switching_debug.rerange_send_ranging_time = BCMOS_FALSE;
        this->protection_switching_debug.rerange_send_ranging_time_delay = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        this->cbr_rt_allocation_profile.ma_7 = 64;
        this->cbr_rt_allocation_profile.ma_3 = 256;
        this->cbr_rt_allocation_profile.ma_1 = 512;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        this->cbr_nrt_allocation_profile.arr[0] = 4096;
        this->cbr_nrt_allocation_profile.arr[1] = 8192;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        this->power_management.ilowpower = 1600;
        this->power_management.iaware = 160;
        this->power_management.itransinit = 80;
        this->power_management.itxinit = 40;
        this->power_management.irxoff = 1600;
        this->power_management.low_power_clobi = 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        this->rogue_onu_detection_process.control = BCMOLT_CONTROL_STATE_DISABLE;
        this->rogue_onu_detection_process.detection_algorithm.algorithm_type = BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.measurement_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.interval = 10000;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.second_ranging_window = BCMOS_FALSE;
        this->rogue_onu_detection_process.detection_algorithm.u.early_rogue_detection.alloc_type_to_scan = BCMOLT_ALLOC_TYPE_TO_SCAN_ALL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        this->periodic_standby_pon_monitoring.interval = 5000;
        this->periodic_standby_pon_monitoring.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        this->dba_mode = BCMOLT_DBA_MODE_NORMAL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        this->ploam_handling.ack_timeout = 2000;
        this->ploam_handling.retrans_ranging_time = 0;
        this->ploam_handling.retrans_assign_alloc_id = 0;
        this->ploam_handling.retrans_key_control = 0;
        this->ploam_handling.retrans_request_registration = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        this->min_data_alloc_id = (bcmolt_xgpon_alloc_id) 1024;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        this->min_data_gem_port_id = (bcmolt_xgpon_gem_id) 1024;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        memset(this->multicast_key.key.bytes, 0, sizeof(this->multicast_key.key.bytes));
        this->multicast_key.key_control = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        this->prbs_checker.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_checker.mode = BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC;
        this->prbs_checker.data_invert = BCMOS_FALSE;
        this->prbs_checker.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        this->prbs_generator.polynom = BCMOLT_PRBS_POLYNOMIAL_PRBS_7;
        this->prbs_generator.error_insert = BCMOS_FALSE;
        this->prbs_generator.invert = BCMOS_FALSE;
        this->prbs_generator.control = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        this->prbs_status.lock_state = BCMOLT_PRBS_LOCK_STATE_UNLOCKED;
        this->prbs_status.error_counts = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        this->automatic_onu_deactivation.los = BCMOS_FALSE;
        this->automatic_onu_deactivation.onu_alarms = BCMOS_FALSE;
        this->automatic_onu_deactivation.tiwi = BCMOS_FALSE;
        this->automatic_onu_deactivation.ack_timeout = BCMOS_FALSE;
        this->automatic_onu_deactivation.sfi = BCMOS_FALSE;
        this->automatic_onu_deactivation.loki = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        this->us_bandwidth_limit = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        this->all_onus.len = 0;
        this->all_onus.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        this->all_mcast_gem_ports.len = 0;
        this->all_mcast_gem_ports.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        this->debug.increase_available_cbr_bw = BCMOS_FALSE;
        this->debug.inter_burst_gap_in_bytes = 512;
        this->debug.number_of_gem_ports_per_onu = 64;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        this->onu_upgrade_params.response_timeout_ms = 1000;
        this->onu_upgrade_params.max_retry_count = 23;
        this->onu_upgrade_params.omci_format = BCMOLT_OMCI_DEVICE_ID_EXTENDED;
        this->onu_upgrade_params.window_size = 32;
        this->onu_upgrade_params.activate_commit = BCMOS_FALSE;
        this->onu_upgrade_params.delay_for_commit_ms = 40000UL;
        this->onu_upgrade_params.max_activation_attempts = 23;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        this->ds_fec_mode = BCMOLT_CONTROL_STATE_ENABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        this->dba_type = BCMOLT_DBA_TYPE_INTERNAL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        this->onu_tuning.tsource = 1000;
        this->onu_tuning.ttarget = 1000;
        this->onu_tuning.request_registration_required = BCMOS_TRUE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_data_pack(const bcmolt_xgpon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        if (!bcmolt_hw_pon_id_pack(&this->hw_pon_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_pack(&this->available_bandwidth, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->number_of_active_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_pack(&this->pon_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_pack(&this->pon_distance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_window_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->eqd_cycles_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_pack(&this->drift_control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->los_alarm_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_status_pack(this->los_initial_value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_thresholds_pack(&this->onu_alarms_thresholds, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_pack(&this->ber_monitor, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_xgpon_onu_activation_pack(&this->onu_activation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_xgpon_sn_acquisition_pack(&this->sn_acquisition, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_xgpon_key_exchange_pack(&this->key_exchange, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_pack(&this->protection_switching, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_debug_pack(&this->protection_switching_debug, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_pack(&this->cbr_rt_allocation_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_pack(&this->cbr_nrt_allocation_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_pack(&this->power_management, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_pack(&this->rogue_onu_detection_process, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_pack(&this->periodic_standby_pon_monitoring, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        if (!bcmolt_dba_mode_pack(this->dba_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        if (!bcmolt_xgpon_ploam_handling_pack(&this->ploam_handling, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->min_data_alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->min_data_gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        if (!bcmolt_xgpon_multicast_key_pack(&this->multicast_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_pack(&this->prbs_checker, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_pack(&this->prbs_generator, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_pack(&this->prbs_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_pack(&this->automatic_onu_deactivation, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->us_bandwidth_limit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_with_state_list_u16_max_510_pack(&this->all_onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_128_pack(&this->all_mcast_gem_ports, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_ni_debug_pack(&this->debug, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_pack(&this->onu_upgrade_params, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_control_state_pack(this->ds_fec_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        if (!bcmolt_dba_type_pack(this->dba_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        if (!bcmolt_onu_tuning_configuration_pack(&this->onu_tuning, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_cfg_data_get_packed_length(const bcmolt_xgpon_ni_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        count += 12;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        count += 18;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        count += bcmolt_rogue_onu_detection_process_get_packed_length(&this->rogue_onu_detection_process);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        count += 17;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        count += 6;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        count += bcmolt_xgpon_onu_with_state_list_u16_max_510_get_packed_length(&this->all_onus);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        count += bcmolt_xgpon_gem_port_with_state_list_u16_max_128_get_packed_length(&this->all_mcast_gem_ports);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        count += 14;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        count += 9;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_data_unpack(bcmolt_xgpon_ni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        if (!bcmolt_hw_pon_id_unpack(&this->hw_pon_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_unpack(&this->available_bandwidth, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->number_of_active_onus))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_unpack(&this->pon_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_unpack(&this->pon_distance, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_window_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->eqd_cycles_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_unpack(&this->drift_control, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->los_alarm_threshold))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_status_unpack(&this->los_initial_value, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_thresholds_unpack(&this->onu_alarms_thresholds, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_unpack(&this->ber_monitor, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_xgpon_onu_activation_unpack(&this->onu_activation, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_xgpon_sn_acquisition_unpack(&this->sn_acquisition, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_xgpon_key_exchange_unpack(&this->key_exchange, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_unpack(&this->protection_switching, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_debug_unpack(&this->protection_switching_debug, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_unpack(&this->cbr_rt_allocation_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_unpack(&this->cbr_nrt_allocation_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_unpack(&this->power_management, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_unpack(&this->rogue_onu_detection_process, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_unpack(&this->periodic_standby_pon_monitoring, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        if (!bcmolt_dba_mode_unpack(&this->dba_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        if (!bcmolt_xgpon_ploam_handling_unpack(&this->ploam_handling, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->min_data_alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->min_data_gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        if (!bcmolt_xgpon_multicast_key_unpack(&this->multicast_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_unpack(&this->prbs_checker, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_unpack(&this->prbs_generator, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_unpack(&this->prbs_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_unpack(&this->automatic_onu_deactivation, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->us_bandwidth_limit))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_with_state_list_u16_max_510_unpack(&this->all_onus, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_128_unpack(&this->all_mcast_gem_ports, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_ni_debug_unpack(&this->debug, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_unpack(&this->onu_upgrade_params, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_control_state_unpack(&this->ds_fec_mode, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        if (!bcmolt_dba_type_unpack(&this->dba_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        if (!bcmolt_onu_tuning_configuration_unpack(&this->onu_tuning, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 12))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 18))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 17))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 6))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_with_state_list_u16_max_510_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_128_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 14))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 9))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cfg_data_bounds_check(const bcmolt_xgpon_ni_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID)) != 0)
    {
        if (!bcmolt_hw_pon_id_bounds_check(&this->hw_pon_id))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) != 0)
    {
        if (!bcmolt_pon_available_bandwidth_bounds_check(&this->available_bandwidth))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) != 0)
    {
        if (!bcmolt_pon_status_bounds_check(&this->pon_status))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PON_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE)) != 0)
    {
        if (!bcmolt_pon_distance_bounds_check(&this->pon_distance))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER)) != 0)
    {
        if (this->eqd_cycles_number > 255)
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL)) != 0)
    {
        if (!bcmolt_pon_drift_control_bounds_check(&this->drift_control))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE)) != 0)
    {
        switch (this->los_initial_value)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_thresholds_bounds_check(&this->onu_alarms_thresholds))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR)) != 0)
    {
        if (!bcmolt_ber_monitor_params_bounds_check(&this->ber_monitor))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION)) != 0)
    {
        if (!bcmolt_xgpon_onu_activation_bounds_check(&this->onu_activation))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION)) != 0)
    {
        if (!bcmolt_xgpon_sn_acquisition_bounds_check(&this->sn_acquisition))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE)) != 0)
    {
        if (!bcmolt_xgpon_key_exchange_bounds_check(&this->key_exchange))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_bounds_check(&this->protection_switching))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_protection_switching_debug_bounds_check(&this->protection_switching_debug))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_cbr_rt_allocation_profile_bounds_check(&this->cbr_rt_allocation_profile))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE)) != 0)
    {
        if (!bcmolt_arr_u16_2_bounds_check(&this->cbr_nrt_allocation_profile))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT)) != 0)
    {
        if (!bcmolt_onu_power_management_configuration_bounds_check(&this->power_management))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS)) != 0)
    {
        if (!bcmolt_rogue_onu_detection_process_bounds_check(&this->rogue_onu_detection_process))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING)) != 0)
    {
        if (!bcmolt_periodic_standby_pon_monitoring_bounds_check(&this->periodic_standby_pon_monitoring))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_MODE)) != 0)
    {
        switch (this->dba_mode)
        {
            case BCMOLT_DBA_MODE_NORMAL:
                break;
            case BCMOLT_DBA_MODE_EXTENDED:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CFG_ID_DBA_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING)) != 0)
    {
        if (!bcmolt_xgpon_ploam_handling_bounds_check(&this->ploam_handling))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID)) != 0)
    {
        if (this->min_data_alloc_id < (bcmolt_xgpon_alloc_id) 1024)
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID;
            return BCMOS_FALSE;
        }

        if (this->min_data_alloc_id > (bcmolt_xgpon_alloc_id) 14591)
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID)) != 0)
    {
        if (this->min_data_gem_port_id < (bcmolt_xgpon_gem_id) 1024)
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID;
            return BCMOS_FALSE;
        }

        if (this->min_data_gem_port_id > (bcmolt_xgpon_gem_id) 57598U)
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY)) != 0)
    {
        if (!bcmolt_xgpon_multicast_key_bounds_check(&this->multicast_key))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER)) != 0)
    {
        if (!bcmolt_prbs_checker_config_bounds_check(&this->prbs_checker))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR)) != 0)
    {
        if (!bcmolt_prbs_generator_config_bounds_check(&this->prbs_generator))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) != 0)
    {
        if (!bcmolt_prbs_status_bounds_check(&this->prbs_status))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION)) != 0)
    {
        if (!bcmolt_automatic_onu_deactivation_bounds_check(&this->automatic_onu_deactivation))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) != 0)
    {
        if (this->all_onus.len > 510)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_xgpon_onu_with_state_list_u16_max_510_bounds_check(&this->all_onus))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS)) != 0)
    {
        if (this->all_mcast_gem_ports.len > 128)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_128_bounds_check(&this->all_mcast_gem_ports))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_ni_debug_bounds_check(&this->debug))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_DEBUG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_params_bounds_check(&this->onu_upgrade_params))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE)) != 0)
    {
        switch (this->ds_fec_mode)
        {
            case BCMOLT_CONTROL_STATE_DISABLE:
                break;
            case BCMOLT_CONTROL_STATE_ENABLE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE)) != 0)
    {
        switch (this->dba_type)
        {
            case BCMOLT_DBA_TYPE_INTERNAL:
                break;
            case BCMOLT_DBA_TYPE_PARTIAL_EXTERNAL:
                break;
            case BCMOLT_DBA_TYPE_EXTERNAL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING)) != 0)
    {
        if (!bcmolt_onu_tuning_configuration_bounds_check(&this->onu_tuning))
        {
            *failed_prop = BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_stat_data_set_default(bcmolt_xgpon_ni_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        this->fec_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES)) != 0)
    {
        this->bip32_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS)) != 0)
    {
        this->bip32_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS)) != 0)
    {
        this->rx_xgtc_headers = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED)) != 0)
    {
        this->rx_xgtc_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED)) != 0)
    {
        this->rx_xgtc_uncorrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM)) != 0)
    {
        this->rx_xgem = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED)) != 0)
    {
        this->rx_xgem_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE)) != 0)
    {
        this->rx_xgem_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED)) != 0)
    {
        this->rx_xgem_corrected = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR)) != 0)
    {
        this->rx_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR)) != 0)
    {
        this->rx_fragment_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        this->rx_packets_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        this->rx_dropped_too_short = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        this->rx_dropped_too_long = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR)) != 0)
    {
        this->rx_key_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        this->tx_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        this->rx_ploams_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        this->rx_allocations_valid = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        this->rx_allocations_invalid = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        this->rx_allocations_disabled = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        this->rx_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        this->rx_ploams_non_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        this->rx_ploams_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        this->rx_cpu = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        this->rx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        this->rx_omci_packets_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS)) != 0)
    {
        this->tx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_XGEM)) != 0)
    {
        this->tx_xgem = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        this->tx_cpu = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        this->tx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        this->tx_cpu_omci_packets_dropped = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        this->tx_dropped_illegal_length = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        this->tx_dropped_tpid_miss = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        this->tx_dropped_vid_miss = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_data_pack(const bcmolt_xgpon_ni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip32_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip32_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgtc_headers))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgtc_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgtc_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgem_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgem_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_xgem_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_fragment_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_dropped_too_short))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_dropped_too_long))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_key_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_valid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_invalid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_allocations_disabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_XGEM)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_xgem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_cpu_omci_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_illegal_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_tpid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_dropped_vid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_stat_data_get_packed_length(const bcmolt_xgpon_ni_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_XGEM)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_data_unpack(bcmolt_xgpon_ni_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip32_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip32_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgtc_headers))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgtc_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgtc_uncorrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgem_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgem_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_xgem_corrected))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_fragment_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_dropped_too_short))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_dropped_too_long))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_key_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_valid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_invalid))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_allocations_disabled))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_XGEM)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_xgem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_cpu))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_cpu_omci_packets_dropped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_illegal_length))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_tpid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_dropped_vid_miss))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_CPU)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_XGEM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_data_bounds_check(const bcmolt_xgpon_ni_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_stat_cfg_data_set_default(bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_data_pack(const bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_stat_cfg_data_get_packed_length(const bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_data_unpack(bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_cfg_data_bounds_check(const bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_XGPON_NI_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_cpu_packets_failure_data_set_default(bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        this->error = BCMOLT_PACKET_INJECTION_ERROR_GEM_PORT_NOT_ACTIVE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        this->gem_port_id = (bcmolt_xgpon_gem_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_data_pack(const bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_packet_injection_error_pack(this->error, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_cpu_packets_failure_data_get_packed_length(const bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_data_unpack(bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_packet_injection_error_unpack(&this->error, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->gem_port_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_data_bounds_check(const bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_cpu_packets_failure_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR)) != 0)
    {
        switch (this->error)
        {
            case BCMOLT_PACKET_INJECTION_ERROR_GEM_PORT_NOT_ACTIVE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID)) != 0)
    {
        if (this->gem_port_id > (bcmolt_xgpon_gem_id) 65533U)
        {
            *failed_prop = BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_los_data_set_default(bcmolt_xgpon_ni_los_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_data_pack(const bcmolt_xgpon_ni_los_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_los_data_get_packed_length(const bcmolt_xgpon_ni_los_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_data_unpack(bcmolt_xgpon_ni_los_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_los_data_bounds_check(const bcmolt_xgpon_ni_los_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_los_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_LOS_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_LOS_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_onu_discovered_data_set_default(bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        this->ranging_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        this->upstream_line_rate_capabilities = BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID)) != 0)
    {
        this->current_downstream_pon_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID)) != 0)
    {
        this->current_upstream_pon_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        memset(this->calibration_record.arr, 0, sizeof(this->calibration_record.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY)) != 0)
    {
        this->tuning_granularity = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME)) != 0)
    {
        this->step_tuning_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        this->attenuation = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        this->power_levelling_capabilities = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_data_pack(const bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        if (!bcmolt_upstream_line_rate_capabilities_pack(this->upstream_line_rate_capabilities, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->current_downstream_pon_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->current_upstream_pon_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_pack(&this->calibration_record, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tuning_granularity))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->step_tuning_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->power_levelling_capabilities))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_onu_discovered_data_get_packed_length(const bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_data_unpack(bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        if (!bcmolt_upstream_line_rate_capabilities_unpack(&this->upstream_line_rate_capabilities, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->current_downstream_pon_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->current_upstream_pon_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_unpack(&this->calibration_record, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tuning_granularity))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->step_tuning_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->power_levelling_capabilities))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_discovered_data_bounds_check(const bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_onu_discovered_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES)) != 0)
    {
        switch (this->upstream_line_rate_capabilities)
        {
            case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G:
                break;
            case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_10_G:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_bounds_check(&this->calibration_record))
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION)) != 0)
    {
        if (this->attenuation > 7)
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (this->power_levelling_capabilities > 127)
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_onu_upgrade_complete_data_set_default(bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        this->status = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        this->list_of_failed_entities.len = 0;
        this->list_of_failed_entities.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_data_pack(const bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_pack(&this->list_of_failed_entities, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_onu_upgrade_complete_data_get_packed_length(const bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        count += bcmolt_gpon_onu_upgrade_status_list_u32_get_packed_length(&this->list_of_failed_entities);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_data_unpack(bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->status))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_unpack(&this->list_of_failed_entities, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_data_bounds_check(const bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_onu_upgrade_complete_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES)) != 0)
    {
        if (!bcmolt_gpon_onu_upgrade_status_list_u32_bounds_check(&this->list_of_failed_entities))
        {
            *failed_prop = BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_protection_switching_onus_ranged_data_set_default(bcmolt_xgpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        this->onus.len = 0;
        this->onus.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_data_pack(const bcmolt_xgpon_ni_protection_switching_onus_ranged_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_eqd_list_u32_pack(&this->onus, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_protection_switching_onus_ranged_data_get_packed_length(const bcmolt_xgpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        count += bcmolt_xgpon_onu_eqd_list_u32_get_packed_length(&this->onus);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_data_unpack(bcmolt_xgpon_ni_protection_switching_onus_ranged_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_eqd_list_u32_unpack(&this->onus, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_eqd_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_data_bounds_check(const bcmolt_xgpon_ni_protection_switching_onus_ranged_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_protection_switching_onus_ranged_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS)) != 0)
    {
        if (!bcmolt_xgpon_onu_eqd_list_u32_bounds_check(&this->onus))
        {
            *failed_prop = BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_protection_switching_switchover_completed_data_set_default(bcmolt_xgpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_data_pack(const bcmolt_xgpon_ni_protection_switching_switchover_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_protection_switching_switchover_completed_data_get_packed_length(const bcmolt_xgpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_data_unpack(bcmolt_xgpon_ni_protection_switching_switchover_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_data_bounds_check(const bcmolt_xgpon_ni_protection_switching_switchover_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_protection_switching_switchover_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_protection_switching_traffic_resume_data_set_default(bcmolt_xgpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_TRAFFIC_RESUME_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_data_pack(const bcmolt_xgpon_ni_protection_switching_traffic_resume_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_traffic_resume_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_protection_switching_traffic_resume_data_get_packed_length(const bcmolt_xgpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_data_unpack(bcmolt_xgpon_ni_protection_switching_traffic_resume_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_traffic_resume_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_data_bounds_check(const bcmolt_xgpon_ni_protection_switching_traffic_resume_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_protection_switching_traffic_resume_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_TRAFFIC_RESUME_RESULT_SUCCESS:
                break;
            case BCMOLT_TRAFFIC_RESUME_RESULT_FAILURE:
                break;
            case BCMOLT_TRAFFIC_RESUME_RESULT_SUSPECTED_LOS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_rogue_detection_completed_data_set_default(bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        this->window_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        this->measurement_status = BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_COMPLETE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_xgpon_alloc_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        this->is_delineation = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        this->is_ed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        this->rx_data.len = 0;
        this->rx_data.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        this->ploam_received_onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR)) != 0)
    {
        this->ploam_received_mic_error = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_data_pack(const bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_pack(this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_rogue_measurement_result_pack(this->measurement_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->is_delineation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->is_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->rx_data, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->ploam_received_onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ploam_received_mic_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_rogue_detection_completed_data_get_packed_length(const bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->rx_data);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_data_unpack(bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_unpack(&this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_rogue_measurement_result_unpack(&this->measurement_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->is_delineation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->is_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->rx_data, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->ploam_received_onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ploam_received_mic_error))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_data_bounds_check(const bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_rogue_detection_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE)) != 0)
    {
        switch (this->window_type)
        {
            case BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW:
                break;
            case BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS)) != 0)
    {
        switch (this->measurement_status)
        {
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_COMPLETE:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_NOT_PERFORMED:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_ROGUE_CYCLE_STOP:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_ERROR:
                break;
            case BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_NOT_COMPLETE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_xgpon_alloc_id) 16383)
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->rx_data))
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID)) != 0)
    {
        if (this->ploam_received_onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_set_default(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        this->number_of_detected_delimiter = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        this->energy_detect_signal = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_pack(const bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->number_of_detected_delimiter))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_status_pack(this->energy_detect_signal, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_get_packed_length(const bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_unpack(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->number_of_detected_delimiter))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_status_unpack(&this->energy_detect_signal, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_bounds_check(const bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL)) != 0)
    {
        switch (this->energy_detect_signal)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_stat_alarm_cleared_data_set_default(bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_data_pack(const bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_ni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_stat_alarm_cleared_data_get_packed_length(const bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_data_unpack(bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_ni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_data_bounds_check(const bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_CPU:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_XGEM:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_CPU:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_OMCI:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_stat_alarm_raised_data_set_default(bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_data_pack(const bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_ni_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_stat_alarm_raised_data_get_packed_length(const bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_data_unpack(bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_ni_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_data_bounds_check(const bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_CPU:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_XGEM:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_CPU:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_OMCI:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS:
                break;
            case BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_state_change_completed_data_set_default(bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        this->previous_state = BCMOLT_PON_STATE_INACTIVE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_PON_STATE_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_data_pack(const bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_pon_state_pack(this->previous_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_pon_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_state_change_completed_data_get_packed_length(const bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_data_unpack(bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_pon_state_unpack(&this->previous_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_pon_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_state_change_completed_data_bounds_check(const bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_state_change_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE)) != 0)
    {
        switch (this->previous_state)
        {
            case BCMOLT_PON_STATE_INACTIVE:
                break;
            case BCMOLT_PON_STATE_PROCESSING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_PON_STATE_INACTIVE:
                break;
            case BCMOLT_PON_STATE_PROCESSING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_STATE_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_tod_request_completed_data_set_default(bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        memset(this->tod_string.str, 0, 64);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        this->sfc = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        this->rtc_offset_sec = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        this->rtc_offset_nsec = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_data_pack(const bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_pack(&this->tod_string, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->sfc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rtc_offset_sec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->rtc_offset_nsec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_tod_request_completed_data_get_packed_length(const bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        count += 64;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_data_unpack(bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_unpack(&this->tod_string, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->sfc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rtc_offset_sec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->rtc_offset_nsec))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 64))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_tod_request_completed_data_bounds_check(const bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_tod_request_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING)) != 0)
    {
        if (!bcmolt_str_64_bounds_check(&this->tod_string))
        {
            *failed_prop = BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_auto_cfg_data_set_default(bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->activate_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        this->cpu_packets_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->deactivate_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->disable_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        this->enable_all_onus_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        this->los = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        this->onu_discovered = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        this->onu_upgrade_complete = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        this->protection_switching_onus_ranged = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        this->protection_switching_switchover_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        this->protection_switching_traffic_resume = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        this->rogue_detection_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        this->rogue_onu_special_map_cycle_start = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        this->serial_number_acquisition_cycle_start = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        this->standby_pon_monitoring_cycle_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        this->state_change_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        this->tod_request_completed = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_data_pack(const bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->activate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->cpu_packets_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->deactivate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->disable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->enable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->los))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_onus_ranged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_switchover_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->protection_switching_traffic_resume))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_detection_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rogue_onu_special_map_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->serial_number_acquisition_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->standby_pon_monitoring_cycle_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tod_request_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_auto_cfg_data_get_packed_length(const bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_data_unpack(bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->activate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->cpu_packets_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->deactivate_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->disable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->enable_all_onus_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->los))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_discovered))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_upgrade_complete))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_onus_ranged))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_switchover_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->protection_switching_traffic_resume))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_detection_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rogue_onu_special_map_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->serial_number_acquisition_cycle_start))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->standby_pon_monitoring_cycle_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->state_change_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tod_request_completed))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_auto_cfg_data_bounds_check(const bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_adjust_tx_wavelength_data_set_default(bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        this->freqency_adjustment_direction = BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_LOWER;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        this->frequency_adjustment_size = 1;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_data_pack(const bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_frequency_adjustment_direction_pack(this->freqency_adjustment_direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->frequency_adjustment_size))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_adjust_tx_wavelength_data_get_packed_length(const bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_data_unpack(bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_frequency_adjustment_direction_unpack(&this->freqency_adjustment_direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->frequency_adjustment_size))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_data_bounds_check(const bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_adjust_tx_wavelength_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        switch (this->freqency_adjustment_direction)
        {
            case BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_LOWER:
                break;
            case BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_HIGHER:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (this->frequency_adjustment_size > 10)
        {
            *failed_prop = BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_disable_serial_number_data_set_default(bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_data_pack(const bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_disable_serial_number_control_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_disable_serial_number_data_get_packed_length(const bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_data_unpack(bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_disable_serial_number_control_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_disable_serial_number_data_bounds_check(const bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_disable_serial_number_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_DISABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_ENABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_ENABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_DISABLE:
                break;
            case BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_DISABLE_DISCOVERY:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_rogue_detection_window_data_set_default(bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        this->window_type = BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_xgpon_alloc_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        this->second_ranging_window = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_data_pack(const bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_pack(this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->second_ranging_window))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_rogue_detection_window_data_get_packed_length(const bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_data_unpack(bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_rogue_detection_window_unpack(&this->window_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->second_ranging_window))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_data_bounds_check(const bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_rogue_detection_window_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE)) != 0)
    {
        switch (this->window_type)
        {
            case BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW:
                break;
            case BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_xgpon_alloc_id) 16383)
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_run_special_bw_map_data_set_default(bcmolt_xgpon_ni_run_special_bw_map_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE)) != 0)
    {
        this->number_of_cycle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER)) != 0)
    {
        this->allocation_number = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY)) != 0)
    {
        this->bw_map_array = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_data_pack(const bcmolt_xgpon_ni_run_special_bw_map_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_cycle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->allocation_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->bw_map_array))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_run_special_bw_map_data_get_packed_length(const bcmolt_xgpon_ni_run_special_bw_map_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_data_unpack(bcmolt_xgpon_ni_run_special_bw_map_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_cycle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->allocation_number))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->bw_map_array))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_data_bounds_check(const bcmolt_xgpon_ni_run_special_bw_map_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_run_special_bw_map_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_set_onu_state_data_set_default(bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_data_pack(const bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_set_onu_state_data_get_packed_length(const bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_data_unpack(bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_onu_state_data_bounds_check(const bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_set_onu_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_OPERATION_INACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_DISABLE:
                break;
            case BCMOLT_ONU_OPERATION_ENABLE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_OPERATION_AWAKE_FREE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_set_pon_state_data_set_default(bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        this->pon_state = BCMOLT_PON_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_data_pack(const bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_pon_operation_pack(this->pon_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_set_pon_state_data_get_packed_length(const bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_data_unpack(bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_pon_operation_unpack(&this->pon_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_set_pon_state_data_bounds_check(const bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_set_pon_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE)) != 0)
    {
        switch (this->pon_state)
        {
            case BCMOLT_PON_OPERATION_INACTIVE:
                break;
            case BCMOLT_PON_OPERATION_ACTIVE_WORKING:
                break;
            case BCMOLT_PON_OPERATION_ACTIVE_STANDBY:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_start_onu_upgrade_data_set_default(bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        this->list_of_onu_ids.len = 0;
        this->list_of_onu_ids.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_data_pack(const bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_pack(&this->list_of_onu_ids, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_start_onu_upgrade_data_get_packed_length(const bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        count += bcmolt_pon_onu_id_list_u32_get_packed_length(&this->list_of_onu_ids);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_data_unpack(bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_unpack(&this->list_of_onu_ids, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_data_bounds_check(const bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_start_onu_upgrade_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS)) != 0)
    {
        if (!bcmolt_pon_onu_id_list_u32_bounds_check(&this->list_of_onu_ids))
        {
            *failed_prop = BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_broadcast_ploam_packet_data_set_default(bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        memset(this->ploam.arr, 0, sizeof(this->ploam.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_data_pack(const bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_pack(&this->ploam, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_broadcast_ploam_packet_data_get_packed_length(const bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        count += 40;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_data_unpack(bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_unpack(&this->ploam, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 40))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_data_bounds_check(const bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_broadcast_ploam_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_bounds_check(&this->ploam))
        {
            *failed_prop = BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_ni_cpu_packets_data_set_default(bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        this->packet_type = BCMOLT_PACKET_TYPE_CPU;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        this->calc_crc = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        this->gem_port_list.len = 0;
        this->gem_port_list.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_data_pack(const bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_pack(this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_xgpon_gem_id_list_u8_max_16_pack(&this->gem_port_list, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_ni_cpu_packets_data_get_packed_length(const bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        count += bcmolt_xgpon_gem_id_list_u8_max_16_get_packed_length(&this->gem_port_list);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_max_2048_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_data_unpack(bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_unpack(&this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_xgpon_gem_id_list_u8_max_16_unpack(&this->gem_port_list, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (!bcmolt_xgpon_gem_id_list_u8_max_16_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_ni_cpu_packets_data_bounds_check(const bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_ni_cpu_packets_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        switch (this->packet_type)
        {
            case BCMOLT_PACKET_TYPE_CPU:
                break;
            case BCMOLT_PACKET_TYPE_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST)) != 0)
    {
        if (this->gem_port_list.len > 16)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_xgpon_gem_id_list_u8_max_16_bounds_check(&this->gem_port_list))
        {
            *failed_prop = BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (this->buffer.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u8_list_u32_max_2048_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_key_set_default(bcmolt_xgpon_onu_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        this->onu_id = (bcmolt_xgpon_onu_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_pack(const bcmolt_xgpon_onu_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_key_get_packed_length(const bcmolt_xgpon_onu_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_unpack(bcmolt_xgpon_onu_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->onu_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_bounds_check(const bcmolt_xgpon_onu_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_ONU_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_ID_ONU_ID)) != 0)
    {
        if (this->onu_id > (bcmolt_xgpon_onu_id) 511)
        {
            *failed_prop = BCMOLT_XGPON_ONU_KEY_ID_ONU_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_cfg_data_set_default(bcmolt_xgpon_onu_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        this->onu_old_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        this->alarm_state.losi = BCMOLT_STATUS_OFF;
        this->alarm_state.lobi = BCMOLT_STATUS_OFF;
        this->alarm_state.lopci = BCMOLT_STATUS_OFF;
        this->alarm_state.lopci_mic_error = BCMOLT_STATUS_OFF;
        this->alarm_state.looci = BCMOLT_STATUS_OFF;
        this->alarm_state.tiwi = BCMOLT_STATUS_OFF;
        this->alarm_state.dowi = BCMOLT_STATUS_OFF;
        this->alarm_state.sufi = BCMOLT_STATUS_OFF;
        this->alarm_state.sfi = BCMOLT_STATUS_OFF;
        this->alarm_state.sdi = BCMOLT_STATUS_OFF;
        this->alarm_state.dfi = BCMOLT_STATUS_OFF;
        this->alarm_state.dgi = BCMOLT_STATUS_OFF;
        this->alarm_state.pqsi = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        memset(this->registration_encryption_keys.ploam_ik.bytes, 0, sizeof(this->registration_encryption_keys.ploam_ik.bytes));
        memset(this->registration_encryption_keys.omci_ik.bytes, 0, sizeof(this->registration_encryption_keys.omci_ik.bytes));
        memset(this->registration_encryption_keys.omci_k1.bytes, 0, sizeof(this->registration_encryption_keys.omci_k1.bytes));
        memset(this->registration_encryption_keys.omci_k2.bytes, 0, sizeof(this->registration_encryption_keys.omci_k2.bytes));
        memset(this->registration_encryption_keys.kek.bytes, 0, sizeof(this->registration_encryption_keys.kek.bytes));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        memset(this->current_encryption_key.encryption_key.bytes, 0, sizeof(this->current_encryption_key.encryption_key.bytes));
        this->current_encryption_key.key_index = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        memset(this->registration_id.arr, 0, sizeof(this->registration_id.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING)) != 0)
    {
        this->registration_id_auto_learning = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        this->ranging_burst_profile = (bcmolt_burst_profile_index) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        this->data_burst_profile = (bcmolt_burst_profile_index) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        this->ranging_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        this->disabled_after_discovery = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        this->deactivation_reason = BCMOLT_DEACTIVATION_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        this->all_gem_ports.len = 0;
        this->all_gem_ports.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        this->all_allocs.len = 0;
        this->all_allocs.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        this->extended_guard_time.additional_preburst_guard_time = 0;
        this->extended_guard_time.additional_postburst_guard_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        this->us_line_rate = BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        memset(this->calibration_record.arr, 0, sizeof(this->calibration_record.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY)) != 0)
    {
        this->tuning_granularity = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME)) != 0)
    {
        this->step_tuning_time = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        this->power_levelling_capabilities = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        this->request_registration_status.request_registration_state = BCMOLT_CONTROL_STATE_DISABLE;
        this->request_registration_status.sma_flag = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_data_pack(const bcmolt_xgpon_onu_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->onu_old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarm_state_pack(&this->alarm_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_pack(&this->registration_encryption_keys, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_pack(&this->current_encryption_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_pack(&this->registration_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->registration_id_auto_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->ranging_burst_profile))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->data_burst_profile))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_status_pack(this->disabled_after_discovery, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_deactivation_reason_pack(this->deactivation_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_256_pack(&this->all_gem_ports, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_xgpon_alloc_with_state_list_u16_max_32_pack(&this->all_allocs, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_pack(&this->extended_guard_time, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        if (!bcmolt_upstream_line_rate_capabilities_pack(this->us_line_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_pack(&this->calibration_record, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tuning_granularity))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->step_tuning_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->power_levelling_capabilities))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_request_registration_status_pack(&this->request_registration_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_cfg_data_get_packed_length(const bcmolt_xgpon_onu_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        count += 13;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        count += 80;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        count += 17;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        count += 36;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        count += bcmolt_xgpon_gem_port_with_state_list_u16_max_256_get_packed_length(&this->all_gem_ports);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        count += bcmolt_xgpon_alloc_with_state_list_u16_max_32_get_packed_length(&this->all_allocs);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_data_unpack(bcmolt_xgpon_onu_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->onu_old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarm_state_unpack(&this->alarm_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_unpack(&this->registration_encryption_keys, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_unpack(&this->current_encryption_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_unpack(&this->registration_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->registration_id_auto_learning))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->ranging_burst_profile))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->data_burst_profile))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ranging_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_status_unpack(&this->disabled_after_discovery, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_deactivation_reason_unpack(&this->deactivation_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_256_unpack(&this->all_gem_ports, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_xgpon_alloc_with_state_list_u16_max_32_unpack(&this->all_allocs, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_unpack(&this->extended_guard_time, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        if (!bcmolt_upstream_line_rate_capabilities_unpack(&this->us_line_rate, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_unpack(&this->calibration_record, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tuning_granularity))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->step_tuning_time))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->power_levelling_capabilities))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_request_registration_status_unpack(&this->request_registration_status, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 13))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 80))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 17))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 36))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_256_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (!bcmolt_xgpon_alloc_with_state_list_u16_max_32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cfg_data_bounds_check(const bcmolt_xgpon_onu_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE)) != 0)
    {
        switch (this->onu_old_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarm_state_bounds_check(&this->alarm_state))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_bounds_check(&this->registration_encryption_keys))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_bounds_check(&this->current_encryption_key))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_bounds_check(&this->registration_id))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE)) != 0)
    {
        if (this->ranging_burst_profile > (bcmolt_burst_profile_index) 3)
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE)) != 0)
    {
        if (this->data_burst_profile > (bcmolt_burst_profile_index) 3)
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) != 0)
    {
        switch (this->disabled_after_discovery)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) != 0)
    {
        switch (this->deactivation_reason)
        {
            case BCMOLT_DEACTIVATION_REASON_NONE:
                break;
            case BCMOLT_DEACTIVATION_REASON_DEACTIVATION:
                break;
            case BCMOLT_DEACTIVATION_REASON_ACK_TIMEOUT:
                break;
            case BCMOLT_DEACTIVATION_REASON_SFI:
                break;
            case BCMOLT_DEACTIVATION_REASON_TIWI:
                break;
            case BCMOLT_DEACTIVATION_REASON_PASSWORD_AUTHENTICATION:
                break;
            case BCMOLT_DEACTIVATION_REASON_ONU_ALARM:
                break;
            case BCMOLT_DEACTIVATION_REASON_LOS:
                break;
            case BCMOLT_DEACTIVATION_REASON_LOKI:
                break;
            case BCMOLT_DEACTIVATION_REASON_RERANGE_FAILURE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) != 0)
    {
        if (this->all_gem_ports.len > 256)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_xgpon_gem_port_with_state_list_u16_max_256_bounds_check(&this->all_gem_ports))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) != 0)
    {
        if (this->all_allocs.len > 32)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_xgpon_alloc_with_state_list_u16_max_32_bounds_check(&this->all_allocs))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME)) != 0)
    {
        if (!bcmolt_extended_guard_time_bounds_check(&this->extended_guard_time))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE)) != 0)
    {
        switch (this->us_line_rate)
        {
            case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G:
                break;
            case BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_10_G:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD)) != 0)
    {
        if (!bcmolt_arr_calibration_record_8_bounds_check(&this->calibration_record))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_request_registration_status_bounds_check(&this->request_registration_status))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_stat_data_set_default(bcmolt_xgpon_onu_stat_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        this->positive_drift = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        this->negative_drift = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION)) != 0)
    {
        this->delimiter_miss_detection = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS)) != 0)
    {
        this->bip32_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS)) != 0)
    {
        this->rx_words = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS)) != 0)
    {
        this->fec_corrected_symbols = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS)) != 0)
    {
        this->fec_corrected_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS)) != 0)
    {
        this->fec_uncorrectable_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        this->fec_codewords = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS)) != 0)
    {
        this->fec_corrected_bits = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS)) != 0)
    {
        this->xgem_key_errors = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS)) != 0)
    {
        this->xgem_loss = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR)) != 0)
    {
        this->rx_ploams_mic_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        this->rx_ploams_non_idle = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        this->rx_omci = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        this->rx_omci_packets_crc_error = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        this->rx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        this->rx_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        this->tx_bytes = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        this->tx_packets = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_data_pack(const bcmolt_xgpon_onu_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->positive_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->negative_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->delimiter_miss_detection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->bip32_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_words))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corrected_symbols))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corrected_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_uncorrectable_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->fec_corrected_bits))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->xgem_key_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->xgem_loss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_mic_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u64(buf, this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_stat_data_get_packed_length(const bcmolt_xgpon_onu_stat_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        count += 8;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_data_unpack(bcmolt_xgpon_onu_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->positive_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->negative_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->delimiter_miss_detection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->bip32_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_words))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corrected_symbols))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corrected_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_uncorrectable_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_codewords))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->fec_corrected_bits))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->xgem_key_errors))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->xgem_loss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_mic_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_ploams_non_idle))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_omci_packets_crc_error))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->rx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_bytes))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u64(buf, &this->tx_packets))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_data_bounds_check(const bcmolt_xgpon_onu_stat_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_stat_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_stat_cfg_data_set_default(bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        this->cfg.trigger.type = BCMOLT_STAT_CONDITION_TYPE_NONE;
        this->cfg.soak.active_soak_time = 0;
        this->cfg.soak.clear_soak_time = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_data_pack(const bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_pack(&this->cfg, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_stat_cfg_data_get_packed_length(const bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        count += bcmolt_stat_alarm_config_get_packed_length(&this->cfg);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_data_unpack(bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_unpack(&this->cfg, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_cfg_data_bounds_check(const bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_stat_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG)) != 0)
    {
        if (!bcmolt_stat_alarm_config_bounds_check(&this->cfg))
        {
            *failed_prop = BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_dfi_data_set_default(bcmolt_xgpon_onu_dfi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_data_pack(const bcmolt_xgpon_onu_dfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_dfi_data_get_packed_length(const bcmolt_xgpon_onu_dfi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_data_unpack(bcmolt_xgpon_onu_dfi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dfi_data_bounds_check(const bcmolt_xgpon_onu_dfi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_dfi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_dgi_data_set_default(bcmolt_xgpon_onu_dgi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_data_pack(const bcmolt_xgpon_onu_dgi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_dgi_data_get_packed_length(const bcmolt_xgpon_onu_dgi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_data_unpack(bcmolt_xgpon_onu_dgi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dgi_data_bounds_check(const bcmolt_xgpon_onu_dgi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_dgi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_dowi_data_set_default(bcmolt_xgpon_onu_dowi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        this->drift_value = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        this->new_eqd = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_data_pack(const bcmolt_xgpon_onu_dowi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->new_eqd))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_dowi_data_get_packed_length(const bcmolt_xgpon_onu_dowi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_data_unpack(bcmolt_xgpon_onu_dowi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->new_eqd))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_dowi_data_bounds_check(const bcmolt_xgpon_onu_dowi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_dowi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_invalid_dbru_report_data_set_default(bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        this->alloc_id = (bcmolt_xgpon_alloc_id) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_data_pack(const bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, (uint16_t) this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_invalid_dbru_report_data_get_packed_length(const bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_data_unpack(bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, (uint16_t *) &this->alloc_id))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_data_bounds_check(const bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_invalid_dbru_report_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID)) != 0)
    {
        if (this->alloc_id > (bcmolt_xgpon_alloc_id) 16383)
        {
            *failed_prop = BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_key_exchange_completed_data_set_default(bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        memset(this->new_key.encryption_key.bytes, 0, sizeof(this->new_key.encryption_key.bytes));
        this->new_key.key_index = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_data_pack(const bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_pack(&this->new_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_key_exchange_completed_data_get_packed_length(const bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        count += 17;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_data_unpack(bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_unpack(&this->new_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 17))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_data_bounds_check(const bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_key_exchange_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY)) != 0)
    {
        if (!bcmolt_xgpon_onu_aes_key_bounds_check(&this->new_key))
        {
            *failed_prop = BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_key_exchange_key_mismatch_data_set_default(bcmolt_xgpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        memset(this->expected_key.bytes, 0, sizeof(this->expected_key.bytes));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        memset(this->received_key.bytes, 0, sizeof(this->received_key.bytes));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_data_pack(const bcmolt_xgpon_onu_key_exchange_key_mismatch_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->expected_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->received_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_key_exchange_key_mismatch_data_get_packed_length(const bcmolt_xgpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        count += 16;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        count += 16;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_data_unpack(bcmolt_xgpon_onu_key_exchange_key_mismatch_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->expected_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->received_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_data_bounds_check(const bcmolt_xgpon_onu_key_exchange_key_mismatch_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_key_exchange_key_mismatch_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->expected_key))
        {
            *failed_prop = BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->received_key))
        {
            *failed_prop = BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_looci_data_set_default(bcmolt_xgpon_onu_looci_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_data_pack(const bcmolt_xgpon_onu_looci_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_looci_data_get_packed_length(const bcmolt_xgpon_onu_looci_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_data_unpack(bcmolt_xgpon_onu_looci_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_looci_data_bounds_check(const bcmolt_xgpon_onu_looci_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_looci_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_activation_completed_data_set_default(bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_ACTIVATION_FAIL_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        memset(this->registration_id.arr, 0, sizeof(this->registration_id.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        memset(this->registration_encryption_keys.ploam_ik.bytes, 0, sizeof(this->registration_encryption_keys.ploam_ik.bytes));
        memset(this->registration_encryption_keys.omci_ik.bytes, 0, sizeof(this->registration_encryption_keys.omci_ik.bytes));
        memset(this->registration_encryption_keys.omci_k1.bytes, 0, sizeof(this->registration_encryption_keys.omci_k1.bytes));
        memset(this->registration_encryption_keys.omci_k2.bytes, 0, sizeof(this->registration_encryption_keys.omci_k2.bytes));
        memset(this->registration_encryption_keys.kek.bytes, 0, sizeof(this->registration_encryption_keys.kek.bytes));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_data_pack(const bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_activation_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_pack(&this->registration_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_pack(&this->registration_encryption_keys, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_activation_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        count += 36;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        count += 80;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_data_unpack(bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_activation_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_unpack(&this->registration_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_unpack(&this->registration_encryption_keys, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 36))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 80))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_activation_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_ACTIVATION_FAIL_REASON_NONE:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_RANGING:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_LOS:
                break;
            case BCMOLT_ACTIVATION_FAIL_REASON_ONU_ALARM:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_bounds_check(&this->registration_id))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS)) != 0)
    {
        if (!bcmolt_xgpon_onu_registration_keys_bounds_check(&this->registration_encryption_keys))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_alarm_data_set_default(bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        this->onu_alarm.losi = BCMOLT_STATUS_OFF;
        this->onu_alarm.lobi = BCMOLT_STATUS_OFF;
        this->onu_alarm.lopci_miss = BCMOLT_STATUS_OFF;
        this->onu_alarm.lopci_mic_error = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_data_pack(const bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_pack(&this->onu_alarm, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_alarm_data_get_packed_length(const bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_data_unpack(bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_unpack(&this->onu_alarm, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_alarm_data_bounds_check(const bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_alarm_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_xgpon_onu_alarms_bounds_check(&this->onu_alarm))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_deactivation_completed_data_set_default(bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_data_pack(const bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_deactivation_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_data_unpack(bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_deactivation_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_disable_completed_data_set_default(bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_data_pack(const bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_disable_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_data_unpack(bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_disable_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_enable_completed_data_set_default(bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        memset(this->serial_number.vendor_id, 0, sizeof(this->serial_number.vendor_id));
        memset(this->serial_number.vendor_specific, 0, sizeof(this->serial_number.vendor_specific));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_data_pack(const bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_pack(&this->serial_number, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_enable_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        count += 8;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_data_unpack(bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_unpack(&this->serial_number, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 8))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_enable_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER)) != 0)
    {
        if (!bcmolt_serial_number_bounds_check(&this->serial_number))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_tuning_in_completed_data_set_default(bcmolt_xgpon_onu_onu_tuning_in_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_TUNE_IN_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_data_pack(const bcmolt_xgpon_onu_onu_tuning_in_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_tune_in_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_tuning_in_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_tuning_in_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_data_unpack(bcmolt_xgpon_onu_onu_tuning_in_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_tune_in_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_tuning_in_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_tuning_in_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_TUNE_IN_FAIL_REASON_NONE:
                break;
            case BCMOLT_TUNE_IN_FAIL_REASON_NO_TUNING_RESPONSE_PLOAM_RECEIVED:
                break;
            case BCMOLT_TUNE_IN_FAIL_REASON_ONU_ACTIVATION_FAILED:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_tuning_out_completed_data_set_default(bcmolt_xgpon_onu_onu_tuning_out_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_TUNE_OUT_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_data_pack(const bcmolt_xgpon_onu_onu_tuning_out_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_tune_out_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_tuning_out_completed_data_get_packed_length(const bcmolt_xgpon_onu_onu_tuning_out_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_data_unpack(bcmolt_xgpon_onu_onu_tuning_out_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_tune_out_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_data_bounds_check(const bcmolt_xgpon_onu_onu_tuning_out_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_tuning_out_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_TUNE_OUT_FAIL_REASON_NONE:
                break;
            case BCMOLT_TUNE_OUT_FAIL_REASON_NACK_PLOAM_RECEIVED:
                break;
            case BCMOLT_TUNE_OUT_FAIL_REASON_NO_TUNING_RESPONSE_PLOAM_RECEIVED:
                break;
            case BCMOLT_TUNE_OUT_FAIL_REASON_TSOURCE_TIMEOUT:
                break;
            case BCMOLT_TUNE_OUT_FAIL_REASON_ROLLBACK_REQUEST:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_possible_drift_data_set_default(bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        this->estimated_drift = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_data_pack(const bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->estimated_drift))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_possible_drift_data_get_packed_length(const bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_data_unpack(bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->estimated_drift))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_possible_drift_data_bounds_check(const bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_possible_drift_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_power_consumption_report_data_set_default(bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        memset(this->power_consumption_report.arr, 0, sizeof(this->power_consumption_report.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_data_pack(const bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_arr_power_consumption_channel_report_8_pack(&this->power_consumption_report, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_power_consumption_report_data_get_packed_length(const bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        count += 32;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_data_unpack(bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_arr_power_consumption_channel_report_8_unpack(&this->power_consumption_report, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 32))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_consumption_report_data_bounds_check(const bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_power_consumption_report_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_arr_power_consumption_channel_report_8_bounds_check(&this->power_consumption_report))
        {
            *failed_prop = BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_power_level_report_data_set_default(bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION)) != 0)
    {
        this->attenuation = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY)) != 0)
    {
        this->power_levelling_capability = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_data_pack(const bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->power_levelling_capability))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_power_level_report_data_get_packed_length(const bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_data_unpack(bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->power_levelling_capability))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_level_report_data_bounds_check(const bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_power_level_report_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_power_management_state_change_data_set_default(bcmolt_xgpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        this->old_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        this->new_state = BCMOLT_ONU_STATE_NOT_CONFIGURED;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        this->reason = BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_ENABLED;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_data_pack(const bcmolt_xgpon_onu_power_management_state_change_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_onu_state_pack(this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_power_management_transition_reason_pack(this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_power_management_state_change_data_get_packed_length(const bcmolt_xgpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_data_unpack(bcmolt_xgpon_onu_power_management_state_change_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->old_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_onu_state_unpack(&this->new_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_power_management_transition_reason_unpack(&this->reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_power_management_state_change_data_bounds_check(const bcmolt_xgpon_onu_power_management_state_change_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_power_management_state_change_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE)) != 0)
    {
        switch (this->old_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE)) != 0)
    {
        switch (this->new_state)
        {
            case BCMOLT_ONU_STATE_NOT_CONFIGURED:
                break;
            case BCMOLT_ONU_STATE_INACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE:
                break;
            case BCMOLT_ONU_STATE_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_STATE_DISABLED:
                break;
            case BCMOLT_ONU_STATE_AWAKE_FREE:
                break;
            case BCMOLT_ONU_STATE_PROCESSING:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_DOZE:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_SLEEP:
                break;
            case BCMOLT_ONU_STATE_LOW_POWER_WATCH:
                break;
            case BCMOLT_ONU_STATE_UNAWARE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON)) != 0)
    {
        switch (this->reason)
        {
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_ENABLED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_DISABLED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_AWAKE:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_DOZE:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_SLEEP:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_WATCH:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TERI_EXPIRED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TALERTED_EXPIRED:
                break;
            case BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_ALARM:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_pqsi_data_set_default(bcmolt_xgpon_onu_pqsi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_data_pack(const bcmolt_xgpon_onu_pqsi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_pqsi_data_get_packed_length(const bcmolt_xgpon_onu_pqsi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_data_unpack(bcmolt_xgpon_onu_pqsi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_pqsi_data_bounds_check(const bcmolt_xgpon_onu_pqsi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_pqsi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_ranging_completed_data_set_default(bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_RANGING_FAIL_REASON_NONE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        this->eqd = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        this->number_of_ploams = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        this->power_level = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_data_pack(const bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_ranging_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->eqd))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->power_level))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_ranging_completed_data_get_packed_length(const bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_data_unpack(bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_ranging_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->eqd))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_ploams))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->power_level))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ranging_completed_data_bounds_check(const bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_ranging_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_RANGING_FAIL_REASON_NONE:
                break;
            case BCMOLT_RANGING_FAIL_REASON_RANGING_ACK_TIMEOUT:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_DATA_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_TYPE_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_PLOAM_ONU_ID_MISMATCH:
                break;
            case BCMOLT_RANGING_FAIL_REASON_DRIFT_EXCEEDED:
                break;
            case BCMOLT_RANGING_FAIL_REASON_NO_PLOAM_RECEIVED:
                break;
            case BCMOLT_RANGING_FAIL_REASON_LOS:
                break;
            case BCMOLT_RANGING_FAIL_REASON_ALARMS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_registration_id_data_set_default(bcmolt_xgpon_onu_registration_id_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        memset(this->registration_id.arr, 0, sizeof(this->registration_id.arr));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        this->request_registration_status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        this->request_registration_fail_reason = BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_data_pack(const bcmolt_xgpon_onu_registration_id_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_pack(&this->registration_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->request_registration_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        if (!bcmolt_request_registration_fail_reason_pack(this->request_registration_fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_registration_id_data_get_packed_length(const bcmolt_xgpon_onu_registration_id_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        count += 36;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_data_unpack(bcmolt_xgpon_onu_registration_id_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_unpack(&this->registration_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->request_registration_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        if (!bcmolt_request_registration_fail_reason_unpack(&this->request_registration_fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 36))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_registration_id_data_bounds_check(const bcmolt_xgpon_onu_registration_id_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_registration_id_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_arr_u8_36_bounds_check(&this->registration_id))
        {
            *failed_prop = BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS)) != 0)
    {
        switch (this->request_registration_status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON)) != 0)
    {
        switch (this->request_registration_fail_reason)
        {
            case BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_NONE:
                break;
            case BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_REGISTRATION_PLOAM_TIMEOUT:
                break;
            case BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_ONU_ALARM:
                break;
            case BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_DEACTIVATION:
                break;
            case BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_DISABLE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_rssi_measurement_completed_data_set_default(bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NONE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_data_pack(const bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_rssi_measurement_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_rssi_measurement_completed_data_get_packed_length(const bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_data_unpack(bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_rssi_measurement_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_data_bounds_check(const bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_rssi_measurement_completed_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NONE:
                break;
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_DELIMITER:
                break;
            case BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_ACCESS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_sdi_data_set_default(bcmolt_xgpon_onu_sdi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_BER)) != 0)
    {
        this->ber = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_data_pack(const bcmolt_xgpon_onu_sdi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_sdi_data_get_packed_length(const bcmolt_xgpon_onu_sdi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_BER)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_data_unpack(bcmolt_xgpon_onu_sdi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sdi_data_bounds_check(const bcmolt_xgpon_onu_sdi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_sdi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_set_default(bcmolt_xgpon_onu_secure_mutual_authentication_failure_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_RESULT_SUCCESS;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        this->fail_reason = BCMOLT_SECURE_MUTUAL_AUTHENTICATION_FAIL_REASON_TIMEOUT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_pack(const bcmolt_xgpon_onu_secure_mutual_authentication_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_secure_mutual_authentication_fail_reason_pack(this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_get_packed_length(const bcmolt_xgpon_onu_secure_mutual_authentication_failure_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_failure_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        if (!bcmolt_result_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_secure_mutual_authentication_fail_reason_unpack(&this->fail_reason, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_bounds_check(const bcmolt_xgpon_onu_secure_mutual_authentication_failure_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_secure_mutual_authentication_failure_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON)) != 0)
    {
        switch (this->fail_reason)
        {
            case BCMOLT_SECURE_MUTUAL_AUTHENTICATION_FAIL_REASON_TIMEOUT:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_sfi_data_set_default(bcmolt_xgpon_onu_sfi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_BER)) != 0)
    {
        this->ber = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_data_pack(const bcmolt_xgpon_onu_sfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_sfi_data_get_packed_length(const bcmolt_xgpon_onu_sfi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_BER)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_data_unpack(bcmolt_xgpon_onu_sfi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->ber))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_BER)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sfi_data_bounds_check(const bcmolt_xgpon_onu_sfi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_sfi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_stat_alarm_cleared_data_set_default(bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_data_pack(const bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_onu_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_stat_alarm_cleared_data_get_packed_length(const bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_data_unpack(bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_onu_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_data_bounds_check(const bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_stat_alarm_cleared_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_stat_alarm_raised_data_set_default(bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        this->stat = BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_data_pack(const bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_onu_stat_id_pack(this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_stat_alarm_raised_data_get_packed_length(const bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        count += 2;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_data_unpack(bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_xgpon_onu_stat_id_unpack(&this->stat, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_data_bounds_check(const bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_stat_alarm_raised_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT)) != 0)
    {
        switch (this->stat)
        {
            case BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES:
                break;
            case BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_sufi_data_set_default(bcmolt_xgpon_onu_sufi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_data_pack(const bcmolt_xgpon_onu_sufi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_sufi_data_get_packed_length(const bcmolt_xgpon_onu_sufi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_data_unpack(bcmolt_xgpon_onu_sufi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_sufi_data_bounds_check(const bcmolt_xgpon_onu_sufi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_sufi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_tiwi_data_set_default(bcmolt_xgpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        this->alarm_status = BCMOLT_STATUS_OFF;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        this->drift_value = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_data_pack(const bcmolt_xgpon_onu_tiwi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_write_s32(buf, this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_tiwi_data_get_packed_length(const bcmolt_xgpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_data_unpack(bcmolt_xgpon_onu_tiwi_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->alarm_status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_read_s32(buf, &this->drift_value))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tiwi_data_bounds_check(const bcmolt_xgpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_tiwi_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS)) != 0)
    {
        switch (this->alarm_status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_tuning_response_data_set_default(bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK)) != 0)
    {
        this->ack = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        this->result = BCMOLT_RESULT_SUCCESS;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_data_pack(const bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ack))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_pack(this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_tuning_response_data_get_packed_length(const bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_data_unpack(bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ack))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        if (!bcmolt_result_unpack(&this->result, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_tuning_response_data_bounds_check(const bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_tuning_response_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT)) != 0)
    {
        switch (this->result)
        {
            case BCMOLT_RESULT_SUCCESS:
                break;
            case BCMOLT_RESULT_FAIL:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_auto_cfg_data_set_default(bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        this->dfi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        this->dgi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        this->dowi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        this->invalid_dbru_report = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        this->key_exchange_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        this->key_exchange_cycle_skipped = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        this->key_exchange_key_mismatch = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        this->key_exchange_key_request_timeout = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI)) != 0)
    {
        this->looci = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        this->onu_activation_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        this->onu_alarm = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        this->onu_deactivation_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        this->onu_disable_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        this->onu_enable_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED)) != 0)
    {
        this->onu_tuning_in_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED)) != 0)
    {
        this->onu_tuning_out_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        this->optical_reflection = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        this->possible_drift = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        this->power_consumption_report = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT)) != 0)
    {
        this->power_level_report = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        this->power_management_state_change = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI)) != 0)
    {
        this->pqsi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        this->ranging_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID)) != 0)
    {
        this->registration_id = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        this->rssi_measurement_completed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        this->sdi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE)) != 0)
    {
        this->secure_mutual_authentication_failure = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        this->sfi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        this->stat_alarm_cleared = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        this->stat_alarm_raised = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        this->sufi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        this->tiwi = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE)) != 0)
    {
        this->tuning_response = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_data_pack(const bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dgi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->dowi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->invalid_dbru_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_cycle_skipped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_key_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->key_exchange_key_request_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->looci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_activation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_alarm))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_deactivation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_disable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_enable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_tuning_in_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->onu_tuning_out_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->optical_reflection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->possible_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->power_consumption_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->power_level_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->power_management_state_change))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->pqsi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->ranging_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->registration_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sdi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->secure_mutual_authentication_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sufi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tiwi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->tuning_response))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_auto_cfg_data_get_packed_length(const bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_data_unpack(bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dgi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->dowi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->invalid_dbru_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_cycle_skipped))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_key_mismatch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->key_exchange_key_request_timeout))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->looci))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_activation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_alarm))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_deactivation_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_disable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_enable_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_tuning_in_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->onu_tuning_out_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->optical_reflection))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->possible_drift))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->power_consumption_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->power_level_report))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->power_management_state_change))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->pqsi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->ranging_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->registration_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rssi_measurement_completed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sdi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->secure_mutual_authentication_failure))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sfi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_cleared))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->stat_alarm_raised))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sufi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tiwi))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->tuning_response))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_auto_cfg_data_bounds_check(const bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_auto_cfg_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_adjust_tx_wavelength_data_set_default(bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        this->frequency_adjustment_direction = BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_LOWER;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        this->frequency_adjustment_size = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_data_pack(const bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_frequency_adjustment_direction_pack(this->frequency_adjustment_direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->frequency_adjustment_size))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_adjust_tx_wavelength_data_get_packed_length(const bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_data_unpack(bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_frequency_adjustment_direction_unpack(&this->frequency_adjustment_direction, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->frequency_adjustment_size))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_data_bounds_check(const bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_adjust_tx_wavelength_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION)) != 0)
    {
        switch (this->frequency_adjustment_direction)
        {
            case BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_LOWER:
                break;
            case BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_HIGHER:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_change_power_levelling_data_set_default(bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        this->control = BCMOLT_POWER_LEVELLING_CONTROL_DIRECT;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION)) != 0)
    {
        this->attenuation = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_data_pack(const bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        if (!bcmolt_power_levelling_control_pack(this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_change_power_levelling_data_get_packed_length(const bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_data_unpack(bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        if (!bcmolt_power_levelling_control_unpack(&this->control, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->attenuation))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_change_power_levelling_data_bounds_check(const bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_change_power_levelling_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL)) != 0)
    {
        switch (this->control)
        {
            case BCMOLT_POWER_LEVELLING_CONTROL_DIRECT:
                break;
            case BCMOLT_POWER_LEVELLING_CONTROL_DECREASE:
                break;
            case BCMOLT_POWER_LEVELLING_CONTROL_INCREASE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_onu_tuning_out_data_set_default(bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        this->target_ds_pon_id.administrative_label = 0;
        this->target_ds_pon_id.dwlch_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        this->target_us_pon_id.administrative_label = 0;
        this->target_us_pon_id.dwlch_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        this->time_to_switch = 500;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK)) != 0)
    {
        this->rollback = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        this->status = BCMOLT_STATUS_OFF;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_data_pack(const bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_pack(&this->target_ds_pon_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_pack(&this->target_us_pon_id, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->time_to_switch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->rollback))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_pack(this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_onu_tuning_out_data_get_packed_length(const bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        count += 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_data_unpack(bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_unpack(&this->target_ds_pon_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_unpack(&this->target_us_pon_id, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->time_to_switch))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->rollback))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        if (!bcmolt_status_unpack(&this->status, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_data_bounds_check(const bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_onu_tuning_out_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_bounds_check(&this->target_ds_pon_id))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID)) != 0)
    {
        if (!bcmolt_pon_id_bounds_check(&this->target_us_pon_id))
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH)) != 0)
    {
        if (this->time_to_switch < 500)
        {
            *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS)) != 0)
    {
        switch (this->status)
        {
            case BCMOLT_STATUS_OFF:
                break;
            case BCMOLT_STATUS_ON:
                break;
            case BCMOLT_STATUS_NO_CHANGE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_request_registration_data_set_default(bcmolt_xgpon_onu_request_registration_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG)) != 0)
    {
        this->sma_flag = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_data_pack(const bcmolt_xgpon_onu_request_registration_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->sma_flag))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_request_registration_data_get_packed_length(const bcmolt_xgpon_onu_request_registration_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_data_unpack(bcmolt_xgpon_onu_request_registration_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->sma_flag))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_request_registration_data_bounds_check(const bcmolt_xgpon_onu_request_registration_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_request_registration_id *failed_prop)
{
    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_secure_mutual_authentication_data_set_default(bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        memset(this->master_key.bytes, 0, sizeof(this->master_key.bytes));
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC)) != 0)
    {
        this->mic = 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_data_pack(const bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        if (!bcmolt_aes_key_pack(&this->master_key, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->mic))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_secure_mutual_authentication_data_get_packed_length(const bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        count += 16;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_max_2048_get_packed_length(&this->buffer);
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC)) != 0)
    {
        count += 4;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_data_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        if (!bcmolt_aes_key_unpack(&this->master_key, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->mic))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 16))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_data_bounds_check(const bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_secure_mutual_authentication_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY)) != 0)
    {
        if (!bcmolt_aes_key_bounds_check(&this->master_key))
        {
            *failed_prop = BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER)) != 0)
    {
        if (this->buffer.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u8_list_u32_max_2048_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_set_onu_state_data_set_default(bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        this->onu_state = BCMOLT_ONU_OPERATION_INACTIVE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_data_pack(const bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_pack(this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_set_onu_state_data_get_packed_length(const bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_data_unpack(bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_onu_operation_unpack(&this->onu_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_set_onu_state_data_bounds_check(const bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_set_onu_state_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE)) != 0)
    {
        switch (this->onu_state)
        {
            case BCMOLT_ONU_OPERATION_INACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE:
                break;
            case BCMOLT_ONU_OPERATION_DISABLE:
                break;
            case BCMOLT_ONU_OPERATION_ENABLE:
                break;
            case BCMOLT_ONU_OPERATION_ACTIVE_STANDBY:
                break;
            case BCMOLT_ONU_OPERATION_AWAKE_FREE:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_cpu_packets_data_set_default(bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        this->packet_type = BCMOLT_PACKET_TYPE_CPU;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        this->calc_crc = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        this->number_of_packets = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_data_pack(const bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_pack(this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->number_of_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_cpu_packets_data_get_packed_length(const bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_max_2048_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_data_unpack(bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_packet_type_unpack(&this->packet_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->calc_crc))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->number_of_packets))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_max_2048_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packets_data_bounds_check(const bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_cpu_packets_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE)) != 0)
    {
        switch (this->packet_type)
        {
            case BCMOLT_PACKET_TYPE_CPU:
                break;
            case BCMOLT_PACKET_TYPE_OMCI:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS)) != 0)
    {
        if (this->number_of_packets > 32)
        {
            *failed_prop = BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE)) != 0)
    {
        if (this->packet_size > 2000)
        {
            *failed_prop = BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER)) != 0)
    {
        if (this->buffer.len > 2048)
        {
            return BCMOS_FALSE;
        }

        if (!bcmolt_u8_list_u32_max_2048_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_ploam_packet_data_set_default(bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY)) != 0)
    {
        this->default_key = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        memset(this->ploam.arr, 0, sizeof(this->ploam.arr));
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_data_pack(const bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->default_key))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_pack(&this->ploam, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_ploam_packet_data_get_packed_length(const bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        count += 40;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_data_unpack(bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->default_key))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_unpack(&this->ploam, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 40))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_ploam_packet_data_bounds_check(const bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_ploam_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM)) != 0)
    {
        if (!bcmolt_arr_u8_40_bounds_check(&this->ploam))
        {
            *failed_prop = BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_cpu_packet_data_set_default(bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        this->port_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        this->crc_ok = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_data_pack(const bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_cpu_packet_data_get_packed_length(const bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_data_unpack(bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_cpu_packet_data_bounds_check(const bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_cpu_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_onu_omci_packet_data_set_default(bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        this->port_id = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        this->crc_ok = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        this->packet_size = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        this->buffer.len = 0;
        this->buffer.val = NULL;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_data_pack(const bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_write_u16(buf, this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_write_u32(buf, this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_pack(&this->buffer, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_onu_omci_packet_data_get_packed_length(const bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        count += bcmolt_u8_list_u32_get_packed_length(&this->buffer);
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_data_unpack(bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_read_u16(buf, &this->port_id))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->crc_ok))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_read_u32(buf, &this->packet_size))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_unpack(&this->buffer, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_scan(packed, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_onu_omci_packet_data_bounds_check(const bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_onu_omci_packet_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER)) != 0)
    {
        if (!bcmolt_u8_list_u32_bounds_check(&this->buffer))
        {
            *failed_prop = BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_trx_key_set_default(bcmolt_xgpon_trx_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_xgpon_ni) 0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_pack(const bcmolt_xgpon_trx_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_trx_key_get_packed_length(const bcmolt_xgpon_trx_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_unpack(bcmolt_xgpon_trx_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_key_bounds_check(const bcmolt_xgpon_trx_key *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_trx_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_xgpon_ni) 7)
        {
            *failed_prop = BCMOLT_XGPON_TRX_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xgpon_trx_cfg_data_set_default(bcmolt_xgpon_trx_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        this->burst_profile.arr[0].profile_version = 0;
        this->burst_profile.arr[0].is_fec_on = BCMOS_FALSE;
        this->burst_profile.arr[0].delimiter_size_in_bytes = 8;
        this->burst_profile.arr[0].delimiter_pattern_high = 3015562000UL;
        this->burst_profile.arr[0].delimiter_pattern_low = 2999259041UL;
        this->burst_profile.arr[0].preamble_length_in_bytes = 8;
        this->burst_profile.arr[0].preamble_repeats_count = 20;
        this->burst_profile.arr[0].preamble_pattern_high = 2863311530UL;
        this->burst_profile.arr[0].preamble_pattern_low = 2863311530UL;
        this->burst_profile.arr[0].pon_tag = 0;
        this->burst_profile.arr[0].num_of_guard_bytes = 16;
        this->burst_profile.arr[0].is_profile_valid = BCMOS_TRUE;
        this->burst_profile.arr[0].burst_overhead_size_in_words = 78;
        this->burst_profile.arr[1].profile_version = 0;
        this->burst_profile.arr[1].is_fec_on = BCMOS_FALSE;
        this->burst_profile.arr[1].delimiter_size_in_bytes = 8;
        this->burst_profile.arr[1].delimiter_pattern_high = 3015562000UL;
        this->burst_profile.arr[1].delimiter_pattern_low = 2999259041UL;
        this->burst_profile.arr[1].preamble_length_in_bytes = 8;
        this->burst_profile.arr[1].preamble_repeats_count = 9;
        this->burst_profile.arr[1].preamble_pattern_high = 2863311530UL;
        this->burst_profile.arr[1].preamble_pattern_low = 2863311530UL;
        this->burst_profile.arr[1].pon_tag = 0;
        this->burst_profile.arr[1].num_of_guard_bytes = 16;
        this->burst_profile.arr[1].is_profile_valid = BCMOS_TRUE;
        this->burst_profile.arr[1].burst_overhead_size_in_words = 56;
        this->burst_profile.arr[2].profile_version = 0;
        this->burst_profile.arr[2].is_fec_on = BCMOS_TRUE;
        this->burst_profile.arr[2].delimiter_size_in_bytes = 8;
        this->burst_profile.arr[2].delimiter_pattern_high = 3015562000UL;
        this->burst_profile.arr[2].delimiter_pattern_low = 2999259041UL;
        this->burst_profile.arr[2].preamble_length_in_bytes = 8;
        this->burst_profile.arr[2].preamble_repeats_count = 20;
        this->burst_profile.arr[2].preamble_pattern_high = 2863311530UL;
        this->burst_profile.arr[2].preamble_pattern_low = 2863311530UL;
        this->burst_profile.arr[2].pon_tag = 0;
        this->burst_profile.arr[2].num_of_guard_bytes = 16;
        this->burst_profile.arr[2].is_profile_valid = BCMOS_TRUE;
        this->burst_profile.arr[2].burst_overhead_size_in_words = 78;
        this->burst_profile.arr[3].profile_version = 0;
        this->burst_profile.arr[3].is_fec_on = BCMOS_TRUE;
        this->burst_profile.arr[3].delimiter_size_in_bytes = 8;
        this->burst_profile.arr[3].delimiter_pattern_high = 3015562000UL;
        this->burst_profile.arr[3].delimiter_pattern_low = 2999259041UL;
        this->burst_profile.arr[3].preamble_length_in_bytes = 8;
        this->burst_profile.arr[3].preamble_repeats_count = 9;
        this->burst_profile.arr[3].preamble_pattern_high = 2863311530UL;
        this->burst_profile.arr[3].preamble_pattern_low = 2863311530UL;
        this->burst_profile.arr[3].pon_tag = 0;
        this->burst_profile.arr[3].num_of_guard_bytes = 16;
        this->burst_profile.arr[3].is_profile_valid = BCMOS_TRUE;
        this->burst_profile.arr[3].burst_overhead_size_in_words = 56;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        this->transceiver_config.arr[0].trx_reset_pattern_first = 0;
        this->transceiver_config.arr[0].trx_reset_pattern_middle = 4294967295UL;
        this->transceiver_config.arr[0].trx_reset_pattern_last = 0;
        this->transceiver_config.arr[0].trx_reset_middle_repeats_count = 4;
        this->transceiver_config.arr[0].trx_reset_location = 0;
        this->transceiver_config.arr[0].trx_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[0].bcdr_reset_pattern_first = 0;
        this->transceiver_config.arr[0].bcdr_reset_pattern_middle = 255;
        this->transceiver_config.arr[0].bcdr_reset_pattern_last = 0;
        this->transceiver_config.arr[0].bcdr_reset_middle_repeats_count = 1;
        this->transceiver_config.arr[0].bcdr_reset_location = 20;
        this->transceiver_config.arr[0].bcdr_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[1].trx_reset_pattern_first = 0;
        this->transceiver_config.arr[1].trx_reset_pattern_middle = 4294967295UL;
        this->transceiver_config.arr[1].trx_reset_pattern_last = 0;
        this->transceiver_config.arr[1].trx_reset_middle_repeats_count = 4;
        this->transceiver_config.arr[1].trx_reset_location = 33;
        this->transceiver_config.arr[1].trx_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[1].bcdr_reset_pattern_first = 0;
        this->transceiver_config.arr[1].bcdr_reset_pattern_middle = 255;
        this->transceiver_config.arr[1].bcdr_reset_pattern_last = 0;
        this->transceiver_config.arr[1].bcdr_reset_middle_repeats_count = 1;
        this->transceiver_config.arr[1].bcdr_reset_location = 23;
        this->transceiver_config.arr[1].bcdr_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[2].trx_reset_pattern_first = 0;
        this->transceiver_config.arr[2].trx_reset_pattern_middle = 4294967295UL;
        this->transceiver_config.arr[2].trx_reset_pattern_last = 0;
        this->transceiver_config.arr[2].trx_reset_middle_repeats_count = 4;
        this->transceiver_config.arr[2].trx_reset_location = 0;
        this->transceiver_config.arr[2].trx_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[2].bcdr_reset_pattern_first = 0;
        this->transceiver_config.arr[2].bcdr_reset_pattern_middle = 255;
        this->transceiver_config.arr[2].bcdr_reset_pattern_last = 0;
        this->transceiver_config.arr[2].bcdr_reset_middle_repeats_count = 1;
        this->transceiver_config.arr[2].bcdr_reset_location = 20;
        this->transceiver_config.arr[2].bcdr_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[3].trx_reset_pattern_first = 0;
        this->transceiver_config.arr[3].trx_reset_pattern_middle = 4294967295UL;
        this->transceiver_config.arr[3].trx_reset_pattern_last = 0;
        this->transceiver_config.arr[3].trx_reset_middle_repeats_count = 4;
        this->transceiver_config.arr[3].trx_reset_location = 33;
        this->transceiver_config.arr[3].trx_reset_polarity = BCMOS_FALSE;
        this->transceiver_config.arr[3].bcdr_reset_pattern_first = 0;
        this->transceiver_config.arr[3].bcdr_reset_pattern_middle = 255;
        this->transceiver_config.arr[3].bcdr_reset_pattern_last = 0;
        this->transceiver_config.arr[3].bcdr_reset_middle_repeats_count = 1;
        this->transceiver_config.arr[3].bcdr_reset_location = 23;
        this->transceiver_config.arr[3].bcdr_reset_polarity = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        this->transceiver_type = BCMOLT_XGPON_TRX_TYPE_LTH_7222_PC;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        this->debug.rx_reversed_polarity = BCMOLT_CONTROL_STATE_DISABLE;
        this->debug.neg_out_bit = BCMOLT_CONTROL_STATE_DISABLE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        this->rssi_normal_config.polarity = BCMOLT_POLARITY_LOW;
        this->rssi_normal_config.location = 35;
        this->rssi_normal_config.location_sign = BCMOLT_SIGN_POSITIVE;
        this->rssi_normal_config.pulse_width = 80;
        this->rssi_normal_config.minimum_burst = 200;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        this->rssi_ranging_config.start_on_ed = BCMOS_TRUE;
        this->rssi_ranging_config.frame_delay = 0;
        this->rssi_ranging_config.word_delay = 20;
        this->rssi_ranging_config.frame_delay_after_ed = 0;
        this->rssi_ranging_config.word_delay_after_ed = 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        this->serdes_configuration.multi_ed_mode = BCMOS_FALSE;
        this->serdes_configuration.ranging_mode = BCMOLT_XGPON_SERDES_RANGING_MODE_BCDR;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        this->burst_profile_delimiter_max_errors.arr[0] = 7;
        this->burst_profile_delimiter_max_errors.arr[1] = 7;
        this->burst_profile_delimiter_max_errors.arr[2] = 7;
        this->burst_profile_delimiter_max_errors.arr[3] = 7;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        this->ranging_sm_patterns_at_init.trx_reset_pattern_first = 4294967295UL;
        this->ranging_sm_patterns_at_init.trx_reset_pattern_middle = 4294967295UL;
        this->ranging_sm_patterns_at_init.trx_reset_pattern_last = 4294967295UL;
        this->ranging_sm_patterns_at_init.trx_reset_middle_repeats = 8;
        this->ranging_sm_patterns_at_init.trx_reset_location = 2;
        this->ranging_sm_patterns_at_init.bcdr_reset_pattern_first = 4294967295UL;
        this->ranging_sm_patterns_at_init.bcdr_reset_pattern_middle = 4294967295UL;
        this->ranging_sm_patterns_at_init.bcdr_reset_pattern_last = 4294967295UL;
        this->ranging_sm_patterns_at_init.bcdr_reset_middle_repeats = 4;
        this->ranging_sm_patterns_at_init.bcdr_reset_location = 2;
        this->ranging_sm_patterns_at_init.bcdr_reset_polarity = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        this->ranging_sm_patterns_ed_failure.trx_reset_pattern_first = 0;
        this->ranging_sm_patterns_ed_failure.trx_reset_pattern_middle = 0;
        this->ranging_sm_patterns_ed_failure.trx_reset_pattern_last = 0;
        this->ranging_sm_patterns_ed_failure.trx_reset_middle_repeats = 0;
        this->ranging_sm_patterns_ed_failure.trx_reset_location = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_pattern_first = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_pattern_middle = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_pattern_last = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_middle_repeats = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_location = 0;
        this->ranging_sm_patterns_ed_failure.bcdr_reset_polarity = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS)) != 0)
    {
        this->reset_on_del_miss = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        this->ed_state.reset_on_ed_fail = BCMOS_FALSE;
        this->ed_state.reset_on_ed_success = BCMOS_TRUE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED)) != 0)
    {
        this->invert_ed = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET)) != 0)
    {
        this->end_of_burst_reset = BCMOS_FALSE;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY)) != 0)
    {
        this->trx_rst_polarity = BCMOS_FALSE;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_data_pack(const bcmolt_xgpon_trx_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_arr_xgpon_burst_profile_4_pack(&this->burst_profile, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        if (!bcmolt_arr_xgpon_trx_configuration_4_pack(&this->transceiver_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_xgpon_trx_type_pack(this->transceiver_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_trx_debug_pack(&this->debug, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_normal_config_pack(&this->rssi_normal_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_ranging_config_pack(&this->rssi_ranging_config, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_xgpon_serdes_configuration_pack(&this->serdes_configuration, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        if (!bcmolt_arr_u8_4_pack(&this->burst_profile_delimiter_max_errors, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_pack(&this->ranging_sm_patterns_at_init, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_pack(&this->ranging_sm_patterns_ed_failure, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->reset_on_del_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        if (!bcmolt_xgpon_ed_state_pack(&this->ed_state, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->invert_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->end_of_burst_reset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY)) != 0)
    {
        if (!bcmolt_buf_write_bool(buf, this->trx_rst_polarity))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xgpon_trx_cfg_data_get_packed_length(const bcmolt_xgpon_trx_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        count += 152;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        count += 124;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        count += 7;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        count += 4;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        count += 29;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        count += 29;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        count += 2;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_data_unpack(bcmolt_xgpon_trx_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_arr_xgpon_burst_profile_4_unpack(&this->burst_profile, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        if (!bcmolt_arr_xgpon_trx_configuration_4_unpack(&this->transceiver_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_xgpon_trx_type_unpack(&this->transceiver_type, buf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_trx_debug_unpack(&this->debug, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_normal_config_unpack(&this->rssi_normal_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_ranging_config_unpack(&this->rssi_ranging_config, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_xgpon_serdes_configuration_unpack(&this->serdes_configuration, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        if (!bcmolt_arr_u8_4_unpack(&this->burst_profile_delimiter_max_errors, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_unpack(&this->ranging_sm_patterns_at_init, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_unpack(&this->ranging_sm_patterns_ed_failure, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->reset_on_del_miss))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        if (!bcmolt_xgpon_ed_state_unpack(&this->ed_state, buf, extra_mem))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->invert_ed))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->end_of_burst_reset))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY)) != 0)
    {
        if (!bcmolt_buf_read_bool(buf, &this->trx_rst_polarity))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 152))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 124))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 7))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 29))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 29))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xgpon_trx_cfg_data_bounds_check(const bcmolt_xgpon_trx_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xgpon_trx_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE)) != 0)
    {
        if (!bcmolt_arr_xgpon_burst_profile_4_bounds_check(&this->burst_profile))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG)) != 0)
    {
        if (!bcmolt_arr_xgpon_trx_configuration_4_bounds_check(&this->transceiver_config))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE)) != 0)
    {
        switch (this->transceiver_type)
        {
            case BCMOLT_XGPON_TRX_TYPE_LTH_7222_PC:
                break;
            case BCMOLT_XGPON_TRX_TYPE_USER_DEFINED:
                break;
            case BCMOLT_XGPON_TRX_TYPE_WTD_RTXM266_702:
                break;
            case BCMOLT_XGPON_TRX_TYPE_LTH_7222_BC_PLUS:
                break;
            case BCMOLT_XGPON_TRX_TYPE_LTH_7226_PC:
                break;
            case BCMOLT_XGPON_TRX_TYPE_LTH_5302_PC:
                break;
            case BCMOLT_XGPON_TRX_TYPE_XGPON_GENERAL_1:
                break;
            case BCMOLT_XGPON_TRX_TYPE_XGPON_GENERAL_2:
                break;
            case BCMOLT_XGPON_TRX_TYPE_LTW_627_X_PC:
                break;
            case BCMOLT_XGPON_TRX_TYPE_XPP_XE_R_3_CDFB:
                break;
            default:
                *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE;
                return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_DEBUG)) != 0)
    {
        if (!bcmolt_xgpon_trx_debug_bounds_check(&this->debug))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_DEBUG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_normal_config_bounds_check(&this->rssi_normal_config))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG)) != 0)
    {
        if (!bcmolt_xgpon_rssi_ranging_config_bounds_check(&this->rssi_ranging_config))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION)) != 0)
    {
        if (!bcmolt_xgpon_serdes_configuration_bounds_check(&this->serdes_configuration))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS)) != 0)
    {
        if (!bcmolt_arr_u8_4_bounds_check(&this->burst_profile_delimiter_max_errors))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_bounds_check(&this->ranging_sm_patterns_at_init))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE)) != 0)
    {
        if (!bcmolt_xgpon_rx_ranging_sm_pattern_bounds_check(&this->ranging_sm_patterns_ed_failure))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XGPON_TRX_CFG_ID_ED_STATE)) != 0)
    {
        if (!bcmolt_xgpon_ed_state_bounds_check(&this->ed_state))
        {
            *failed_prop = BCMOLT_XGPON_TRX_CFG_ID_ED_STATE;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xpon_serdes_key_set_default(bcmolt_xpon_serdes_key *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        this->pon_ni = (bcmolt_pon_ni) 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        this->instance = BCMOLT_SERDES_INSTANCE_INSTANCE_0;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_pack(const bcmolt_xpon_serdes_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, (uint8_t) this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_serdes_instance_pack(this->instance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xpon_serdes_key_get_packed_length(const bcmolt_xpon_serdes_key *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_unpack(bcmolt_xpon_serdes_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, (uint8_t *) &this->pon_ni))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_serdes_instance_unpack(&this->instance, buf))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_key_bounds_check(const bcmolt_xpon_serdes_key *this, bcmolt_presence_mask fields_present, bcmolt_xpon_serdes_key_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_PON_NI)) != 0)
    {
        if (this->pon_ni > (bcmolt_pon_ni) 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_KEY_ID_PON_NI;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_KEY_ID_INSTANCE)) != 0)
    {
        switch (this->instance)
        {
            case BCMOLT_SERDES_INSTANCE_INSTANCE_0:
                break;
            case BCMOLT_SERDES_INSTANCE_INSTANCE_1:
                break;
            default:
                *failed_prop = BCMOLT_XPON_SERDES_KEY_ID_INSTANCE;
                return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
void bcmolt_xpon_serdes_cfg_data_set_default(bcmolt_xpon_serdes_cfg_data *this, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        this->rx_vga = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        this->rx_pf = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        this->rx_lfpf = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        this->rx_dfe1 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        this->rx_dfe2 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        this->rx_dfe3 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        this->rx_dfe4 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        this->rx_dfe5 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        this->tx_pre = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        this->tx_main = 43;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        this->tx_post1 = 5;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        this->tx_post2 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        this->tx_post3 = 0;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        this->tx_amp = 12;
    }
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_data_pack(const bcmolt_xpon_serdes_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_vga))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_pf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_lfpf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->rx_dfe1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->rx_dfe5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_pre))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_main))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_post1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->tx_post2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_write_s8(buf, this->tx_post3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_write_u8(buf, this->tx_amp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
uint32_t bcmolt_xpon_serdes_cfg_data_get_packed_length(const bcmolt_xpon_serdes_cfg_data *this, bcmolt_presence_mask fields_present)
{
    uint32_t count = 0;
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        count += 1;
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        count += 1;
    }

    return count;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_data_unpack(bcmolt_xpon_serdes_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_vga))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_pf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_lfpf))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->rx_dfe1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe4))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->rx_dfe5))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_pre))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_main))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_post1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->tx_post2))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_read_s8(buf, &this->tx_post3))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_read_u8(buf, &this->tx_amp))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (!bcmolt_buf_skip(packed, 1))
        {
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

/******************************************************************************/
bcmos_bool bcmolt_xpon_serdes_cfg_data_bounds_check(const bcmolt_xpon_serdes_cfg_data *this, bcmolt_presence_mask fields_present, bcmolt_xpon_serdes_cfg_id *failed_prop)
{
    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_VGA)) != 0)
    {
        if (this->rx_vga > 45)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_VGA;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_PF)) != 0)
    {
        if (this->rx_pf > 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_PF;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF)) != 0)
    {
        if (this->rx_lfpf > 7)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1)) != 0)
    {
        if (this->rx_dfe1 > 63)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2)) != 0)
    {
        if (this->rx_dfe2 < -31)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe2 > 31)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3)) != 0)
    {
        if (this->rx_dfe3 < -31)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe3 > 31)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4)) != 0)
    {
        if (this->rx_dfe4 < -15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe4 > 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5)) != 0)
    {
        if (this->rx_dfe5 < -15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5;
            return BCMOS_FALSE;
        }

        if (this->rx_dfe5 > 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_PRE)) != 0)
    {
        if (this->tx_pre > 31)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_PRE;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN)) != 0)
    {
        if (this->tx_main > 112)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST1)) != 0)
    {
        if (this->tx_post1 > 63)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_POST1;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST2)) != 0)
    {
        if (this->tx_post2 < -15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_POST2;
            return BCMOS_FALSE;
        }

        if (this->tx_post2 > 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_POST2;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_POST3)) != 0)
    {
        if (this->tx_post3 < -7)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_POST3;
            return BCMOS_FALSE;
        }

        if (this->tx_post3 > 7)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_POST3;
            return BCMOS_FALSE;
        }
    }

    if ((fields_present & (1ULL << BCMOLT_XPON_SERDES_CFG_ID_TX_AMP)) != 0)
    {
        if (this->tx_amp > 15)
        {
            *failed_prop = BCMOLT_XPON_SERDES_CFG_ID_TX_AMP;
            return BCMOS_FALSE;
        }
    }

    return BCMOS_TRUE;
}

bcmos_bool bcmolt_obj_has_tag(bcmolt_obj_id obj, bcmolt_obj_tag tag)
{
    switch (obj)
    {
        case BCMOLT_OBJ_ID_AE_NI:
            return (tag == BCMOLT_OBJ_TAG_AE);
        case BCMOLT_OBJ_ID_AE_PATH_DS:
            return (tag == BCMOLT_OBJ_TAG_AE);
        case BCMOLT_OBJ_ID_AE_PATH_US:
            return (tag == BCMOLT_OBJ_TAG_AE);
        case BCMOLT_OBJ_ID_CHANNEL:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_DEBUG:
            return (((tag == BCMOLT_OBJ_TAG_EPON) || (tag == BCMOLT_OBJ_TAG_GPON)) || (tag == BCMOLT_OBJ_TAG_XGPON));
        case BCMOLT_OBJ_ID_DEVICE:
            return ((((tag == BCMOLT_OBJ_TAG_EPON) || (tag == BCMOLT_OBJ_TAG_GPON)) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        case BCMOLT_OBJ_ID_EPON_DENIED_LINK:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_LINK:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_NI:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_ONU_10G_US:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_ONU_1G_US:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_PATH_10G_DS:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_PATH_10G_US:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_PATH_1G_DS:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_PATH_1G_US:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_EPON_RP:
            return (tag == BCMOLT_OBJ_TAG_EPON);
        case BCMOLT_OBJ_ID_GPIO:
            return ((((tag == BCMOLT_OBJ_TAG_EPON) || (tag == BCMOLT_OBJ_TAG_GPON)) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        case BCMOLT_OBJ_ID_GPON_ALLOC:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_GEM_PORT:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_IWF:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_IWF_US_FLOW:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_NI:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_ONU:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_GPON_TRX:
            return (tag == BCMOLT_OBJ_TAG_GPON);
        case BCMOLT_OBJ_ID_LOG_ENTRY:
            return (((tag == BCMOLT_OBJ_TAG_XGPON) || (tag == BCMOLT_OBJ_TAG_GPON)) || (tag == BCMOLT_OBJ_TAG_EPON));
        case BCMOLT_OBJ_ID_LOGGER:
            return (((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON));
        case BCMOLT_OBJ_ID_NNI:
            return ((((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        case BCMOLT_OBJ_ID_NNI_SERDES:
            return ((((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        case BCMOLT_OBJ_ID_SOFTWARE_ERROR:
            return ((((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        case BCMOLT_OBJ_ID_TRX_CALIBRATION:
            return (((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON));
        case BCMOLT_OBJ_ID_XGPON_ALLOC:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XGPON_GEM_PORT:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XGPON_IWF:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XGPON_NI:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XGPON_ONU:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XGPON_TRX:
            return (tag == BCMOLT_OBJ_TAG_XGPON);
        case BCMOLT_OBJ_ID_XPON_SERDES:
            return ((((tag == BCMOLT_OBJ_TAG_GPON) || (tag == BCMOLT_OBJ_TAG_XGPON)) || (tag == BCMOLT_OBJ_TAG_EPON)) || (tag == BCMOLT_OBJ_TAG_AE));
        default:
            return BCMOS_FALSE;
    }
}

/* Maple device selected as a target for CLI commands */
bcmolt_devid current_device;

/* System mode */
static bcmolt_system_mode device_system_mode[BCMTR_MAX_OLTS];

/** Set system mode
 * \param[in]  dev            Device id
 * \param[in]  system_mode    System mode
 * \returns BCM_ERR_OK, BCM_ERR_NOT_SUPPORTED
 */
bcmos_errno bcmolt_system_mode_set(bcmolt_devid dev, bcmolt_system_mode system_mode)
{
    if (dev >= BCMTR_MAX_OLTS) return BCM_ERR_PARM;
    device_system_mode[dev] = system_mode;
    return BCM_ERR_OK;
}

/** Get system mode
 * \param[in]  dev            Device id
 * \param[in]  system_mode    System mode
 * \returns BCM_ERR_OK
 */
bcmos_errno bcmolt_system_mode_get(bcmolt_devid dev, bcmolt_system_mode *system_mode)
{
    if (dev >= BCMTR_MAX_OLTS) return BCM_ERR_PARM;
    *system_mode = device_system_mode[dev];
    return BCM_ERR_OK;
}

/** Mapping of system mode to object tag.
 * This function is hand-written and must be updated whenever a new system mode is added or object tags change.
 */
bcmos_bool bcmolt_obj_tag_valid_for_system_mode(bcmolt_system_mode system_mode, bcmolt_obj_tag tag)
{
    switch (system_mode)
    {
        case BCMOLT_SYSTEM_MODE_GPON__16_X: /* Fall-through */
        case BCMOLT_SYSTEM_MODE_GPON__8_X:
        case BCMOLT_SYSTEM_MODE_GPON__4_X:
            return tag == BCMOLT_OBJ_TAG_GPON;
        case BCMOLT_SYSTEM_MODE_EPON__16_X:
        case BCMOLT_SYSTEM_MODE_EPON__8_X:
        case BCMOLT_SYSTEM_MODE_EPON__4_X:
        case BCMOLT_SYSTEM_MODE_EPON__8_X_COEXISTENCE_TDMA:
        case BCMOLT_SYSTEM_MODE_EPON__4_X_COEXISTENCE_TDMA:
        case BCMOLT_SYSTEM_MODE_EPON__8_X_10_G:
        case BCMOLT_SYSTEM_MODE_EPON__4_X_10_G:
        case BCMOLT_SYSTEM_MODE_EPON__2_X_10_G:
            return tag == BCMOLT_OBJ_TAG_EPON;
        case BCMOLT_SYSTEM_MODE_XGPON_1__8_X:
        case BCMOLT_SYSTEM_MODE_XGPON_1__4_X:
        case BCMOLT_SYSTEM_MODE_XGS__2_X_10_G:
        case BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G:
        case BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G:
            return tag == BCMOLT_OBJ_TAG_XGPON;
        case BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE:
            return tag == BCMOLT_OBJ_TAG_GPON || tag == BCMOLT_OBJ_TAG_XGPON;
        case BCMOLT_SYSTEM_MODE_AE_8_X:
            return tag == BCMOLT_OBJ_TAG_AE;
        default:
            return BCMOS_FALSE;
    }
}

bcmos_bool bcmolt_object_is_supported(bcmolt_system_mode system_mode, bcmolt_obj_id obj)
{
    bcmolt_obj_tag tag;

    for (tag = 0; tag < BCMOLT_OBJ_TAG__NUM_OF; tag++)
    {
        if (bcmolt_obj_tag_valid_for_system_mode(system_mode, tag) && bcmolt_obj_has_tag(obj, tag))
        {
            return BCMOS_TRUE;
        }
    }

    return BCMOS_FALSE;
}

const char *bcmolt_system_mode_name(bcmolt_system_mode mode)
{
    static const char *mode_name[] = { [BCMOLT_SYSTEM_MODE_GPON__16_X] = "GPON_16", [BCMOLT_SYSTEM_MODE_GPON__8_X] = "GPON_8", [BCMOLT_SYSTEM_MODE_GPON__4_X] = "GPON_4", [BCMOLT_SYSTEM_MODE_EPON__16_X] = "EPON_16", [BCMOLT_SYSTEM_MODE_EPON__8_X] = "EPON_8", [BCMOLT_SYSTEM_MODE_EPON__4_X] = "EPON_4", [BCMOLT_SYSTEM_MODE_XGPON_1__8_X] = "XGPON1_8", [BCMOLT_SYSTEM_MODE_EPON__8_X_COEXISTENCE_TDMA] = "EPON_8_TDMA", [BCMOLT_SYSTEM_MODE_EPON__4_X_COEXISTENCE_TDMA] = "EPON_4_TDMA", [BCMOLT_SYSTEM_MODE_EPON__8_X_10_G] = "EPON_8_10G", [BCMOLT_SYSTEM_MODE_EPON__4_X_10_G] = "EPON_4_10G", [BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE] = "GPON_8_XGPON_4", [BCMOLT_SYSTEM_MODE_AE_8_X] = "AE_8", [BCMOLT_SYSTEM_MODE_XGS__2_X_10_G] = "XGS_2_10G", [BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G] = "NGPON2_2_10G", [BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G] = "NGPON2_2_2_5G", [BCMOLT_SYSTEM_MODE_XGPON_1__4_X] = "XGPON1_4", [BCMOLT_SYSTEM_MODE_EPON__2_X_10_G] = "EPON_2_10G", };

    const char *unset = "*unconfigured*";
    const char *invalid = "*invalid*";

    if (mode >= BCMOLT_SYSTEM_MODE__NUM_OF)
    {
        return unset;
    }

    if (mode_name[mode] == NULL)
    {
        return invalid;
    }

    return mode_name[mode];
}

/* XGPON num of onus */
static bcmolt_xgpon_num_of_onus device_xgpon_num_of_onus[BCMTR_MAX_OLTS];

/** Set xgpon num of onus
 * \param[in]  dev            Device id
 * \param[in]  xgpon_num_of_onus    XGPON num of onus
 * \returns BCM_ERR_OK, BCM_ERR_PARM
 */
bcmos_errno bcmolt_xgpon_num_of_onus_set(bcmolt_devid dev, bcmolt_xgpon_num_of_onus xgpon_num_of_onus)
{
    if (dev >= BCMTR_MAX_OLTS) return BCM_ERR_PARM;
    device_xgpon_num_of_onus[dev] = xgpon_num_of_onus;
    return BCM_ERR_OK;
}

/** Get xgpon num of onus
 * \param[in]  dev            Device id
 * \param[in]  xgpon_num_of_onus    XGPON num of onus
 * \returns BCM_ERR_OK, BCM_ERR_PARM
 */
bcmos_errno bcmolt_xgpon_num_of_onus_get(bcmolt_devid dev, bcmolt_xgpon_num_of_onus *xgpon_num_of_onus)
{
    if (dev >= BCMTR_MAX_OLTS) return BCM_ERR_PARM;
    *xgpon_num_of_onus = device_xgpon_num_of_onus[dev];
    return BCM_ERR_OK;
}
