diff --git a/bcm68620_release/release/host_driver/model/Makefile b/bcm68620_release/release/host_driver/model/Makefile
new file mode 100644
index 0000000..7416316
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/Makefile
@@ -0,0 +1,21 @@
+# Maple object model
+#
+MOD_NAME = model
+MOD_TYPE = lib
+MOD_DEPS = utils common_api
+MOD_INC_DIRS = $(MODEL_OUT_DIR)
+gen_srcs = bcmolt_model_types.c bcmolt_msg_pack.c
+
+ifeq ("$(OS_KERNEL)", "linux")
+    MOD_DEPS += sysmodel
+endif
+
+EXTRA_TYPES += pon_onu_id pon_alloc_id pon_gem_port_id pon_alloc_index pon_gem_port_index
+
+ifeq ("$(ENABLE_EPON)", "y")
+    EXTRA_TYPES += eni pon_rate ieee_8021as_time_sync 
+endif
+
+ifeq ("$(ENABLE_GPON)", "y")
+    EXTRA_TYPES += burst_profile mac_table_idx_main mac_table_idx_cam mac_table_idx_combined
+endif
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_model_data.h b/bcm68620_release/release/host_driver/model/bcmolt_model_data.h
new file mode 100644
index 0000000..f83d4e7
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_model_data.h
@@ -0,0 +1,3893 @@
+/*
+<: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.
+:>
+*/
+#ifndef BCMOLT_MODEL_DATA_H_
+#define BCMOLT_MODEL_DATA_H_
+
+#include "bcmos_system.h"
+
+/** \addtogroup object_model
+ * @{
+ */
+typedef uint32_t bcmolt_time_quanta;                                /**< bcmolt_time_quanta: typed alias for a 32-bit unsigned integer. */
+typedef uint16_t bcmolt_ae_ni;                                      /**< bcmolt_ae_ni: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_AE_NI_AE_NI_INVALID  ((bcmolt_ae_ni) 65535U)
+typedef uint8_t bcmolt_aggregation_domain;                          /**< bcmolt_aggregation_domain: typed alias for a 8-bit unsigned integer. */
+typedef uint32_t bcmolt_bandwidth_Kbps;                             /**< bcmolt_bandwidth_Kbps: typed alias for a 32-bit unsigned integer. */
+typedef uint32_t bcmolt_ber_interval;                               /**< bcmolt_ber_interval: typed alias for a 32-bit unsigned integer. */
+#define BCMOLT_BER_INTERVAL_BER_INTERVAL_NOT_CONFIGURED ((bcmolt_ber_interval) 0)
+typedef uint8_t bcmolt_burst_profile_index;                         /**< bcmolt_burst_profile_index: typed alias for a 8-bit unsigned integer. */
+typedef uint8_t bcmolt_dba_port;                                    /**< bcmolt_dba_port: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_DBA_PORT_COUNT   ((bcmolt_dba_port) 8)
+typedef uint8_t bcmolt_epon_top;                                    /**< bcmolt_epon_top: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_EPON_TOP_COUNT   ((bcmolt_epon_top) 8)
+typedef uint8_t bcmolt_epm_lim_global;                              /**< bcmolt_epm_lim_global: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_EPM_LIM_GLOBAL_COUNT ((bcmolt_epm_lim_global) 16)
+typedef uint8_t bcmolt_xg2g_id;                                     /**< bcmolt_xg2g_id: typed alias for a 8-bit unsigned integer. */
+typedef uint16_t bcmolt_epon_llid;                                  /**< bcmolt_epon_llid: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_EPON_LLID_BROADCAST_LLID_10G ((bcmolt_epon_llid) 32766)
+#define BCMOLT_EPON_LLID_BROADCAST_LLID_1G  ((bcmolt_epon_llid) 32767)
+typedef uint32_t bcmolt_epon_tunnel_id;                             /**< bcmolt_epon_tunnel_id: typed alias for a 32-bit unsigned integer. */
+typedef uint16_t bcmolt_epon_ni;                                    /**< bcmolt_epon_ni: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_EPON_NI_INVALID  ((bcmolt_epon_ni) 65535U)
+typedef uint8_t bcmolt_epon_onu_id;                                 /**< bcmolt_epon_onu_id: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_EPON_ONU_ID_UNKNOWN_ONU  ((bcmolt_epon_onu_id) 255)
+typedef uint16_t bcmolt_flow_id;                                    /**< bcmolt_flow_id: typed alias for a 16-bit unsigned integer. */
+typedef uint16_t bcmolt_gpon_alloc_id;                              /**< bcmolt_gpon_alloc_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_GPON_ALLOC_ID_ANY        ((bcmolt_gpon_alloc_id) 65534U)
+#define BCMOLT_GPON_ALLOC_ID_INVALID    ((bcmolt_gpon_alloc_id) 65535U)
+typedef uint16_t bcmolt_vlan_id;                                    /**< bcmolt_vlan_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_VLAN_ID_MAX  ((bcmolt_vlan_id) 4095)
+#define BCMOLT_VLAN_ID_ANY  ((bcmolt_vlan_id) 65535U)
+typedef uint16_t bcmolt_gpon_gem_id;                                /**< bcmolt_gpon_gem_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_GPON_GEM_ID_ANY      ((bcmolt_gpon_gem_id) 65534U)
+#define BCMOLT_GPON_GEM_ID_INVALID  ((bcmolt_gpon_gem_id) 65535U)
+typedef uint16_t bcmolt_gpon_onu_id;                                /**< bcmolt_gpon_onu_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_GPON_ONU_ID_ANY      ((bcmolt_gpon_onu_id) 65534U)
+#define BCMOLT_GPON_ONU_ID_INVALID  ((bcmolt_gpon_onu_id) 65535U)
+typedef uint8_t bcmolt_gpon_ni;                                     /**< bcmolt_gpon_ni: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_GPON_NI_INVALID  ((bcmolt_gpon_ni) 255)
+typedef uint16_t bcmolt_pon_onu_id;                                 /**< bcmolt_pon_onu_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_PON_ONU_ID_INVALID   ((bcmolt_pon_onu_id) 65535U)
+typedef uint8_t bcmolt_mac_table_idx_cam;                           /**< bcmolt_mac_table_idx_cam: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_MAC_TABLE_IDX_CAM_NONE   ((bcmolt_mac_table_idx_cam) 255)
+typedef uint16_t bcmolt_mac_table_idx_combined;                     /**< bcmolt_mac_table_idx_combined: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_MAC_TABLE_IDX_COMBINED_NONE  ((bcmolt_mac_table_idx_combined) 65535U)
+typedef uint16_t bcmolt_mac_table_idx_main;                         /**< bcmolt_mac_table_idx_main: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_MAC_TABLE_IDX_MAIN_NONE  ((bcmolt_mac_table_idx_main) 65535U)
+typedef uint32_t bcmolt_meters;                                     /**< bcmolt_meters: typed alias for a 32-bit unsigned integer. */
+typedef uint16_t bcmolt_pon_alloc_id;                               /**< bcmolt_pon_alloc_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_PON_ALLOC_ID_INVALID ((bcmolt_pon_alloc_id) 65535U)
+typedef uint16_t bcmolt_pon_alloc_index;                            /**< bcmolt_pon_alloc_index: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_PON_ALLOC_INDEX_INVALID  ((bcmolt_pon_alloc_index) 65535U)
+typedef uint16_t bcmolt_pon_gem_port_id;                            /**< bcmolt_pon_gem_port_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_PON_GEM_PORT_ID_INVALID  ((bcmolt_pon_gem_port_id) 65535U)
+typedef uint16_t bcmolt_pon_gem_port_index;                         /**< bcmolt_pon_gem_port_index: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_PON_GEM_PORT_INDEX_INVALID   ((bcmolt_pon_gem_port_index) 65535U)
+typedef uint8_t bcmolt_pon_ni;                                      /**< bcmolt_pon_ni: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_PON_NI_INVALID   ((bcmolt_pon_ni) 255)
+typedef uint16_t bcmolt_xgpon_alloc_id;                             /**< bcmolt_xgpon_alloc_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_XGPON_ALLOC_ID_ANY       ((bcmolt_xgpon_alloc_id) 65534U)
+#define BCMOLT_XGPON_ALLOC_ID_INVALID   ((bcmolt_xgpon_alloc_id) 65535U)
+typedef uint16_t bcmolt_xgpon_gem_id;                               /**< bcmolt_xgpon_gem_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_XGPON_GEM_ID_ANY     ((bcmolt_xgpon_gem_id) 65534U)
+#define BCMOLT_XGPON_GEM_ID_INVALID ((bcmolt_xgpon_gem_id) 65535U)
+typedef uint8_t bcmolt_xgpon_ni;                                    /**< bcmolt_xgpon_ni: typed alias for a 8-bit unsigned integer. */
+#define BCMOLT_XGPON_NI_INVALID ((bcmolt_xgpon_ni) 255)
+typedef uint16_t bcmolt_xgpon_onu_id;                               /**< bcmolt_xgpon_onu_id: typed alias for a 16-bit unsigned integer. */
+#define BCMOLT_XGPON_ONU_ID_ANY     ((bcmolt_xgpon_onu_id) 65534U)
+#define BCMOLT_XGPON_ONU_ID_INVALID ((bcmolt_xgpon_onu_id) 65535U)
+
+/** activation fail reason. 
+ */
+typedef enum bcmolt_activation_fail_reason
+{
+    BCMOLT_ACTIVATION_FAIL_REASON__BEGIN                    = 0,
+    BCMOLT_ACTIVATION_FAIL_REASON_NONE                      = 0,    /**< None. */
+    BCMOLT_ACTIVATION_FAIL_REASON_RANGING                   = 1,    /**< Ranging. */
+    BCMOLT_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION   = 2,    /**< Password authentication. */
+    BCMOLT_ACTIVATION_FAIL_REASON_LOS                       = 3,    /**< LOS. */
+    BCMOLT_ACTIVATION_FAIL_REASON_ONU_ALARM                 = 4,    /**< ONU Alarm. */
+    BCMOLT_ACTIVATION_FAIL_REASON__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_activation_fail_reason;
+
+/** Additional BW eligibility. 
+ */
+typedef enum bcmolt_additional_bw_eligibility
+{
+    BCMOLT_ADDITIONAL_BW_ELIGIBILITY__BEGIN                 = 0,
+    BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NONE                   = 0,    /**< None. */
+    BCMOLT_ADDITIONAL_BW_ELIGIBILITY_NON_ASSURED            = 1,    /**< Non Assured. */
+    BCMOLT_ADDITIONAL_BW_ELIGIBILITY_BEST_EFFORT            = 2,    /**< Best Effort. */
+    BCMOLT_ADDITIONAL_BW_ELIGIBILITY__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_additional_bw_eligibility;
+
+/** Enable state of the AE NI. 
+ */
+typedef enum bcmolt_ae_ni_en_state
+{
+    BCMOLT_AE_NI_EN_STATE__BEGIN                            = 0,
+    BCMOLT_AE_NI_EN_STATE_DISABLED                          = 0,    /**< AE NI is fully disabled. */
+    BCMOLT_AE_NI_EN_STATE_ENABLED                           = 1,    /**< AE NI is fully enabled. */
+    BCMOLT_AE_NI_EN_STATE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_ni_en_state;
+
+/** Alloc operation. 
+ */
+typedef enum bcmolt_alloc_operation
+{
+    BCMOLT_ALLOC_OPERATION__BEGIN                           = 0,
+    BCMOLT_ALLOC_OPERATION_ACTIVATE                         = 0,    /**< Activate. */
+    BCMOLT_ALLOC_OPERATION_DEACTIVATE                       = 1,    /**< Deactivate. */
+    BCMOLT_ALLOC_OPERATION__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_alloc_operation;
+
+/** Alloc State. 
+ */
+typedef enum bcmolt_alloc_state
+{
+    BCMOLT_ALLOC_STATE__BEGIN                               = 0,
+    BCMOLT_ALLOC_STATE_NOT_CONFIGURED                       = 0,    /**< Not configured. */
+    BCMOLT_ALLOC_STATE_INACTIVE                             = 1,    /**< Inactive. */
+    BCMOLT_ALLOC_STATE_PROCESSING                           = 2,    /**< Processing. */
+    BCMOLT_ALLOC_STATE_ACTIVE                               = 3,    /**< Active. */
+    BCMOLT_ALLOC_STATE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_alloc_state;
+
+/** Alloc Type. 
+ */
+typedef enum bcmolt_alloc_type
+{
+    BCMOLT_ALLOC_TYPE__BEGIN                                = 0,
+    BCMOLT_ALLOC_TYPE_NONE                                  = 0,    /**< None. */
+    BCMOLT_ALLOC_TYPE_NSR                                   = 1,    /**< Non Status Report. */
+    BCMOLT_ALLOC_TYPE_SR                                    = 2,    /**< Status Report. */
+    BCMOLT_ALLOC_TYPE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_alloc_type;
+
+/** Alloc Type to scan during the rogue onu detection process. 
+ */
+typedef enum bcmolt_alloc_type_to_scan
+{
+    BCMOLT_ALLOC_TYPE_TO_SCAN__BEGIN                        = 0,
+    BCMOLT_ALLOC_TYPE_TO_SCAN_UNUSED                        = 0,    /**< Scan only the Alloc-IDs that have not been used. */
+    BCMOLT_ALLOC_TYPE_TO_SCAN_PREVIOUSLY_USED               = 1,    /**< Scan only the Alloc-IDs that has been used but currently not being used.  This is for detecting the case when the OLT has released the Alloc, but the ONU is still holding it due to an error. */
+    BCMOLT_ALLOC_TYPE_TO_SCAN_ALL                           = 2,    /**< Scan both used and unused Alloc-IDs. */
+    BCMOLT_ALLOC_TYPE_TO_SCAN__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_alloc_type_to_scan;
+
+/** What to do when the capture buffer is full. 
+ */
+typedef enum bcmolt_api_capture_buffer_mode
+{
+    BCMOLT_API_CAPTURE_BUFFER_MODE__BEGIN                   = 0,
+    BCMOLT_API_CAPTURE_BUFFER_MODE_OVERFLOW                 = 0,    /**< Drop messages when the buffer is full. */
+    BCMOLT_API_CAPTURE_BUFFER_MODE_WRAP                     = 1,    /**< Wrap back to the beginning when the buffer is full. */
+    BCMOLT_API_CAPTURE_BUFFER_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_api_capture_buffer_mode;
+
+/** Where to perform the API capture. 
+ */
+typedef enum bcmolt_api_capture_location
+{
+    BCMOLT_API_CAPTURE_LOCATION__BEGIN                      = 0,
+    BCMOLT_API_CAPTURE_LOCATION_DEVICE                      = 0,    /**< On the device. */
+    BCMOLT_API_CAPTURE_LOCATION_HOST                        = 1,    /**< On the host. */
+    BCMOLT_API_CAPTURE_LOCATION__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_api_capture_location;
+
+/** Calibration Record. 
+ */
+typedef enum bcmolt_calibration_record
+{
+    BCMOLT_CALIBRATION_RECORD__BEGIN                        = 0,
+    BCMOLT_CALIBRATION_RECORD_UNSPECIFIED                   = 0,    /**< Unspecified. */
+    BCMOLT_CALIBRATION_RECORD_UNCALIBRATED                  = 1,    /**< Uncalibrated. */
+    BCMOLT_CALIBRATION_RECORD_LOOSE                         = 2,    /**< Loose. */
+    BCMOLT_CALIBRATION_RECORD_SUFFICIENT                    = 3,    /**< Sufficient. */
+    BCMOLT_CALIBRATION_RECORD__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_calibration_record;
+
+/** sign. 
+ */
+typedef enum bcmolt_sign
+{
+    BCMOLT_SIGN__BEGIN                                      = 0,
+    BCMOLT_SIGN_POSITIVE                                    = 0,    /**< Positive. */
+    BCMOLT_SIGN_NEGATIVE                                    = 1,    /**< Negative. */
+    BCMOLT_SIGN__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_sign;
+
+/** XGPON ni upstream line rate capabilities 
+ */
+typedef enum bcmolt_upstream_line_rate_capabilities
+{
+    BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES__BEGIN           = 0,
+    BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_2_P_5_G     = 0,    /**< 2.5G Upstream line rate capability */
+    BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES_RATE_10_G        = 1,    /**< 10G Upstream line rate capability */
+    BCMOLT_UPSTREAM_LINE_RATE_CAPABILITIES__NUM_OF                  /**< Number of enum entries, not an entry itself. */
+} bcmolt_upstream_line_rate_capabilities;
+
+/** Link type. 
+ */
+typedef enum bcmolt_link_type
+{
+    BCMOLT_LINK_TYPE__BEGIN                                 = 0,
+    BCMOLT_LINK_TYPE_UNSPECIFIED                            = 0,    /**< Link type unspecified */
+    BCMOLT_LINK_TYPE_B                                      = 1,    /**< Link type A is not supported, link type B is supported */
+    BCMOLT_LINK_TYPE_A                                      = 2,    /**< Link type A is supported, link type B is not supported */
+    BCMOLT_LINK_TYPE_A_AND_B                                = 3,    /**< Both link types A and B are supported */
+    BCMOLT_LINK_TYPE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_link_type;
+
+/** capture strobe signal. 
+ */
+typedef enum bcmolt_capture_strobe_signal
+{
+    BCMOLT_CAPTURE_STROBE_SIGNAL__BEGIN                     = 0,
+    BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_BCDR_RESET            = 0,    /**< gpon bcdr reset. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_TRX_ED                = 1,    /**< gpon trx ed. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_RSSI                  = 2,    /**< gpon rssi. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL_GPON_EOB                   = 3,    /**< gpon eob. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL_SERDES_BURST_EN            = 4,    /**< serdes burst en. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL_SERDES_RX_LOCK             = 5,    /**< serdes rx lock. */
+    BCMOLT_CAPTURE_STROBE_SIGNAL__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_capture_strobe_signal;
+
+/** Console Redirection Type. 
+ */
+typedef enum bcmolt_console_redirection
+{
+    BCMOLT_CONSOLE_REDIRECTION__BEGIN                       = 0,
+    BCMOLT_CONSOLE_REDIRECTION_NONE                         = 0,    /**< No redirection */
+    BCMOLT_CONSOLE_REDIRECTION_REDIRECT                     = 1,    /**< Embedded console output is redirected to the host */
+    BCMOLT_CONSOLE_REDIRECTION_CLONE                        = 2,    /**< Embedded console output is cloned to the host */
+    BCMOLT_CONSOLE_REDIRECTION__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_console_redirection;
+
+/** control state. 
+ */
+typedef enum bcmolt_control_state
+{
+    BCMOLT_CONTROL_STATE__BEGIN                             = 0,
+    BCMOLT_CONTROL_STATE_DISABLE                            = 0,    /**< Disabled. */
+    BCMOLT_CONTROL_STATE_ENABLE                             = 1,    /**< Enabled. */
+    BCMOLT_CONTROL_STATE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_control_state;
+
+/** dba mode. 
+ */
+typedef enum bcmolt_dba_mode
+{
+    BCMOLT_DBA_MODE__BEGIN                                  = 0,
+    BCMOLT_DBA_MODE_NORMAL                                  = 0,    /**< normal. */
+    BCMOLT_DBA_MODE_EXTENDED                                = 1,    /**< extended. */
+    BCMOLT_DBA_MODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_dba_mode;
+
+/** DBA RAM. 
+ */
+typedef enum bcmolt_dba_ram
+{
+    BCMOLT_DBA_RAM__BEGIN                                   = 0,
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_0                         = 0,    /**< Grant FIFO RAM 0. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_1                         = 1,    /**< Grant FIFO RAM 1. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_2                         = 2,    /**< Grant FIFO RAM 2. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_3                         = 3,    /**< Grant FIFO RAM 3. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_4                         = 4,    /**< Grant FIFO RAM 4. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_5                         = 5,    /**< Grant FIFO RAM 5. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_6                         = 6,    /**< Grant FIFO RAM 6. */
+    BCMOLT_DBA_RAM_GRANT_FIFO_RAM_7                         = 7,    /**< Grant FIFO RAM 7. */
+    BCMOLT_DBA_RAM_GRANTS_OUT_RAM                           = 8,    /**< Grants Out RAM. */
+    BCMOLT_DBA_RAM_GRANTS_IN_RAM                            = 9,    /**< Grants In RAM. */
+    BCMOLT_DBA_RAM_GRANTS_RETIRED_RAM                       = 10,   /**< Grants Retired RAM. */
+    BCMOLT_DBA_RAM_REPORT_RAM                               = 11,   /**< Report RAM. */
+    BCMOLT_DBA_RAM_GRANT_CFG_RAM                            = 12,   /**< Grant Cfg RAM. */
+    BCMOLT_DBA_RAM_DEFAULT_TOKENS_RAM                       = 13,   /**< Default Tokens RAM. */
+    BCMOLT_DBA_RAM_POLL_RECORDS_RAM                         = 14,   /**< Poll Records RAM. */
+    BCMOLT_DBA_RAM_HEIR_POLL_RAM                            = 15,   /**< Heir Poll RAM. */
+    BCMOLT_DBA_RAM_LAST_POLL_TIME_RAM                       = 16,   /**< Last Poll Time RAM. */
+    BCMOLT_DBA_RAM_POLL_ORDER_RAM                           = 17,   /**< Poll Order RAM. */
+    BCMOLT_DBA_RAM_TDM_RAM_0                                = 18,   /**< TDM RAM 0. */
+    BCMOLT_DBA_RAM_TDM_RAM_1                                = 19,   /**< TDM RAM 1. */
+    BCMOLT_DBA_RAM_TDM_RAM_2                                = 20,   /**< TDM RAM 2. */
+    BCMOLT_DBA_RAM_TDM_RAM_3                                = 21,   /**< TDM RAM 3. */
+    BCMOLT_DBA_RAM_TDM_RAM_4                                = 22,   /**< TDM RAM 4. */
+    BCMOLT_DBA_RAM_TDM_RAM_5                                = 23,   /**< TDM RAM 5. */
+    BCMOLT_DBA_RAM_TDM_RAM_6                                = 24,   /**< TDM RAM 6. */
+    BCMOLT_DBA_RAM_TDM_RAM_7                                = 25,   /**< TDM RAM 7. */
+    BCMOLT_DBA_RAM__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_dba_ram;
+
+/** DBA type. 
+ */
+typedef enum bcmolt_dba_type
+{
+    BCMOLT_DBA_TYPE__BEGIN                                  = 0,
+    BCMOLT_DBA_TYPE_INTERNAL                                = 0,    /**< DBA internal implementation */
+    BCMOLT_DBA_TYPE_PARTIAL_EXTERNAL                        = 1,    /**< DBA partial external implementation (DE, BA are implemented externally) */
+    BCMOLT_DBA_TYPE_EXTERNAL                                = 2,    /**< DBA external implementation  */
+    BCMOLT_DBA_TYPE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_dba_type;
+
+/** DDR Test Status. 
+ */
+typedef enum bcmolt_ddr_test_status
+{
+    BCMOLT_DDR_TEST_STATUS__BEGIN                           = 0,
+    BCMOLT_DDR_TEST_STATUS_COMPLETED                        = 0,    /**< The DDR test ran to completion */
+    BCMOLT_DDR_TEST_STATUS_CONNECTION_FAILED                = 1,    /**< The DDR test failed due to an issue loading the bootloader */
+    BCMOLT_DDR_TEST_STATUS_TIMEOUT                          = 2,    /**< The DDR test failed to complete within the expected time */
+    BCMOLT_DDR_TEST_STATUS__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_ddr_test_status;
+
+/** DDR Test Result. 
+ */
+typedef enum bcmolt_ddr_test_result
+{
+    BCMOLT_DDR_TEST_RESULT_SUCCESS                          = 0,        /**< Success. */
+    BCMOLT_DDR_TEST_RESULT_PHY_INIT_ERROR                   = 1,        /**< PHY Init Error. */
+    BCMOLT_DDR_TEST_RESULT_DRAM_INIT_ERROR                  = 2,        /**< DRAM Init Error. */
+    BCMOLT_DDR_TEST_RESULT_SHMOO_ERROR                      = 3,        /**< SHMOO Error. */
+    BCMOLT_DDR_TEST_RESULT_EDIS_TEST_ERROR                  = 4,        /**< EDIS Test Error. */
+    BCMOLT_DDR_TEST_RESULT_MEM_TEST_ERROR                   = 5,        /**< Mem Test Error. */
+    BCMOLT_DDR_TEST_RESULT_NOT_TESTED                       = 127       /**< Not Tested. */
+} bcmolt_ddr_test_result;
+
+/** Reasons why the connection between the host and the device failed 
+ */
+typedef enum bcmolt_host_connection_fail_reason
+{
+    BCMOLT_HOST_CONNECTION_FAIL_REASON__BEGIN                   = 0,
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_TIMEOUT                  = 0,    /**< The connection process has timed out. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_KEEPALIVE                = 1,    /**< Too much time has passed between keepalive messages from the device. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_USER_CALLBACK_ERROR      = 2,    /**< A user callback returned a nonzero error code.  Check log output to determine which callback failed. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_SOFTWARE_VERSION_MISMATCH= 3,    /**< The software version on the running device doesn't match the version in the host software.  Only the revision number is allowed to differ - major/minor/model must match. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_MISMATCH     = 4,    /**< The system mode on the running device doesn't match the version in the host software. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_NNI_SPEED_MISMATCH       = 5,    /**< The NNI speed on the running device doesn't match the version in the host software. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_RECONNECT_TIMEOUT        = 6,    /**< A running device didn't respond to the request to reconnect. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_INTERNAL_ERROR           = 7,    /**< An unspecified internal error occurred - check the log output for details. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_SYSTEM_MODE_NOT_SUPPORTED= 8,    /**< The given system mode is not supported on this device. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON_PARAMETER                = 9,    /**< One of the initial connection parameters was incorrect. */
+    BCMOLT_HOST_CONNECTION_FAIL_REASON__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_host_connection_fail_reason;
+
+/** deactivation reason. 
+ */
+typedef enum bcmolt_deactivation_reason
+{
+    BCMOLT_DEACTIVATION_REASON__BEGIN                           = 0,
+    BCMOLT_DEACTIVATION_REASON_NONE                             = 0,    /**< none. */
+    BCMOLT_DEACTIVATION_REASON_DEACTIVATION                     = 1,    /**< deactivation. */
+    BCMOLT_DEACTIVATION_REASON_ACK_TIMEOUT                      = 2,    /**< ack timeout. */
+    BCMOLT_DEACTIVATION_REASON_SFI                              = 3,    /**< sfi alarm. */
+    BCMOLT_DEACTIVATION_REASON_TIWI                             = 4,    /**< tiwi. */
+    BCMOLT_DEACTIVATION_REASON_PASSWORD_AUTHENTICATION          = 5,    /**< password authentication. */
+    BCMOLT_DEACTIVATION_REASON_ONU_ALARM                        = 6,    /**< onu alarm. */
+    BCMOLT_DEACTIVATION_REASON_LOS                              = 7,    /**< los. */
+    BCMOLT_DEACTIVATION_REASON_LOKI                             = 8,    /**< loki. */
+    BCMOLT_DEACTIVATION_REASON_RERANGE_FAILURE                  = 9,    /**< re-range failure. */
+    BCMOLT_DEACTIVATION_REASON__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_deactivation_reason;
+
+/** Revision of the BCM68620 device. 
+ */
+typedef enum bcmolt_device_chip_revision
+{
+    BCMOLT_DEVICE_CHIP_REVISION_A0                              = 160,  /**< A0. */
+    BCMOLT_DEVICE_CHIP_REVISION_B0                              = 176   /**< B0. */
+} bcmolt_device_chip_revision;
+
+/** Device Image Type. 
+ */
+typedef enum bcmolt_device_image_type
+{
+    BCMOLT_DEVICE_IMAGE_TYPE__BEGIN                             = 0,
+    BCMOLT_DEVICE_IMAGE_TYPE_BOOTLOADER                         = 0,    /**< Bootloader. */
+    BCMOLT_DEVICE_IMAGE_TYPE_APPLICATION                        = 1,    /**< Application. */
+    BCMOLT_DEVICE_IMAGE_TYPE_ITU_PON_ONU_FIRMWARE               = 2,    /**< ITU PON ONU firmware. */
+    BCMOLT_DEVICE_IMAGE_TYPE_EPON_ONU_FIRMWARE                  = 3,    /**< EPON ONU firmware. */
+    BCMOLT_DEVICE_IMAGE_TYPE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_image_type;
+
+/** Network interface speed 
+ */
+typedef enum bcmolt_nni_speed
+{
+    BCMOLT_NNI_SPEED__BEGIN                                     = 0,
+    BCMOLT_NNI_SPEED_GBPS_1                                     = 0,    /**< 1Gbps */
+    BCMOLT_NNI_SPEED_GBPS_2P5                                   = 1,    /**< 2.5Gbps */
+    BCMOLT_NNI_SPEED_GBPS_10                                    = 2,    /**< 10Gbps */
+    BCMOLT_NNI_SPEED_GBPS_12P5                                  = 3,    /**< 12.5Gbps */
+    BCMOLT_NNI_SPEED_GBPS_10_G_MUX                              = 4,    /**< 10Gbps Mux */
+    BCMOLT_NNI_SPEED__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_speed;
+
+/** Options for the reset operation. 
+ */
+typedef enum bcmolt_device_reset_mode
+{
+    BCMOLT_DEVICE_RESET_MODE_DEVICE                             = 1,    /**< Turn off the embedded device's processor. */
+    BCMOLT_DEVICE_RESET_MODE_HOST                               = 2,    /**< Reset the host processor. */
+    BCMOLT_DEVICE_RESET_MODE_ALL                                = 3     /**< Turn off the embedded device's processor and reset the host processor. */
+} bcmolt_device_reset_mode;
+
+/** The overall state of the host's connection to the device. 
+ */
+typedef enum bcmolt_device_state
+{
+    BCMOLT_DEVICE_STATE__BEGIN                                  = 0,
+    BCMOLT_DEVICE_STATE_DISCONNECTED                            = 0,    /**< The host is not connected to the device. */
+    BCMOLT_DEVICE_STATE_CONNECTING                              = 1,    /**< The host is in the process of connecting to the device. */
+    BCMOLT_DEVICE_STATE_READY                                   = 2,    /**< The device is connected to the host and is ready to accept any command from the host. */
+    BCMOLT_DEVICE_STATE_WAITING_FOR_DEVICE                      = 3,    /**< Waiting for the embedded side to respond to a configuration message. */
+    BCMOLT_DEVICE_STATE_TESTING_DDR                             = 4,    /**< A DDR test is currently in progress */
+    BCMOLT_DEVICE_STATE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_state;
+
+/** Disable Serial Number Control. 
+ */
+typedef enum bcmolt_disable_serial_number_control
+{
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL__BEGIN                 = 0,
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_DISABLE        = 0,    /**< Unicast Disable. */
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_UNICAST_ENABLE         = 1,    /**< Unicast Enable. */
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_ENABLE       = 2,    /**< Broadcast Enable. */
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_BROADCAST_DISABLE      = 3,    /**< Broadcast Disable. */
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL_DISABLE_DISCOVERY      = 4,    /**< Disable Discovery. */
+    BCMOLT_DISABLE_SERIAL_NUMBER_CONTROL__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_disable_serial_number_control;
+
+/** drv_icf_id. 
+ */
+typedef enum bcmolt_drv_icf_id
+{
+    BCMOLT_DRV_ICF_ID__BEGIN                                    = 0,
+    BCMOLT_DRV_ICF_ID_IDX0                                      = 0,    /**< IDX0. */
+    BCMOLT_DRV_ICF_ID_IDX1                                      = 1,    /**< IDX1. */
+    BCMOLT_DRV_ICF_ID_IDX2                                      = 2,    /**< IDX2. */
+    BCMOLT_DRV_ICF_ID_IDX3                                      = 3,    /**< IDX3. */
+    BCMOLT_DRV_ICF_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_drv_icf_id;
+
+/** drv_sgb_id. 
+ */
+typedef enum bcmolt_drv_sgb_id
+{
+    BCMOLT_DRV_SGB_ID__BEGIN                                    = 0,
+    BCMOLT_DRV_SGB_ID_IDX0                                      = 0,    /**< IDX0. */
+    BCMOLT_DRV_SGB_ID_IDX1                                      = 1,    /**< IDX1. */
+    BCMOLT_DRV_SGB_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_drv_sgb_id;
+
+/** DS VLAN action. 
+ */
+typedef enum bcmolt_ds_vlan_action
+{
+    BCMOLT_DS_VLAN_ACTION__BEGIN                                = 0,
+    BCMOLT_DS_VLAN_ACTION_REMOVE                                = 0,    /**< Remove. */
+    BCMOLT_DS_VLAN_ACTION_TRANSPARENT                           = 1,    /**< Transparent. */
+    BCMOLT_DS_VLAN_ACTION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ds_vlan_action;
+
+/** TFB Trap Behavior. 
+ */
+typedef enum bcmolt_tfb_trap_behavior
+{
+    BCMOLT_TFB_TRAP_BEHAVIOR__BEGIN                             = 0,
+    BCMOLT_TFB_TRAP_BEHAVIOR_DROP                               = 0,    /**< Drop. */
+    BCMOLT_TFB_TRAP_BEHAVIOR_FORWARD_NNI                        = 1,    /**< Forward NNI. */
+    BCMOLT_TFB_TRAP_BEHAVIOR_FORWARD_CPU                        = 2,    /**< Forward CPU. */
+    BCMOLT_TFB_TRAP_BEHAVIOR_SNOOP                              = 3,    /**< Snoop. */
+    BCMOLT_TFB_TRAP_BEHAVIOR__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_tfb_trap_behavior;
+
+/** TFB Mode. 
+ */
+typedef enum bcmolt_tfb_mode
+{
+    BCMOLT_TFB_MODE__BEGIN                                      = 0,
+    BCMOLT_TFB_MODE_GPON                                        = 0,    /**< GPON. */
+    BCMOLT_TFB_MODE_XGPON                                       = 1,    /**< XGPON. */
+    BCMOLT_TFB_MODE_EPON                                        = 2,    /**< EPON. */
+    BCMOLT_TFB_MODE_XEPON                                       = 3,    /**< XEPON. */
+    BCMOLT_TFB_MODE_COEX                                        = 4,    /**< COEX. */
+    BCMOLT_TFB_MODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_tfb_mode;
+
+/** LIM SEC Mode Up. 
+ */
+typedef enum bcmolt_lim_sec_mode_up
+{
+    BCMOLT_LIM_SEC_MODE_UP__BEGIN                               = 0,
+    BCMOLT_LIM_SEC_MODE_UP_TEK                                  = 0,    /**< Teknovus encryption mode */
+    BCMOLT_LIM_SEC_MODE_UP_PER_LLID                             = 1,    /**< Encryption per LLID, 802.1ae/zero-overhead */
+    BCMOLT_LIM_SEC_MODE_UP_NTT                                  = 2,    /**< EPON (NTT) encryption mode */
+    BCMOLT_LIM_SEC_MODE_UP__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_lim_sec_mode_up;
+
+/** LIM SEC Mode Dn. 
+ */
+typedef enum bcmolt_lim_sec_mode_dn
+{
+    BCMOLT_LIM_SEC_MODE_DN__BEGIN                               = 0,
+    BCMOLT_LIM_SEC_MODE_DN_TEK                                  = 0,    /**< Teknovus encryption mode */
+    BCMOLT_LIM_SEC_MODE_DN_PER_LLID                             = 1,    /**< Encryption per LLID, 802.1ae/zero-overhead */
+    BCMOLT_LIM_SEC_MODE_DN_NTT                                  = 2,    /**< EPON (NTT) encryption mode */
+    BCMOLT_LIM_SEC_MODE_DN_CEPON                                = 3,    /**< CEPON (3Churn) encryption mode */
+    BCMOLT_LIM_SEC_MODE_DN__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_lim_sec_mode_dn;
+
+/** XIM SEC Mode. 
+ */
+typedef enum bcmolt_xim_sec_mode
+{
+    BCMOLT_XIM_SEC_MODE__BEGIN                                  = 0,
+    BCMOLT_XIM_SEC_MODE_RESERVED_0                              = 0,    /**< Reserved 0. */
+    BCMOLT_XIM_SEC_MODE_PER_LLID                                = 1,    /**< Per LLID. */
+    BCMOLT_XIM_SEC_MODE_RESERVED_2                              = 2,    /**< Reserved 2. */
+    BCMOLT_XIM_SEC_MODE_CEPON                                   = 3,    /**< CEPON. */
+    BCMOLT_XIM_SEC_MODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xim_sec_mode;
+
+/** HSC RAM. 
+ */
+typedef enum bcmolt_hsc_ram
+{
+    BCMOLT_HSC_RAM__BEGIN                                       = 0,
+    BCMOLT_HSC_RAM_LLC_T1                                       = 0,    /**< LLC T1. */
+    BCMOLT_HSC_RAM_LLC_T2                                       = 1,    /**< LLC T2. */
+    BCMOLT_HSC_RAM_LLC_T3                                       = 2,    /**< LLC T3. */
+    BCMOLT_HSC_RAM_GRP_T2                                       = 3,    /**< Grp T2. */
+    BCMOLT_HSC_RAM_GRP_T3                                       = 4,    /**< Grp T3. */
+    BCMOLT_HSC_RAM_SHP_T1                                       = 5,    /**< Shp T1. */
+    BCMOLT_HSC_RAM_SHP_T2                                       = 6,    /**< Shp T2. */
+    BCMOLT_HSC_RAM_SHP_T3                                       = 7,    /**< Shp T3. */
+    BCMOLT_HSC_RAM_PRF_T1                                       = 8,    /**< Prf T1. */
+    BCMOLT_HSC_RAM_PRF_T2                                       = 9,    /**< Prf T2. */
+    BCMOLT_HSC_RAM_PRF_T3                                       = 10,   /**< Prf T3. */
+    BCMOLT_HSC_RAM_CRE_T1                                       = 11,   /**< Cre T1. */
+    BCMOLT_HSC_RAM_CRE_T2                                       = 12,   /**< Cre T2. */
+    BCMOLT_HSC_RAM_CRE_T3                                       = 13,   /**< Cre T3. */
+    BCMOLT_HSC_RAM_ELU                                          = 14,   /**< ELU. */
+    BCMOLT_HSC_RAM_PTR_T1                                       = 15,   /**< Ptr T1. */
+    BCMOLT_HSC_RAM_PTR_T2                                       = 16,   /**< Ptr T2. */
+    BCMOLT_HSC_RAM_AGR_SHP_T1                                   = 17,   /**< Agr Shp T1. */
+    BCMOLT_HSC_RAM_AEM                                          = 18,   /**< AEM. */
+    BCMOLT_HSC_RAM_ALL_LLC                                      = 19,   /**< All LLC. */
+    BCMOLT_HSC_RAM__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_hsc_ram;
+
+/** LIM RAM. 
+ */
+typedef enum bcmolt_lim_ram
+{
+    BCMOLT_LIM_RAM__BEGIN                                       = 0,
+    BCMOLT_LIM_RAM_LLID_UP                                      = 0,    /**< LLID Up. */
+    BCMOLT_LIM_RAM_PER_ONU_STAT                                 = 1,    /**< Per ONU Stat. */
+    BCMOLT_LIM_RAM_FEC_UP_FULL_S                                = 2,    /**< FEC Up Full S. */
+    BCMOLT_LIM_RAM_FEC_UP_DATA                                  = 3,    /**< FEC Up Data. */
+    BCMOLT_LIM_RAM__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_lim_ram;
+
+/** LKY RAM. 
+ */
+typedef enum bcmolt_lky_ram
+{
+    BCMOLT_LKY_RAM__BEGIN                                       = 0,
+    BCMOLT_LKY_RAM_TX_KEY_RAM                                   = 0,    /**< Tx Key RAM. */
+    BCMOLT_LKY_RAM_TX_KEY_BUFFER                                = 1,    /**< Tx Key Buffer. */
+    BCMOLT_LKY_RAM_RX_KEY_RAM                                   = 2,    /**< Rx Key RAM. */
+    BCMOLT_LKY_RAM_RX_KEY_BUFFER                                = 3,    /**< Rx Key Buffer. */
+    BCMOLT_LKY_RAM__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_lky_ram;
+
+/** MIC RAM. 
+ */
+typedef enum bcmolt_mic_ram
+{
+    BCMOLT_MIC_RAM__BEGIN                                       = 0,
+    BCMOLT_MIC_RAM_RANGE                                        = 0,    /**< Range. */
+    BCMOLT_MIC_RAM_LLID                                         = 1,    /**< LLID. */
+    BCMOLT_MIC_RAM_IDX                                          = 2,    /**< Index. */
+    BCMOLT_MIC_RAM_GRANT_MISS                                   = 3,    /**< Grant Miss. */
+    BCMOLT_MIC_RAM_GRANT_ID                                     = 4,    /**< Grant ID. */
+    BCMOLT_MIC_RAM_TX_IV                                        = 5,    /**< Tx IV. */
+    BCMOLT_MIC_RAM_RX_IV                                        = 6,    /**< Rx IV. */
+    BCMOLT_MIC_RAM_TX_PORT_STAT                                 = 7,    /**< Tx Port Stat. */
+    BCMOLT_MIC_RAM_RX_PORT_STAT                                 = 8,    /**< Rx Port Stat. */
+    BCMOLT_MIC_RAM__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_mic_ram;
+
+/** XPCSRM RAM. 
+ */
+typedef enum bcmolt_xpcsrm_ram
+{
+    BCMOLT_XPCSRM_RAM__BEGIN                                    = 0,
+    BCMOLT_XPCSRM_RAM_CAPTURE_FIFO                              = 0,    /**< Capture FIFO. */
+    BCMOLT_XPCSRM_RAM_FEC_DECODE                                = 1,    /**< FEC Decode. */
+    BCMOLT_XPCSRM_RAM_FEC_STATS                                 = 2,    /**< FEC Stats. */
+    BCMOLT_XPCSRM_RAM_FEC_ENQUEUE                               = 3,    /**< FEC Enqueue. */
+    BCMOLT_XPCSRM_RAM_IDLE_INSERT                               = 4,    /**< Idle Insert. */
+    BCMOLT_XPCSRM_RAM__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xpcsrm_ram;
+
+/** embedded image transfer status. 
+ */
+typedef enum bcmolt_embedded_image_transfer_status
+{
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS__BEGIN                = 0,
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_NONE                  = 0,    /**< No file.  Transfer has never started for this entry. */
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_IN_PROGRESS           = 1,    /**< Transfer has started and not finished. */
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_SUCCESS               = 2,    /**< Transfer has finished successfully. */
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS_FAILURE               = 3,    /**< Transfer failed.  Typically due to CRC error. */
+    BCMOLT_EMBEDDED_IMAGE_TRANSFER_STATUS__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_embedded_image_transfer_status;
+
+/** EPON Encryption information format. 
+ */
+typedef enum bcmolt_epon_encryption_information_format
+{
+    BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT__BEGIN            = 0,
+    BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CFB               = 0,    /**< CFB. */
+    BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT_CTR               = 1,    /**< CTR. */
+    BCMOLT_EPON_ENCRYPTION_INFORMATION_FORMAT__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_encryption_information_format;
+
+/** energy detect source. 
+ */
+typedef enum bcmolt_energy_detect_source
+{
+    BCMOLT_ENERGY_DETECT_SOURCE__BEGIN                          = 0,
+    BCMOLT_ENERGY_DETECT_SOURCE_INTERNAL                        = 0,    /**< internal. */
+    BCMOLT_ENERGY_DETECT_SOURCE_TRX                             = 1,    /**< TRX. */
+    BCMOLT_ENERGY_DETECT_SOURCE_BCDR                            = 2,    /**< BCDR. */
+    BCMOLT_ENERGY_DETECT_SOURCE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_energy_detect_source;
+
+/** EPON turbo mode.  Enables double downstream speed (2G) on 1G EPON NIs 
+ */
+typedef enum bcmolt_epon_1g_turbo_mode
+{
+    BCMOLT_EPON_1G_TURBO_MODE__BEGIN                            = 0,
+    BCMOLT_EPON_1G_TURBO_MODE_DISABLED                          = 0,    /**< Turbo mode is disabled - EPON NI has a dowstream data rate of 1G. */
+    BCMOLT_EPON_1G_TURBO_MODE_ENABLED                           = 1,    /**< Turbo mode is enabled - EPON NI has a dowstream data rate of 2G. */
+    BCMOLT_EPON_1G_TURBO_MODE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_1g_turbo_mode;
+
+/** EPON Clock Transport Mode. 
+ */
+typedef enum bcmolt_epon_clock_transport_mode
+{
+    BCMOLT_EPON_CLOCK_TRANSPORT_MODE__BEGIN                     = 0,
+    BCMOLT_EPON_CLOCK_TRANSPORT_MODE_HOST_DRIVEN                = 0,    /**< At each pulse, the Maple will issue an indication to the host containing the equivalent MPCP time for this PON. */
+    BCMOLT_EPON_CLOCK_TRANSPORT_MODE_EMBEDDED_DRIVEN            = 1,    /**< At each pulse, the Maple will parse the ToD from the second UART (if available) and then format and send down an IEEE 802.1as clock transport time sync message to each user link. */
+    BCMOLT_EPON_CLOCK_TRANSPORT_MODE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_clock_transport_mode;
+
+/** Control for how the DBA handles received MPCP report frames. 
+ */
+typedef enum bcmolt_epon_dba_reporting_mode
+{
+    BCMOLT_EPON_DBA_REPORTING_MODE__BEGIN                       = 0,
+    BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_A                     = 0,    /**< Handle reports as specified by SIEPON package A. */
+    BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_B                     = 1,    /**< Handle reports as specified by SIEPON package B. */
+    BCMOLT_EPON_DBA_REPORTING_MODE_SIEPON_C                     = 2,    /**< Handle reports as specified by SIEPON package C */
+    BCMOLT_EPON_DBA_REPORTING_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_dba_reporting_mode;
+
+/** EPON link rate. 
+ */
+typedef enum bcmolt_epon_link_rate
+{
+    BCMOLT_EPON_LINK_RATE__BEGIN                                = 0,
+    BCMOLT_EPON_LINK_RATE_TEN_TEN                               = 0,    /**< Ten_Ten. */
+    BCMOLT_EPON_LINK_RATE_TEN_ONE                               = 1,    /**< Ten_One. */
+    BCMOLT_EPON_LINK_RATE_ONE_ONE                               = 2,    /**< One_One. */
+    BCMOLT_EPON_LINK_RATE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_rate;
+
+/** Status. 
+ */
+typedef enum bcmolt_status
+{
+    BCMOLT_STATUS__BEGIN                                        = 0,
+    BCMOLT_STATUS_OFF                                           = 0,    /**< Status is off. */
+    BCMOLT_STATUS_ON                                            = 1,    /**< Status is on. */
+    BCMOLT_STATUS_NO_CHANGE                                     = 2,    /**< Status should not be changed (valid for SET API calls only). */
+    BCMOLT_STATUS__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_status;
+
+/** EPON encryption mode. 
+ */
+typedef enum bcmolt_epon_encryption_mode
+{
+    BCMOLT_EPON_ENCRYPTION_MODE__BEGIN                          = 0,
+    BCMOLT_EPON_ENCRYPTION_MODE_NO_ENCRYPTION                   = 0,    /**< No encryption of any kind. */
+    BCMOLT_EPON_ENCRYPTION_MODE_EPON_TRIPLE_CHURNING            = 1,    /**< EPON triple-churning mode per CTC specification.  */
+    BCMOLT_EPON_ENCRYPTION_MODE_EPON_ZERO_OVERHEAD_AES          = 2,    /**< EPON zero-overhead AES mode. */
+    BCMOLT_EPON_ENCRYPTION_MODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_encryption_mode;
+
+/** Epon Key Choice. 
+ */
+typedef enum bcmolt_epon_key_choice
+{
+    BCMOLT_EPON_KEY_CHOICE__BEGIN                               = 0,
+    BCMOLT_EPON_KEY_CHOICE_KEY_0                                = 0,    /**< Key 0. */
+    BCMOLT_EPON_KEY_CHOICE_KEY_1                                = 1,    /**< Key 1. */
+    BCMOLT_EPON_KEY_CHOICE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_key_choice;
+
+/** EPON Encryption Direction. 
+ */
+typedef enum bcmolt_epon_encryption_direction
+{
+    BCMOLT_EPON_ENCRYPTION_DIRECTION__BEGIN                     = 0,
+    BCMOLT_EPON_ENCRYPTION_DIRECTION_DOWNSTREAM_ONLY            = 0,    /**< Encrypt downstream traffic only. */
+    BCMOLT_EPON_ENCRYPTION_DIRECTION__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_encryption_direction;
+
+/** EPON FEC enable state.  See flag descriptions for restrictions. 
+ */
+typedef enum bcmolt_epon_fec_en_state
+{
+    BCMOLT_EPON_FEC_EN_STATE__BEGIN                             = 0,
+    BCMOLT_EPON_FEC_EN_STATE_DISABLED                           = 0,    /**< FEC is disabled. */
+    BCMOLT_EPON_FEC_EN_STATE_ENABLED                            = 1,    /**< FEC is enabled.   Note: FEC can only be enabled and disabled PON-wide for 10G paths, but can be enabled and disabled with logical link granularity for 1G paths. */
+    BCMOLT_EPON_FEC_EN_STATE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_fec_en_state;
+
+/** The types of OAM to choose from. 
+ */
+typedef enum bcmolt_epon_oam_type
+{
+    BCMOLT_EPON_OAM_TYPE__BEGIN                                 = 0,
+    BCMOLT_EPON_OAM_TYPE_BROADCOM                               = 0,    /**< Broadcom OAM (formerly TEK). */
+    BCMOLT_EPON_OAM_TYPE_CTC                                    = 1,    /**< CTC OAM. */
+    BCMOLT_EPON_OAM_TYPE_DPOE                                   = 2,    /**< DPoE OAM */
+    BCMOLT_EPON_OAM_TYPE_SIEPONA                                = 3,    /**< SiEPON OAM. (Mostly similar to DPoE). */
+    BCMOLT_EPON_OAM_TYPE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_oam_type;
+
+/** epon link fec state. 
+ */
+typedef enum bcmolt_epon_link_fec_state
+{
+    BCMOLT_EPON_LINK_FEC_STATE__BEGIN                           = 0,
+    BCMOLT_EPON_LINK_FEC_STATE_DISABLED                         = 0,    /**< Disabled. */
+    BCMOLT_EPON_LINK_FEC_STATE_ENABLED                          = 1,    /**< Enabled. */
+    BCMOLT_EPON_LINK_FEC_STATE_USE_DEFAULT                      = 2,    /**< Use defaults. */
+    BCMOLT_EPON_LINK_FEC_STATE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_fec_state;
+
+/** The current registration status of a link. 
+ */
+typedef enum bcmolt_epon_link_status
+{
+    BCMOLT_EPON_LINK_STATUS_NONE                                = 0,
+    BCMOLT_EPON_LINK_STATUS_DISCOVERED                          = 0x0001,   /**< Link has completed MPCP registration. */
+    BCMOLT_EPON_LINK_STATUS_REGISTRATION_PREVENTED              = 0x0008    /**< Link is being prevented from registering. */
+} bcmolt_epon_link_status;
+
+/** MPCP discovery info. 
+ */
+typedef enum bcmolt_mpcp_discovery_info
+{
+    BCMOLT_MPCP_DISCOVERY_INFO_NONE                             = 0,
+    BCMOLT_MPCP_DISCOVERY_INFO_ONE_G_CAPABLE                    = 0x0001,   /**< 1G Capable. */
+    BCMOLT_MPCP_DISCOVERY_INFO_TEN_G_CAPABLE                    = 0x0002,   /**< 10G Capable. */
+    BCMOLT_MPCP_DISCOVERY_INFO_ONE_G_WINDOW                     = 0x0010,   /**< 1G window. */
+    BCMOLT_MPCP_DISCOVERY_INFO_TEN_G_WINDOW                     = 0x0020    /**< 10G window. */
+} bcmolt_mpcp_discovery_info;
+
+/** EPON link state flags reflect the current status of the link.  
+ */
+typedef enum bcmolt_epon_link_state_flags
+{
+    BCMOLT_EPON_LINK_STATE_FLAGS_NONE                           = 0,
+    BCMOLT_EPON_LINK_STATE_FLAGS_MPCP_REGISTRATION_COMPLETE     = 0x0001    /**< Link has completed MPCP registration. */
+} bcmolt_epon_link_state_flags;
+
+/** EPON Link Type. 
+ */
+typedef enum bcmolt_epon_link_type
+{
+    BCMOLT_EPON_LINK_TYPE__BEGIN                                = 0,
+    BCMOLT_EPON_LINK_TYPE_SYSTEM                                = 0,        /**< A Link automatically created for system usage. */
+    BCMOLT_EPON_LINK_TYPE_DOWNSTREAM_ONLY                       = 1,        /**< A Link that does not consume upstream bandwidth. */
+    BCMOLT_EPON_LINK_TYPE_BIDIRECTIONAL                         = 2,        /**< A Link that undergoes the MPCP registration process. */
+    BCMOLT_EPON_LINK_TYPE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_type;
+
+/** MPCP gate mode. 
+ */
+typedef enum bcmolt_mpcp_gate_mode
+{
+    BCMOLT_MPCP_GATE_MODE__BEGIN                                = 0,
+    BCMOLT_MPCP_GATE_MODE_TEKNOVUS                              = 0,    /**< Teknovus MPCP registration mode. */
+    BCMOLT_MPCP_GATE_MODE_CUSTOM                                = 1,    /**< Non-Teknovus MPCP registration mode. */
+    BCMOLT_MPCP_GATE_MODE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_mpcp_gate_mode;
+
+/** MPCP registration gate flags. 
+ */
+typedef enum bcmolt_mpcp_registration_gate_flags
+{
+    BCMOLT_MPCP_REGISTRATION_GATE_FLAGS_NONE                    = 0,
+    BCMOLT_MPCP_REGISTRATION_GATE_FLAGS_FORCE_REPORT            = 0x0001    /**< Force report bit. */
+} bcmolt_mpcp_registration_gate_flags;
+
+/** Enable state of the EPON NI.  Initially the only enable states defined are 
+ * `disabled' and `enabled', but this may later be extended to include 
+ * different degrees of enablement. 
+ */
+typedef enum bcmolt_epon_ni_en_state
+{
+    BCMOLT_EPON_NI_EN_STATE__BEGIN                              = 0,
+    BCMOLT_EPON_NI_EN_STATE_DISABLED                            = 0,        /**< EPON NI is fully disabled. */
+    BCMOLT_EPON_NI_EN_STATE_ENABLED                             = 1,        /**< EPON NI is fully enabled. */
+    BCMOLT_EPON_NI_EN_STATE_PROTECTED_WORKING                   = 2,        /**< EPON NI is fully enabled. redundant and activily carrying traffic. */
+    BCMOLT_EPON_NI_EN_STATE_PROTECTED_STANDBY                   = 3,        /**< EPON NI is fully enabled. redundant and protecting another PON. */
+    BCMOLT_EPON_NI_EN_STATE_PROCESSING                          = 4,        /**< EPON NI is currently transitioning between states */
+    BCMOLT_EPON_NI_EN_STATE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_en_state;
+
+/** EPON OAM Extension Type. 
+ */
+typedef enum bcmolt_epon_oam_extension_type
+{
+    BCMOLT_EPON_OAM_EXTENSION_TYPE__BEGIN                       = 0,
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_RESERVED                     = 0,    /**< Reserved */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_BROADCOM                     = 1,    /**< Broadcom */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_CTC                          = 2,    /**< China Telecom */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_DASAN                        = 3,    /**< Dasan Networks */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_KT                           = 4,    /**< Korea Telecom */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE_DPOE                         = 5,    /**< DPoE */
+    BCMOLT_EPON_OAM_EXTENSION_TYPE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_oam_extension_type;
+
+/** 1 to 11 matche the DPoE response code.  Refer to DPoE-SP-OAMv1.0-I08-140807, 
+ * Cl. 12.1.3. 21 to 28 are used for CTC. 
+ */
+typedef enum bcmolt_epon_onu_upgrade_onu_response_code
+{
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_OK                    = 0,    /**< No errors. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_UNDEFINED             = 1,    /**< Unknown error, or one not covered elsewhere. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_NOT_FOUND             = 2,    /**< Read requested file that is not available. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_NO_ACCESS             = 3,    /**< Access permissions do not allow the requested read/write. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_FULL                  = 4,    /**< Storage is full, and cannot hold the written file. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ILLEGAL_OPERATION     = 5,    /**< Cannot perform requested operation in current state. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_UNKNOWN_ID            = 6,    /**< Requested file ID is not supported by this device. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_BAD_BLOCK             = 7,    /**< Block received in error. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_TIMEOUT               = 8,    /**< No block received before timer expiration. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_BUSY                  = 9,    /**< Cannot perform requested action due to other activity. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_INCOMPATIBLE_FILE     = 10,   /**< Received file is incompatible with this device. File incompatibility is determined by the device vendor. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_CORRUPTED_FILE        = 11,   /**< File was received corrupted and is unusable by this device. File integrity is determined by the device vendor. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_NOT_DEFINED     = 21,   /**< ONU returned ERROR PDU: Undefined error code. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_ALLOC_EXCEEDED  = 22,   /**< ONU returned ERROR PDU: Disk full or allocation exceeded. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_ILLEGAL_OP      = 23,   /**< ONU returned ERROR PDU: Illegal TFTP operation. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_ERROR_FILE_EXISTS     = 24,   /**< ONU returned ERROR PDU: Mirror file already exists. */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_WRITING_NVS       = 25,   /**< ONU returned END RESPONSE PDU with error: Writing file to NVS */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_CRC_ERROR         = 26,   /**< ONU returned END RESPONSE PDU with error: CRC32 error */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_PARAM_ERROR       = 27,   /**< ONU returned END RESPONSE PDU with error: Parameter error */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_END_CMD_UNSUPPORTED   = 28,   /**< ONU returned END RESPONSE PDU with error: Command not supported */
+    BCMOLT_EPON_ONU_UPGRADE_ONU_RESPONSE_CODE_LAST                  = 29    /**< Last. */
+} bcmolt_epon_onu_upgrade_onu_response_code;
+
+/** EPON ONU Upgrade Return Code. 
+ */
+typedef enum bcmolt_epon_onu_upgrade_return_code
+{
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE__BEGIN                      = 0,
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_SUCCESS                     = 0,    /**< Command succeeded. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_ONU_RESPONSE_TIMEOUT        = 1,    /**< ONU did not respond to a message within the time specified by the "Write request timeout". */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_ONU_ERROR_RESPONSE          = 2,    /**< Error found in the ONU response. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_SYNC_ERROR                  = 3,    /**< Block number sync error. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_COMMIT_FAILED               = 4,    /**< Commit software command failed. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_INTERNAL                    = 5,    /**< Internal error. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE_PARSE_ERROR                 = 6,    /**< Unable to parse the ONU response. */
+    BCMOLT_EPON_ONU_UPGRADE_RETURN_CODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_upgrade_return_code;
+
+/** Indicates whether links are unprotected, protected standby, or protected 
+ * working. 
+ */
+typedef enum bcmolt_epon_protection_state
+{
+    BCMOLT_EPON_PROTECTION_STATE__BEGIN                             = 0,
+    BCMOLT_EPON_PROTECTION_STATE_UNPROTECTED                        = 0,    /**< The link is not a member of a protection pair. */
+    BCMOLT_EPON_PROTECTION_STATE_PROTECTED_STANDBY                  = 1,    /**< The link is a member of a protection pair in the standby role. */
+    BCMOLT_EPON_PROTECTION_STATE_PROTECTED_WORKING                  = 2,    /**< The link is a member of a protection pair in the working role. */
+    BCMOLT_EPON_PROTECTION_STATE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_protection_state;
+
+/** EPON Protection Switching Type. 
+ */
+typedef enum bcmolt_epon_protection_switching_type
+{
+    BCMOLT_EPON_PROTECTION_SWITCHING_TYPE__BEGIN                        = 0,
+    BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_NO_PROTECTION_SWTICHING       = 0,    /**< No protection swtiching. */
+    BCMOLT_EPON_PROTECTION_SWITCHING_TYPE_LINE_CARD_PROTECTION_SWITCHING= 1,    /**< Line card protection switching. */
+    BCMOLT_EPON_PROTECTION_SWITCHING_TYPE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_protection_switching_type;
+
+/** Protection Switching Detection Options. 
+ */
+typedef enum bcmolt_protection_switching_detection_options
+{
+    BCMOLT_PROTECTION_SWITCHING_DETECTION_OPTIONS_NONE                  = 0,
+    BCMOLT_PROTECTION_SWITCHING_DETECTION_OPTIONS_STANDBY_LOS_DETECTION = 0x0001            /**< Standby LOS detection. */
+} bcmolt_protection_switching_detection_options;
+
+/** Criteria for logical link selection during re-ranging process 
+ */
+typedef enum bcmolt_epon_protection_switching_reranging_options
+{
+    BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_NONE                 = 1,    /**< No re-ranging at all */
+    BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_SINGLE_LOGICAL_LINK  = 2,    /**< Pick minimum logical links to re-range */
+    BCMOLT_EPON_PROTECTION_SWITCHING_RERANGING_OPTIONS_RERANGE_ALL_LOGICAL_LINKS    = 4     /**< Individually re-range all logical links */
+} bcmolt_epon_protection_switching_reranging_options;
+
+/** GPIO pin number. 
+ */
+typedef enum bcmolt_gpio_pin
+{
+    BCMOLT_GPIO_PIN_PIN0                                                            = 0,    /**< GPIO pin 0. */
+    BCMOLT_GPIO_PIN_PIN1                                                            = 1,    /**< GPIO pin 1. */
+    BCMOLT_GPIO_PIN_PIN2                                                            = 2,    /**< GPIO pin 2. */
+    BCMOLT_GPIO_PIN_PIN3                                                            = 3,    /**< GPIO pin 3. */
+    BCMOLT_GPIO_PIN_PIN4                                                            = 4,    /**< GPIO pin 4. */
+    BCMOLT_GPIO_PIN_PIN5                                                            = 5,    /**< GPIO pin 5. */
+    BCMOLT_GPIO_PIN_PIN6                                                            = 6,    /**< GPIO pin 6. */
+    BCMOLT_GPIO_PIN_PIN7                                                            = 7,    /**< GPIO pin 7. */
+    BCMOLT_GPIO_PIN_PIN8                                                            = 8,    /**< GPIO pin 8. */
+    BCMOLT_GPIO_PIN_PIN9                                                            = 9,    /**< GPIO pin 9. */
+    BCMOLT_GPIO_PIN_PIN10                                                           = 10,   /**< GPIO pin 10. */
+    BCMOLT_GPIO_PIN_PIN11                                                           = 11,   /**< GPIO pin 11. */
+    BCMOLT_GPIO_PIN_PIN12                                                           = 12,   /**< GPIO pin 12. */
+    BCMOLT_GPIO_PIN_PIN13                                                           = 13,   /**< GPIO pin 13. */
+    BCMOLT_GPIO_PIN_PIN14                                                           = 14,   /**< GPIO pin 14. */
+    BCMOLT_GPIO_PIN_PIN15                                                           = 15,   /**< GPIO pin 15. */
+    BCMOLT_GPIO_PIN_PIN16                                                           = 16,   /**< GPIO pin 16. */
+    BCMOLT_GPIO_PIN_PIN17                                                           = 17,   /**< GPIO pin 17. */
+    BCMOLT_GPIO_PIN_PIN18                                                           = 18,   /**< GPIO pin 18. */
+    BCMOLT_GPIO_PIN_PIN19                                                           = 19,   /**< GPIO pin 19. */
+    BCMOLT_GPIO_PIN_PIN20                                                           = 20,   /**< GPIO pin 20. */
+    BCMOLT_GPIO_PIN_PIN21                                                           = 21,   /**< GPIO pin 21. */
+    BCMOLT_GPIO_PIN_PIN22                                                           = 22,   /**< GPIO pin 22. */
+    BCMOLT_GPIO_PIN_PIN23                                                           = 23,   /**< GPIO pin 23. */
+    BCMOLT_GPIO_PIN_PIN24                                                           = 24,   /**< GPIO pin 24. */
+    BCMOLT_GPIO_PIN_PIN25                                                           = 25,   /**< GPIO pin 25. */
+    BCMOLT_GPIO_PIN_PIN26                                                           = 26,   /**< GPIO pin 26. */
+    BCMOLT_GPIO_PIN_PIN27                                                           = 27,   /**< GPIO pin 27. */
+    BCMOLT_GPIO_PIN_PIN28                                                           = 28,   /**< GPIO pin 28. */
+    BCMOLT_GPIO_PIN_PIN29                                                           = 29,   /**< GPIO pin 29. */
+    BCMOLT_GPIO_PIN_PIN30                                                           = 30,   /**< GPIO pin 30. */
+    BCMOLT_GPIO_PIN_PIN31                                                           = 31,   /**< GPIO pin 31. */
+    BCMOLT_GPIO_PIN_PIN32                                                           = 32,   /**< GPIO pin 32. */
+    BCMOLT_GPIO_PIN_PIN33                                                           = 33,   /**< GPIO pin 33. */
+    BCMOLT_GPIO_PIN_PIN34                                                           = 34,   /**< GPIO pin 34. */
+    BCMOLT_GPIO_PIN_PIN35                                                           = 35,   /**< GPIO pin 35. */
+    BCMOLT_GPIO_PIN_PIN36                                                           = 36,   /**< GPIO pin 36. */
+    BCMOLT_GPIO_PIN_PIN37                                                           = 37,   /**< GPIO pin 37. */
+    BCMOLT_GPIO_PIN_PIN38                                                           = 38,   /**< GPIO pin 38. */
+    BCMOLT_GPIO_PIN_PIN39                                                           = 39,   /**< GPIO pin 39. */
+    BCMOLT_GPIO_PIN_PIN40                                                           = 40,   /**< GPIO pin 40. */
+    BCMOLT_GPIO_PIN_PIN41                                                           = 41,   /**< GPIO pin 41. */
+    BCMOLT_GPIO_PIN_PIN42                                                           = 42,   /**< GPIO pin 42. */
+    BCMOLT_GPIO_PIN_PIN43                                                           = 43,   /**< GPIO pin 43. */
+    BCMOLT_GPIO_PIN_PIN44                                                           = 44,   /**< GPIO pin 44. */
+    BCMOLT_GPIO_PIN_PIN45                                                           = 45,   /**< GPIO pin 45. */
+    BCMOLT_GPIO_PIN_PIN46                                                           = 46,   /**< GPIO pin 46. */
+    BCMOLT_GPIO_PIN_PIN47                                                           = 47,   /**< GPIO pin 47. */
+    BCMOLT_GPIO_PIN_PIN48                                                           = 48,   /**< GPIO pin 48. */
+    BCMOLT_GPIO_PIN_PIN49                                                           = 49,   /**< GPIO pin 49. */
+    BCMOLT_GPIO_PIN_PIN50                                                           = 50,   /**< GPIO pin 50. */
+    BCMOLT_GPIO_PIN_PIN51                                                           = 51,   /**< GPIO pin 51. */
+    BCMOLT_GPIO_PIN_PIN52                                                           = 52,   /**< GPIO pin 52. */
+    BCMOLT_GPIO_PIN_PIN53                                                           = 53,   /**< GPIO pin 53. */
+    BCMOLT_GPIO_PIN_PIN54                                                           = 54,   /**< GPIO pin 54. */
+    BCMOLT_GPIO_PIN_PIN55                                                           = 55,   /**< GPIO pin 55. */
+    BCMOLT_GPIO_PIN_PIN56                                                           = 56,   /**< GPIO pin 56. */
+    BCMOLT_GPIO_PIN_PIN57                                                           = 57,   /**< GPIO pin 57. */
+    BCMOLT_GPIO_PIN_PIN58                                                           = 58,   /**< GPIO pin 58. */
+    BCMOLT_GPIO_PIN_PIN59                                                           = 59,   /**< GPIO pin 59. */
+    BCMOLT_GPIO_PIN_PIN60                                                           = 60,   /**< GPIO pin 60. */
+    BCMOLT_GPIO_PIN_PIN61                                                           = 61,   /**< GPIO pin 61. */
+    BCMOLT_GPIO_PIN_PIN62                                                           = 62,   /**< GPIO pin 62. */
+    BCMOLT_GPIO_PIN_PIN63                                                           = 63,   /**< GPIO pin 63. */
+    BCMOLT_GPIO_PIN_PIN64                                                           = 64,   /**< GPIO pin 64. */
+    BCMOLT_GPIO_PIN_PIN65                                                           = 65,   /**< GPIO pin 65. */
+    BCMOLT_GPIO_PIN_PIN66                                                           = 66,   /**< GPIO pin 66. */
+    BCMOLT_GPIO_PIN_PIN67                                                           = 67,   /**< GPIO pin 67. */
+    BCMOLT_GPIO_PIN_PIN68                                                           = 68,   /**< GPIO pin 68. */
+    BCMOLT_GPIO_PIN_PIN69                                                           = 69,   /**< GPIO pin 69. */
+    BCMOLT_GPIO_PIN_PIN70                                                           = 70,   /**< GPIO pin 70. */
+    BCMOLT_GPIO_PIN_PIN71                                                           = 71,   /**< GPIO pin 71. */
+    BCMOLT_GPIO_PIN_PIN72                                                           = 72,   /**< GPIO pin 72. */
+    BCMOLT_GPIO_PIN_PIN73                                                           = 73,   /**< GPIO pin 73. */
+    BCMOLT_GPIO_PIN_PIN74                                                           = 74,   /**< GPIO pin 74. */
+    BCMOLT_GPIO_PIN_PIN75                                                           = 75,   /**< GPIO pin 75. */
+    BCMOLT_GPIO_PIN_PIN76                                                           = 76,   /**< GPIO pin 76. */
+    BCMOLT_GPIO_PIN_PIN77                                                           = 77,   /**< GPIO pin 77. */
+    BCMOLT_GPIO_PIN_PIN78                                                           = 78,   /**< GPIO pin 78. */
+    BCMOLT_GPIO_PIN_PIN79                                                           = 79,   /**< GPIO pin 79. */
+    BCMOLT_GPIO_PIN_PIN80                                                           = 80,   /**< GPIO pin 80. */
+    BCMOLT_GPIO_PIN_PIN81                                                           = 81,   /**< GPIO pin 81. */
+    BCMOLT_GPIO_PIN_PIN82                                                           = 82,   /**< GPIO pin 82. */
+    BCMOLT_GPIO_PIN_PIN83                                                           = 83,   /**< GPIO pin 83. */
+    BCMOLT_GPIO_PIN_PIN84                                                           = 84,   /**< GPIO pin 84. */
+    BCMOLT_GPIO_PIN_PIN85                                                           = 85,   /**< GPIO pin 85. */
+    BCMOLT_GPIO_PIN_PIN86                                                           = 86,   /**< GPIO pin 86. */
+    BCMOLT_GPIO_PIN_PIN87                                                           = 87,   /**< GPIO pin 87. */
+    BCMOLT_GPIO_PIN_PIN88                                                           = 88,   /**< GPIO pin 88. */
+    BCMOLT_GPIO_PIN_PIN89                                                           = 89,   /**< GPIO pin 89. */
+    BCMOLT_GPIO_PIN_PIN90                                                           = 90,   /**< GPIO pin 90. */
+    BCMOLT_GPIO_PIN_PIN91                                                           = 91,   /**< GPIO pin 91. */
+    BCMOLT_GPIO_PIN_PIN92                                                           = 92,   /**< GPIO pin 92. */
+    BCMOLT_GPIO_PIN_PIN93                                                           = 93,   /**< GPIO pin 93. */
+    BCMOLT_GPIO_PIN_PIN94                                                           = 94,   /**< GPIO pin 94. */
+    BCMOLT_GPIO_PIN_PIN95                                                           = 95,   /**< GPIO pin 95. */
+    BCMOLT_GPIO_PIN_PIN96                                                           = 96,   /**< GPIO pin 96. */
+    BCMOLT_GPIO_PIN_PIN97                                                           = 97,   /**< GPIO pin 97. */
+    BCMOLT_GPIO_PIN_PIN98                                                           = 98,   /**< GPIO pin 98. */
+    BCMOLT_GPIO_PIN_PIN99                                                           = 99,   /**< GPIO pin 99. */
+    BCMOLT_GPIO_PIN_PIN100                                                          = 100,  /**< GPIO pin 100. */
+    BCMOLT_GPIO_PIN_PIN101                                                          = 101,  /**< GPIO pin 101. */
+    BCMOLT_GPIO_PIN_PIN102                                                          = 102,  /**< GPIO pin 102. */
+    BCMOLT_GPIO_PIN_PIN103                                                          = 103,  /**< GPIO pin 103. */
+    BCMOLT_GPIO_PIN_PIN104                                                          = 104,  /**< GPIO pin 104. */
+    BCMOLT_GPIO_PIN_PIN105                                                          = 105,  /**< GPIO pin 105. */
+    BCMOLT_GPIO_PIN_PIN106                                                          = 106,  /**< GPIO pin 106. */
+    BCMOLT_GPIO_PIN_UNCONFIGURED                                                    = 255   /**< Unconfigured GPIO pin. */
+} bcmolt_gpio_pin;
+
+/** GPIO Polarity. 
+ */
+typedef enum bcmolt_gpio_polarity
+{
+    BCMOLT_GPIO_POLARITY__BEGIN                                                     = 0,
+    BCMOLT_GPIO_POLARITY_ACTIVE_LOW                                                 = 0,    /**< Active Low. */
+    BCMOLT_GPIO_POLARITY_ACTIVE_HIGH                                                = 1,    /**< Active High. */
+    BCMOLT_GPIO_POLARITY__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpio_polarity;
+
+/** External IRQ. 
+ */
+typedef enum bcmolt_ext_irq
+{
+    BCMOLT_EXT_IRQ_EXT_IRQ0                                                         = 0,    /**< External IRQ 0. */
+    BCMOLT_EXT_IRQ_EXT_IRQ1                                                         = 1,    /**< External IRQ 1. */
+    BCMOLT_EXT_IRQ_EXT_IRQ2                                                         = 2,    /**< External IRQ 2. */
+    BCMOLT_EXT_IRQ_EXT_IRQ3                                                         = 3,    /**< External IRQ 3. */
+    BCMOLT_EXT_IRQ_EXT_IRQ4                                                         = 4,    /**< External IRQ 4. */
+    BCMOLT_EXT_IRQ_EXT_IRQ5                                                         = 5,    /**< External IRQ 5. */
+    BCMOLT_EXT_IRQ_UNCONFIGURED                                                     = 255   /**< Unconfigured external IRQ. */
+} bcmolt_ext_irq;
+
+/** Flush MAC table option. 
+ */
+typedef enum bcmolt_flush_mac_table_option
+{
+    BCMOLT_FLUSH_MAC_TABLE_OPTION__BEGIN                                            = 0,
+    BCMOLT_FLUSH_MAC_TABLE_OPTION_ALL                                               = 0,    /**< All. */
+    BCMOLT_FLUSH_MAC_TABLE_OPTION_PER_VID                                           = 1,    /**< PER VID. */
+    BCMOLT_FLUSH_MAC_TABLE_OPTION_PER_FLOW                                          = 2,    /**< PER flow. */
+    BCMOLT_FLUSH_MAC_TABLE_OPTION_VID_PLUS_FLOW                                     = 3,    /**< VID+flow. */
+    BCMOLT_FLUSH_MAC_TABLE_OPTION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_flush_mac_table_option;
+
+/** Frequency adjustment direction 
+ */
+typedef enum bcmolt_frequency_adjustment_direction
+{
+    BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION__BEGIN                                    = 0,
+    BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_LOWER                                     = 0,    /**< Lower */
+    BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION_HIGHER                                    = 1,    /**< Higher */
+    BCMOLT_FREQUENCY_ADJUSTMENT_DIRECTION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_frequency_adjustment_direction;
+
+/** GEM port ID direction. 
+ */
+typedef enum bcmolt_gem_port_direction
+{
+    BCMOLT_GEM_PORT_DIRECTION__BEGIN                                                = 0,
+    BCMOLT_GEM_PORT_DIRECTION_DOWNSTREAM                                            = 0,    /**< downstream port ID. */
+    BCMOLT_GEM_PORT_DIRECTION_UPSTREAM                                              = 1,    /**< upstream port ID. */
+    BCMOLT_GEM_PORT_DIRECTION_BIDIRECTIONAL                                         = 2,    /**< bidirectional port  ID. */
+    BCMOLT_GEM_PORT_DIRECTION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gem_port_direction;
+
+/** GEM port type. 
+ */
+typedef enum bcmolt_gem_port_type
+{
+    BCMOLT_GEM_PORT_TYPE__BEGIN                                                     = 0,
+    BCMOLT_GEM_PORT_TYPE_UNICAST                                                    = 0,    /**< unicast port ID. */
+    BCMOLT_GEM_PORT_TYPE_MULTICAST                                                  = 1,    /**< multicast port ID. */
+    BCMOLT_GEM_PORT_TYPE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gem_port_type;
+
+/** GEM port operation. 
+ */
+typedef enum bcmolt_gem_port_operation
+{
+    BCMOLT_GEM_PORT_OPERATION__BEGIN                                                = 0,
+    BCMOLT_GEM_PORT_OPERATION_ACTIVATE                                              = 0,    /**< Activate. */
+    BCMOLT_GEM_PORT_OPERATION_DEACTIVATE                                            = 1,    /**< Deactivate. */
+    BCMOLT_GEM_PORT_OPERATION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gem_port_operation;
+
+/** GPIO PIN Direction. 
+ */
+typedef enum bcmolt_gpio_pin_dir
+{
+    BCMOLT_GPIO_PIN_DIR__BEGIN                                                      = 0,
+    BCMOLT_GPIO_PIN_DIR_INPUT                                                       = 0,    /**< Input. */
+    BCMOLT_GPIO_PIN_DIR_OUTPUT                                                      = 1,    /**< Output. */
+    BCMOLT_GPIO_PIN_DIR__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpio_pin_dir;
+
+/** GPIO Value. 
+ */
+typedef enum bcmolt_gpio_value
+{
+    BCMOLT_GPIO_VALUE__BEGIN                                                        = 0,
+    BCMOLT_GPIO_VALUE_CLEAR                                                         = 0,    /**< Clear. */
+    BCMOLT_GPIO_VALUE_SET                                                           = 1,    /**< Set. */
+    BCMOLT_GPIO_VALUE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpio_value;
+
+/** GPON GEM Port State. 
+ */
+typedef enum bcmolt_gpon_gem_port_state
+{
+    BCMOLT_GPON_GEM_PORT_STATE__BEGIN                                               = 0,
+    BCMOLT_GPON_GEM_PORT_STATE_NOT_CONFIGURED                                       = 0,    /**< not configured. */
+    BCMOLT_GPON_GEM_PORT_STATE_INACTIVE                                             = 1,    /**< inactive. */
+    BCMOLT_GPON_GEM_PORT_STATE_PROCESSING                                           = 2,    /**< processing. */
+    BCMOLT_GPON_GEM_PORT_STATE_ACTIVE                                               = 3,    /**< active. */
+    BCMOLT_GPON_GEM_PORT_STATE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_state;
+
+/** Key exchange mode. 
+ */
+typedef enum bcmolt_key_exchange_mode
+{
+    BCMOLT_KEY_EXCHANGE_MODE__BEGIN                                                 = 0,
+    BCMOLT_KEY_EXCHANGE_MODE_NORMAL                                                 = 0,    /**< Normal. */
+    BCMOLT_KEY_EXCHANGE_MODE_ENHANCED                                               = 1,    /**< Enhanced. */
+    BCMOLT_KEY_EXCHANGE_MODE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_key_exchange_mode;
+
+/** OMCI Device ID. 
+ */
+typedef enum bcmolt_omci_device_id
+{
+    BCMOLT_OMCI_DEVICE_ID_BASELINE                                                  = 10,   /**< Baseline. */
+    BCMOLT_OMCI_DEVICE_ID_EXTENDED                                                  = 11    /**< Extended. */
+} bcmolt_omci_device_id;
+
+/** GPON ONU Upgrade Return Code. 
+ */
+typedef enum bcmolt_gpon_onu_upgrade_return_code
+{
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE__BEGIN                                      = 0,
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_SUCCESS                                     = 0,    /**< Command succeeded. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ONU_RESPONSE_TIMEOUT                        = 1,    /**< ONU did not respond to a message within the time specified by the "Write request timeout". */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ONU_ERROR_RESPONSE                          = 2,    /**< Error found in the ONU response. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_TCI_MISMATCH                                = 3,    /**< Transaction ID mismatch. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_GET_IMAGE_FAILED                            = 4,    /**< Get Image Info command failed. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_ACTIVATION_FAILED                           = 5,    /**< Activation software command failed. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE_INTERNAL                                    = 6,    /**< Internal error. */
+    BCMOLT_GPON_ONU_UPGRADE_RETURN_CODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_upgrade_return_code;
+
+/** G.988 OMCI Result Code. 
+ */
+typedef enum bcmolt_omci_result_code
+{
+    BCMOLT_OMCI_RESULT_CODE__BEGIN                                                  = 0,
+    BCMOLT_OMCI_RESULT_CODE_NO_ERROR                                                = 0,    /**< Command processed successfully. */
+    BCMOLT_OMCI_RESULT_CODE_PROCESSING_ERROR                                        = 1,    /**< Command processing error. */
+    BCMOLT_OMCI_RESULT_CODE_NOT_SUPPORTED                                           = 2,    /**< Command not supported, or not applicable for End software download message. */
+    BCMOLT_OMCI_RESULT_CODE_PARAMETER_ERROR                                         = 3,    /**< Parameter error, or not applicable for End software download message. */
+    BCMOLT_OMCI_RESULT_CODE_UNKNOWN_ENTITY                                          = 4,    /**< Unknown managed entity. */
+    BCMOLT_OMCI_RESULT_CODE_UNKNOWN_INSTANCE                                        = 5,    /**< Unknown managed entity instance. */
+    BCMOLT_OMCI_RESULT_CODE_DEVICE_BUSY                                             = 6,    /**< Device busy. */
+    BCMOLT_OMCI_RESULT_CODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_omci_result_code;
+
+/** ONU state. 
+ */
+typedef enum bcmolt_onu_state
+{
+    BCMOLT_ONU_STATE_NOT_CONFIGURED                                                 = 0,    /**< not_configured. */
+    BCMOLT_ONU_STATE_INACTIVE                                                       = 1,    /**< inactive. */
+    BCMOLT_ONU_STATE_ACTIVE                                                         = 2,    /**< active. */
+    BCMOLT_ONU_STATE_ACTIVE_STANDBY                                                 = 3,    /**< active standby. */
+    BCMOLT_ONU_STATE_DISABLED                                                       = 4,    /**< disabled. */
+    BCMOLT_ONU_STATE_AWAKE_FREE                                                     = 5,    /**< ONU is active, but power management is enabled. ONU is allowed to enter low power states at its own discretion. */
+    BCMOLT_ONU_STATE_PROCESSING                                                     = 7,    /**< processing. */
+    BCMOLT_ONU_STATE_LOW_POWER_DOZE                                                 = 8,    /**< ONU has entered the Doze low power state. */
+    BCMOLT_ONU_STATE_LOW_POWER_SLEEP                                                = 9,    /**< ONU has entered the Sleep low power state. */
+    BCMOLT_ONU_STATE_LOW_POWER_WATCH                                                = 10,   /**< ONU has entered the Watchful Sleep low power state. */
+    BCMOLT_ONU_STATE_UNAWARE                                                        = 11    /**< ONU is added to data base but no bws is saved  */
+} bcmolt_onu_state;
+
+/** rssi location sign. 
+ */
+typedef enum bcmolt_rssi_location_sign
+{
+    BCMOLT_RSSI_LOCATION_SIGN__BEGIN                                                = 0,
+    BCMOLT_RSSI_LOCATION_SIGN_BEFORE                                                = 0,    /**< before. */
+    BCMOLT_RSSI_LOCATION_SIGN_AFTER                                                 = 1,    /**< after. */
+    BCMOLT_RSSI_LOCATION_SIGN__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_rssi_location_sign;
+
+/** ONU post discovery mode. 
+ */
+typedef enum bcmolt_onu_post_discovery_mode
+{
+    BCMOLT_ONU_POST_DISCOVERY_MODE__BEGIN                                           = 0,
+    BCMOLT_ONU_POST_DISCOVERY_MODE_NONE                                             = 0,    /**< none. */
+    BCMOLT_ONU_POST_DISCOVERY_MODE_ACTIVATE                                         = 1,    /**< activate. */
+    BCMOLT_ONU_POST_DISCOVERY_MODE_DISABLE                                          = 2,    /**< disable. */
+    BCMOLT_ONU_POST_DISCOVERY_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_onu_post_discovery_mode;
+
+/** Image transfer status. 
+ */
+typedef enum bcmolt_image_transfer_status
+{
+    BCMOLT_IMAGE_TRANSFER_STATUS__BEGIN                                             = 0,
+    BCMOLT_IMAGE_TRANSFER_STATUS_SUCCESS                                            = 0,    /**< Success. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_MEMORY_ALLOCATION_FAILURE                          = 1,    /**< Memory allocation failure. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_UNSUPPORTED_FILE_TYPE                              = 2,    /**< Unsupported file type. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_CRC_ERROR                                          = 3,    /**< CRC checksum error. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_BLOCK_OUT_OF_SYNC                                  = 4,    /**< Block out of sync. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_INTERNAL_ERROR                                     = 5,    /**< Internal error. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_INVALID_STATE                                      = 6,    /**< Invalid state. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_PREMATURE_TERMINATION                              = 7,    /**< Premature termination. */
+    BCMOLT_IMAGE_TRANSFER_STATUS_ACK_TIMEOUT                                        = 8,    /**< ACK timeout. */
+    BCMOLT_IMAGE_TRANSFER_STATUS__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_image_transfer_status;
+
+/** iwf mode. 
+ */
+typedef enum bcmolt_iwf_mode
+{
+    BCMOLT_IWF_MODE__BEGIN                                                          = 0,
+    BCMOLT_IWF_MODE_DIRECT_MAPPING_MODE                                             = 0,    /**< DIRECT MAPPING MODE. */
+    BCMOLT_IWF_MODE_PER_FLOW_MODE                                                   = 1,    /**< PER FLOW MODE. */
+    BCMOLT_IWF_MODE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_iwf_mode;
+
+/** log file id. 
+ */
+typedef enum bcmolt_log_file_id
+{
+    BCMOLT_LOG_FILE_ID__BEGIN                                                       = 0,
+    BCMOLT_LOG_FILE_ID_SRAM                                                         = 0,    /**< SRAM. */
+    BCMOLT_LOG_FILE_ID_DDR                                                          = 1,    /**< DDR. */
+    BCMOLT_LOG_FILE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_file_id;
+
+/** log level. 
+ */
+typedef enum bcmolt_log_level
+{
+    BCMOLT_LOG_LEVEL__BEGIN                                                         = 0,
+    BCMOLT_LOG_LEVEL_NO_LOG                                                         = 0,    /**< no log. */
+    BCMOLT_LOG_LEVEL_FATAL                                                          = 1,    /**< fatal. */
+    BCMOLT_LOG_LEVEL_ERROR                                                          = 2,    /**< error. */
+    BCMOLT_LOG_LEVEL_WARNING                                                        = 3,    /**< warning. */
+    BCMOLT_LOG_LEVEL_INFO                                                           = 4,    /**< info. */
+    BCMOLT_LOG_LEVEL_DEBUG                                                          = 5,    /**< debug. */
+    BCMOLT_LOG_LEVEL__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_level;
+
+/** log style. 
+ */
+typedef enum bcmolt_log_style
+{
+    BCMOLT_LOG_STYLE__BEGIN                                                         = 0,
+    BCMOLT_LOG_STYLE_NORMAL                                                         = 0,    /**< normal. */
+    BCMOLT_LOG_STYLE_BOLD                                                           = 1,    /**< bold. */
+    BCMOLT_LOG_STYLE_UNDERLINE                                                      = 2,    /**< underline. */
+    BCMOLT_LOG_STYLE_BLINK                                                          = 3,    /**< blink. */
+    BCMOLT_LOG_STYLE_REVERSE_VIDEO                                                  = 4,    /**< reverse video. */
+    BCMOLT_LOG_STYLE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_style;
+
+/** log type. 
+ */
+typedef enum bcmolt_log_type
+{
+    BCMOLT_LOG_TYPE__BEGIN                                                          = 0,
+    BCMOLT_LOG_TYPE_NONE                                                            = 0,    /**< dont show log  */
+    BCMOLT_LOG_TYPE_PRINT                                                           = 1,    /**< print. */
+    BCMOLT_LOG_TYPE_SAVE                                                            = 2,    /**< save. */
+    BCMOLT_LOG_TYPE_BOTH                                                            = 3,    /**< both. */
+    BCMOLT_LOG_TYPE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_type;
+
+/** MAC table miss fallback. 
+ */
+typedef enum bcmolt_mac_table_miss_fallback
+{
+    BCMOLT_MAC_TABLE_MISS_FALLBACK__BEGIN                                           = 0,
+    BCMOLT_MAC_TABLE_MISS_FALLBACK_DROP                                             = 0,    /**< The packet is dropped. */
+    BCMOLT_MAC_TABLE_MISS_FALLBACK_DEFAULT_FLOW                                     = 1,    /**< The packet is forwarded with the provisioned default flow ID. */
+    BCMOLT_MAC_TABLE_MISS_FALLBACK_VID                                              = 2,    /**< The packet is forwarded with a flow ID equal to its VID. */
+    BCMOLT_MAC_TABLE_MISS_FALLBACK__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_mac_table_miss_fallback;
+
+/** MAC table Learning mode. 
+ */
+typedef enum bcmolt_mac_table_learning_mode
+{
+    BCMOLT_MAC_TABLE_LEARNING_MODE__BEGIN                                           = 0,
+    BCMOLT_MAC_TABLE_LEARNING_MODE_NORMAL                                           = 0,    /**< Normal mode: upstream traffic that matches on MAC/VID but doesn't match on flow ID is still allowed to pass. */
+    BCMOLT_MAC_TABLE_LEARNING_MODE_MOVE                                             = 1,    /**< Normal mode: upstream traffic that matches on MAC/VID but doesn't match on flow ID is considered to be a MAC move condition. */
+    BCMOLT_MAC_TABLE_LEARNING_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_mac_table_learning_mode;
+
+/** Mapping tag method. 
+ */
+typedef enum bcmolt_mapping_tag_method
+{
+    BCMOLT_MAPPING_TAG_METHOD_OUTER_VID                                             = 1,    /**< Outer VID. */
+    BCMOLT_MAPPING_TAG_METHOD_INNER_VID                                             = 0     /**< Inner VID. */
+} bcmolt_mapping_tag_method;
+
+/** NNI Connection. 
+ */
+typedef enum bcmolt_nni_connection
+{
+    BCMOLT_NNI_CONNECTION__BEGIN                                                    = 0,
+    BCMOLT_NNI_CONNECTION_PRIMARY                                                   = 0,    /**< Primary. */
+    BCMOLT_NNI_CONNECTION_BACKUP                                                    = 1,    /**< Backup. */
+    BCMOLT_NNI_CONNECTION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_connection;
+
+/** Trivalent. 
+ */
+typedef enum bcmolt_trivalent
+{
+    BCMOLT_TRIVALENT__BEGIN                                                         = 0,
+    BCMOLT_TRIVALENT_FALSE                                                          = 0,    /**< False. */
+    BCMOLT_TRIVALENT_TRUE                                                           = 1,    /**< True. */
+    BCMOLT_TRIVALENT_NOT_APPLICABLE                                                 = 2,    /**< Not Applicable. */
+    BCMOLT_TRIVALENT__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_trivalent;
+
+/** ODN Class. 
+ */
+typedef enum bcmolt_odn_class
+{
+    BCMOLT_ODN_CLASS_N1                                                             = 0,    /**< N1. */
+    BCMOLT_ODN_CLASS_N2                                                             = 1,    /**< N2. */
+    BCMOLT_ODN_CLASS_E1                                                             = 3,    /**< E1. */
+    BCMOLT_ODN_CLASS_E2                                                             = 4     /**< E2. */
+} bcmolt_odn_class;
+
+/** OMCI Port ID operation. 
+ */
+typedef enum bcmolt_omci_port_id_operation
+{
+    BCMOLT_OMCI_PORT_ID_OPERATION__BEGIN                                            = 0,
+    BCMOLT_OMCI_PORT_ID_OPERATION_CONFIGURE                                         = 0,    /**< configure. */
+    BCMOLT_OMCI_PORT_ID_OPERATION_REMOVE                                            = 1,    /**< remove. */
+    BCMOLT_OMCI_PORT_ID_OPERATION__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_omci_port_id_operation;
+
+/** ONU operation. 
+ */
+typedef enum bcmolt_onu_operation
+{
+    BCMOLT_ONU_OPERATION__BEGIN                                                     = 0,
+    BCMOLT_ONU_OPERATION_INACTIVE                                                   = 0,    /**< Inactive. */
+    BCMOLT_ONU_OPERATION_ACTIVE                                                     = 1,    /**< Active. */
+    BCMOLT_ONU_OPERATION_DISABLE                                                    = 2,    /**< Disable. */
+    BCMOLT_ONU_OPERATION_ENABLE                                                     = 3,    /**< Enable. */
+    BCMOLT_ONU_OPERATION_ACTIVE_STANDBY                                             = 4,    /**< Active Standby. */
+    BCMOLT_ONU_OPERATION_AWAKE_FREE                                                 = 5,    /**< Transitions the ONU to an active state with power management enabled. Allowed in inactive, disabled, and active states. */
+    BCMOLT_ONU_OPERATION__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_onu_operation;
+
+/** ONU Power level. 
+ */
+typedef enum bcmolt_onu_power_level
+{
+    BCMOLT_ONU_POWER_LEVEL__BEGIN                                                   = 0,
+    BCMOLT_ONU_POWER_LEVEL_INCREASE                                                 = 0,    /**< increase. */
+    BCMOLT_ONU_POWER_LEVEL_DECREASE                                                 = 1,    /**< decrease. */
+    BCMOLT_ONU_POWER_LEVEL__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_onu_power_level;
+
+/** TC layer protocol. 
+ */
+typedef enum bcmolt_tc_protocol
+{
+    BCMOLT_TC_PROTOCOL__BEGIN                                                       = 0,
+    BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_987_P_3                                  = 0,    /**< TC layer protocol G.987.3 */
+    BCMOLT_TC_PROTOCOL_TC_LAYER_PROTOCOL_G_989_P_3                                  = 1,    /**< TC layer protocol G.989.3 */
+    BCMOLT_TC_PROTOCOL__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_tc_protocol;
+
+/** Packet Injection Error. 
+ */
+typedef enum bcmolt_packet_injection_error
+{
+    BCMOLT_PACKET_INJECTION_ERROR__BEGIN                                            = 0,
+    BCMOLT_PACKET_INJECTION_ERROR_GEM_PORT_NOT_ACTIVE                               = 0,    /**< GEM Port Not Active. */
+    BCMOLT_PACKET_INJECTION_ERROR__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_packet_injection_error;
+
+/** packet type. 
+ */
+typedef enum bcmolt_packet_type
+{
+    BCMOLT_PACKET_TYPE__BEGIN                                                       = 0,
+    BCMOLT_PACKET_TYPE_CPU                                                          = 0,    /**< CPU. */
+    BCMOLT_PACKET_TYPE_OMCI                                                         = 1,    /**< OMCI. */
+    BCMOLT_PACKET_TYPE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_packet_type;
+
+/** Password authentication fail reason. 
+ */
+typedef enum bcmolt_password_authentication_fail_reason
+{
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON__BEGIN                               = 0,
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_NONE                                 = 0,    /**< none. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_INCONSISTENCY               = 1,    /**< Password inconsistency. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_MISMATCH                    = 2,    /**< Password mismatch. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_PASSWORD_AUTHENTICATION_TIMEOUT      = 3,    /**< Password authentication timeout. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_ONU_ALARM                            = 4,    /**< onu alarm. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_LOS_EVENT                            = 5,    /**< los event. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON_DISABLE_EVENT                        = 6,    /**< disable event. */
+    BCMOLT_PASSWORD_AUTHENTICATION_FAIL_REASON__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_password_authentication_fail_reason;
+
+/** Polarity. 
+ */
+typedef enum bcmolt_polarity
+{
+    BCMOLT_POLARITY__BEGIN                                                          = 0,
+    BCMOLT_POLARITY_LOW                                                             = 0,    /**< Low. */
+    BCMOLT_POLARITY_HIGH                                                            = 1,    /**< High. */
+    BCMOLT_POLARITY__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_polarity;
+
+/** Polling Interval. 
+ */
+typedef enum bcmolt_polling_interval
+{
+    BCMOLT_POLLING_INTERVAL_POLLING_DISABLED                                        = 0,            /**< No polling gates will be sent to this LLID. */
+    BCMOLT_POLLING_INTERVAL_US_500                                                  = 500,          /**< 500 us. */
+    BCMOLT_POLLING_INTERVAL_MS_1                                                    = 1000,         /**< 1 ms. */
+    BCMOLT_POLLING_INTERVAL_MS_2                                                    = 2000,         /**< 2 ms. */
+    BCMOLT_POLLING_INTERVAL_MS_4                                                    = 4000,         /**< 4 ms. */
+    BCMOLT_POLLING_INTERVAL_MS_8                                                    = 8000,         /**< 8 ms. */
+    BCMOLT_POLLING_INTERVAL_MS_16                                                   = 16000,        /**< 16 ms. */
+    BCMOLT_POLLING_INTERVAL_AUTOMATIC                                               = 2147483647L   /**< Firmware will choose an appropriate value. */
+} bcmolt_polling_interval;
+
+/** PON Operation. 
+ */
+typedef enum bcmolt_pon_operation
+{
+    BCMOLT_PON_OPERATION__BEGIN                                                     = 0,
+    BCMOLT_PON_OPERATION_INACTIVE                                                   = 0,            /**< Inactive. */
+    BCMOLT_PON_OPERATION_ACTIVE_WORKING                                             = 1,            /**< Active Working. */
+    BCMOLT_PON_OPERATION_ACTIVE_STANDBY                                             = 2,            /**< Active Standby. */
+    BCMOLT_PON_OPERATION__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_pon_operation;
+
+/** PON Protection Switching Options. 
+ */
+typedef enum bcmolt_pon_protection_switching_options
+{
+    BCMOLT_PON_PROTECTION_SWITCHING_OPTIONS_NONE                                    = 0,
+    BCMOLT_PON_PROTECTION_SWITCHING_OPTIONS_SWIFT_POPUP                             = 0x0001,   /**< If set, switchovers will utilize the Swift_POPUP and Ranging_Adjustment PLOAMs added in G.984 annex D. */
+    BCMOLT_PON_PROTECTION_SWITCHING_OPTIONS_DEBUG_FAST_RANGING                      = 0x0002    /**< If set, ONU EQDs will not be calculated as part of a switchover.  Instead, each ONU's new EQD will be equal to its last EQD when the PON NI was in active-working state.  This provides a fast switchover, but can only be used if the trunk distance never changes. */
+} bcmolt_pon_protection_switching_options;
+
+/** PON state. 
+ */
+typedef enum bcmolt_pon_state
+{
+    BCMOLT_PON_STATE__BEGIN                                                         = 0,
+    BCMOLT_PON_STATE_INACTIVE                                                       = 0,        /**< Inactive. */
+    BCMOLT_PON_STATE_PROCESSING                                                     = 1,        /**< Processing. */
+    BCMOLT_PON_STATE_ACTIVE_WORKING                                                 = 2,        /**< Active Working. */
+    BCMOLT_PON_STATE_ACTIVE_STANDBY                                                 = 3,        /**< Active Standby. */
+    BCMOLT_PON_STATE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_pon_state;
+
+/** power levelling control. 
+ */
+typedef enum bcmolt_power_levelling_control
+{
+    BCMOLT_POWER_LEVELLING_CONTROL__BEGIN                                           = 0,
+    BCMOLT_POWER_LEVELLING_CONTROL_DIRECT                                           = 0,    /**< Direct. */
+    BCMOLT_POWER_LEVELLING_CONTROL_DECREASE                                         = 1,    /**< Decrease. */
+    BCMOLT_POWER_LEVELLING_CONTROL_INCREASE                                         = 2,    /**< Increase. */
+    BCMOLT_POWER_LEVELLING_CONTROL__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_power_levelling_control;
+
+/** The reason that a power management state change occurred. 
+ */
+typedef enum bcmolt_power_management_transition_reason
+{
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON__BEGIN                                = 0,
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_ENABLED              = 0,    /**< Host requested power management enable. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_POWER_MANAGEMENT_DISABLED             = 1,    /**< Host requested power management disable. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_AWAKE                   = 2,    /**< Received sleep request PLOAM from ONU. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_DOZE                    = 3,    /**< Received sleep request PLOAM from ONU. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_SLEEP                   = 4,    /**< Received sleep request PLOAM from ONU. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_SLEEP_REQUEST_WATCH                   = 5,    /**< Received sleep request PLOAM from ONU. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TERI_EXPIRED                          = 6,    /**< Teri timer expired. It has been too long since we have received an upstream burst from an ONU in a low power state. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_TALERTED_EXPIRED                      = 7,    /**< Talerted timer expired. It has been too long since the ONU was requested to wake up with no idication that it has complied. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON_ALARM                                 = 8,    /**< A LOSi/LOFi/LOBi alarm has ben raised against the ONU. */
+    BCMOLT_POWER_MANAGEMENT_TRANSITION_REASON__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_power_management_transition_reason;
+
+/** PRBS Polynomial. 
+ */
+typedef enum bcmolt_prbs_polynomial
+{
+    BCMOLT_PRBS_POLYNOMIAL__BEGIN                                                   = 0,
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_7                                                   = 0,    /**< PRBS_7. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_9                                                   = 1,    /**< PRBS_9. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_11                                                  = 2,    /**< PRBS_11. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_15                                                  = 3,    /**< PRBS_15. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_23                                                  = 4,    /**< PRBS_23. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_31                                                  = 5,    /**< PRBS_31. */
+    BCMOLT_PRBS_POLYNOMIAL_PRBS_58                                                  = 6,    /**< PRBS_58. */
+    BCMOLT_PRBS_POLYNOMIAL__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_prbs_polynomial;
+
+/** PRBS checker mode. 
+ */
+typedef enum bcmolt_prbs_checker_mode
+{
+    BCMOLT_PRBS_CHECKER_MODE__BEGIN                                                 = 0,
+    BCMOLT_PRBS_CHECKER_MODE_SELF_SYNC                                              = 0,    /**< Self-sync mode w/ hysteresis. PRBS seed register is continuously seeded with previous received bits.  This mode results in faster locking, but bit errors are counted multiple times (often by 3x).  */
+    BCMOLT_PRBS_CHECKER_MODE_INITIAL_SEED_MODE                                      = 1,    /**< Initial seed mode w/ hysteresis. PRBS seed registers is seeded with previous received bits only till PRBS lock is  acquired and then they run locally independently from the received data until the checker goes out of PRBS lock.  */
+    BCMOLT_PRBS_CHECKER_MODE_INITIAL_SEED_MODE_2                                    = 2,    /**< Initial seed mode w/o hysteresis. Similar to mode 1 above except once locked it stays locked until PRBS is disabled.    */
+    BCMOLT_PRBS_CHECKER_MODE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_prbs_checker_mode;
+
+/** PRBS Lock State. 
+ */
+typedef enum bcmolt_prbs_lock_state
+{
+    BCMOLT_PRBS_LOCK_STATE__BEGIN                                                   = 0,
+    BCMOLT_PRBS_LOCK_STATE_UNLOCKED                                                 = 0,    /**< PRBS Checker is out of LOCK state and state machine is searching for a LOCK */
+    BCMOLT_PRBS_LOCK_STATE_LOCKED                                                   = 1,    /**< PRBS Checker is in LOCKED state */
+    BCMOLT_PRBS_LOCK_STATE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_prbs_lock_state;
+
+/** Possible Raman Mitigation settings.  Raman mitigation injects pseudo-noise 
+ * into the 1G downstream data path to reduce interference with analog video 
+ * signals on other wavelengths. 
+ */
+typedef enum bcmolt_raman_mitigation_mode
+{
+    BCMOLT_RAMAN_MITIGATION_MODE__BEGIN                                             = 0,
+    BCMOLT_RAMAN_MITIGATION_MODE_DISABLED                                           = 0,    /**< No packets are generated. */
+    BCMOLT_RAMAN_MITIGATION_MODE_RANDOM                                             = 1,    /**< Pseudo-random packets are generated. */
+    BCMOLT_RAMAN_MITIGATION_MODE_FIXED                                              = 2,    /**< Fixed background packets are generated. */
+    BCMOLT_RAMAN_MITIGATION_MODE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_raman_mitigation_mode;
+
+/** Ranging fail reason. 
+ */
+typedef enum bcmolt_ranging_fail_reason
+{
+    BCMOLT_RANGING_FAIL_REASON__BEGIN                                               = 0,
+    BCMOLT_RANGING_FAIL_REASON_NONE                                                 = 0,    /**< none. */
+    BCMOLT_RANGING_FAIL_REASON_RANGING_ACK_TIMEOUT                                  = 1,    /**< ranging ack timeout. */
+    BCMOLT_RANGING_FAIL_REASON_PLOAM_DATA_MISMATCH                                  = 2,    /**< ploam data mismatch. */
+    BCMOLT_RANGING_FAIL_REASON_PLOAM_TYPE_MISMATCH                                  = 3,    /**< ploam type mismatch. */
+    BCMOLT_RANGING_FAIL_REASON_PLOAM_ONU_ID_MISMATCH                                = 4,    /**< ploam onu id mismatch. */
+    BCMOLT_RANGING_FAIL_REASON_DRIFT_EXCEEDED                                       = 5,    /**< drift exceeded. */
+    BCMOLT_RANGING_FAIL_REASON_NO_PLOAM_RECEIVED                                    = 6,    /**< no ploam received. */
+    BCMOLT_RANGING_FAIL_REASON_LOS                                                  = 7,    /**< los. */
+    BCMOLT_RANGING_FAIL_REASON_ALARMS                                               = 8,    /**< alarms. */
+    BCMOLT_RANGING_FAIL_REASON__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_ranging_fail_reason;
+
+/** Registration Behavior. 
+ */
+typedef enum bcmolt_registration_behavior
+{
+    BCMOLT_REGISTRATION_BEHAVIOR__BEGIN                                             = 0,
+    BCMOLT_REGISTRATION_BEHAVIOR_AUTOMATIC                                          = 0,    /**< All links will be allowed to register. */
+    BCMOLT_REGISTRATION_BEHAVIOR_NOTIFY_UNKNOWN                                     = 1,    /**< Links that are not pre-provisioned will not be allowed to register.  A maskable indication will be sent to the host which can then decide if the link should be provisioned. */
+    BCMOLT_REGISTRATION_BEHAVIOR__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_registration_behavior;
+
+/** request registration fail reason. 
+ */
+typedef enum bcmolt_request_registration_fail_reason
+{
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON__BEGIN                                  = 0,
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_NONE                                    = 0,    /**< None. */
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_REGISTRATION_PLOAM_TIMEOUT              = 1,    /**< registration ploam timeout. */
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_ONU_ALARM                               = 2,    /**< onu alarm. */
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_DEACTIVATION                            = 3,    /**< deactivation. */
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON_DISABLE                                 = 4,    /**< disable. */
+    BCMOLT_REQUEST_REGISTRATION_FAIL_REASON__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_request_registration_fail_reason;
+
+/** Result. 
+ */
+typedef enum bcmolt_result
+{
+    BCMOLT_RESULT__BEGIN                                                            = 0,
+    BCMOLT_RESULT_SUCCESS                                                           = 0,    /**< Success. */
+    BCMOLT_RESULT_FAIL                                                              = 1,    /**< Fail. */
+    BCMOLT_RESULT__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_result;
+
+/** Type of the rogue detection algorithm. 
+ */
+typedef enum bcmolt_rogue_detection_algorithm_type
+{
+    BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE__BEGIN                                    = 0,
+    BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EARLY_ROGUE_DETECTION                     = 0,    /**< Firmware-driven periodic process which runs in the background to detect the potential rogue ONU. */
+    BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_SPECIAL_MAP                               = 1,    /**< Use the user-provisioned special bandwidth map until it is told to stop. */
+    BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE_EXTENDED_GUARD_TIME                       = 2,    /**< Destructive tool that extends the guard time on all bursts. */
+    BCMOLT_ROGUE_DETECTION_ALGORITHM_TYPE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_rogue_detection_algorithm_type;
+
+/** Rogue ONU detection measurement type. 
+ */
+typedef enum bcmolt_rogue_detection_window
+{
+    BCMOLT_ROGUE_DETECTION_WINDOW__BEGIN                                            = 0,
+    BCMOLT_ROGUE_DETECTION_WINDOW_SILENT_WINDOW                                     = 0,    /**< Silent window measurement. */
+    BCMOLT_ROGUE_DETECTION_WINDOW_CUT_OFF_WINDOW                                    = 1,    /**< Cut-off window measurement. */
+    BCMOLT_ROGUE_DETECTION_WINDOW__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_rogue_detection_window;
+
+/** Status of the rogue ONU detection result. 
+ */
+typedef enum bcmolt_rogue_measurement_result
+{
+    BCMOLT_ROGUE_MEASUREMENT_RESULT__BEGIN                                          = 0,
+    BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_COMPLETE                                   = 0,    /**< Rogue ONU RSSI detection activity completed. */
+    BCMOLT_ROGUE_MEASUREMENT_RESULT_NOT_PERFORMED                                   = 1,    /**< Rogue ONU detection not performed. */
+    BCMOLT_ROGUE_MEASUREMENT_RESULT_ROGUE_CYCLE_STOP                                = 2,    /**< Rogue ONU cycle detection stopped. */
+    BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_ERROR                                      = 3,    /**< There was an error in the RSSI measurement. */
+    BCMOLT_ROGUE_MEASUREMENT_RESULT_RSSI_NOT_COMPLETE                               = 4,    /**< The RSSI mesaurement was not complete. */
+    BCMOLT_ROGUE_MEASUREMENT_RESULT__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_rogue_measurement_result;
+
+/** Rogue Scan Indication Status . 
+ */
+typedef enum bcmolt_rogue_scan_status
+{
+    BCMOLT_ROGUE_SCAN_STATUS__BEGIN                                                 = 0,
+    BCMOLT_ROGUE_SCAN_STATUS_COMPLETE                                               = 0,    /**< Rogue Scan was completed. */
+    BCMOLT_ROGUE_SCAN_STATUS_LLID_STATE_IS_BAD                                      = 1,    /**< llid in targeted scan was an active link. */
+    BCMOLT_ROGUE_SCAN_STATUS_LLID_IS_OOR                                            = 2,    /**< llid in targeted scan is out of range for pon. */
+    BCMOLT_ROGUE_SCAN_STATUS_SCAN_ERR_NORES                                         = 3,    /**< There were no available LIM indexes for the scan.. */
+    BCMOLT_ROGUE_SCAN_STATUS_SCAN_ERR_INTERNAL                                      = 4,    /**< An internal software was encountered.. */
+    BCMOLT_ROGUE_SCAN_STATUS__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_rogue_scan_status;
+
+/** RSSI measurement fail reason. 
+ */
+typedef enum bcmolt_rssi_measurement_fail_reason
+{
+    BCMOLT_RSSI_MEASUREMENT_FAIL_REASON__BEGIN                                      = 0,
+    BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NONE                                        = 0,    /**< None. */
+    BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_DELIMITER                                = 1,    /**< No delimiter. */
+    BCMOLT_RSSI_MEASUREMENT_FAIL_REASON_NO_ACCESS                                   = 2,    /**< No access. */
+    BCMOLT_RSSI_MEASUREMENT_FAIL_REASON__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_rssi_measurement_fail_reason;
+
+/** secure mutual authentication fail reason. 
+ */
+typedef enum bcmolt_secure_mutual_authentication_fail_reason
+{
+    BCMOLT_SECURE_MUTUAL_AUTHENTICATION_FAIL_REASON__BEGIN                          = 0,
+    BCMOLT_SECURE_MUTUAL_AUTHENTICATION_FAIL_REASON_TIMEOUT                         = 0,    /**< secure mutual authentication timeout. */
+    BCMOLT_SECURE_MUTUAL_AUTHENTICATION_FAIL_REASON__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_secure_mutual_authentication_fail_reason;
+
+/** serdes ranging mode. 
+ */
+typedef enum bcmolt_serdes_ranging_mode
+{
+    BCMOLT_SERDES_RANGING_MODE__BEGIN                                               = 0,
+    BCMOLT_SERDES_RANGING_MODE_ED_MODE                                              = 0,    /**< ed mode. */
+    BCMOLT_SERDES_RANGING_MODE_BCDR_RESET_MODE                                      = 1,    /**< BCDR reset mode. */
+    BCMOLT_SERDES_RANGING_MODE_FAST_MODE                                            = 2,    /**< fast mode. */
+    BCMOLT_SERDES_RANGING_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_serdes_ranging_mode;
+
+/** SerDes Instance. 
+ */
+typedef enum bcmolt_serdes_instance
+{
+    BCMOLT_SERDES_INSTANCE__BEGIN                                                   = 0,
+    BCMOLT_SERDES_INSTANCE_INSTANCE_0                                               = 0,    /**< Primary Serdes, or 10G SerDes for EPON pon_ids. */
+    BCMOLT_SERDES_INSTANCE_INSTANCE_1                                               = 1,    /**< Secondary Serdes, or 1G/2G SerDes for EPON pon_ids. */
+    BCMOLT_SERDES_INSTANCE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_serdes_instance;
+
+/** Shaper Mode. 
+ */
+typedef enum bcmolt_shaper_mode
+{
+    BCMOLT_SHAPER_MODE__BEGIN                                                       = 0,
+    BCMOLT_SHAPER_MODE_LAYER_1                                                      = 0,    /**< Shapers will count IPG, preamble, frame, and FCS */
+    BCMOLT_SHAPER_MODE_LAYER_2                                                      = 1,    /**< Shapers will count frame and FCS. */
+    BCMOLT_SHAPER_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_shaper_mode;
+
+/** All possible statistic alarm trigger conditions. 
+ */
+typedef enum bcmolt_stat_condition_type
+{
+    BCMOLT_STAT_CONDITION_TYPE__BEGIN                                               = 0,
+    BCMOLT_STAT_CONDITION_TYPE_NONE                                                 = 0,    /**< The alarm is disabled. */
+    BCMOLT_STAT_CONDITION_TYPE_RATE_THRESHOLD                                       = 1,    /**< The alarm is triggered if the stats delta value between samples crosses the configured threshold boundary. */
+    BCMOLT_STAT_CONDITION_TYPE_RATE_RANGE                                           = 2,    /**< The alarm is triggered if the stats delta value between samples deviates from the configured range. */
+    BCMOLT_STAT_CONDITION_TYPE_VALUE_THRESHOLD                                      = 3,    /**< The alarm is raised if the stats sample value becomes greater than this level.  The alarm is cleared when the host read the stats. */
+    BCMOLT_STAT_CONDITION_TYPE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_stat_condition_type;
+
+/** Switch over type c onu state. 
+ */
+typedef enum bcmolt_switch_over_type_c_onu_state
+{
+    BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE__BEGIN                                      = 0,
+    BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE_ACTIVE                                      = 0,    /**< Active. */
+    BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE_ACTIVE_STANDBY                              = 1,    /**< Active standby. */
+    BCMOLT_SWITCH_OVER_TYPE_C_ONU_STATE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_switch_over_type_c_onu_state;
+
+/** System working mode (GPON/EPON etc.) 
+ */
+typedef enum bcmolt_system_mode
+{
+    BCMOLT_SYSTEM_MODE__BEGIN                                                       = 0,
+    BCMOLT_SYSTEM_MODE_GPON__16_X                                                   = 0,    /**< 16x GPON */
+    BCMOLT_SYSTEM_MODE_GPON__8_X                                                    = 1,    /**< 8x GPON */
+    BCMOLT_SYSTEM_MODE_GPON__4_X                                                    = 2,    /**< 4x GPON */
+    BCMOLT_SYSTEM_MODE_EPON__16_X                                                   = 3,    /**< 16x EPON */
+    BCMOLT_SYSTEM_MODE_XGPON_1__8_X                                                 = 4,    /**< 8x XGPON1 */
+    BCMOLT_SYSTEM_MODE_EPON__8_X_COEXISTENCE_TDMA                                   = 5,    /**< 8x EPON coexistence TDMA */
+    BCMOLT_SYSTEM_MODE_AE_8_X                                                       = 6,    /**< 8x 10G Active Ethernet */
+    BCMOLT_SYSTEM_MODE_EPON__8_X_10_G                                               = 7,    /**< 8x EPON (10/10 only) */
+    BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE                                 = 8,    /**< 8x GPON 4x XGPON coexistence */
+    BCMOLT_SYSTEM_MODE_EPON__8_X                                                    = 9,    /**< 8x EPON (1/1 only) */
+    BCMOLT_SYSTEM_MODE_EPON__4_X                                                    = 10,   /**< 4x EPON (1/1 only) */
+    BCMOLT_SYSTEM_MODE_EPON__4_X_COEXISTENCE_TDMA                                   = 11,   /**< 4x EPON coexistence TDMA */
+    BCMOLT_SYSTEM_MODE_EPON__4_X_10_G                                               = 12,   /**< 4x EPON (10/10 only) */
+    BCMOLT_SYSTEM_MODE_XGS__2_X_10_G                                                = 13,   /**< 2x XGS-PON (10/10) */
+    BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G                                             = 14,   /**< 2x NGPON2 (10/10) */
+    BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G                                          = 15,   /**< 8x NGPON2 (10/2.5) */
+    BCMOLT_SYSTEM_MODE_XGPON_1__4_X                                                 = 16,   /**< 4x XGPON1 */
+    BCMOLT_SYSTEM_MODE_EPON__2_X_10_G                                               = 17,   /**< 2x EPON (10/10 only) */
+    BCMOLT_SYSTEM_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_system_mode;
+
+/** US operating wavelength bands. 
+ */
+typedef enum bcmolt_us_operating_wavelength_bands
+{
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_WIDE_BAND                = 0,    /**< Expanded spectrum wide band option */
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_REDUCED_BAND             = 1,    /**< Expanded spectrum reduced band option */
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_EXPANDED_SPECTRUM_NARROW_BAND              = 2,    /**< Expanded spectrum reduced band option */
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_WIDE_BAND                  = 16,   /**< Shared spectrum wide band option */
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_REDUCED_BAND               = 17,   /**< Shared spectrum reduced band option */
+    BCMOLT_US_OPERATING_WAVELENGTH_BANDS_SHARED_SPECTRUM_NARROW_BAND                = 18    /**< Shared spectrum wide narrow option */
+} bcmolt_us_operating_wavelength_bands;
+
+/** Traffic resume result. 
+ */
+typedef enum bcmolt_traffic_resume_result
+{
+    BCMOLT_TRAFFIC_RESUME_RESULT__BEGIN                                             = 0,
+    BCMOLT_TRAFFIC_RESUME_RESULT_SUCCESS                                            = 0,    /**< Success. */
+    BCMOLT_TRAFFIC_RESUME_RESULT_FAILURE                                            = 1,    /**< Failure. */
+    BCMOLT_TRAFFIC_RESUME_RESULT_SUSPECTED_LOS                                      = 2,    /**< suspected_los. */
+    BCMOLT_TRAFFIC_RESUME_RESULT__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_traffic_resume_result;
+
+/** trx calibration trigger. 
+ */
+typedef enum bcmolt_trx_calibration_trigger
+{
+    BCMOLT_TRX_CALIBRATION_TRIGGER__BEGIN                                           = 0,
+    BCMOLT_TRX_CALIBRATION_TRIGGER_EPON_STAT                                        = 0,    /**< epon stat. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_BCDR_RESET                                  = 1,    /**< gpon bcdr reset. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_TRX_RESET                                   = 2,    /**< gpon trx reset. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_TRX_ED                                      = 3,    /**< gpon trx ed. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_RSSI                                        = 4,    /**< gpon rssi. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_EOB                                         = 5,    /**< gpon eob. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_GPON_RANGING                                     = 6,    /**< gpon ranging. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_SERDES_BURST_EN                                  = 7,    /**< serdes burst en. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_trigger;
+
+/** trx calibration trigger position. 
+ */
+typedef enum bcmolt_trx_calibration_trigger_position
+{
+    BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION__BEGIN                                  = 0,
+    BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION_RISING                                  = 0,    /**< rising edge. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION_FALLING                                 = 1,    /**< falling edge. */
+    BCMOLT_TRX_CALIBRATION_TRIGGER_POSITION__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_trigger_position;
+
+/** trx calibration window mode. 
+ */
+typedef enum bcmolt_trx_calibration_window_mode
+{
+    BCMOLT_TRX_CALIBRATION_WINDOW_MODE__BEGIN                                       = 0,
+    BCMOLT_TRX_CALIBRATION_WINDOW_MODE_RANGING                                      = 0,    /**< ranging. */
+    BCMOLT_TRX_CALIBRATION_WINDOW_MODE_NON_RANGING                                  = 1,    /**< non ranging. */
+    BCMOLT_TRX_CALIBRATION_WINDOW_MODE_BOTH                                         = 2,    /**< ranging and non ranging. */
+    BCMOLT_TRX_CALIBRATION_WINDOW_MODE__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_window_mode;
+
+/** TRX type. 
+ */
+typedef enum bcmolt_trx_type
+{
+    BCMOLT_TRX_TYPE__BEGIN                                                          = 0,
+    BCMOLT_TRX_TYPE_SPS_43_48_H_HP_CDE_SD_2013                                      = 0,    /**< SourcePhotonics - SPS-43-48H-HP-CDE-SD Reset is required BEFORE, TRX is Squelched. till 2013 rev.  */
+    BCMOLT_TRX_TYPE_SOG_4321_PSGB                                                   = 1,    /**< Superxon B+ type */
+    BCMOLT_TRX_TYPE_LTE_3680_M                                                      = 2,    /**< LIGENT LTE3680M. */
+    BCMOLT_TRX_TYPE_SOURCE_PHOTONICS                                                = 3,    /**< Source Photonics. */
+    BCMOLT_TRX_TYPE_LTE_3680_P_TYPE_C_PLUS                                          = 4,    /**< LIGENT LTE3680P_TYPE_C_PLUS. */
+    BCMOLT_TRX_TYPE_ANY                                                             = 5,    /**< Any. */
+    BCMOLT_TRX_TYPE_ANY_RESET_GUARD                                                 = 6,    /**< Any reset guard. */
+    BCMOLT_TRX_TYPE_ANY_RESET_PREAMBLE                                              = 7,    /**< Any reset preamble. */
+    BCMOLT_TRX_TYPE_WTD_RTXM_167_526_CPLUS                                          = 8,    /**< WTD RTXM167 526 C+. */
+    BCMOLT_TRX_TYPE_WTD_RTXM_167_522_BPLUS                                          = 9,    /**< WTD RTXM167 522 B+. */
+    BCMOLT_TRX_TYPE_LTE_3680_P_BC                                                   = 10,   /**< LIGENT HiSense LTE3680P-BC. */
+    BCMOLT_TRX_TYPE_SOGQ_4321_PSGB_C_PLUS                                           = 11,   /**< Superxon C+ type */
+    BCMOLT_TRX_TYPE_WTD_RTXM167_521                                                 = 12,   /**< WTD RTXM167_521. */
+    BCMOLT_TRX_TYPE_LTE3678                                                         = 13,   /**< LTE3678. */
+    BCMOLT_TRX_TYPE_SOGP_4321_PSGA                                                  = 14,   /**< Superxon SOGP4321-PSGA. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_1                                                  = 15,   /**< gpon general 1. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_2                                                  = 16,   /**< gpon general 2. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_3                                                  = 17,   /**< gpon general 3. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_4                                                  = 18,   /**< gpon general 4. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_5                                                  = 19,   /**< gpon general 5. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_6                                                  = 20,   /**< gpon general 6. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_7                                                  = 21,   /**< gpon general 7. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_8                                                  = 22,   /**< gpon general 8. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_9                                                  = 23,   /**< gpon general 9. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_10                                                 = 24,   /**< gpon general 10. */
+    BCMOLT_TRX_TYPE_GPON_GENERAL_11                                                 = 25,   /**< gpon general 11. */
+    BCMOLT_TRX_TYPE__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_type;
+
+/** Tune in fail reason. 
+ */
+typedef enum bcmolt_tune_in_fail_reason
+{
+    BCMOLT_TUNE_IN_FAIL_REASON__BEGIN                                               = 0,
+    BCMOLT_TUNE_IN_FAIL_REASON_NONE                                                 = 0,    /**< none. */
+    BCMOLT_TUNE_IN_FAIL_REASON_NO_TUNING_RESPONSE_PLOAM_RECEIVED                    = 1,    /**< No tuning response ploam received. */
+    BCMOLT_TUNE_IN_FAIL_REASON_ONU_ACTIVATION_FAILED                                = 2,    /**< onu activation failed. */
+    BCMOLT_TUNE_IN_FAIL_REASON__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_tune_in_fail_reason;
+
+/** Tune out fail reason. 
+ */
+typedef enum bcmolt_tune_out_fail_reason
+{
+    BCMOLT_TUNE_OUT_FAIL_REASON__BEGIN                                              = 0,
+    BCMOLT_TUNE_OUT_FAIL_REASON_NONE                                                = 0,    /**< none. */
+    BCMOLT_TUNE_OUT_FAIL_REASON_NACK_PLOAM_RECEIVED                                 = 1,    /**< NACK ploam received. */
+    BCMOLT_TUNE_OUT_FAIL_REASON_NO_TUNING_RESPONSE_PLOAM_RECEIVED                   = 2,    /**< no tuning response ploam received. */
+    BCMOLT_TUNE_OUT_FAIL_REASON_TSOURCE_TIMEOUT                                     = 3,    /**< tsource timeout. */
+    BCMOLT_TUNE_OUT_FAIL_REASON_ROLLBACK_REQUEST                                    = 4,    /**< rollback request. */
+    BCMOLT_TUNE_OUT_FAIL_REASON__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_tune_out_fail_reason;
+
+/** UART baud rate. 
+ */
+typedef enum bcmolt_uart_baudrate
+{
+    BCMOLT_UART_BAUDRATE__BEGIN                                                     = 0,
+    BCMOLT_UART_BAUDRATE_UART_RATE_4800                                             = 0,    /**< UART rate 4800. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_9600                                             = 1,    /**< UART rate 9600. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_14400                                            = 2,    /**< UART rate 14400. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_19200                                            = 3,    /**< UART rate 19200. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_38400                                            = 4,    /**< UART rate 38400. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_57600                                            = 5,    /**< UART rate 57600. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_115200                                           = 6,    /**< UART rate 115200. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_230400                                           = 7,    /**< UART rate 230400. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_380400                                           = 8,    /**< UART rate 380400. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_460800                                           = 9,    /**< UART rate 460800. */
+    BCMOLT_UART_BAUDRATE_UART_RATE_921600                                           = 10,   /**< UART rate 921600. */
+    BCMOLT_UART_BAUDRATE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_uart_baudrate;
+
+/** us_gem_port_destination. 
+ */
+typedef enum bcmolt_us_gem_port_destination
+{
+    BCMOLT_US_GEM_PORT_DESTINATION__BEGIN                                           = 0,
+    BCMOLT_US_GEM_PORT_DESTINATION_DATA                                             = 0,    /**< data. */
+    BCMOLT_US_GEM_PORT_DESTINATION_CPU                                              = 1,    /**< cpu. */
+    BCMOLT_US_GEM_PORT_DESTINATION_OMCI                                             = 2,    /**< omci. */
+    BCMOLT_US_GEM_PORT_DESTINATION__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_us_gem_port_destination;
+
+/** US VLAN action. 
+ */
+typedef enum bcmolt_us_vlan_action
+{
+    BCMOLT_US_VLAN_ACTION_ADD                                                       = 1,    /**< Add. */
+    BCMOLT_US_VLAN_ACTION_TRANSPARENT                                               = 0     /**< Transparent. */
+} bcmolt_us_vlan_action;
+
+/** VLAN to flow mapping method. 
+ */
+typedef enum bcmolt_vlan_to_flow_mapping_method
+{
+    BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD__BEGIN                                       = 0,
+    BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD_VID                                          = 0,    /**< VID. */
+    BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD_MACPLUSVID                                   = 1,    /**< MAC+VID. */
+    BCMOLT_VLAN_TO_FLOW_MAPPING_METHOD__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_vlan_to_flow_mapping_method;
+
+/** XGPON GEM Port State. 
+ */
+typedef enum bcmolt_xgpon_gem_port_state
+{
+    BCMOLT_XGPON_GEM_PORT_STATE_NOT_CONFIGURED                                      = 0,    /**< not configured. */
+    BCMOLT_XGPON_GEM_PORT_STATE_INACTIVE                                            = 1,    /**< inactive. */
+    BCMOLT_XGPON_GEM_PORT_STATE_ACTIVE                                              = 3     /**< active. */
+} bcmolt_xgpon_gem_port_state;
+
+/** xgpon num of onus. 
+ */
+typedef enum bcmolt_xgpon_num_of_onus
+{
+    BCMOLT_XGPON_NUM_OF_ONUS__BEGIN                                                 = 0,
+    BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_256_ONUS                                 = 0,    /**< xgpon support 256 onus. */
+    BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS                                 = 1,    /**< xgpon support 510 onus. */
+    BCMOLT_XGPON_NUM_OF_ONUS__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_num_of_onus;
+
+/** xgpon serdes ranging mode. 
+ */
+typedef enum bcmolt_xgpon_serdes_ranging_mode
+{
+    BCMOLT_XGPON_SERDES_RANGING_MODE__BEGIN                                         = 0,
+    BCMOLT_XGPON_SERDES_RANGING_MODE_ED                                             = 0,    /**< ed. */
+    BCMOLT_XGPON_SERDES_RANGING_MODE_BCDR                                           = 1,    /**< bcdr. */
+    BCMOLT_XGPON_SERDES_RANGING_MODE_FAST_RANGING1                                  = 2,    /**< fast ranging1. */
+    BCMOLT_XGPON_SERDES_RANGING_MODE_FAST_RANGING2                                  = 3,    /**< fast ranging2. */
+    BCMOLT_XGPON_SERDES_RANGING_MODE__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_serdes_ranging_mode;
+
+/** XGPON TRX type. 
+ */
+typedef enum bcmolt_xgpon_trx_type
+{
+    BCMOLT_XGPON_TRX_TYPE__BEGIN                                                    = 0,
+    BCMOLT_XGPON_TRX_TYPE_LTH_7222_PC                                               = 0,    /**< Ligent LTH 7222-PC. */
+    BCMOLT_XGPON_TRX_TYPE_USER_DEFINED                                              = 1,    /**< User Defined. */
+    BCMOLT_XGPON_TRX_TYPE_WTD_RTXM266_702                                           = 2,    /**< WTD_RTXM266_702. */
+    BCMOLT_XGPON_TRX_TYPE_LTH_7222_BC_PLUS                                          = 3,    /**< SFP+ */
+    BCMOLT_XGPON_TRX_TYPE_LTH_7226_PC                                               = 4,    /**< XGS */
+    BCMOLT_XGPON_TRX_TYPE_LTH_5302_PC                                               = 5,    /**< 10G EPON for XGS mode */
+    BCMOLT_XGPON_TRX_TYPE_XGPON_GENERAL_1                                           = 6,    /**< xgpon general 1. */
+    BCMOLT_XGPON_TRX_TYPE_XGPON_GENERAL_2                                           = 7,    /**< xgpon general 2. */
+    BCMOLT_XGPON_TRX_TYPE_LTW_627_X_PC                                              = 8,    /**< Supports NGPON2 TRx for various channels */
+    BCMOLT_XGPON_TRX_TYPE_XPP_XE_R_3_CDFB                                           = 9,    /**< 10G EPON for XGS mode */
+    BCMOLT_XGPON_TRX_TYPE__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_trx_type;
+
+/** Actual Scheduler/Shaper. 
+ */
+typedef struct bcmolt_actual_schedulershaper
+{
+    bcmolt_time_quanta actual_mbs_tq;       /**< Actual MBS (TQ). */
+    bcmolt_time_quanta actual_weight_tq;    /**< Actual Weight (TQ). */
+} bcmolt_actual_schedulershaper;
+
+/** 128-bit AES key used for ONU authentication. 
+ */
+typedef struct bcmolt_aes_key
+{
+    uint8_t bytes[16];  /**< Bytes that comprise the key. */
+} bcmolt_aes_key;
+
+/** What portion of the capture buffer to read. 
+ */
+typedef struct bcmolt_api_capture_buffer_reader
+{
+    uint32_t offset;    /**< The bytes offset to read from. */
+    uint32_t size;      /**< The number of bytes to read. */
+} bcmolt_api_capture_buffer_reader;
+
+/** Configuration for API capture. 
+ */
+typedef struct bcmolt_api_capture_config
+{
+    bcmolt_api_capture_location location;   /**< Where to perform the API capture. */
+    uint32_t buffer_size_bytes;             /**< Maximum number of bytes to capture. */
+    bcmolt_api_capture_buffer_mode buffer_mode; /**< What to do when the capture buffer is full. */
+} bcmolt_api_capture_config;
+
+/** Statistics on the most recent API capture. 
+ */
+typedef struct bcmolt_api_capture_stats
+{
+    uint32_t buffer_used_bytes; /**< Used space in the capture buffer (in bytes). */
+    uint32_t buffer_wrap_count; /**< Number of times the capture buffer has wrapped. */
+    uint32_t events_recorded;   /**< Number of events recorded in the capture buffer. */
+    uint32_t events_dropped;    /**< Number of events dropped due to overflow. */
+    uint32_t readable_bytes;    /**< Number of bytes needed to retrieve capture buffer. */
+} bcmolt_api_capture_stats;
+
+/** Bounds. 
+ */
+typedef struct bcmolt_bounds
+{
+    uint32_t best_case;     /**< Best Case. */
+    uint32_t worst_case;    /**< Worst Case. */
+} bcmolt_bounds;
+
+/** Fixed-Length list: 8x bounds. 
+ */
+typedef struct bcmolt_arr_bounds_8
+{
+    bcmolt_bounds arr[8];   /**< Array. */
+} bcmolt_arr_bounds_8;
+
+/** Fixed-Length list: 8x calibration_record. 
+ */
+typedef struct bcmolt_arr_calibration_record_8
+{
+    bcmolt_calibration_record arr[8];   /**< Array. */
+} bcmolt_arr_calibration_record_8;
+
+/** DS frequency offset. 
+ */
+typedef struct bcmolt_ds_frequency_offset
+{
+    bcmolt_sign sign;   /**< sign. */
+    uint8_t value;      /**< value. */
+} bcmolt_ds_frequency_offset;
+
+/** Channel Profile 
+ */
+typedef struct bcmolt_channel_profile
+{
+    uint8_t version;        /**< Channel profile version */
+    uint8_t channel_index;  /**< Channel profile index */
+    bcmolt_ds_frequency_offset ds_frequency_offset; /**< The difference between the actual OLT CT Tx frequency and the nominal central frequency for the given DWLCH ID, expressed in units of 0.1GHz */
+    uint8_t channel_partition;                      /**< Channel partition */
+    uint8_t uwlch_id;       /**< The assigned upstream wavelength channel ID */
+    uint32_t us_frequency;  /**< The nominal central frequency of the upstream wavelength channel or a root frequency of the cyclic set of central frequencies forming an upstream wavelength channel, indicates the value in units of 0.1 GHz. */
+    bcmolt_upstream_line_rate_capabilities us_rate; /**< US rate. */
+    uint8_t default_onu_attenuation;                /**< The default ONU attenuation level in steps of 3dB */
+    uint8_t response_threshold;                     /**< Threshold represent the maximum number of Ploams the ONU can transmit at non-zero attenuation level while attempting to establish communication with OLT CT */
+    bcmolt_link_type us_link_type;                  /**< US link type. */
+    bcmos_bool is_valid;    /**< is valid. */
+} bcmolt_channel_profile;
+
+/** Fixed-Length list: 8x channel_profile. 
+ */
+typedef struct bcmolt_arr_channel_profile_8
+{
+    bcmolt_channel_profile arr[8];  /**< Array. */
+} bcmolt_arr_channel_profile_8;
+
+/** Power consumption report per channel 
+ */
+typedef struct bcmolt_power_consumption_channel_report
+{
+    uint8_t ds_wavelength_channel_id;   /**< Downstream wavelength channel ID */
+    uint8_t us_wavelength_channel_id;   /**< Upstream wavelength channel ID */
+    uint16_t power_consumption;         /**< Power consumption */
+} bcmolt_power_consumption_channel_report;
+
+/** Fixed-Length list: 8x power_consumption_channel_report. 
+ */
+typedef struct bcmolt_arr_power_consumption_channel_report_8
+{
+    bcmolt_power_consumption_channel_report arr[8]; /**< Array. */
+} bcmolt_arr_power_consumption_channel_report_8;
+
+/** Fixed-Length list: 2x U16. 
+ */
+typedef struct bcmolt_arr_u16_2
+{
+    uint16_t arr[2];    /**< Array. */
+} bcmolt_arr_u16_2;
+
+/** Fixed-Length list: 2x U16. 
+ */
+typedef struct bcmolt_arr_u16_2_hex
+{
+    uint16_t arr[2];    /**< Array. */
+} bcmolt_arr_u16_2_hex;
+
+/** Fixed-Length list: 5x U16. 
+ */
+typedef struct bcmolt_arr_u16_5_hex
+{
+    uint16_t arr[5];    /**< Array. */
+} bcmolt_arr_u16_5_hex;
+
+/** Fixed-Length list: 7x U16. 
+ */
+typedef struct bcmolt_arr_u16_7
+{
+    uint16_t arr[7];    /**< Array. */
+} bcmolt_arr_u16_7;
+
+/** Fixed-Length list: 6x U32. 
+ */
+typedef struct bcmolt_arr_u32_6
+{
+    uint32_t arr[6];    /**< Array. */
+} bcmolt_arr_u32_6;
+
+/** Fixed-Length list: 10x U8. 
+ */
+typedef struct bcmolt_arr_u8_10
+{
+    uint8_t arr[10];    /**< Array. */
+} bcmolt_arr_u8_10;
+
+/** Fixed-Length list: 12x U8. 
+ */
+typedef struct bcmolt_arr_u8_12
+{
+    uint8_t arr[12];    /**< Array. */
+} bcmolt_arr_u8_12;
+
+/** Fixed-Length list: 13x U8. 
+ */
+typedef struct bcmolt_arr_u8_13
+{
+    uint8_t arr[13];    /**< Array. */
+} bcmolt_arr_u8_13;
+
+/** Fixed-Length list: 36x U8. 
+ */
+typedef struct bcmolt_arr_u8_36
+{
+    uint8_t arr[36];    /**< Array. */
+} bcmolt_arr_u8_36;
+
+/** Fixed-Length list: 4x U8. 
+ */
+typedef struct bcmolt_arr_u8_4
+{
+    uint8_t arr[4]; /**< Array. */
+} bcmolt_arr_u8_4;
+
+/** Fixed-Length list: 40x U8. 
+ */
+typedef struct bcmolt_arr_u8_40
+{
+    uint8_t arr[40];    /**< Array. */
+} bcmolt_arr_u8_40;
+
+/** XGPON burst profile. 
+ */
+typedef struct bcmolt_xgpon_burst_profile
+{
+    uint8_t profile_version;            /**< profile version. */
+    bcmos_bool is_fec_on;               /**< is fec on. */
+    uint8_t delimiter_size_in_bytes;    /**< delimiter size in bytes. */
+    uint32_t delimiter_pattern_high;    /**< delimiter pattern high. */
+    uint32_t delimiter_pattern_low;     /**< delimiter pattern low. */
+    uint8_t preamble_length_in_bytes;   /**< preamble length in bytes. */
+    uint8_t preamble_repeats_count;     /**< preamble repeats count. */
+    uint32_t preamble_pattern_high;     /**< preamble pattern high. */
+    uint32_t preamble_pattern_low;      /**< preamble pattern low. */
+    uint64_t pon_tag;                   /**< PON tag. */
+    uint32_t num_of_guard_bytes;        /**< number of guard bytes. */
+    bcmos_bool is_profile_valid;        /**< is profile valid. */
+    uint32_t burst_overhead_size_in_words;  /**< Burst overhead size in 4-byte words (word size is 4 bytes regardless of upstream data rate). */
+} bcmolt_xgpon_burst_profile;
+
+/** Fixed-Length list: 4x xgpon_burst_profile. 
+ */
+typedef struct bcmolt_arr_xgpon_burst_profile_4
+{
+    bcmolt_xgpon_burst_profile arr[4];  /**< Array. */
+} bcmolt_arr_xgpon_burst_profile_4;
+
+/** XGPON TRX configuration. 
+ */
+typedef struct bcmolt_xgpon_trx_configuration
+{
+    uint32_t trx_reset_pattern_first;           /**< trx reset pattern first. */
+    uint32_t trx_reset_pattern_middle;          /**< trx reset pattern middle. */
+    uint32_t trx_reset_pattern_last;            /**< trx reset pattern last. */
+    uint8_t trx_reset_middle_repeats_count;     /**< trx reset middle repeats count. */
+    uint16_t trx_reset_location;                /**< trx reset location. */
+    bcmos_bool trx_reset_polarity;              /**< trx reset polarity. */
+    uint32_t bcdr_reset_pattern_first;          /**< bcdr reset pattern first. */
+    uint32_t bcdr_reset_pattern_middle;         /**< bcdr reset pattern middle. */
+    uint32_t bcdr_reset_pattern_last;           /**< bcdr reset pattern last. */
+    uint8_t bcdr_reset_middle_repeats_count;    /**< bcdr reset middle repeats count. */
+    uint8_t bcdr_reset_location;                /**< bcdr reset location. */
+    bcmos_bool bcdr_reset_polarity;             /**< bcdr reset polarity. */
+} bcmolt_xgpon_trx_configuration;
+
+/** Fixed-Length list: 4x xgpon_trx_configuration. 
+ */
+typedef struct bcmolt_arr_xgpon_trx_configuration_4
+{
+    bcmolt_xgpon_trx_configuration arr[4];  /**< Array. */
+} bcmolt_arr_xgpon_trx_configuration_4;
+
+/** Automatic ONU deactivation. 
+ */
+typedef struct bcmolt_automatic_onu_deactivation
+{
+    bcmos_bool los;         /**< Auto deactivate ONU due to LOS */
+    bcmos_bool onu_alarms;  /**< Auto deactivate ONU due to ONU alarms */
+    bcmos_bool tiwi;        /**< Auto deactivate ONU due to TIWi alarm */
+    bcmos_bool ack_timeout; /**< Auto deactivate ONU due to Ack timeout */
+    bcmos_bool sfi;         /**< Auto deactivate ONU due to SFi alarm */
+    bcmos_bool loki;        /**< Auto deactivate ONU due to Loki alarm */
+} bcmolt_automatic_onu_deactivation;
+
+/** TRX Resync pattern control. 
+ */
+typedef struct bcmolt_resync_control
+{
+    uint8_t start_pattern;      /**< start pattern. */
+    uint8_t middle_pattern;     /**< middle pattern. */
+    uint8_t last_pattern;       /**< last pattern. */
+    uint8_t middle_repetition;  /**< middle repetition. */
+    uint8_t location;           /**< location. */
+} bcmolt_resync_control;
+
+/** BCDR resync pattern configuration. 
+ */
+typedef struct bcmolt_bcdr_resync_pattern_configuration
+{
+    bcmolt_resync_control resync_control;           /**< resync control. */
+    bcmolt_resync_control ranging_resync_control;   /**< ranging resync control. */
+} bcmolt_bcdr_resync_pattern_configuration;
+
+/** BER monitoring parameters. 
+ */
+typedef struct bcmolt_ber_monitor_params
+{
+    uint32_t us_ber_interval;   /**< Interval in milliseconds for upstream BER monitoring (0 = disabled). */
+    uint8_t sf_threshold;       /**< Signal fail alarm is raised when BER raises to 10^-x, where x is this number. */
+    uint8_t sd_threshold;       /**< Signal degrade alarm is raised when BER raises to 10^-x, where x is this number. */
+} bcmolt_ber_monitor_params;
+
+/** CBR RT Allocation profile. 
+ */
+typedef struct bcmolt_cbr_rt_allocation_profile
+{
+    uint16_t ma_7;  /**< CBA maximum allocation size for frame gap 7 */
+    uint16_t ma_3;  /**< CBA maximum allocation size for frame gap 3 */
+    uint16_t ma_1;  /**< CBA maximum allocation size for frame gap 1 */
+} bcmolt_cbr_rt_allocation_profile;
+
+/** Results of the DDR test 
+ */
+typedef struct bcmolt_ddr_test_completed
+{
+    bcmolt_ddr_test_status status;  /**< Outcome of the DDR test */
+    union
+    {
+        struct
+        {
+            bcmolt_ddr_test_result cpu_result;          /**< CPU Result. */
+            bcmolt_ddr_test_result ras_0_result;        /**< RAS 0 Result. */
+            bcmolt_ddr_test_result ras_1_result;        /**< RAS 1 Result. */
+        } completed;
+
+        struct
+        {
+            bcmolt_host_connection_fail_reason reason;  /**< Connection fail reason. */
+        } connection_failed;
+    } u;
+} bcmolt_ddr_test_completed;
+
+/** Debug parameters for device configuration 
+ */
+typedef struct bcmolt_debug_device_cfg
+{
+    uint16_t host_dma_rx_queue_size;            /**< RX Queue size of the host DMA     */
+    uint16_t host_dma_tx_queue_size;            /**< TX Queue size of the host DMA     */
+    bcmos_bool avs_control;                     /**< AVS control. */
+    bcmos_bool use_prev_pon_serdes_firmware;    /**< This is a fallback option if there are issues with the new firmware */
+    bcmos_bool use_prev_nni_serdes_firmware;    /**< This is a fallback option if there are issues with the new firmware */
+} bcmolt_debug_device_cfg;
+
+/** Device NNI Speed. 
+ */
+typedef struct bcmolt_device_nni_speed
+{
+    bcmolt_nni_speed first_half;    /**< Interface speed for the first half of the NNI ports on the system. */
+    bcmolt_nni_speed second_half;   /**< Interface speed for the second half of the NNI ports on the system. */
+} bcmolt_device_nni_speed;
+
+/* \cond UNDOCUMENTED_SYMBOLS */
+
+/** Dummy Struct For Embedded Types. 
+ */
+typedef struct bcmolt_dummy_struct_for_embedded_types
+{
+    bcmolt_aggregation_domain ad;               /**< ad. */
+    bcmolt_epon_top et;                         /**< et. */
+    bcmolt_epm_lim_global elg;                  /**< elg. */
+    bcmolt_dba_port dba_port;                   /**< dba port. */
+    bcmolt_drv_sgb_id sgb;                      /**< sgb. */
+    bcmolt_drv_icf_id icf;                      /**< icf. */
+    bcmolt_tfb_trap_behavior tfb_trap_behavior; /**< tfb trap behavior. */
+    bcmolt_tfb_mode tfb_mode;                   /**< tfb mode. */
+    bcmolt_lim_sec_mode_up lim_sec_mode_up;     /**< lim sec mode up. */
+    bcmolt_lim_sec_mode_dn lim_sec_mode_dn;     /**< lim sec mode dn. */
+    bcmolt_xim_sec_mode xim_sec_mode;           /**< xim sec mode. */
+    bcmolt_dba_ram dba_ram;                     /**< dba ram. */
+    bcmolt_hsc_ram hsc_ram;                     /**< hsc ram. */
+    bcmolt_lim_ram lim_ram;                     /**< lim ram. */
+    bcmolt_lky_ram lky_ram;                     /**< lky ram. */
+    bcmolt_mic_ram mic_ram;                     /**< mic ram. */
+    bcmolt_xpcsrm_ram xpcs_ram;                 /**< xpcs ram. */
+    bcmolt_xg2g_id xg2g_id;                     /**< xg2g id. */
+} bcmolt_dummy_struct_for_embedded_types;
+
+/* \endcond */
+
+/** Embedded image entry. 
+ */
+typedef struct bcmolt_embedded_image_entry
+{
+    bcmolt_device_image_type image_type;    /**< Type of the embedded file image. */
+    uint32_t image_size;                    /**< Size of the embedded file image.  Unit is bytes. */
+    uint32_t crc32; /**< CRC 32 checksum of entire file image data. */
+    bcmolt_embedded_image_transfer_status status;   /**< Image transfer status. */
+    char image_name[64];    /**< Name of the file image.  Null-terminated string.  This is required for the DPoE ONU only.  DPoE requires the write request OAM contains the name of the file. */
+} bcmolt_embedded_image_entry;
+
+/** Variable-length list of embedded_image_entry. 
+ */
+typedef struct bcmolt_embedded_image_entry_list_u8
+{
+    uint8_t len;                        /**< List length. */
+    bcmolt_embedded_image_entry *val;   /**< List contents. */
+} bcmolt_embedded_image_entry_list_u8;
+
+/** Encryption_information_container. 
+ */
+typedef struct bcmolt_encryption_information_container
+{
+    bcmolt_epon_encryption_information_format format;   /**< Format. */
+    union
+    {
+        struct
+        {
+            uint8_t key[16];    /**< Key. */
+        } cfb;
+
+        struct
+        {
+            uint8_t key[16];    /**< Key. */
+            uint8_t sci[8];     /**< SCI. */
+        } ctr;
+    } u;
+} bcmolt_encryption_information_container;
+
+/** EPON clock transport configuration 
+ */
+typedef struct bcmolt_epon_clock_transport_configuration
+{
+    bcmolt_epon_clock_transport_mode epon_clock_transport_mode; /**< Clock Transport mode on this OLT PON Port. */
+} bcmolt_epon_clock_transport_configuration;
+
+/** Data of unknown link, including rate and alarm status 
+ */
+typedef struct bcmolt_unknown_link_status
+{
+    bcmolt_epon_link_rate link_rate;    /**< The rate of the unknown link */
+    bcmolt_status alarm_status;         /**< Whether the unknown link alarm is raised or cleared. */
+} bcmolt_unknown_link_status;
+
+/** Data of laser on/off violating link, including attempted laser on time, 
+ * attempted laser off time, and alarm status. 
+ */
+typedef struct bcmolt_laser_on_off_status
+{
+    bcmolt_time_quanta laser_on_time;   /**< The laser on time of the ONU that is violating. */
+    bcmolt_time_quanta laser_off_time;  /**< The laser off time of the ONU that is violating. */
+    bcmolt_status alarm_status;         /**< Whether the laser on/off violation alarm is raised or cleared. */
+} bcmolt_laser_on_off_status;
+
+/** Data of range violating link, including the range it attempted to use, and 
+ * alarm status. 
+ */
+typedef struct bcmolt_range_status
+{
+    bcmolt_time_quanta range;   /**< The range that the violating link attempted to register at. */
+    bcmolt_status alarm_status; /**< Whether the range violation alarm is raised or cleared. */
+} bcmolt_range_status;
+
+/** Details of Suspected Rogue ONU provided in Denied Link Alarm 
+ */
+typedef struct bcmolt_rogue_status
+{
+    bcmolt_epon_llid denied_llid;       /**< LLID. */
+    bcmolt_time_quanta denied_range;    /**< ONU Range. */
+    bcmolt_status alarm_status;         /**< Alarm State. */
+} bcmolt_rogue_status;
+
+/** The state of all alarms on an EPON Denied Link. 
+ */
+typedef struct bcmolt_epon_denied_link_alarm_state
+{
+    bcmolt_unknown_link_status unknown_link_violation;  /**< Unknown Link Violation. */
+    bcmolt_status overhead_profile_violation;           /**< Overhead Profile Violation. */
+    bcmolt_status max_link_violation;                   /**< Max Link Violation. */
+    bcmolt_status llid_pool_empty_violation;            /**< LLID Pool Empty Violation. */
+    bcmolt_laser_on_off_status laser_on_off_violation;  /**< Laser On/Off Violation. */
+    bcmolt_status system_resource_violation;            /**< System Resource Violation. */
+    bcmolt_range_status range_violation;                /**< Range Violation. */
+    bcmolt_status tdm_channels_exhausted;               /**< TDM Channels Exhausted. */
+    bcmolt_rogue_status rogue_violation;                /**< Rogue ONU Violation. */
+    bcmolt_status upstream_bandwidth_violation;         /**< Upstream Bandwidth Violation. */
+} bcmolt_epon_denied_link_alarm_state;
+
+/** Keys and mode for encrypting the EPON logical link. 
+ */
+typedef struct bcmolt_epon_encryption_config
+{
+    bcmolt_epon_encryption_mode downstream_mode;    /**< Downstream Mode. */
+    bcmolt_epon_key_choice downstream_key_choice;   /**< Downstream Key Choice. */
+    bcmolt_encryption_information_container downstream_encryption_information;  /**< Downstream Encryption Information. */
+    bcmolt_epon_encryption_mode upstream_mode;  /**< Upstream Mode. */
+    bcmolt_epon_key_choice upstream_key_choice; /**< Upstream Key Choice. */
+    bcmolt_encryption_information_container upstream_encryption_information;    /**< Upstream Encryption Information. */
+} bcmolt_epon_encryption_config;
+
+/** Key exchange configuration that applies to the EPON link. 
+ */
+typedef struct bcmolt_epon_key_exchange_config
+{
+    bcmolt_epon_oam_type oam_type;              /**< The type of OAM that is sent to start the key exchange. */
+    uint16_t period;                            /**< Key exchange period in seconds.  0 means disable encryption. */
+    bcmolt_epon_encryption_direction direction; /**< Encryption direction: Downstream only or Bi-directional. */
+} bcmolt_epon_key_exchange_config;
+
+/** EPON laser overhead parameters. (Laser On and Laser Off times) 
+ */
+typedef struct bcmolt_epon_laser_overhead_parameters
+{
+    bcmolt_time_quanta laser_on_time;   /**< Number of time quanta to allow for ONUs' laser-on transition. */
+    bcmolt_time_quanta laser_off_time;  /**< Number of time quanta to allow for ONUs' laser-off transition. */
+} bcmolt_epon_laser_overhead_parameters;
+
+/** The state of all alarms on an EPON Link. 
+ */
+typedef struct bcmolt_epon_link_alarm_state
+{
+    bcmolt_status key_exchange_failure;         /**< Key Exchange Failure. */
+    bcmolt_status invalid_mpcp_report_received; /**< Invalid MPCP Report Received. */
+    bcmolt_status mpcp_report_timeout;          /**< MPCP Report Timeout. */
+    bcmolt_status oam_keepalive_timeout;        /**< OAM Keepalive Timeout. */
+} bcmolt_epon_link_alarm_state;
+
+/** Downstream and upstream FEC enable state for an EPON link. 
+ */
+typedef struct bcmolt_epon_link_fec_en
+{
+    bcmolt_epon_link_fec_state upstream;    /**< FEC enable state for upstream path. */
+    bcmolt_epon_link_fec_state downstream;  /**< FEC enable state for downstream path. */
+} bcmolt_epon_link_fec_en;
+
+/** EPON logical link. 
+ */
+typedef struct bcmolt_epon_link_info
+{
+    bcmolt_epon_link_status link_status;            /**< Link status flags. */
+    bcmolt_epon_link_rate rate;                     /**< The rate at which the link operates. */
+    bcmolt_epon_llid llid;                          /**< The LLID of the link. */
+    bcmolt_mpcp_discovery_info mpcp_discovery_info; /**< Flags from MPCP discovery. */
+    bcmolt_time_quanta onu_laser_on_time_tq;        /**< Laser on time reported by ONU.  This is set to 0 for 1G/1G links as 1G MPCP does not include this field. */
+    bcmolt_time_quanta onu_laser_off_time_tq;       /**< Laser off time reported by ONU. */
+    uint8_t pending_grants;             /**< The number of pending grants. */
+    bcmolt_time_quanta range_value_tq;  /**< The link's range value in TQ. */
+    bcmolt_epon_tunnel_id tunnel_id;    /**< The tunnel ID to use when sending traffic to the link. */
+} bcmolt_epon_link_info;
+
+/** Gate parameters. 
+ */
+typedef struct bcmolt_gate_parameters
+{
+    bcmolt_mpcp_registration_gate_flags flags;  /**< Flags to set for this gate. */
+    uint32_t delay_before_ms;                   /**< Delay before sending this gate in milliseconds. */
+    bcmolt_time_quanta gate_size_tq;            /**< Size of this gate in time quanta. */
+} bcmolt_gate_parameters;
+
+/** Variable-length list of gate_parameters. 
+ */
+typedef struct bcmolt_gate_parameters_list_u32
+{
+    uint32_t len;                   /**< List length. */
+    bcmolt_gate_parameters *val;    /**< List contents. */
+} bcmolt_gate_parameters_list_u32;
+
+/** Specification of the EPON gate mode and associated parameters. 
+ */
+typedef struct bcmolt_epon_registration_gate_mode
+{
+    bcmolt_mpcp_gate_mode registration_gate_mode;   /**< MPCP registration gate mode. */
+    union
+    {
+        struct
+        {
+            uint16_t reg_ack_timeout_ms;            /**< Amount of time to wait for a link to respond with a register ack after a register is sent. */
+        } teknovus;
+
+        struct
+        {
+            bcmolt_gate_parameters_list_u32 gates;  /**< Gates to send for REG ACK. */
+        } custom;
+    } u;
+} bcmolt_epon_registration_gate_mode;
+
+/** Configuration related to EPON logical link registration and reporting. 
+ */
+typedef struct bcmolt_epon_logical_link_options
+{
+    bcmolt_epon_registration_gate_mode registration_gate_mode;  /**< EPON registration gate mode. */
+    bcmolt_epon_dba_reporting_mode reporting_mode;              /**< Control for how the DBA handles received MPCP report frames. */
+    uint16_t max_links; /**< Maximum number of links to register on the EPON NI.  A value of zero indicates no fixed limit. This is an aggregate limit on the number of non-system links on a PON. This limit applies to both registered and non-registered links. This value cannot be reduced below the count of links currently allocated, nor is it valid to increase it above the sum of the per RP mac_links limits. */
+} bcmolt_epon_logical_link_options;
+
+/** The list of alarms defined for an EPON NI 
+ */
+typedef struct bcmolt_epon_ni_alarm_state
+{
+    bcmolt_status no_reports;   /**< No Reports. */
+} bcmolt_epon_ni_alarm_state;
+
+/** Encryption configuration that applies to the EPON NI as a whole. 
+ */
+typedef struct bcmolt_epon_ni_encryption_cfg
+{
+    bcmolt_epon_encryption_mode downstream_encryption_mode; /**< Downstream encryption mode. */
+    bcmolt_epon_encryption_mode upstream_encryption_mode;   /**< Upstream encryption mode. */
+} bcmolt_epon_ni_encryption_cfg;
+
+/** EPON ONU Upgrade Parameters. 
+ */
+typedef struct bcmolt_epon_onu_upgrade_params
+{
+    bcmolt_epon_oam_extension_type oam_extension_type;  /**< OAM Extension Type. */
+    union
+    {
+        struct
+        {
+            uint32_t response_timeout_ms;               /**< The length of time that the OLT will wait for the ONU to respond. */
+        } broadcom;
+
+        struct
+        {
+            uint32_t response_timeout_ms;               /**< The length of time that the OLT will wait for the ONU to respond. */
+        } ctc;
+
+        struct
+        {
+            uint32_t response_timeout_ms;               /**< The length of time that the OLT will wait for the ONU to respond. */
+        } dasan;
+
+        struct
+        {
+            uint32_t response_timeout_ms;               /**< The length of time that the OLT will wait for the ONU to respond. */
+        } kt;
+
+        struct
+        {
+            uint32_t response_timeout_ms;               /**< The length of time that the OLT will wait for the ONU to respond. */
+            uint16_t block_size;                        /**< Number of byte per data block. */
+            uint32_t final_ack_response_timeout;        /**< Timeout for the final ACK response.  The DPoE standard 1.0 specifies this should be at least 15 seconds.  Unit is seconds. */
+        } dpoe;
+    } u;
+} bcmolt_epon_onu_upgrade_params;
+
+/** EPON ONU Upgrade Status. 
+ */
+typedef struct bcmolt_epon_onu_upgrade_status
+{
+    bcmos_mac_address onu_id;                       /**< ONU ID. */
+    bcmolt_epon_onu_upgrade_return_code error_code; /**< Upgrade status. */
+    bcmolt_epon_onu_upgrade_onu_response_code onu_return_code;  /**< Response code from the ONU. */
+} bcmolt_epon_onu_upgrade_status;
+
+/** Variable-length list of epon_onu_upgrade_status. 
+ */
+typedef struct bcmolt_epon_onu_upgrade_status_list_u32
+{
+    uint32_t len;   /**< List length. */
+    bcmolt_epon_onu_upgrade_status *val;    /**< List contents. */
+} bcmolt_epon_onu_upgrade_status_list_u32;
+
+/** EPON protection switching configuration 
+ */
+typedef struct bcmolt_epon_protection_switching_configuration
+{
+    bcmolt_epon_protection_switching_type protection_type;  /**< Protection scheme. */
+    bcmolt_protection_switching_detection_options protection_switching_options; /**< Protection switching options. */
+    bcmolt_epon_protection_switching_reranging_options rerange_options;         /**< Re-ranging algorithm selection */
+    uint8_t rerange_attempts;                   /**< Number of times to re range during a switch */
+    uint16_t rerange_interval;                  /**< Interval between re-range attempts. */
+    uint16_t sync_gate_duration;                /**< Duration of sync gate. */
+    bcmolt_gpio_pin gpio_input;                 /**< Configures state on PON (working/standby) */
+    bcmolt_gpio_polarity gpio_input_polarity;   /**< GPIO Input Polarity. */
+    bcmolt_gpio_pin gpio_output;                /**< Indicates state on PON (working/standby) */
+    bcmolt_gpio_polarity gpio_output_polarity;  /**< GPIO Output Polarity. */
+} bcmolt_epon_protection_switching_configuration;
+
+/** Variable-length list of U8. 
+ */
+typedef struct bcmolt_u8_list_u16
+{
+    uint16_t len;   /**< List length. */
+    uint8_t *val;   /**< List contents. */
+} bcmolt_u8_list_u16;
+
+/** A template for an Ethernet frame of some fixed length, accompanied by a mask 
+ * vector of equal size.  When used in the context of frame transmission, the 
+ * mask vector distinguishes bit regions of the template that should be 
+ * transmitted verbatim (e.g. the content of an OAM message) from bit regions 
+ * that should be filled in farther along the data path (e.g. Ethernet source 
+ * or destination addresses).  When used in the context of frame reception, the 
+ * mask vector distinguishes bit regions of the template that are to be 
+ * compared with received frames (e.g. flags within OAM heartbeat messages 
+ * received from ONUs) from "don't care" bit regions (e.g. Ethernet source 
+ * addresses from those same messages).  
+ */
+typedef struct bcmolt_ethernet_frame_masked
+{
+    bcmolt_u8_list_u16 frame_octets;    /**< A complete Ethernet frame.  For every zero bit in the mask_octets */
+    bcmolt_u8_list_u16 mask_octets;     /**< A bit vector of the same length as frame_octets. */
+} bcmolt_ethernet_frame_masked;
+
+/** A complete Ethernet frame, beginning with the DA (layer 2 destination 
+ * address) and ending just before the FCS (frame check sequence).  In contrast 
+ * to `masked Ethernet frames,' which see, unmasked Ethernet frames are 
+ * transmitted or interpreted/relayed verbatim.  
+ */
+typedef struct bcmolt_ethernet_frame_unmasked
+{
+    bcmolt_u8_list_u16 frame_octets;    /**< Complete content of the Ethernet frame, beginning with the DA (layer 2 destination */
+} bcmolt_ethernet_frame_unmasked;
+
+/** Extended Guard Time. 
+ */
+typedef struct bcmolt_extended_guard_time
+{
+    uint32_t additional_preburst_guard_time;    /**< Additional guard time (in bytes) before all bursts for this ONU. */
+    uint32_t additional_postburst_guard_time;   /**< Additional guard time (in bytes) after all bursts for this ONU. */
+} bcmolt_extended_guard_time;
+
+/** Firmware SW Version 
+ */
+typedef struct bcmolt_firmware_sw_version
+{
+    uint8_t major;          /**< Major . */
+    uint8_t minor;          /**< Minor. */
+    uint8_t revision;       /**< Revision. */
+    uint32_t model;         /**< Model. */
+    char build_time[32];    /**< Firmware SW build time */
+} bcmolt_firmware_sw_version;
+
+/** GEM port configuration. 
+ */
+typedef struct bcmolt_gem_port_configuration
+{
+    bcmolt_gem_port_direction direction;    /**< GEM port direction */
+    bcmolt_gem_port_type type;              /**< GEM port type */
+} bcmolt_gem_port_configuration;
+
+/** GPON Alloc With State. 
+ */
+typedef struct bcmolt_gpon_alloc_with_state
+{
+    bcmolt_gpon_alloc_id alloc_id;  /**< Alloc ID. */
+    bcmolt_alloc_state state;       /**< State. */
+} bcmolt_gpon_alloc_with_state;
+
+/** Variable-length list of gpon_alloc_with_state. 
+ */
+typedef struct bcmolt_gpon_alloc_with_state_list_u16_max_32
+{
+    uint16_t len;                       /**< List length. */
+    bcmolt_gpon_alloc_with_state *val;  /**< List contents. */
+} bcmolt_gpon_alloc_with_state_list_u16_max_32;
+
+/** GPON Debug Flow Config. 
+ */
+typedef struct bcmolt_gpon_debug_flow_config
+{
+    bcmolt_control_state untagged_flow; /**< If enabled, this GEM port will expect upstream traffic to be untagged and downstream traffic to use a custom VLAN tag. */
+    bcmolt_vlan_id untagged_vid;        /**< The VLAN ID to use when adding MAC table entries for untagged traffic. */
+} bcmolt_gpon_debug_flow_config;
+
+/** Variable-length list of gpon_gem_id. 
+ */
+typedef struct bcmolt_gpon_gem_id_list_u8_max_16
+{
+    uint8_t len;                /**< List length. */
+    bcmolt_gpon_gem_id *val;    /**< List contents. */
+} bcmolt_gpon_gem_id_list_u8_max_16;
+
+/** GPON GEM Port With State. 
+ */
+typedef struct bcmolt_gpon_gem_port_with_state
+{
+    bcmolt_gpon_gem_id gem_id;          /**< GEM ID. */
+    bcmolt_gpon_gem_port_state state;   /**< State. */
+} bcmolt_gpon_gem_port_with_state;
+
+/** Variable-length list of gpon_gem_port_with_state. 
+ */
+typedef struct bcmolt_gpon_gem_port_with_state_list_u16_max_128
+{
+    uint16_t len;   /**< List length. */
+    bcmolt_gpon_gem_port_with_state *val;   /**< List contents. */
+} bcmolt_gpon_gem_port_with_state_list_u16_max_128;
+
+/** Variable-length list of gpon_gem_port_with_state. 
+ */
+typedef struct bcmolt_gpon_gem_port_with_state_list_u16_max_256
+{
+    uint16_t len;   /**< List length. */
+    bcmolt_gpon_gem_port_with_state *val;   /**< List contents. */
+} bcmolt_gpon_gem_port_with_state_list_u16_max_256;
+
+/** Options for configuring the "untagged flow" feature. 
+ */
+typedef struct bcmolt_gpon_iwf_debug_flow_config
+{
+    bcmos_bool learn_untagged_flow_vids;        /**< When a MAC/VID is learned on an untagged flow, learn the received MAC address with both the untagged VID and the received VID (even though it will be invalid). */
+    uint16_t untagged_flow_shaping_ms_per_sec;  /**< If this value is greater than 0, learning events on untagged flows will only be enabled for N milliseconds every second.  For example, a value of 10 would mean learning is only enabled for 1% of the total time. */
+} bcmolt_gpon_iwf_debug_flow_config;
+
+/** GPON Key Exchange . 
+ */
+typedef struct bcmolt_gpon_key_exchange
+{
+    uint32_t interval;              /**< Key Exchange process interval in milliseconds */
+    bcmolt_control_state control;   /**< Enable\disable periodic process of Key Exchange for active ONUs */
+    bcmolt_key_exchange_mode mode;  /**< Key exchange mode */
+    bcmolt_control_state encrypted_ports_only;  /**< Perform key exchange only to ONUs with GEM ports that have downstream encryption enabled */
+} bcmolt_gpon_key_exchange;
+
+/** GPON MAC table scan result for a single MAC table entry. 
+ */
+typedef struct bcmolt_gpon_mac_table_scan_result
+{
+    bcmolt_vlan_id vlan;            /**< The VLAN ID of the entry. */
+    bcmolt_flow_id flow_id;         /**< The flow ID assigned to traffic that matches this MAC table entry. */
+    bcmos_bool stat;                /**< Whether or not the MAC entry is static.  Static entries don't age. */
+    bcmolt_gpon_gem_id gem_port_id; /**< The GEM port ID of the traffic that created this table entry.  This only applies to automatically-learned entries.  Manually-added entries will have the value BCMOLT_PON_GEM_PORT_ID_INVALID. */
+    bcmolt_gpon_onu_id onu_id;      /**< The ONU ID for the traffic that created this table entry.  This only valid if gem_port_id is valid.  Otherwise this will be set to BCMOLT_GPON_ONU_ID_INVALID. */
+} bcmolt_gpon_mac_table_scan_result;
+
+/** Variable-length list of gpon_mac_table_scan_result. 
+ */
+typedef struct bcmolt_gpon_mac_table_scan_result_list_u16
+{
+    uint16_t len;   /**< List length. */
+    bcmolt_gpon_mac_table_scan_result *val; /**< List contents. */
+} bcmolt_gpon_mac_table_scan_result_list_u16;
+
+/** GPON NI Debug parameters 
+ */
+typedef struct bcmolt_gpon_ni_debug
+{
+    uint16_t number_of_gem_ports_per_onu;   /**< Number of Gem ports per ONU */
+} bcmolt_gpon_ni_debug;
+
+/** GPON ONU activation. 
+ */
+typedef struct bcmolt_gpon_onu_activation
+{
+    bcmolt_control_state key_exchange;              /**< Perform single key exchange during activation. */
+    bcmolt_control_state password_authentication;   /**< Perform password authentication during activation */
+    bcmolt_control_state fail_due_to_password_authentication_failure;   /**< Deactivate ONU due to password authentication failure */
+} bcmolt_gpon_onu_activation;
+
+/** GPON ONU alarm status. 
+ */
+typedef struct bcmolt_gpon_onu_alarm_state
+{
+    bcmolt_status losi;     /**< Loss of signal. */
+    bcmolt_status lofi;     /**< Loss of frame. */
+    bcmolt_status loami;    /**< Loss of PLOAM. */
+    bcmolt_status dgi;      /**< Dying Gasp. */
+    bcmolt_status tiwi;     /**< Transmission interference Alarm. */
+    bcmolt_status dowi;     /**< Drift of Window. */
+    bcmolt_status sufi;     /**< Start UP Failure. */
+    bcmolt_status sfi;      /**< Signal Fail. */
+    bcmolt_status sdi;      /**< Signal Degraded. */
+    bcmolt_status dfi;      /**< Deactivation Failure. */
+    bcmolt_status loai;     /**< Loss of ack. */
+    bcmolt_status loki;     /**< loss of key. */
+} bcmolt_gpon_onu_alarm_state;
+
+/** GPON ONU alarms. 
+ */
+typedef struct bcmolt_gpon_onu_alarms
+{
+    bcmolt_status losi;     /**< LOSi. */
+    bcmolt_status lofi;     /**< LOFi. */
+    bcmolt_status loami;    /**< LOAMi. */
+} bcmolt_gpon_onu_alarms;
+
+/** GPON ONU alarms thresholds. 
+ */
+typedef struct bcmolt_gpon_onu_alarms_thresholds
+{
+    uint8_t losi;   /**< Threshold for asserting LOSi alarm */
+    uint8_t lofi;   /**< Threshold for asserting LOFi alarm */
+    uint8_t loami;  /**< Threshold for asserting LOAMi alarm */
+} bcmolt_gpon_onu_alarms_thresholds;
+
+/** GPON ONU EQD. 
+ */
+typedef struct bcmolt_gpon_onu_eqd
+{
+    bcmolt_gpon_onu_id onu_id;  /**< ONU ID. */
+    uint32_t eqd;               /**< EQD. */
+} bcmolt_gpon_onu_eqd;
+
+/** Variable-length list of gpon_onu_eqd. 
+ */
+typedef struct bcmolt_gpon_onu_eqd_list_u32
+{
+    uint32_t len;               /**< List length. */
+    bcmolt_gpon_onu_eqd *val;   /**< List contents. */
+} bcmolt_gpon_onu_eqd_list_u32;
+
+/** Variable-length list of gpon_onu_id. 
+ */
+typedef struct bcmolt_gpon_onu_id_list_u32_max_256
+{
+    uint32_t len;               /**< List length. */
+    bcmolt_gpon_onu_id *val;    /**< List contents. */
+} bcmolt_gpon_onu_id_list_u32_max_256;
+
+/** GPON ONU upgrade params. 
+ */
+typedef struct bcmolt_gpon_onu_upgrade_params
+{
+    uint32_t response_timeout_ms;       /**< The length of time that the OLT will wait for the ONU to respond. */
+    uint8_t max_retry_count;            /**< The number of retries. */
+    bcmolt_omci_device_id omci_format;  /**< Baseline (0x0A) or Extended (0x0B). */
+    uint16_t window_size;               /**< Number of sections per window. */
+    bcmos_bool activate_commit;         /**< Automatically activate the new image and commit. */
+    uint32_t delay_for_commit_ms;       /**< Delay time before COMMIT command.  Unit is milliseconds. */
+    uint8_t max_activation_attempts;    /**< Maximum number of re-attempts to activate the ONU. */
+} bcmolt_gpon_onu_upgrade_params;
+
+/** GPON ONU Upgrade Status. 
+ */
+typedef struct bcmolt_gpon_onu_upgrade_status
+{
+    bcmolt_pon_onu_id onu_id;   /**< ONU ID. */
+    bcmolt_gpon_onu_upgrade_return_code error_code; /**< Error Code. */
+    bcmolt_omci_result_code fail_reason;            /**< Failure reason specific to the Error Code above. */
+} bcmolt_gpon_onu_upgrade_status;
+
+/** Variable-length list of gpon_onu_upgrade_status. 
+ */
+typedef struct bcmolt_gpon_onu_upgrade_status_list_u32
+{
+    uint32_t len;   /**< List length. */
+    bcmolt_gpon_onu_upgrade_status *val;    /**< List contents. */
+} bcmolt_gpon_onu_upgrade_status_list_u32;
+
+/** GPON ONU With State. 
+ */
+typedef struct bcmolt_gpon_onu_with_state
+{
+    bcmolt_gpon_onu_id onu_id;  /**< ONU ID. */
+    bcmolt_onu_state state;     /**< State. */
+} bcmolt_gpon_onu_with_state;
+
+/** Variable-length list of gpon_onu_with_state. 
+ */
+typedef struct bcmolt_gpon_onu_with_state_list_u16_max_128
+{
+    uint16_t len;                       /**< List length. */
+    bcmolt_gpon_onu_with_state *val;    /**< List contents. */
+} bcmolt_gpon_onu_with_state_list_u16_max_128;
+
+/** gpon RSSI general configuration. 
+ */
+typedef struct bcmolt_gpon_rssi_general_configuration
+{
+    uint8_t location;   /**< the pattern activation location in clock cycles relative (before) to start of burst. */
+    bcmolt_rssi_location_sign location_sign;    /**< this bit determines whether the location of the RSSI in data mode (configured as RSSI pattern 1) will be before or after the burst start. */
+    uint8_t start_pattern;                      /**< the value of the first cycle of the pattern (will be transmitted once). */
+    uint8_t middle_pattern;                     /**< the value of the pattern that will be transmitted middle_repetition times between the start and the end of the pattern. */
+    uint8_t last_pattern;                       /**< the value of the last cycle of the pattern. will be transmitted once. */
+    uint8_t middle_repertition;                 /**< the number of times the middle pattern will be repeated. */
+    uint16_t minimum_burst;                     /**< the minimum burst size needed measurement */
+} bcmolt_gpon_rssi_general_configuration;
+
+/** GPON SN Acquisition. 
+ */
+typedef struct bcmolt_gpon_sn_acquisition
+{
+    uint32_t interval;              /**< SN process interval in milliseconds */
+    bcmolt_control_state control;   /**< SN process control */
+    bcmolt_onu_post_discovery_mode onu_post_discovery_mode; /**< Automatic operation following ONU discovery */
+} bcmolt_gpon_sn_acquisition;
+
+/** Host SW Version 
+ */
+typedef struct bcmolt_host_sw_version
+{
+    uint8_t major;          /**< Major . */
+    uint8_t minor;          /**< Minor. */
+    uint8_t revision;       /**< Revision. */
+    uint32_t model;         /**< Model. */
+    char build_time[32];    /**< Firmware SW build time */
+} bcmolt_host_sw_version;
+
+/** HW PON ID. 
+ */
+typedef struct bcmolt_hw_pon_id
+{
+    uint32_t pon_id_1;  /**< LSB 32 bits of PON ID. */
+    uint32_t pon_id_2;  /**< MSB 19 bits of PON ID. */
+} bcmolt_hw_pon_id;
+
+/** Port Identity used in IEEE 802.1as Clock Tranport. 
+ */
+typedef struct bcmolt_ieee_8021as_port_identity
+{
+    uint8_t clock_identity[8];  /**< Clock identity is a unique identifier used in IEEE 802.1as clock transport. */
+    uint16_t port_number;       /**< Port Number. */
+} bcmolt_ieee_8021as_port_identity;
+
+/** Timestamp used in IEEE 802.1as clock transport. 
+ */
+typedef struct bcmolt_ieee_8021as_timestamp
+{
+    uint16_t seconds_high;  /**< The high 16 bits of the 48 bit seconds field as required by IEEE. */
+    uint32_t seconds_low;   /**< The low 32 bts of the 48 bit seconds field as required by IEEE. */
+    uint32_t nanoseconds;   /**< The Nanoseconds part of the timestamp. */
+} bcmolt_ieee_8021as_timestamp;
+
+/** Full frame of the IEEE 802.1as time sync message used in clock transport. 
+ */
+typedef struct bcmolt_ieee_8021as_time_sync
+{
+    bcmos_mac_address destination_mac;  /**< Destination MAC Address. */
+    bcmos_mac_address source_mac;       /**< Source MAC Address. */
+    uint16_t eth_type_len;              /**< Type of Ethernet PDU. */
+    uint8_t eth_subtype;                /**< Slow protocol Subtype. */
+    uint8_t ieee_oui[3];                /**< IEEE OUI. */
+    uint16_t msg_id;                    /**< Message ID. */
+    uint32_t x; /**< Reference Time. */
+    bcmolt_ieee_8021as_timestamp tod;               /**< Time of day timestamp. */
+    bcmolt_ieee_8021as_port_identity port_identity; /**< Source port identity. */
+    int8_t log_msg_interval;                        /**< Log message interval (currently unused but required by spec). */
+    double rate_ratio;                  /**< Ratio of local second to grandmaster second. */
+    uint16_t gm_time_base_indicator;    /**< Grandmaster time base indicator (currently unused but required by spec). */
+    uint8_t last_gm_phase_change[12];   /**< Time of the current grandmaster minus the time of the previous grandmaster, in units of 2^-16 ns (currently unused but required by spec). */
+    int32_t last_frequency_change;      /**< Fractional frequency offset of the current grandmaster relative to the previous grandmaster (Not currently used but required by spec). */
+} bcmolt_ieee_8021as_time_sync;
+
+/** Rate limiting / shaping for the indication channel. 
+ */
+typedef struct bcmolt_indication_shaping
+{
+    bcmos_bool enabled; /**< Whether or not the device will limit the rate of indications sent to the host. */
+    uint32_t max_rate;  /**< Maximum number of indications per second to be generated by the device. */
+    uint32_t max_burst; /**< Maximum number of indications that are allowed to be sent back-to-back. */
+} bcmolt_indication_shaping;
+
+/** LA resync pattern configuration. 
+ */
+typedef struct bcmolt_la_resync_pattern_configuration
+{
+    bcmolt_resync_control resync_control;   /**< used in normal mode */
+    bcmolt_resync_control ranging_resync_control;   /**< used in ranging mode at the beginning of each ranging cycle */
+} bcmolt_la_resync_pattern_configuration;
+
+/** log buffer. 
+ */
+typedef struct bcmolt_log_buffer
+{
+    char buff[2048];        /**< buff. */
+    uint32_t msg_to_read;   /**< msg_to_read. */
+} bcmolt_log_buffer;
+
+/** MAC table configuration. 
+ */
+typedef struct bcmolt_mac_table_configuration
+{
+    bcmolt_mac_table_miss_fallback miss_fallback;   /**< Behavior for downstream traffic when MAC table lookup fails. */
+    bcmolt_flow_id default_flow_id;                 /**< Flow ID assigned to upstream traffic on a MAC table miss if miss_fallback is set to default_flow. */
+    uint32_t aging_time;    /**< Aging time in seconds.  If no traffic is seen for a given MAC address / VID for this length of time, the entry will age and the host will be notified via indication. */
+    bcmolt_mac_table_learning_mode learning_mode;   /**< Learning table mode. */
+    bcmolt_control_state automatic_mac_learning;    /**< If enabled, new MAC table entries are added automatically the first time a new MAC address/VID combination is seen.  If disabled, no actions are taken automatically except notifying the host via indication. */
+    bcmolt_control_state automatic_mac_aging;       /**< If enabled, MAC table entries are deleted automatically when they age.  If disabled, no actions are taken automatically except notifying the host via indication. */
+    bcmolt_control_state automatic_mac_move;        /**< Only applicable if learning_mode is move.  If enabled, MAC table entries are automatically updated when a MAC move condition is encountered.  If disabled, no actions are taken automatically except notifying the host via indication. */
+    bcmos_bool automatic_static_mode;               /**< If enabled, all MAC entries that are added automatically via automatic_mac_learning and automatic_mac_move will be treated as static (not aging). */
+} bcmolt_mac_table_configuration;
+
+/** Variable-length list of MacAddress. 
+ */
+typedef struct bcmolt_macaddress_list_u32
+{
+    uint32_t len;           /**< List length. */
+    bcmos_mac_address *val; /**< List contents. */
+} bcmolt_macaddress_list_u32;
+
+/** Variable-length list of MacAddress. 
+ */
+typedef struct bcmolt_macaddress_list_u32_max_2048
+{
+    uint32_t len;           /**< List length. */
+    bcmos_mac_address *val; /**< List contents. */
+} bcmolt_macaddress_list_u32_max_2048;
+
+/** NNI Link Status. 
+ */
+typedef struct bcmolt_nni_link_status
+{
+    bcmolt_trivalent link_status;       /**< The local and remote partners are abled and ready to transmit/receive traffic. */
+    bcmolt_trivalent signal_detected;   /**< Serdes controller has detected energy on the line.  debugging purpose. */
+    bcmolt_trivalent pmd_locked;        /**< Indicates PMD locked.  debugging purpose.  If this is true, but the links status is not, that means the transceiver is not enabled. */
+} bcmolt_nni_link_status;
+
+/** OAM heartbeat configuration 
+ */
+typedef struct bcmolt_oam_heartbeat_config
+{
+    uint16_t send_period;               /**< The period at which to send OAM info frames, and expect info responses on this link (in seconds). */
+    bcmolt_u8_list_u16 transmit_frame;  /**< The OAM PDU payload from the Flags field (offset 15) to the end of the PDU (before the FCS). */
+    bcmolt_ethernet_frame_masked ignored_receive_frame_template;    /**< OAM packets matching this masked payload will be dropped rather than forwarded to the host. */
+    uint16_t receive_timeout;       /**< The time (in seconds) to report OAM timeout after the last received OAM frame. */
+    uint16_t maximum_receive_size;  /**< Maximum size of received frames.  Setting this value to zero will cause all OAM frames to be dropped. */
+} bcmolt_oam_heartbeat_config;
+
+/** Configuration parameters for the ONU power management feature. These should 
+ * match the parameters sent to the ONU via OMCI. 
+ */
+typedef struct bcmolt_onu_power_management_configuration
+{
+    uint32_t ilowpower;         /**< The maximum amount of time any ONU on this NI may spend in a low power state in units of 125us. */
+    uint32_t iaware;            /**< The minimum amount of time every ONU on his NI must spend in an aware state in units of 125us. */
+    uint16_t itransinit;        /**< The maximum amount of time required by any ONU on this NI to power up its transmitter only from a low power state in units of 125us. */
+    uint16_t itxinit;           /**< The maximum amount of time required by any ONU on this NI to power up its transceiver (transmitter + receiver) from a low power state in units of 125us. */
+    uint32_t irxoff;            /**< The maximum amount of time any ONU on this NI may spend with its receiver disabled in units of 125us. */
+    uint16_t low_power_clobi;   /**< The number of consecutive non-contiguous missing allocations to allow before raising the LOSi/LOFi/LOBi alarms on any ONU on this NI. */
+} bcmolt_onu_power_management_configuration;
+
+/** onu tuning configuration. 
+ */
+typedef struct bcmolt_onu_tuning_configuration
+{
+    uint32_t tsource;   /**< Tsource timer in msec */
+    uint32_t ttarget;   /**< Ttarget timer in msec */
+    bcmos_bool request_registration_required;   /**< is request registration part of the tuning in process */
+} bcmolt_onu_tuning_configuration;
+
+/** Identifies the TWDM channel termination within a certain domain 
+ */
+typedef struct bcmolt_pon_id
+{
+    uint32_t administrative_label;  /**< MSB 28 bit of the PON ID */
+    uint8_t dwlch_id;               /**< LSB 4 bits of the PON ID */
+} bcmolt_pon_id;
+
+/** Operation Control 
+ */
+typedef struct bcmolt_operation_control
+{
+    uint8_t re;                 /**< Indicates whether the Transmit Optical Level (TOL) contains the launch power of the OTL (RE=0) or of a reach extender (RE=1) */
+    bcmolt_odn_class odn_class; /**< Identifies the nominal optical parameters of the transceiver according to the ODN Optical Path Loss (OPL) */
+    bcmolt_control_state ds_fec_mode;   /**< Enable/Disable the downstream FEC. Default is Enable. Attribute can be set only when PON NI state is Inactive. */
+    bcmolt_tc_protocol protocol;        /**< When system mode is NGPON2, this parameter Indicate the TC layer protocol: ITU-T G.989.3 or ITU-T G.987.3 */
+    bcmolt_link_type ds_link_type;      /**< Optical link type (Unspecified, A, B, Both) */
+    bcmolt_pon_id pon_id;               /**< Identifies the TWDM channel termination within a certain domain */
+    uint8_t c;  /**< Transmit optical level (TOL) reference point indicator: S/R-CG or S/R-CP */
+} bcmolt_operation_control;
+
+/** Periodic Standby PON monitoring. 
+ */
+typedef struct bcmolt_periodic_standby_pon_monitoring
+{
+    uint32_t interval;              /**< interval in ms. */
+    bcmolt_control_state control;   /**< control. */
+} bcmolt_periodic_standby_pon_monitoring;
+
+/** Port Level Shaper Configuration:. 
+ */
+typedef struct bcmolt_pon_aggregate_shaper
+{
+    uint32_t bandwidth_kbps;    /**< Rate in kbps, 0 is disabled, If rate is >1G then use 256kbps increments, if rate is < 1G then use 64kbps increments.  */
+    uint32_t mbs_kB;            /**< Maximum Burst Size in KB : range is 2KB to 4MB in 1KB increments.  */
+} bcmolt_pon_aggregate_shaper;
+
+/** PON Alloc SLA. 
+ */
+typedef struct bcmolt_pon_alloc_sla
+{
+    uint32_t cbr_rt_bw;     /**< CBR Real Time Bandwidth which require shaping of the bandwidth allocations in a fine granularity.  */
+    uint32_t cbr_nrt_bw;    /**< Fixed Bandwidth with no critical requirement of shaping */
+    uint32_t guaranteed_bw; /**< Dynamic bandwidth which the OLT is committed to allocate upon demand */
+    uint32_t maximum_bw;    /**< Maximum allocated bandwidth allowed for this alloc ID */
+    bcmolt_additional_bw_eligibility additional_bw_eligibility; /**< Alloc ID additional BW eligibility */
+    bcmos_bool cbr_rt_compensation; /**< Set to True for AllocID with CBR RT Bandwidth that requires compensation for skipped allocations during quiet window */
+    uint8_t cbr_rt_ap_index;        /**< Allocation Profile index for CBR RT Bandwidth */
+    uint8_t cbr_nrt_ap_index;       /**< Allocation Profile index for CBR non-RT Bandwidth */
+    bcmolt_alloc_type alloc_type;   /**< Type of the alloc ID  */
+    uint8_t weight;                 /**< Alloc ID Weight used in case of Extended DBA mode */
+    uint8_t priority;               /**< Alloc ID Priority used in case of Extended DBA mode */
+} bcmolt_pon_alloc_sla;
+
+/** PON available bandwidth. 
+ */
+typedef struct bcmolt_pon_available_bandwidth
+{
+    uint32_t cbr_bw;            /**< Total BW available for CBR real-time traffic (bytes/sec). */
+    uint32_t total_bw;          /**< Total BW available for guaranteed traffic (bytes/sec) */
+    uint32_t next_onu_total_bw; /**< Total BW available for guaranteed traffic after new ONU is added (bytes/sec). */
+} bcmolt_pon_available_bandwidth;
+
+/** PON DBA. 
+ */
+typedef struct bcmolt_pon_dba
+{
+    uint8_t sr_reporting_block_size;    /**< ONU status report block size in bytes */
+    bcmolt_dba_mode dba_mode;           /**< DBA mode */
+} bcmolt_pon_dba;
+
+/** PON Distance. 
+ */
+typedef struct bcmolt_pon_distance
+{
+    uint32_t max_log_distance;  /**< Max logical distance of an ONU on the PON */
+    uint32_t max_diff_reach;    /**< Max distance between the closest and farthest ONU */
+} bcmolt_pon_distance;
+
+/** PON Drift Control. 
+ */
+typedef struct bcmolt_pon_drift_control
+{
+    uint32_t drift_interval;            /**< Interval in milliseconds for ONU transmission drift monitoring (0 = disabled). */
+    uint8_t drift_limit;                /**< DOWi threshold in bits */
+    uint8_t transmission_control_limit; /**< TIWi threshold in bits */
+} bcmolt_pon_drift_control;
+
+/** Variable-length list of pon_onu_id. 
+ */
+typedef struct bcmolt_pon_onu_id_list_u32
+{
+    uint32_t len;           /**< List length. */
+    bcmolt_pon_onu_id *val; /**< List contents. */
+} bcmolt_pon_onu_id_list_u32;
+
+/** PON Power Level. 
+ */
+typedef struct bcmolt_pon_power_level
+{
+    uint32_t pls_maximum_allocation_size;   /**< Max allocation size for PLS transmission */
+    uint8_t mode;   /**< ONU default power level mode */
+} bcmolt_pon_power_level;
+
+/** GPON protection switching configuration. 
+ */
+typedef struct bcmolt_pon_protection_switching
+{
+    uint16_t timeout;           /**< LOS switch over timeout in milliseconds */
+    bcmolt_gpio_pin gpio_pin;   /**< GPIO pin for input/output signal */
+    bcmolt_pon_protection_switching_options options;    /**< Options to control the protection switching process */
+} bcmolt_pon_protection_switching;
+
+/** PON Status. 
+ */
+typedef struct bcmolt_pon_status
+{
+    bcmolt_pon_state state;     /**< state. */
+    bcmolt_status los_status;   /**< LOS status. */
+} bcmolt_pon_status;
+
+/** PRBS checker config. 
+ */
+typedef struct bcmolt_prbs_checker_config
+{
+    bcmolt_prbs_polynomial polynom; /**< PRBS polynom type */
+    bcmolt_prbs_checker_mode mode;  /**< PRBS LOCK state machine. */
+    bcmos_bool data_invert;         /**< Invert or no invert for received PRBS data */
+    bcmolt_control_state control;   /**< Enable\Disable the US PRBS checker */
+} bcmolt_prbs_checker_config;
+
+/** PRBS Generator config. 
+ */
+typedef struct bcmolt_prbs_generator_config
+{
+    bcmolt_prbs_polynomial polynom; /**< PRBS polynom type */
+    bcmos_bool error_insert;        /**< 0 to 1 transition on this signal will insert single bit error in the MSB bit of the data bus. */
+    bcmos_bool invert;              /**< Invert or no invert for transmitted PRBS data */
+    bcmolt_control_state control;   /**< Enable\Disable the DS PRBS generator */
+} bcmolt_prbs_generator_config;
+
+/** That state of the PRBS test, lock state, and error counters. 
+ */
+typedef struct bcmolt_prbs_status
+{
+    bcmolt_prbs_lock_state lock_state;  /**< The state of the PRBS lock */
+    uint32_t error_counts;              /**< The bit errors observed during the PRBS test.  This field is clear on read. */
+} bcmolt_prbs_status;
+
+/** ranging control configuration. 
+ */
+typedef struct bcmolt_ranging_control_configuration
+{
+    uint8_t wait_state_1_window_size;   /**< wait state 1 window size. */
+    uint8_t wait_state_2_window_size;   /**< wait state 2 window size. */
+    bcmos_bool wait_after_resync_4;     /**< wait after resync 4. */
+} bcmolt_ranging_control_configuration;
+
+/** ranging resync conditions. 
+ */
+typedef struct bcmolt_ranging_resync_conditions
+{
+    bcmos_bool after_init;              /**< after init. */
+    bcmos_bool after_no_ed;             /**< after no ed. */
+    bcmos_bool after_ed;                /**< after ed. */
+    bcmos_bool after_no_del;            /**< after no del. */
+    bcmos_bool after_ranging_access;    /**< after ranging access. */
+    uint16_t med_val;                   /**< med val. */
+} bcmolt_ranging_resync_conditions;
+
+/** ranging rssi control. 
+ */
+typedef struct bcmolt_ranging_rssi_control
+{
+    bcmos_bool after_no_ed;     /**< after no ed. */
+    bcmos_bool after_ed;        /**< after ed. */
+    bcmos_bool after_reset_3;   /**< after reset 3. */
+} bcmolt_ranging_rssi_control;
+
+/** request registration status. 
+ */
+typedef struct bcmolt_request_registration_status
+{
+    bcmolt_control_state request_registration_state;    /**< request registration state. */
+    bcmos_bool sma_flag;    /**< is request registration is part of sma process */
+} bcmolt_request_registration_status;
+
+/** Rogue Detection Special Map. 
+ */
+typedef struct bcmolt_rogue_detection_special_map
+{
+    uint32_t plo_size;              /**< PLO size. */
+    bcmolt_pon_alloc_id alloc_id;   /**< Alloc ID. */
+    bcmolt_pon_onu_id onu_id;       /**< ONU ID. */
+    uint8_t access_size;            /**< Access size. */
+} bcmolt_rogue_detection_special_map;
+
+/** Variable-length list of rogue_detection_special_map. 
+ */
+typedef struct bcmolt_rogue_detection_special_map_list_u32_max_8
+{
+    uint32_t len;   /**< List length. */
+    bcmolt_rogue_detection_special_map *val;    /**< List contents. */
+} bcmolt_rogue_detection_special_map_list_u32_max_8;
+
+/** Type and attributes of the rogue detection algorithm. 
+ */
+typedef struct bcmolt_rogue_detection_algorithm
+{
+    bcmolt_rogue_detection_algorithm_type algorithm_type;   /**< Type of the rogue detection algorithm. */
+    union
+    {
+        struct
+        {
+            bcmolt_rogue_detection_window measurement_type; /**< Silent Window or Cut off Window */
+            uint32_t interval;                  /**< Periodic process timer interval in milliseconds */
+            bcmos_bool second_ranging_window;   /**< Determines whether the second ranging window should be invoked or not. */
+            bcmolt_alloc_type_to_scan alloc_type_to_scan;               /**< Alloc type to scan during rogue detection.  Unused, previously used, or all Alloc-IDs. */
+        } early_rogue_detection;
+
+        struct
+        {
+            bcmolt_rogue_detection_special_map_list_u32_max_8 accesses; /**< Accesses. */
+        } special_map;
+
+        struct
+        {
+            uint32_t additional_guard_time; /**< Additional guard time (in bytes) for all ONUs on this PON. */
+        } extended_guard_time;
+    } u;
+} bcmolt_rogue_detection_algorithm;
+
+/** Configures the attributes of the rogue ONU detection periodic process. 
+ */
+typedef struct bcmolt_rogue_onu_detection_process
+{
+    bcmolt_control_state control;   /**< Enable/Disable the rogue ONU detection process. */
+    bcmolt_rogue_detection_algorithm detection_algorithm;   /**< Type and attributes of the rogue detection algorithm. */
+} bcmolt_rogue_onu_detection_process;
+
+/** serdes configuration. 
+ */
+typedef struct bcmolt_serdes_configuration
+{
+    bcmolt_serdes_ranging_mode ranging_mode;    /**< Select ranging mode for GPON/XGPON */
+    bcmos_bool multi_ed_mode;                   /**< Allow for multiple ED for ED mode for GPON/XGPON */
+    uint16_t burst_enable_start_offset;         /**< Start offset for stat capture on SERDES channel */
+    uint16_t burst_enable_end_offset;           /**< End offset for stat capture on SERDES channel  */
+    bcmos_bool ed_invertion;                    /**< ed invertion. */
+} bcmolt_serdes_configuration;
+
+/** serial number. 
+ */
+typedef struct bcmolt_serial_number
+{
+    uint8_t vendor_id[4];       /**< vendor id. */
+    uint8_t vendor_specific[4]; /**< vendor specific. */
+} bcmolt_serial_number;
+
+/** Solicited Scheduler. 
+ */
+typedef struct bcmolt_solicited_scheduler
+{
+    bcmolt_bandwidth_Kbps bandwidth_Kbps;   /**< The maximum layer 1 throughput provided by this scheduler (in Kbps). */
+    bcmolt_time_quanta max_burst_size_tq;   /**< The maximum burst size (in TQ). */
+    uint8_t priority;                       /**< The priority at which this scheduler runs.  This field is read-only and fixed at 0 for the MIN Shaper/Scheduler  element. */
+    bcmolt_time_quanta weight_tq;           /**< The weight of this scheduler (in TQ rounded up to nearest 128). Must be greater than or equal to Grant Threshold. */
+} bcmolt_solicited_scheduler;
+
+/** Statistic alarm trigger configuration. 
+ */
+typedef struct bcmolt_stat_alarm_trigger_config
+{
+    bcmolt_stat_condition_type type;    /**< Type of condition to trigger the alarm. */
+    union
+    {
+        struct
+        {
+            uint64_t rising;            /**< The alarm is raised if the stats delta value per second becomes greater than this threshold level. */
+            uint64_t falling;           /**< The alarm is cleared if the stats delta value per second becomes less than this threshold level. */
+        } rate_threshold;
+
+        struct
+        {
+            uint64_t upper;             /**< The alarm is raised if the stats delta value per second becomes greater than this upper level. */
+            uint64_t lower;             /**< The alarm is raised if the stats delta value per second becomes less than this lower level. */
+        } rate_range;
+
+        struct
+        {
+            uint64_t limit;             /**< The alarm is raised if the stats sample value becomes greater than this level.  The alarm is cleared when the host clears the stats. */
+        } value_threshold;
+    } u;
+} bcmolt_stat_alarm_trigger_config;
+
+/** Statistics alarm soaking configuration 
+ */
+typedef struct bcmolt_stat_alarm_soak_config
+{
+    uint32_t active_soak_time;  /**< If the alarm condition is raised and stays in the raised state for at least this amount of time (unit=seconds), the alarm indication is sent to the host. */
+    uint32_t clear_soak_time;   /**< After the alarm is raised, if it is cleared and stays in the cleared state for at least this amount of time (unit=seconds), the alarm indication is sent to the host. */
+} bcmolt_stat_alarm_soak_config;
+
+/** Statistic alarm configuration. 
+ */
+typedef struct bcmolt_stat_alarm_config
+{
+    bcmolt_stat_alarm_trigger_config trigger;   /**< Statistics alarm trigger configuration. */
+    bcmolt_stat_alarm_soak_config soak;         /**< Statistics alarm soaking configuration */
+} bcmolt_stat_alarm_config;
+
+/** ASCII string with max length 100. 
+ */
+typedef struct bcmolt_str_100
+{
+    char str[100];  /**< String. */
+} bcmolt_str_100;
+
+/** ASCII string with max length 1000. 
+ */
+typedef struct bcmolt_str_1000
+{
+    char str[1000]; /**< String. */
+} bcmolt_str_1000;
+
+/** ASCII string with max length 2000. 
+ */
+typedef struct bcmolt_str_2000
+{
+    char str[2000]; /**< String. */
+} bcmolt_str_2000;
+
+/** ASCII string with max length 256. 
+ */
+typedef struct bcmolt_str_256
+{
+    char str[256];  /**< String. */
+} bcmolt_str_256;
+
+/** ASCII string with max length 64. 
+ */
+typedef struct bcmolt_str_64
+{
+    char str[64];   /**< String. */
+} bcmolt_str_64;
+
+/** SW Error. 
+ */
+typedef struct bcmolt_sw_error
+{
+    uint64_t first_error_time_us;   /**< Timestamp (in us) when his error first occurred */
+    uint64_t last_error_time_us;    /**< Timestamp (in us) when his error last occurred */
+    uint32_t line_number;           /**< Line Number. */
+    uint32_t error_counter;         /**< The number of times this error has occurred */
+    uint32_t instance;              /**< Instance. */
+    char filename[64];              /**< Filename. */
+    char task_name[64];             /**< Task Name. */
+} bcmolt_sw_error;
+
+/** System profile 
+ */
+typedef struct bcmolt_system_profile
+{
+    uint32_t ng_2_sys_id;       /**< 20-bit identifier of the NGPON2 system */
+    uint8_t version;            /**< System profile version. */
+    uint8_t channel_spacing;    /**< An integer indicating the channel spacing in units of 1GHz */
+    bcmolt_us_operating_wavelength_bands us_operating_wavelength_bands; /**< Upstream operating wavelength bands */
+    uint8_t us_mse; /**< Upstream Maximum Spectral Excursion (MSE) represented as an unsigned integer indicating the value in units of 1GHz */
+    bcmolt_calibration_record loose_calibration_bound;  /**< Spectral excursion bound below which a TWDM ONU can be considered as loosely calibrated */
+    uint16_t fsr;               /**< If a cyclic WM is used in the upstream, Free Spectral Range indicates the value in units of 0.1 GHz */
+    uint8_t twdm_channel_count; /**< The number of Channel_Profile PLOAM messages with distinct Channel Profile indices that an ONU can expect to receive while listening to this downstream wavelength channel */
+} bcmolt_system_profile;
+
+/** TRX Delimiter. 
+ */
+typedef struct bcmolt_trx_delimiter
+{
+    uint8_t pattern[3];     /**< pattern. */
+    uint8_t size;           /**< Size in bytes. */
+    uint8_t window_size;    /**< Window size. */
+} bcmolt_trx_delimiter;
+
+/** TRX Energy detect. 
+ */
+typedef struct bcmolt_trx_energy_detect
+{
+    bcmolt_energy_detect_source ranging_ed_source;      /**< Ranging ED source. */
+    bcmolt_energy_detect_source delimiter_ed_source;    /**< Delimiter ED source. */
+    uint8_t minimum_threshold;  /**< Minimum threshold. */
+    uint8_t maximum_threshold;  /**< Maximum threshold. */
+    uint8_t ed_pattern;         /**< ED pattern. */
+    uint8_t ed_pattern_size;    /**< ED pattern size. */
+    uint8_t window_size;        /**< Window size. */
+    bcmos_bool inversion;       /**< Inversion. */
+    uint8_t no_ed_threshold;    /**< no ed threshold. */
+} bcmolt_trx_energy_detect;
+
+/** TRX Preamble. 
+ */
+typedef struct bcmolt_trx_preamble
+{
+    uint8_t type_1_size;                /**< Type 1 size. */
+    uint8_t type_2_size;                /**< Type 2 size. */
+    uint8_t type_3_pre_ranging_size;    /**< Type 3 pre ranging size. */
+    uint8_t type_3_post_ranging_size;   /**< Type 3 post ranging size. */
+    uint8_t type_3_pattern;             /**< Type 3 pattern. */
+} bcmolt_trx_preamble;
+
+/** TRX RX configuration. 
+ */
+typedef struct bcmolt_trx_rx_configuration
+{
+    uint8_t wait_window_size;           /**< Wait Window size. */
+    uint8_t ranging_access_window_size; /**< Ranging access window size. */
+} bcmolt_trx_rx_configuration;
+
+/** Variable-length list of U32. 
+ */
+typedef struct bcmolt_u32_list_u32_max_500_hex
+{
+    uint32_t len;   /**< List length. */
+    uint32_t *val;  /**< List contents. */
+} bcmolt_u32_list_u32_max_500_hex;
+
+/** Variable-length list of U8. 
+ */
+typedef struct bcmolt_u8_list_u16_hex
+{
+    uint16_t len;   /**< List length. */
+    uint8_t *val;   /**< List contents. */
+} bcmolt_u8_list_u16_hex;
+
+/** Variable-length list of U8. 
+ */
+typedef struct bcmolt_u8_list_u32
+{
+    uint32_t len;   /**< List length. */
+    uint8_t *val;   /**< List contents. */
+} bcmolt_u8_list_u32;
+
+/** Variable-length list of U8. 
+ */
+typedef struct bcmolt_u8_list_u32_max_2048
+{
+    uint32_t len;   /**< List length. */
+    uint8_t *val;   /**< List contents. */
+} bcmolt_u8_list_u32_max_2048;
+
+/** UBD Info. 
+ */
+typedef struct bcmolt_ubd_info
+{
+    uint16_t actual_polling_interval;   /**< Units: 65.536us */
+    bcmolt_time_quanta actual_grant_threshold_tq;               /**< Actual Grant Threshold (TQ). */
+    bcmolt_actual_schedulershaper actual_min_schedulershaper;   /**< Actual Min Scheduler/Shaper. */
+    bcmolt_actual_schedulershaper actual_max_schedulershaper;   /**< Actual Max Scheduler/Shaper. */
+} bcmolt_ubd_info;
+
+/** The upstream bandwidth distribution for this LLID. 
+ */
+typedef struct bcmolt_upstream_bandwidth_distribution
+{
+    bcmolt_polling_interval polling_interval_us;    /**< The amount of time between when this LLID last reported upstream data and when it will next be polled (approximate: rounded down to the nearest 65.536 us). */
+    bcmolt_time_quanta grant_threshold_tq;          /**< Used to determine the maximum grant size that will be issued to this LLID (in TQ; rounded up to the nearest 128TQ; 1TQ = 16ns = 2Bytes@1G or 20Bytes@10G). */
+    bcmolt_solicited_scheduler min_schedulershaper; /**< Min Scheduler/Shaper. */
+    bcmolt_solicited_scheduler max_schedulershaper; /**< Max Scheduler/Shaper. */
+    bcmolt_time_quanta tdm_grant_size_tq;           /**< Size of TDM grants (in TQ). */
+    uint32_t tdm_grant_interval_us;                 /**< Interval between TDM grants (in us). */
+} bcmolt_upstream_bandwidth_distribution;
+
+/** VLAN tag. 
+ */
+typedef struct bcmolt_vlan_tag
+{
+    bcmolt_vlan_id vlan_id; /**< VLAN ID. */
+    uint8_t pbit;           /**< Pbit. */
+} bcmolt_vlan_tag;
+
+/** XGPON Alloc With State. 
+ */
+typedef struct bcmolt_xgpon_alloc_with_state
+{
+    bcmolt_xgpon_alloc_id alloc_id; /**< Alloc ID. */
+    bcmolt_alloc_state state;       /**< State. */
+} bcmolt_xgpon_alloc_with_state;
+
+/** Variable-length list of xgpon_alloc_with_state. 
+ */
+typedef struct bcmolt_xgpon_alloc_with_state_list_u16_max_32
+{
+    uint16_t len;                       /**< List length. */
+    bcmolt_xgpon_alloc_with_state *val; /**< List contents. */
+} bcmolt_xgpon_alloc_with_state_list_u16_max_32;
+
+/** xgpon ed state. 
+ */
+typedef struct bcmolt_xgpon_ed_state
+{
+    bcmos_bool reset_on_ed_fail;    /**< reset on ED fail. */
+    bcmos_bool reset_on_ed_success; /**< reset on ED success. */
+} bcmolt_xgpon_ed_state;
+
+/** Variable-length list of xgpon_gem_id. 
+ */
+typedef struct bcmolt_xgpon_gem_id_list_u8_max_16
+{
+    uint8_t len;                /**< List length. */
+    bcmolt_xgpon_gem_id *val;   /**< List contents. */
+} bcmolt_xgpon_gem_id_list_u8_max_16;
+
+/** XGPON GEM Port With State. 
+ */
+typedef struct bcmolt_xgpon_gem_port_with_state
+{
+    bcmolt_xgpon_gem_id gem_id;         /**< GEM ID. */
+    bcmolt_xgpon_gem_port_state state;  /**< State. */
+} bcmolt_xgpon_gem_port_with_state;
+
+/** Variable-length list of xgpon_gem_port_with_state. 
+ */
+typedef struct bcmolt_xgpon_gem_port_with_state_list_u16_max_128
+{
+    uint16_t len;   /**< List length. */
+    bcmolt_xgpon_gem_port_with_state *val;  /**< List contents. */
+} bcmolt_xgpon_gem_port_with_state_list_u16_max_128;
+
+/** Variable-length list of xgpon_gem_port_with_state. 
+ */
+typedef struct bcmolt_xgpon_gem_port_with_state_list_u16_max_256
+{
+    uint16_t len;   /**< List length. */
+    bcmolt_xgpon_gem_port_with_state *val;  /**< List contents. */
+} bcmolt_xgpon_gem_port_with_state_list_u16_max_256;
+
+/** XGPON Key Exchange. 
+ */
+typedef struct bcmolt_xgpon_key_exchange
+{
+    uint32_t interval;              /**< Key Exchange process interval in milliseconds */
+    bcmolt_control_state control;   /**< Enable\disable periodic process of Key Exchange for active ONUs */
+    bcmolt_control_state encrypted_ports_only;  /**< Perform key exchange only to ONUs with GEM ports that have downstream encryption enabled */
+} bcmolt_xgpon_key_exchange;
+
+/** XGPON Multicast key. 
+ */
+typedef struct bcmolt_xgpon_multicast_key
+{
+    bcmolt_aes_key key;     /**< AES encryption key for multicsat XGEM port IDs */
+    bcmos_bool key_control; /**< Enable\Disable encryption on multicast XGEM ports */
+} bcmolt_xgpon_multicast_key;
+
+/** XGPON NI Debug parameters 
+ */
+typedef struct bcmolt_xgpon_ni_debug
+{
+    bcmos_bool increase_available_cbr_bw;   /**< Use increase available CBR bandwidth for better BW utilization */
+    uint16_t inter_burst_gap_in_bytes;      /**< Gap between two consecutive bursts for the same ONU */
+    uint16_t number_of_gem_ports_per_onu;   /**< Number of gem ports per onu */
+} bcmolt_xgpon_ni_debug;
+
+/** XGPON ONU Activation. 
+ */
+typedef struct bcmolt_xgpon_onu_activation
+{
+    bcmolt_control_state key_exchange;  /**< Perform single key exchange during activation. */
+    bcmolt_control_state fail_due_to_regis_auto_fail;   /**< Deactivate ONU due to registration authentication failure */
+} bcmolt_xgpon_onu_activation;
+
+/** XGPON ONU AES KEY. 
+ */
+typedef struct bcmolt_xgpon_onu_aes_key
+{
+    bcmolt_aes_key encryption_key;  /**< encryption key. */
+    uint8_t key_index;              /**< key index. */
+} bcmolt_xgpon_onu_aes_key;
+
+/** XGPON ONU alarm status. 
+ */
+typedef struct bcmolt_xgpon_onu_alarm_state
+{
+    bcmolt_status losi;             /**< Loss of signal. */
+    bcmolt_status lobi;             /**< Loss of burst. */
+    bcmolt_status lopci;            /**< Loss of PLOAM channel. */
+    bcmolt_status lopci_mic_error;  /**< Mic error on ploam channel. */
+    bcmolt_status looci;            /**< Loss of OMCI channel. */
+    bcmolt_status tiwi;             /**< Transmission interference Alarm. */
+    bcmolt_status dowi;             /**< Drift of Window. */
+    bcmolt_status sufi;             /**< Start UP Failure. */
+    bcmolt_status sfi;              /**< Signal Fail. */
+    bcmolt_status sdi;              /**< Signal Degraded. */
+    bcmolt_status dfi;              /**< Deactivation Failure. */
+    bcmolt_status dgi;              /**< Dying gasp. */
+    bcmolt_status pqsi;             /**< Ploam queue status. */
+} bcmolt_xgpon_onu_alarm_state;
+
+/** XGPON ONU alarms. 
+ */
+typedef struct bcmolt_xgpon_onu_alarms
+{
+    bcmolt_status losi;             /**< LOSi. */
+    bcmolt_status lobi;             /**< LOBi. */
+    bcmolt_status lopci_miss;       /**< LOPCi miss. */
+    bcmolt_status lopci_mic_error;  /**< LOPCi mic error. */
+} bcmolt_xgpon_onu_alarms;
+
+/** XGPON ONU alarms thresholds. 
+ */
+typedef struct bcmolt_xgpon_onu_alarms_thresholds
+{
+    uint8_t losi;   /**< Threshold for asserting LOSi alarm. */
+    uint8_t lobi;   /**< Threshold for asserting LOBi alarm. */
+    uint8_t looci;  /**< Threshold for asserting LOOCi alarm. */
+    uint8_t lopci;  /**< Threshold for asserting LOPCi alarm.  */
+} bcmolt_xgpon_onu_alarms_thresholds;
+
+/** XGPON ONU EQD. 
+ */
+typedef struct bcmolt_xgpon_onu_eqd
+{
+    bcmolt_xgpon_onu_id onu_id; /**< ONU ID. */
+    uint32_t eqd;               /**< EQD. */
+} bcmolt_xgpon_onu_eqd;
+
+/** Variable-length list of xgpon_onu_eqd. 
+ */
+typedef struct bcmolt_xgpon_onu_eqd_list_u32
+{
+    uint32_t len;               /**< List length. */
+    bcmolt_xgpon_onu_eqd *val;  /**< List contents. */
+} bcmolt_xgpon_onu_eqd_list_u32;
+
+/** XGPON ONU registration keys. 
+ */
+typedef struct bcmolt_xgpon_onu_registration_keys
+{
+    bcmolt_aes_key ploam_ik;    /**< ploam ik. */
+    bcmolt_aes_key omci_ik;     /**< omci ik. */
+    bcmolt_aes_key omci_k1;     /**< omci k1. */
+    bcmolt_aes_key omci_k2;     /**< omci k2. */
+    bcmolt_aes_key kek;         /**< kek. */
+} bcmolt_xgpon_onu_registration_keys;
+
+/** XGPON ONU With State. 
+ */
+typedef struct bcmolt_xgpon_onu_with_state
+{
+    bcmolt_xgpon_onu_id onu_id; /**< ONU ID. */
+    bcmolt_onu_state state;     /**< State. */
+} bcmolt_xgpon_onu_with_state;
+
+/** Variable-length list of xgpon_onu_with_state. 
+ */
+typedef struct bcmolt_xgpon_onu_with_state_list_u16_max_510
+{
+    uint16_t len;                       /**< List length. */
+    bcmolt_xgpon_onu_with_state *val;   /**< List contents. */
+} bcmolt_xgpon_onu_with_state_list_u16_max_510;
+
+/** XGPON PLOAM handling. 
+ */
+typedef struct bcmolt_xgpon_ploam_handling
+{
+    uint32_t ack_timeout;               /**< Timeout for receiving ACK ploam */
+    uint8_t retrans_ranging_time;       /**< Number of Ranging Time ploam retransmissions in case of ACK timeout */
+    uint8_t retrans_assign_alloc_id;    /**< Number of Assign Alloc ID ploam retransmissions in case of ACK timeout */
+    uint8_t retrans_key_control;        /**< Number of Key Control ploam retransmissions in case of ACK timeout */
+    uint8_t retrans_request_registration;   /**< Number of Request Registration ploam retransmissions in case of ACK timeout */
+} bcmolt_xgpon_ploam_handling;
+
+/** XGPON protection switching configuration. 
+ */
+typedef struct bcmolt_xgpon_protection_switching
+{
+    uint16_t timeout;           /**< LOS switch over timeout in milliseconds */
+    bcmolt_gpio_pin gpio_pin;   /**< GPIO pin for input/output signal */
+    bcmos_bool fast_ranging;    /**< fast ranging  */
+} bcmolt_xgpon_protection_switching;
+
+/** xgpon protection switching debug. 
+ */
+typedef struct bcmolt_xgpon_protection_switching_debug
+{
+    uint16_t data_map_delay_ms;             /**< delay to wait after sending ranging time delta before running the data map   */
+    bcmos_bool rerange_send_ranging_time;   /**< Should the SM send the current ranging time before doing the re-ranging  */
+    uint16_t rerange_send_ranging_time_delay;   /**< the delay between sending the ranging time and starting the rerange  */
+} bcmolt_xgpon_protection_switching_debug;
+
+/** XGPON RSSI normal configuration. 
+ */
+typedef struct bcmolt_xgpon_rssi_normal_config
+{
+    bcmolt_polarity polarity;   /**< RSSI signal polarity */
+    uint8_t location;           /**< RSSI signal location in words */
+    bcmolt_sign location_sign;  /**< RSSI signal location sign */
+    uint16_t pulse_width;       /**< RSSI pulse width in words */
+    uint16_t minimum_burst;     /**< Data minimum burst size in words */
+} bcmolt_xgpon_rssi_normal_config;
+
+/** xgpon rssi ranging config. 
+ */
+typedef struct bcmolt_xgpon_rssi_ranging_config
+{
+    bcmos_bool start_on_ed;         /**< start on ED. */
+    uint8_t frame_delay;            /**< frame delay from ED */
+    uint16_t word_delay;            /**< word delay from ED */
+    uint8_t frame_delay_after_ed;   /**< frame delay from start  of ranging window */
+    uint16_t word_delay_after_ed;   /**< word delay from start  of ranging window */
+} bcmolt_xgpon_rssi_ranging_config;
+
+/** xgpon rx ranging SM patterns. 
+ */
+typedef struct bcmolt_xgpon_rx_ranging_sm_pattern
+{
+    uint32_t trx_reset_pattern_first;   /**< trx reset pattern first. */
+    uint32_t trx_reset_pattern_middle;  /**< trx reset pattern middle. */
+    uint32_t trx_reset_pattern_last;    /**< trx reset pattern last. */
+    uint8_t trx_reset_middle_repeats;   /**< trx reset middle repeats. */
+    uint8_t trx_reset_location;         /**< trx reset location. */
+    uint32_t bcdr_reset_pattern_first;  /**< bcdr reset pattern first. */
+    uint32_t bcdr_reset_pattern_middle; /**< bcdr reset pattern middle. */
+    uint32_t bcdr_reset_pattern_last;   /**< bcdr reset pattern last. */
+    uint8_t bcdr_reset_middle_repeats;  /**< bcdr reset middle repeats. */
+    uint8_t bcdr_reset_location;        /**< bcdr reset location. */
+    bcmos_bool bcdr_reset_polarity;     /**< bcdr reset polarity. */
+} bcmolt_xgpon_rx_ranging_sm_pattern;
+
+/** xgpon serdes configuration. 
+ */
+typedef struct bcmolt_xgpon_serdes_configuration
+{
+    bcmos_bool multi_ed_mode;   /**< multi ed mode. */
+    bcmolt_xgpon_serdes_ranging_mode ranging_mode;  /**< ranging mode. */
+} bcmolt_xgpon_serdes_configuration;
+
+/** XGPON SN Acquisition. 
+ */
+typedef struct bcmolt_xgpon_sn_acquisition
+{
+    uint32_t interval;              /**< SN process interval in milliseconds */
+    bcmolt_control_state control;   /**< SN process control */
+    bcmolt_onu_post_discovery_mode onu_post_discovery_mode; /**< Automatic operation following ONU discovery */
+    bcmolt_burst_profile_index burst_profile;               /**< Burst profile index to use during SN acquisition window */
+} bcmolt_xgpon_sn_acquisition;
+
+/** xgpon_trx_debug. 
+ */
+typedef struct bcmolt_xgpon_trx_debug
+{
+    bcmolt_control_state rx_reversed_polarity;  /**< transceiver reversed polarity */
+    bcmolt_control_state neg_out_bit;           /**< turn all 1 to 0 and all 0 to 1 at the output. default is not to make negative bits */
+} bcmolt_xgpon_trx_debug;
+
+/** @} */
+#endif /* BCMOLT_MODEL_DATA_H_ */
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_model_ids.h b/bcm68620_release/release/host_driver/model/bcmolt_model_ids.h
new file mode 100644
index 0000000..4a1967c
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_model_ids.h
@@ -0,0 +1,9624 @@
+/*
+<: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.
+:>
+*/
+#ifndef BCMOLT_MODEL_IDS_H_
+#define BCMOLT_MODEL_IDS_H_
+
+/** \addtogroup api_data_types 
+ * @{ 
+ */
+
+/** Identifiers for all properties contained in the ae_ni_cfg group. 
+ */
+typedef enum bcmolt_ae_ni_cfg_id
+{
+    BCMOLT_AE_NI_CFG_ID__BEGIN          = 0,
+    BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS     = 0,                /**< MAC Address. */
+    BCMOLT_AE_NI_CFG_ID_AE_NI_EN        = 1,                /**< AE NI enable state. */
+    BCMOLT_AE_NI_CFG_ID_MTU_10G         = 2,                /**< MTU. */
+    BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR  = 3,                /**< PRBS Generator. */
+    BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER    = 4,                /**< PRBS Checker. */
+    BCMOLT_AE_NI_CFG_ID_PRBS_STATUS     = 5,                /**< PRBS status. */
+    BCMOLT_AE_NI_CFG_ID__NUM_OF                             /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_ni_cfg_id;
+
+/** Identifiers for all properties contained in the ae_ni_key group. 
+ */
+typedef enum bcmolt_ae_ni_key_id
+{
+    BCMOLT_AE_NI_KEY_ID__BEGIN          = 0,
+    BCMOLT_AE_NI_KEY_ID_AE_NI           = 0,                /**< AE NI number. */
+    BCMOLT_AE_NI_KEY_ID__NUM_OF                             /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_ni_key_id;
+
+/** Identifiers for all properties contained in the ae_ni_set_ae_ni_en_state 
+ * group. 
+ */
+typedef enum bcmolt_ae_ni_set_ae_ni_en_state_id
+{
+    BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID__BEGIN   = 0,
+    BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE= 0,        /**< New AE NI enable state. */
+    BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_ni_set_ae_ni_en_state_id;
+
+/** Identifiers for all properties contained in the ae_path_ds_auto_cfg group. 
+ */
+typedef enum bcmolt_ae_path_ds_auto_cfg_id
+{
+    BCMOLT_AE_PATH_DS_AUTO_CFG_ID__BEGIN            = 0,
+    BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED= 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_AE_PATH_DS_AUTO_CFG_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_auto_cfg_id;
+
+/** Identifiers for all properties contained in the ae_path_ds_key group. 
+ */
+typedef enum bcmolt_ae_path_ds_key_id
+{
+    BCMOLT_AE_PATH_DS_KEY_ID__BEGIN                 = 0,
+    BCMOLT_AE_PATH_DS_KEY_ID_AE_NI                  = 0,    /**< AE NI (Active Ethernet Network Interface) number. */
+    BCMOLT_AE_PATH_DS_KEY_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_key_id;
+
+/** Identifiers for all properties contained in the 
+ * ae_path_ds_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_ae_path_ds_stat_alarm_cleared_id
+{
+    BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID__BEGIN  = 0,
+    BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT    = 0,    /**< Statistic ID. */
+    BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the ae_path_ds_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_ae_path_ds_stat_alarm_raised_id
+{
+    BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID__BEGIN   = 0,
+    BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT     = 0,    /**< Statistic ID. */
+    BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID__NUM_OF          /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the ae_path_ds_stat_cfg group. 
+ */
+typedef enum bcmolt_ae_path_ds_stat_cfg_id
+{
+    BCMOLT_AE_PATH_DS_STAT_CFG_ID__BEGIN            = 0,
+    BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG               = 0,    /**< Configuration. */
+    BCMOLT_AE_PATH_DS_STAT_CFG_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_stat_cfg_id;
+
+/** Identifiers for all properties contained in the ae_path_ds_stat group. 
+ */
+typedef enum bcmolt_ae_path_ds_stat_id
+{
+    BCMOLT_AE_PATH_DS_STAT_ID__BEGIN                = 0,
+    BCMOLT_AE_PATH_DS_STAT_ID_BYTES                 = 0,    /**< Bytes. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES                = 1,    /**< Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64             = 2,    /**< 64 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127         = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255        = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511        = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023       = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518      = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047      = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095      = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216      = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383     = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES      = 12,   /**< Broadcast Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES            = 13,   /**< Data Bytes. */
+    BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES      = 14,   /**< Mulitcast Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES        = 15,   /**< Unicast Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES          = 16,   /**< Abort Frames. */
+    BCMOLT_AE_PATH_DS_STAT_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_stat_id;
+
+/** Identifiers for all properties contained in the ae_path_us_auto_cfg group. 
+ */
+typedef enum bcmolt_ae_path_us_auto_cfg_id
+{
+    BCMOLT_AE_PATH_US_AUTO_CFG_ID__BEGIN            = 0,
+    BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED= 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_AE_PATH_US_AUTO_CFG_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_auto_cfg_id;
+
+/** Identifiers for all properties contained in the ae_path_us_key group. 
+ */
+typedef enum bcmolt_ae_path_us_key_id
+{
+    BCMOLT_AE_PATH_US_KEY_ID__BEGIN                 = 0,
+    BCMOLT_AE_PATH_US_KEY_ID_AE_NI                  = 0,    /**< AE NI. */
+    BCMOLT_AE_PATH_US_KEY_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_key_id;
+
+/** Identifiers for all properties contained in the 
+ * ae_path_us_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_ae_path_us_stat_alarm_cleared_id
+{
+    BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID__BEGIN  = 0,
+    BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT    = 0,    /**< Statistic ID. */
+    BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the ae_path_us_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_ae_path_us_stat_alarm_raised_id
+{
+    BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID__BEGIN   = 0,
+    BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT     = 0,    /**< Statistic ID. */
+    BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID__NUM_OF          /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the ae_path_us_stat_cfg group. 
+ */
+typedef enum bcmolt_ae_path_us_stat_cfg_id
+{
+    BCMOLT_AE_PATH_US_STAT_CFG_ID__BEGIN            = 0,
+    BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG               = 0,    /**< Configuration. */
+    BCMOLT_AE_PATH_US_STAT_CFG_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_stat_cfg_id;
+
+/** Identifiers for all properties contained in the ae_path_us_stat group. 
+ */
+typedef enum bcmolt_ae_path_us_stat_id
+{
+    BCMOLT_AE_PATH_US_STAT_ID__BEGIN                = 0,
+    BCMOLT_AE_PATH_US_STAT_ID_BYTES                 = 0,    /**< Bytes. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES                = 1,    /**< Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64             = 2,    /**< 64 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127         = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255        = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511        = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023       = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518      = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047      = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095      = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216      = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383     = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES      = 12,   /**< Broadcast Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES            = 13,   /**< Data Bytes. */
+    BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES      = 14,   /**< Mulitcast Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES        = 15,   /**< Unicast Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES          = 16,   /**< Abort Frames. */
+    BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR             = 17,   /**< FCS Error. */
+    BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR        = 18,   /**< Oversize Error. */
+    BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR            = 19,   /**< Runt Error. */
+    BCMOLT_AE_PATH_US_STAT_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_stat_id;
+
+/** Identifiers for all properties contained in the channel_cfg group. 
+ */
+typedef enum bcmolt_channel_cfg_id
+{
+    BCMOLT_CHANNEL_CFG_ID__BEGIN                    = 0,
+    BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL         = 0,    /**< Operation control. */
+    BCMOLT_CHANNEL_CFG_ID_TOL                       = 1,    /**< TOL. */
+    BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE            = 2,    /**< System profile. */
+    BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE           = 3,    /**< Channel profile. */
+    BCMOLT_CHANNEL_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_channel_cfg_id;
+
+/** Identifiers for all properties contained in the channel_key group. 
+ */
+typedef enum bcmolt_channel_key_id
+{
+    BCMOLT_CHANNEL_KEY_ID__BEGIN                    = 0,
+    BCMOLT_CHANNEL_KEY_ID_PON_NI                    = 0,    /**< PON network interface. */
+    BCMOLT_CHANNEL_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_channel_key_id;
+
+/** Identifiers for all properties contained in the debug_auto_cfg group. 
+ */
+typedef enum bcmolt_debug_auto_cfg_id
+{
+    BCMOLT_DEBUG_AUTO_CFG_ID__BEGIN                 = 0,
+    BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT             = 0,    /**< cli_output. */
+    BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL       = 1,    /**< file_almost_full. */
+    BCMOLT_DEBUG_AUTO_CFG_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_auto_cfg_id;
+
+/** Identifiers for all properties contained in the debug_cfg group. 
+ */
+typedef enum bcmolt_debug_cfg_id
+{
+    BCMOLT_DEBUG_CFG_ID__BEGIN                      = 0,
+    BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION         = 0,    /**< Console_redirection. */
+    BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED         = 1,    /**< Indications Dropped. */
+    BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT           = 2,    /**< File used percent. */
+    BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG             = 3,    /**< API Capture Cfg. */
+    BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS           = 4,    /**< API Capture Stats. */
+    BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ     = 5,    /**< API Capture Buffer Read. */
+    BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER          = 6,    /**< API Capture Buffer. */
+    BCMOLT_DEBUG_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_cfg_id;
+
+/** Identifiers for all properties contained in the debug_cli_input group. 
+ */
+typedef enum bcmolt_debug_cli_input_id
+{
+    BCMOLT_DEBUG_CLI_INPUT_ID__BEGIN                = 0,
+    BCMOLT_DEBUG_CLI_INPUT_ID_DATA                  = 0,    /**< data. */
+    BCMOLT_DEBUG_CLI_INPUT_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_cli_input_id;
+
+/** Identifiers for all properties contained in the debug_cli_output group. 
+ */
+typedef enum bcmolt_debug_cli_output_id
+{
+    BCMOLT_DEBUG_CLI_OUTPUT_ID__BEGIN               = 0,
+    BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA                 = 0,    /**< data. */
+    BCMOLT_DEBUG_CLI_OUTPUT_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_cli_output_id;
+
+/** Identifiers for all properties contained in the debug_file_almost_full 
+ * group. 
+ */
+typedef enum bcmolt_debug_file_almost_full_id
+{
+    BCMOLT_DEBUG_FILE_ALMOST_FULL_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_file_almost_full_id;
+
+/** Identifiers for all properties contained in the debug_key group. 
+ */
+typedef enum bcmolt_debug_key_id
+{
+    BCMOLT_DEBUG_KEY_ID__BEGIN                      = 0,
+    BCMOLT_DEBUG_KEY_ID_RESERVED                    = 0,    /**< Reserved. */
+    BCMOLT_DEBUG_KEY_ID__NUM_OF                 /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_key_id;
+
+/** Identifiers for all properties contained in the debug_reset_api_capture 
+ * group. 
+ */
+typedef enum bcmolt_debug_reset_api_capture_id
+{
+    BCMOLT_DEBUG_RESET_API_CAPTURE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_reset_api_capture_id;
+
+/** Identifiers for all properties contained in the debug_start_api_capture 
+ * group. 
+ */
+typedef enum bcmolt_debug_start_api_capture_id
+{
+    BCMOLT_DEBUG_START_API_CAPTURE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_start_api_capture_id;
+
+/** Identifiers for all properties contained in the debug_stop_api_capture 
+ * group. 
+ */
+typedef enum bcmolt_debug_stop_api_capture_id
+{
+    BCMOLT_DEBUG_STOP_API_CAPTURE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_stop_api_capture_id;
+
+/** Identifiers for all properties contained in the device_auto_cfg group. 
+ */
+typedef enum bcmolt_device_auto_cfg_id
+{
+    BCMOLT_DEVICE_AUTO_CFG_ID__BEGIN                    = 0,
+    BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE       = 0,    /**< Connection Complete. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED    = 1,    /**< Connection Established (Internal). */
+    BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE        = 2,    /**< Connection Failure. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE         = 3,    /**< DDR Test Complete. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE         = 4,    /**< Device Keep Alive (Internal). */
+    BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY              = 5,    /**< Device Ready (Internal). */
+    BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE    = 6,    /**< Disconnection Complete. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE   = 7,    /**< Image Transfer Complete. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED       = 8,    /**< Indications Dropped. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR                  = 9,    /**< sw error. */
+    BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION              = 10,   /**< sw exception. */
+    BCMOLT_DEVICE_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_auto_cfg_id;
+
+/** Identifiers for all properties contained in the device_cfg group. 
+ */
+typedef enum bcmolt_device_cfg_id
+{
+    BCMOLT_DEVICE_CFG_ID__BEGIN                             = 0,
+    BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE                        = 0,    /**< system_mode. */
+    BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL                 = 1,    /**< Device Keepalive Interval. */
+    BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE                = 2,    /**< Device Keepalive tolerance . */
+    BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION                = 3,    /**< Firmware SW Version. */
+    BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION                    = 4,    /**< Host SW Version. */
+    BCMOLT_DEVICE_CFG_ID_CHIP_REVISION                      = 5,    /**< Chip Revision. */
+    BCMOLT_DEVICE_CFG_ID_STATE                              = 6,    /**< Device state. */
+    BCMOLT_DEVICE_CFG_ID_DEBUG                              = 7,    /**< debug parameters. */
+    BCMOLT_DEVICE_CFG_ID_NNI_SPEED                          = 8,    /**< NNI Speed. */
+    BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ       = 9,    /**< Protection Switching External IRQ. */
+    BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY  = 10,   /**< EPON Clock Transport Sample Delay. */
+    BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING                 = 11,   /**< Indication Shaping. */
+    BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE                   = 12,   /**< chip temperature . */
+    BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE              = 13,   /**< GPON/XGPON ToD enable. */
+    BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN            = 14,   /**< GPON/XGPON ToD GPIO pin. */
+    BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY= 15,   /**< GPON/XGPON is ToD internally. */
+    BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT            = 16,   /**< EPON 802.1AS ToD Format. */
+    BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE                   = 17,   /**< EPON Shaper Mode. */
+    BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST                = 18,   /**< Embedded image list. */
+    BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE                       = 19,   /**< chip voltage. */
+    BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING                    = 20,   /**< EPON ToD String. */
+    BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS                  = 21,   /**< xgpon num of onus. */
+    BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS                  = 22,   /**< Device IP Address. */
+    BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT                    = 23,   /**< Device UDP port. */
+    BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE                  = 24,   /**< UART baudrate. */
+    BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH       = 25,   /**< GPON/XGPON ToD string length. */
+    BCMOLT_DEVICE_CFG_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_cfg_id;
+
+/** Identifiers for all properties contained in the device_connect group. 
+ */
+typedef enum bcmolt_device_connect_id
+{
+    BCMOLT_DEVICE_CONNECT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_connect_id;
+
+/** Identifiers for all properties contained in the device_connection_complete 
+ * group. 
+ */
+typedef enum bcmolt_device_connection_complete_id
+{
+    BCMOLT_DEVICE_CONNECTION_COMPLETE_ID__BEGIN             = 0,
+    BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE         = 0,    /**< Standalone. */
+    BCMOLT_DEVICE_CONNECTION_COMPLETE_ID__NUM_OF                    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_connection_complete_id;
+
+/** Identifiers for all properties contained in the 
+ * device_connection_established group. 
+ */
+typedef enum bcmolt_device_connection_established_id
+{
+    BCMOLT_DEVICE_CONNECTION_ESTABLISHED_ID__NUM_OF                 /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_connection_established_id;
+
+/** Identifiers for all properties contained in the device_connection_failure 
+ * group. 
+ */
+typedef enum bcmolt_device_connection_failure_id
+{
+    BCMOLT_DEVICE_CONNECTION_FAILURE_ID__BEGIN              = 0,
+    BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON              = 0,    /**< Connection fail reason. */
+    BCMOLT_DEVICE_CONNECTION_FAILURE_ID__NUM_OF                     /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_connection_failure_id;
+
+/** Identifiers for all properties contained in the device_ddr_test_complete 
+ * group. 
+ */
+typedef enum bcmolt_device_ddr_test_complete_id
+{
+    BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID__BEGIN               = 0,
+    BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST             = 0,    /**< DDR Test. */
+    BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_ddr_test_complete_id;
+
+/** Identifiers for all properties contained in the device_device_keep_alive 
+ * group. 
+ */
+typedef enum bcmolt_device_device_keep_alive_id
+{
+    BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID__BEGIN               = 0,
+    BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER      = 0,    /**< sequence number. */
+    BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP           = 1,    /**< time stamp. */
+    BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_device_keep_alive_id;
+
+/** Identifiers for all properties contained in the device_device_ready group. 
+ */
+typedef enum bcmolt_device_device_ready_id
+{
+    BCMOLT_DEVICE_DEVICE_READY_ID__BEGIN                    = 0,
+    BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION       = 0,    /**< Software Version. */
+    BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE               = 1,    /**< System Mode. */
+    BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED                 = 2,    /**< NNI Speed. */
+    BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION             = 3,    /**< Chip Revision. */
+    BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE                = 4,    /**< ToD control. */
+    BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN              = 5,    /**< GPIO pin is used when ToD UART is not connected to the embedded, and TOD value is obtained by the host. */
+    BCMOLT_DEVICE_DEVICE_READY_ID__NUM_OF           /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_device_ready_id;
+
+/** Identifiers for all properties contained in the device_disconnect group. 
+ */
+typedef enum bcmolt_device_disconnect_id
+{
+    BCMOLT_DEVICE_DISCONNECT_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_disconnect_id;
+
+/** Identifiers for all properties contained in the 
+ * device_disconnection_complete group. 
+ */
+typedef enum bcmolt_device_disconnection_complete_id
+{
+    BCMOLT_DEVICE_DISCONNECTION_COMPLETE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_disconnection_complete_id;
+
+/** Identifiers for all properties contained in the device_host_keep_alive 
+ * group. 
+ */
+typedef enum bcmolt_device_host_keep_alive_id
+{
+    BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID__BEGIN                 = 0,
+    BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER        = 0,    /**< sequence number. */
+    BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP             = 1,    /**< time stamp. */
+    BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_host_keep_alive_id;
+
+/** Identifiers for all properties contained in the 
+ * device_image_transfer_complete group. 
+ */
+typedef enum bcmolt_device_image_transfer_complete_id
+{
+    BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID__BEGIN         = 0,
+    BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE     = 0,    /**< Image type. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER   = 1,    /**< Block number. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS         = 2,    /**< Status. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_image_transfer_complete_id;
+
+/** Identifiers for all properties contained in the device_image_transfer_data 
+ * group. 
+ */
+typedef enum bcmolt_device_image_transfer_data_id
+{
+    BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID__BEGIN             = 0,
+    BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER       = 0,    /**< Block number. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA          = 1,    /**< More Data. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA               = 2,    /**< Data. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID__NUM_OF                    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_image_transfer_data_id;
+
+/** Identifiers for all properties contained in the device_image_transfer_start 
+ * group. 
+ */
+typedef enum bcmolt_device_image_transfer_start_id
+{
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID__BEGIN            = 0,
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE        = 0,    /**< Image type. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE        = 1,    /**< Image Size. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32             = 2,    /**< CRC32. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME        = 3,    /**< Image name. */
+    BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_image_transfer_start_id;
+
+/** Identifiers for all properties contained in the device_indications_dropped 
+ * group. 
+ */
+typedef enum bcmolt_device_indications_dropped_id
+{
+    BCMOLT_DEVICE_INDICATIONS_DROPPED_ID__BEGIN             = 0,
+    BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT        = 0,    /**< Total Count. */
+    BCMOLT_DEVICE_INDICATIONS_DROPPED_ID__NUM_OF                    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_indications_dropped_id;
+
+/** Identifiers for all properties contained in the device_key group. 
+ */
+typedef enum bcmolt_device_key_id
+{
+    BCMOLT_DEVICE_KEY_ID__BEGIN                             = 0,
+    BCMOLT_DEVICE_KEY_ID_RESERVED                           = 0,    /**< Reserved. */
+    BCMOLT_DEVICE_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_key_id;
+
+/** Identifiers for all properties contained in the device_reset group. 
+ */
+typedef enum bcmolt_device_reset_id
+{
+    BCMOLT_DEVICE_RESET_ID__BEGIN                           = 0,
+    BCMOLT_DEVICE_RESET_ID_MODE                             = 0,    /**< Mode. */
+    BCMOLT_DEVICE_RESET_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_reset_id;
+
+/** Identifiers for all properties contained in the device_run_ddr_test group. 
+ */
+typedef enum bcmolt_device_run_ddr_test_id
+{
+    BCMOLT_DEVICE_RUN_DDR_TEST_ID__BEGIN                    = 0,
+    BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU                       = 0,    /**< CPU. */
+    BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0                     = 1,    /**< RAS 0. */
+    BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1                     = 2,    /**< RAS 1. */
+    BCMOLT_DEVICE_RUN_DDR_TEST_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_run_ddr_test_id;
+
+/** Identifiers for all properties contained in the device_sw_error group. 
+ */
+typedef enum bcmolt_device_sw_error_id
+{
+    BCMOLT_DEVICE_SW_ERROR_ID__BEGIN                        = 0,
+    BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME                     = 0,    /**< task name. */
+    BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME                     = 1,    /**< file name. */
+    BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER                   = 2,    /**< line number. */
+    BCMOLT_DEVICE_SW_ERROR_ID_PON_NI                        = 3,    /**< pon_ni. */
+    BCMOLT_DEVICE_SW_ERROR_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_sw_error_id;
+
+/** Identifiers for all properties contained in the device_sw_exception group. 
+ */
+typedef enum bcmolt_device_sw_exception_id
+{
+    BCMOLT_DEVICE_SW_EXCEPTION_ID__BEGIN                    = 0,
+    BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID                    = 0,    /**< CPU ID. */
+    BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT                      = 1,    /**< text. */
+    BCMOLT_DEVICE_SW_EXCEPTION_ID__NUM_OF           /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_sw_exception_id;
+
+/** Identifiers for all properties contained in the device_sw_upgrade_activate 
+ * group. 
+ */
+typedef enum bcmolt_device_sw_upgrade_activate_id
+{
+    BCMOLT_DEVICE_SW_UPGRADE_ACTIVATE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_sw_upgrade_activate_id;
+
+/** Identifiers for all properties contained in the epon_denied_link_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_denied_link_auto_cfg_id
+{
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID__BEGIN                      = 0,
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION      = 0,    /**< Laser On/Off Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION   = 1,    /**< LLID Pool Empty Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION          = 2,    /**< Max Link Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION  = 3,    /**< Overhead Profile Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION             = 4,    /**< Range Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION             = 5,    /**< Rogue ONU Detected. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION   = 6,    /**< System Resource Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED      = 7,    /**< TDM Channels Exhausted. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION      = 8,    /**< Unknown Link Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION= 9,    /**< Upstream Bandwidth Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_denied_link_cfg group. 
+ */
+typedef enum bcmolt_epon_denied_link_cfg_id
+{
+    BCMOLT_EPON_DENIED_LINK_CFG_ID__BEGIN                           = 0,
+    BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE                      = 0,    /**< Alarm State. */
+    BCMOLT_EPON_DENIED_LINK_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_cfg_id;
+
+/** Identifiers for all properties contained in the epon_denied_link_key group. 
+ */
+typedef enum bcmolt_epon_denied_link_key_id
+{
+    BCMOLT_EPON_DENIED_LINK_KEY_ID__BEGIN                           = 0,
+    BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI                          = 0,    /**< EPON NI Identifier. */
+    BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS                      = 1,    /**< MAC Address. */
+    BCMOLT_EPON_DENIED_LINK_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_laser_on_off_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_laser_on_off_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID__BEGIN        = 0,
+    BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS  = 0,        /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_laser_on_off_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_llid_pool_empty_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_llid_pool_empty_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID__BEGIN         = 0,
+    BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS   = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_llid_pool_empty_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_max_link_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_max_link_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID__BEGIN                = 0,
+    BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS          = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_max_link_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_overhead_profile_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_overhead_profile_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID__BEGIN        = 0,
+    BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS  = 0,    /**< Alarm status. */
+    BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_overhead_profile_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_range_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_range_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID__BEGIN                   = 0,
+    BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS             = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_range_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_rogue_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_rogue_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID__BEGIN                   = 0,
+    BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS             = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_rogue_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_system_resource_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_system_resource_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID__BEGIN         = 0,
+    BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS   = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_system_resource_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_tdm_channels_exhausted group. 
+ */
+typedef enum bcmolt_epon_denied_link_tdm_channels_exhausted_id
+{
+    BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID__BEGIN            = 0,
+    BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS      = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_tdm_channels_exhausted_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_unknown_link_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_unknown_link_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID__BEGIN            = 0,
+    BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS      = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_unknown_link_violation_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_denied_link_upstream_bandwidth_violation group. 
+ */
+typedef enum bcmolt_epon_denied_link_upstream_bandwidth_violation_id
+{
+    BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID__BEGIN      = 0,
+    BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS= 0,    /**< Alarm Status. */
+    BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_upstream_bandwidth_violation_id;
+
+/** Identifiers for all properties contained in the epon_link_auto_cfg group. 
+ */
+typedef enum bcmolt_epon_link_auto_cfg_id
+{
+    BCMOLT_EPON_LINK_AUTO_CFG_ID__BEGIN                                 = 0,
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST    = 0,    /**< Duplicate MPCP Registration Request. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED                     = 1,    /**< Encryption Enabled. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE                   = 2,    /**< Key Exchange Failure. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED                   = 3,    /**< key_exchange_started. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED                   = 4,    /**< key_exchange_stopped. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED                           = 5,    /**< Link Deleted. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH                    = 6,    /**< Link attempted to register at a different speed. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED                      = 7,    /**< MPCP Deregistered. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED                        = 8,    /**< MPCP Discovered. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT                   = 9,    /**< MPCP Reg Ack Timeout. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT                    = 10,   /**< MPCP Report Timeout. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT                  = 11,   /**< OAM Keepalive Timeout. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED            = 12,   /**< OAM keepalive timer started. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED            = 13,   /**< OAM keepalive timer stopped. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED            = 14,   /**< Preprovisioned Link Created. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED             = 15,   /**< Protection Switch Occurred. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED                    = 16,   /**< Range Value Changed. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE                        = 17,   /**< Re-range failure. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED                     = 18,   /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED                      = 19,   /**< Stat Alarm Raised. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE               = 20,   /**< Static registration done. */
+    BCMOLT_EPON_LINK_AUTO_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_link_cfg group. 
+ */
+typedef enum bcmolt_epon_link_cfg_id
+{
+    BCMOLT_EPON_LINK_CFG_ID__BEGIN                                      = 0,
+    BCMOLT_EPON_LINK_CFG_ID_LINK_RATE                                   = 0,    /**< EPON link rate. */
+    BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS                                 = 1,    /**< EPON link state flags. */
+    BCMOLT_EPON_LINK_CFG_ID_LLID                                        = 2,    /**< EPON logical link identifier. */
+    BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ                            = 3,    /**< Laser-on time (TQ). */
+    BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ                           = 4,    /**< Laser-off time (TQ). */
+    BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ                              = 5,    /**< Range value (TQ). */
+    BCMOLT_EPON_LINK_CFG_ID_DISTANCE                                    = 6,    /**< Distance. */
+    BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE                                 = 7,    /**< Alarm State. */
+    BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID                                   = 8,    /**< Tunnel ID. */
+    BCMOLT_EPON_LINK_CFG_ID_ONU_ID                                      = 9,    /**< Associated ONU. */
+    BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD                          = 10,   /**< Min Laser Overhead. */
+    BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG                         = 11,   /**< Key exchange configuration. */
+    BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION                             = 12,   /**< EPON Encryption . */
+    BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE                                  = 13,   /**< FEC enable. */
+    BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG                        = 14,   /**< OAM heartbeat configuration. */
+    BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH                          = 15,   /**< Upstream Bandwidth. */
+    BCMOLT_EPON_LINK_CFG_ID_UBD_INFO                                    = 16,   /**< UBD Info. */
+    BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE                      = 17,   /**< Clock Transport Enable. */
+    BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS                              = 18,   /**< Pending grants. */
+    BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE                                   = 19,   /**< Link Type. */
+    BCMOLT_EPON_LINK_CFG_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_cfg_id;
+
+/** Identifiers for all properties contained in the epon_link_delete_link group. 
+ */
+typedef enum bcmolt_epon_link_delete_link_id
+{
+    BCMOLT_EPON_LINK_DELETE_LINK_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_delete_link_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_duplicate_mpcp_registration_request group. 
+ */
+typedef enum bcmolt_epon_link_duplicate_mpcp_registration_request_id
+{
+    BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID__BEGIN          = 0,
+    BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ= 0,    /**< Initial range. */
+    BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ= 1,    /**< Current range. */
+    BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID__NUM_OF                 /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_duplicate_mpcp_registration_request_id;
+
+/** Identifiers for all properties contained in the epon_link_encryption_enabled 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_encryption_enabled_id
+{
+    BCMOLT_EPON_LINK_ENCRYPTION_ENABLED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_encryption_enabled_id;
+
+/** Identifiers for all properties contained in the epon_link_force_rediscovery 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_force_rediscovery_id
+{
+    BCMOLT_EPON_LINK_FORCE_REDISCOVERY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_force_rediscovery_id;
+
+/** Identifiers for all properties contained in the epon_link_frame_captured 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_frame_captured_id
+{
+    BCMOLT_EPON_LINK_FRAME_CAPTURED_ID__BEGIN                               = 0,
+    BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME                                = 0,    /**< Received frame. */
+    BCMOLT_EPON_LINK_FRAME_CAPTURED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_frame_captured_id;
+
+/** Identifiers for all properties contained in the epon_link_inject_frame 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_inject_frame_id
+{
+    BCMOLT_EPON_LINK_INJECT_FRAME_ID__BEGIN                                 = 0,
+    BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME                                  = 0,    /**< Frame to transmit. */
+    BCMOLT_EPON_LINK_INJECT_FRAME_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_inject_frame_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_key_exchange_failure group. 
+ */
+typedef enum bcmolt_epon_link_key_exchange_failure_id
+{
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID__BEGIN                         = 0,
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS                   = 0,    /**< alarm status. */
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_exchange_failure_id;
+
+/** Identifiers for all properties contained in the epon_link_key_exchange_start 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_key_exchange_start_id
+{
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID__BEGIN                           = 0,
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD                           = 0,    /**< period. */
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID__NUM_OF      /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_exchange_start_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_key_exchange_started group. 
+ */
+typedef enum bcmolt_epon_link_key_exchange_started_id
+{
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_STARTED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_exchange_started_id;
+
+/** Identifiers for all properties contained in the epon_link_key_exchange_stop 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_key_exchange_stop_id
+{
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_STOP_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_exchange_stop_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_key_exchange_stopped group. 
+ */
+typedef enum bcmolt_epon_link_key_exchange_stopped_id
+{
+    BCMOLT_EPON_LINK_KEY_EXCHANGE_STOPPED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_exchange_stopped_id;
+
+/** Identifiers for all properties contained in the epon_link_key group. 
+ */
+typedef enum bcmolt_epon_link_key_id
+{
+    BCMOLT_EPON_LINK_KEY_ID__BEGIN                                          = 0,
+    BCMOLT_EPON_LINK_KEY_ID_EPON_NI                                         = 0,    /**< EPON NI identifier. */
+    BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS                                     = 1,    /**< MAC address. */
+    BCMOLT_EPON_LINK_KEY_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_key_id;
+
+/** Identifiers for all properties contained in the epon_link_link_deleted 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_link_deleted_id
+{
+    BCMOLT_EPON_LINK_LINK_DELETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_link_deleted_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_link_speed_mismatch group. 
+ */
+typedef enum bcmolt_epon_link_link_speed_mismatch_id
+{
+    BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID__BEGIN                          = 0,
+    BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE                   = 0,    /**< Previous rate. */
+    BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE                    = 1,    /**< Current rate. */
+    BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_link_speed_mismatch_id;
+
+/** Identifiers for all properties contained in the epon_link_mpcp_deregistered 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_mpcp_deregistered_id
+{
+    BCMOLT_EPON_LINK_MPCP_DEREGISTERED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_mpcp_deregistered_id;
+
+/** Identifiers for all properties contained in the epon_link_mpcp_discovered 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_mpcp_discovered_id
+{
+    BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID__BEGIN                              = 0,
+    BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO                           = 0,    /**< Link information. */
+    BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_mpcp_discovered_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_mpcp_reg_ack_timeout group. 
+ */
+typedef enum bcmolt_epon_link_mpcp_reg_ack_timeout_id
+{
+    BCMOLT_EPON_LINK_MPCP_REG_ACK_TIMEOUT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_mpcp_reg_ack_timeout_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_mpcp_report_timeout group. 
+ */
+typedef enum bcmolt_epon_link_mpcp_report_timeout_id
+{
+    BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID__BEGIN                          = 0,
+    BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS                    = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_mpcp_report_timeout_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_oam_keepalive_timeout group. 
+ */
+typedef enum bcmolt_epon_link_oam_keepalive_timeout_id
+{
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID__BEGIN                        = 0,
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS                  = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oam_keepalive_timeout_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_oam_keepalive_timer_start group. 
+ */
+typedef enum bcmolt_epon_link_oam_keepalive_timer_start_id
+{
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID__BEGIN                    = 0,
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD               = 0,    /**< Send period. */
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oam_keepalive_timer_start_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_oam_keepalive_timer_started group. 
+ */
+typedef enum bcmolt_epon_link_oam_keepalive_timer_started_id
+{
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STARTED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oam_keepalive_timer_started_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_oam_keepalive_timer_stop group. 
+ */
+typedef enum bcmolt_epon_link_oam_keepalive_timer_stop_id
+{
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOP_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oam_keepalive_timer_stop_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_oam_keepalive_timer_stopped group. 
+ */
+typedef enum bcmolt_epon_link_oam_keepalive_timer_stopped_id
+{
+    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOPPED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oam_keepalive_timer_stopped_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_preprovisioned_link_created group. 
+ */
+typedef enum bcmolt_epon_link_preprovisioned_link_created_id
+{
+    BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID__BEGIN                  = 0,
+    BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO               = 0,    /**< Link information. */
+    BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_preprovisioned_link_created_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_protection_switch_occurred group. 
+ */
+typedef enum bcmolt_epon_link_protection_switch_occurred_id
+{
+    BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID__BEGIN                   = 0,
+    BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS        = 0,    /**< Protection status. */
+    BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ           = 1,    /**< Range value in time quanta. */
+    BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_protection_switch_occurred_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_range_value_changed group. 
+ */
+typedef enum bcmolt_epon_link_range_value_changed_id
+{
+    BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID__BEGIN                          = 0,
+    BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ                  = 0,    /**< Range value in time quanta. */
+    BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_range_value_changed_id;
+
+/** Identifiers for all properties contained in the epon_link_rerange_failure 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_rerange_failure_id
+{
+    BCMOLT_EPON_LINK_RERANGE_FAILURE_ID__NUM_OF     /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_rerange_failure_id;
+
+/** Identifiers for all properties contained in the epon_link_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID__BEGIN                           = 0,
+    BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT                             = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the epon_link_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_epon_link_stat_alarm_raised_id
+{
+    BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID__BEGIN                            = 0,
+    BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT                              = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_link_stat_cfg group. 
+ */
+typedef enum bcmolt_epon_link_stat_cfg_id
+{
+    BCMOLT_EPON_LINK_STAT_CFG_ID__BEGIN                                     = 0,
+    BCMOLT_EPON_LINK_STAT_CFG_ID_CFG                                        = 0,    /**< Configuration. */
+    BCMOLT_EPON_LINK_STAT_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_link_stat group. 
+ */
+typedef enum bcmolt_epon_link_stat_id
+{
+    BCMOLT_EPON_LINK_STAT_ID__BEGIN                                         = 0,
+    BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES                                  = 0,    /**< Data Bytes RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES                                 = 1,    /**< Data Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64                                   = 2,    /**< 64 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127                               = 3,    /**< 65-127 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255                              = 4,    /**< 128-255 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511                              = 5,    /**< 256-511 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023                             = 6,    /**< 512-1023 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518                            = 7,    /**< 1024-1518 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047                            = 8,    /**< 1519-2047 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095                            = 9,    /**< 2048-4095 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216                            = 10,   /**< 4096-9216 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383                           = 11,   /**< 9217-16383 Byte Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES                                   = 12,   /**< OAM Bytes RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES                                  = 13,   /**< OAM Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES                                 = 14,   /**< MPCP Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES                            = 15,   /**< Broadcast Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES                              = 16,   /**< Unicast Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES                            = 17,   /**< Multicast Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES                               = 18,   /**< Report Frames RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR                                   = 19,   /**< FCS Error RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR                              = 20,   /**< Oversize Error RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR                                  = 21,   /**< Runt Error RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR                             = 22,   /**< Line Code Error RX. */
+    BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX                         = 23,   /**< Line Code Error Max RX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES                                  = 24,   /**< Data Bytes TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES                                 = 25,   /**< Data Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64                                   = 26,   /**< 64 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127                               = 27,   /**< 65-127 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255                              = 28,   /**< 128-255 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511                              = 29,   /**< 256-511 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023                             = 30,   /**< 512-1023 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518                            = 31,   /**< 1024-1518 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047                            = 32,   /**< 1519-2047 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095                            = 33,   /**< 2048-4095 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216                            = 34,   /**< 4096-9216 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383                           = 35,   /**< 9217-16383 Byte Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES                                   = 36,   /**< OAM Bytes TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES                                  = 37,   /**< OAM Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES                                 = 38,   /**< MPCP Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES                            = 39,   /**< Broadcast Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES                              = 40,   /**< Unicast Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES                            = 41,   /**< Multicast Frames TX. */
+    BCMOLT_EPON_LINK_STAT_ID_TX_GATES                                       = 42,   /**< Gates TX. */
+    BCMOLT_EPON_LINK_STAT_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_stat_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_static_registration_done group. 
+ */
+typedef enum bcmolt_epon_link_static_registration_done_id
+{
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_DONE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_static_registration_done_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_link_static_registration group. 
+ */
+typedef enum bcmolt_epon_link_static_registration_id
+{
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID__BEGIN                          = 0,
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ                 = 0,    /**< Laser-on time (TQ). */
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ                = 1,    /**< Laser-off time (TQ). */
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ                  = 2,    /**< Range value (TQ). */
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS                  = 3,    /**< Pending Grants. */
+    BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_static_registration_id;
+
+/** Identifiers for all properties contained in the epon_ni_add_link group. 
+ */
+typedef enum bcmolt_epon_ni_add_link_id
+{
+    BCMOLT_EPON_NI_ADD_LINK_ID__BEGIN                                       = 0,
+    BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS                                  = 0,    /**< MAC address. */
+    BCMOLT_EPON_NI_ADD_LINK_ID_RATE                                         = 1,    /**< Rate. */
+    BCMOLT_EPON_NI_ADD_LINK_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_add_link_id;
+
+/** Identifiers for all properties contained in the epon_ni_add_multicast_link 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_add_multicast_link_id
+{
+    BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID__BEGIN                             = 0,
+    BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS                        = 0,    /**< MAC address. */
+    BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE                               = 1,    /**< Rate. */
+    BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_add_multicast_link_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_add_protected_standby_link group. 
+ */
+typedef enum bcmolt_epon_ni_add_protected_standby_link_id
+{
+    BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID__BEGIN                     = 0,
+    BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS                = 0,    /**< MAC address. */
+    BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO          = 1,    /**< Working link info. */
+    BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_add_protected_standby_link_id;
+
+/** Identifiers for all properties contained in the epon_ni_auto_cfg group. 
+ */
+typedef enum bcmolt_epon_ni_auto_cfg_id
+{
+    BCMOLT_EPON_NI_AUTO_CFG_ID__BEGIN                                       = 0,
+    BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE                  = 0,    /**< 10G Epon Autonomous Rogue Scan failure detected. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE                   = 1,    /**< 1G Epon Autonomous Rogue Scan failure detected. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED                             = 2,    /**< LLID Quarantined. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED                       = 3,    /**< MPCP Timestamp Changed. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS                                   = 4,    /**< No Reports. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE                         = 5,    /**< ONU Upgrade Complete. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE                              = 6,    /**< Re-range failure. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE                          = 7,    /**< Rogue Scan is Complete. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED                   = 8,    /**< RSSI Measurement Completed. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED                       = 9,    /**< State Change Completed. */
+    BCMOLT_EPON_NI_AUTO_CFG_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_auto_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_auto_rogue_scan_10g_failure group. 
+ */
+typedef enum bcmolt_epon_ni_auto_rogue_scan_10g_failure_id
+{
+    BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_10G_FAILURE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_auto_rogue_scan_10g_failure_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_auto_rogue_scan_1g_failure group. 
+ */
+typedef enum bcmolt_epon_ni_auto_rogue_scan_1g_failure_id
+{
+    BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_1G_FAILURE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_auto_rogue_scan_1g_failure_id;
+
+/** Identifiers for all properties contained in the epon_ni_cfg group. 
+ */
+typedef enum bcmolt_epon_ni_cfg_id
+{
+    BCMOLT_EPON_NI_CFG_ID__BEGIN                                            = 0,
+    BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS                                       = 0,    /**< MAC Address. */
+    BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN                                        = 1,    /**< EPON NI enable state. */
+    BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR                             = 2,    /**< Registration Behavior. */
+    BCMOLT_EPON_NI_CFG_ID_MTU_1G                                            = 3,    /**< 1G MTU. */
+    BCMOLT_EPON_NI_CFG_ID_MTU_10G                                           = 4,    /**< 10G MTU. */
+    BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH                              = 5,    /**< Minimum Fiber Length. */
+    BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH                              = 6,    /**< Maximum Fiber Length. */
+    BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ                                  = 7,    /**< Grant Spacing (TQ). */
+    BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS                         = 8,    /**< EPON logical link options. */
+    BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS                          = 9,    /**< MPCP discovery period in milliseconds. */
+    BCMOLT_EPON_NI_CFG_ID_ALARM_STATE                                       = 10,   /**< Alarm State. */
+    BCMOLT_EPON_NI_CFG_ID_ALL_LINKS                                         = 11,   /**< All links. */
+    BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG                                    = 12,   /**< EPON NI encryption configuration. */
+    BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG                          = 13,   /**< Protection switching configuration. */
+    BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG                               = 14,   /**< Clock transport configuration. */
+    BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS                                  = 15,   /**< Drop-down Weights. */
+    BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE                       = 16,   /**< Approximate Solicited Usage. */
+    BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE                             = 17,   /**< Approximate TDM Usage. */
+    BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME                              = 18,   /**< No Reports soak time. */
+    BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER                              = 19,   /**< PON Aggregate Shaper. */
+    BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ                          = 20,   /**< Estimated PON Latency (TQ). */
+    BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS                                = 21,   /**< ONU upgrade params. */
+    BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN                          = 22,   /**< 10G Epon Autonomous Rogue Detection Enable. */
+    BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN                           = 23,   /**< 1G Epon Autonomous Rogue Detect Enable. */
+    BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD                   = 24,   /**< 10G Epon Auto Rogue Detect Threshold. */
+    BCMOLT_EPON_NI_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_cfg_id;
+
+/** Identifiers for all properties contained in the epon_ni_issue_rssi_grant 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_issue_rssi_grant_id
+{
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID__BEGIN                               = 0,
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK                         = 0,    /**< Granted Link. */
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH                        = 1,    /**< Rssi Trigger Width in ns. */
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY                        = 2,    /**< Rssi Trigger Delay in ns. */
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD                        = 3,    /**< Rssi Sampe Period in us. */
+    BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_issue_rssi_grant_id;
+
+/** Identifiers for all properties contained in the epon_ni_key group. 
+ */
+typedef enum bcmolt_epon_ni_key_id
+{
+    BCMOLT_EPON_NI_KEY_ID__BEGIN                                            = 0,
+    BCMOLT_EPON_NI_KEY_ID_EPON_NI                                           = 0,    /**< EPON NI number. */
+    BCMOLT_EPON_NI_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_key_id;
+
+/** Identifiers for all properties contained in the epon_ni_llid_quarantined 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_llid_quarantined_id
+{
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID__BEGIN                               = 0,
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID                                 = 0,    /**< LLID. */
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE                            = 1,    /**< Link Rate. */
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC                             = 2,    /**< Link MAC. */
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ                       = 3,    /**< Range value in time quanta. */
+    BCMOLT_EPON_NI_LLID_QUARANTINED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_llid_quarantined_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_mpcp_timestamp_changed group. 
+ */
+typedef enum bcmolt_epon_ni_mpcp_timestamp_changed_id
+{
+    BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID__BEGIN                         = 0,
+    BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP                 = 0,    /**< MPCP Timestamp. */
+    BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_mpcp_timestamp_changed_id;
+
+/** Identifiers for all properties contained in the epon_ni_no_reports group. 
+ */
+typedef enum bcmolt_epon_ni_no_reports_id
+{
+    BCMOLT_EPON_NI_NO_REPORTS_ID__BEGIN                                     = 0,
+    BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS                               = 0,    /**< Alarm Status. */
+    BCMOLT_EPON_NI_NO_REPORTS_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_no_reports_id;
+
+/** Identifiers for all properties contained in the epon_ni_onu_upgrade_complete 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_onu_upgrade_complete_id
+{
+    BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID__BEGIN                           = 0,
+    BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS                           = 0,    /**< Status. */
+    BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES          = 1,    /**< List of failed entities. */
+    BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_onu_upgrade_complete_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_protection_switching_apply_rerange_delta group. 
+ */
+typedef enum bcmolt_epon_ni_protection_switching_apply_rerange_delta_id
+{
+    BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID__BEGIN       = 0,
+    BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA= 0,    /**< Re-range delta. */
+    BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_protection_switching_apply_rerange_delta_id;
+
+/** Identifiers for all properties contained in the epon_ni_rerange_failure 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_rerange_failure_id
+{
+    BCMOLT_EPON_NI_RERANGE_FAILURE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_rerange_failure_id;
+
+/** Identifiers for all properties contained in the epon_ni_rogue_llid_scan 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_rogue_llid_scan_id
+{
+    BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID__BEGIN                                = 0,
+    BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE                                  = 0,    /**< Scan All. */
+    BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID                                  = 1,    /**< LLID. */
+    BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_rogue_llid_scan_id;
+
+/** Identifiers for all properties contained in the epon_ni_rogue_scan_complete 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_rogue_scan_complete_id
+{
+    BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID__BEGIN                            = 0,
+    BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS                 = 0,    /**< Status of completed scan. */
+    BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_rogue_scan_complete_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_rssi_measurement_completed group. 
+ */
+typedef enum bcmolt_epon_ni_rssi_measurement_completed_id
+{
+    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS                     = 0,    /**< status. */
+    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID                       = 1,    /**< LLID. */
+    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC                   = 2,    /**< Link MAC . */
+    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_rssi_measurement_completed_id;
+
+/** Identifiers for all properties contained in the epon_ni_set_epon_ni_en_state 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_set_epon_ni_en_state_id
+{
+    BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID__BEGIN                           = 0,
+    BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE                        = 0,    /**< New EPON NI enable state. */
+    BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_set_epon_ni_en_state_id;
+
+/** Identifiers for all properties contained in the epon_ni_start_onu_upgrade 
+ * group. 
+ */
+typedef enum bcmolt_epon_ni_start_onu_upgrade_id
+{
+    BCMOLT_EPON_NI_START_ONU_UPGRADE_ID__BEGIN                              = 0,
+    BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS                     = 0,    /**< List of ONU IDs. */
+    BCMOLT_EPON_NI_START_ONU_UPGRADE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_start_onu_upgrade_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_ni_state_change_completed group. 
+ */
+typedef enum bcmolt_epon_ni_state_change_completed_id
+{
+    BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID__BEGIN                         = 0,
+    BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE                      = 0,    /**< New EPON NI enable state. */
+    BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_state_change_completed_id;
+
+/** Identifiers for all properties contained in the epon_onu_10g_us_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_auto_cfg_id
+{
+    BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED                   = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED                    = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_10g_us_cfg group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_cfg_id
+{
+    BCMOLT_EPON_ONU_10G_US_CFG_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS                                 = 0,    /**< All Links. */
+    BCMOLT_EPON_ONU_10G_US_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_10g_us_key group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_key_id
+{
+    BCMOLT_EPON_ONU_10G_US_KEY_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI                                   = 0,    /**< EPON NI. */
+    BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID                                    = 1,    /**< ONU ID. */
+    BCMOLT_EPON_ONU_10G_US_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_onu_10g_us_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT                       = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_onu_10g_us_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_stat_alarm_raised_id
+{
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID__BEGIN                      = 0,
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT                        = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_onu_10g_us_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_stat_cfg_id
+{
+    BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG                                  = 0,    /**< Configuration. */
+    BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_10g_us_stat group. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_stat_id
+{
+    BCMOLT_EPON_ONU_10G_US_STAT_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL                     = 0,    /**< FEC Code Words Total. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS              = 1,    /**< FEC Code Words Decode Fails. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED                     = 2,    /**< FEC Zeroes Corrected. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED                       = 3,    /**< FEC Ones Corrected. */
+    BCMOLT_EPON_ONU_10G_US_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_stat_id;
+
+/** Identifiers for all properties contained in the epon_onu_1g_us_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_auto_cfg_id
+{
+    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID__BEGIN                                = 0,
+    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED                    = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED                     = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_1g_us_cfg group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_cfg_id
+{
+    BCMOLT_EPON_ONU_1G_US_CFG_ID__BEGIN                                     = 0,
+    BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS                                  = 0,    /**< All Links. */
+    BCMOLT_EPON_ONU_1G_US_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_1g_us_key group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_key_id
+{
+    BCMOLT_EPON_ONU_1G_US_KEY_ID__BEGIN                                     = 0,
+    BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI                                    = 0,    /**< EPON NI. */
+    BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID                                     = 1,    /**< ONU ID. */
+    BCMOLT_EPON_ONU_1G_US_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_onu_1g_us_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID__BEGIN                      = 0,
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT                        = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_onu_1g_us_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_stat_alarm_raised_id
+{
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID__BEGIN                       = 0,
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT                         = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_onu_1g_us_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_stat_cfg_id
+{
+    BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID__BEGIN                                = 0,
+    BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG                                   = 0,    /**< Configuration. */
+    BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_onu_1g_us_stat group. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_stat_id
+{
+    BCMOLT_EPON_ONU_1G_US_STAT_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES                               = 0,    /**< Good frames. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES                                = 1,    /**< Good bytes. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES                             = 2,    /**< Oversized frames. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES                       = 3,    /**< Non-FEC Good Frames. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES                        = 4,    /**< Non-FEC Good Bytes. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES                           = 5,    /**< FEC Good Frames. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES                            = 6,    /**< FEC Good Bytes. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS                       = 7,    /**< FEC Frames which exceeded 8 symbol errors. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS                          = 8,    /**< FEC Blocks with no errors. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS                        = 9,    /**< FEC Blocks with correctable errors. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS                      = 10,   /**< FEC Blocks with uncorrectable errors. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES                            = 11,   /**< FEC Corrected Bytes. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES                           = 12,   /**< FEC Corrected Zeroes. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES                             = 13,   /**< FEC Corrected Ones. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES                            = 14,   /**< Undersize frames. */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES                            = 15,   /**< Errored frame . */
+    BCMOLT_EPON_ONU_1G_US_STAT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_stat_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_ds_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_auto_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID__BEGIN                              = 0,
+    BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED                  = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED                   = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_ds_cfg group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_DS_CFG_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE                                = 0,    /**< Path FEC state. */
+    BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR                           = 1,    /**< PRBS Generator. */
+    BCMOLT_EPON_PATH_10G_DS_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_ds_key group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_key_id
+{
+    BCMOLT_EPON_PATH_10G_DS_KEY_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI                                  = 0,    /**< EPON NI (EPON Network Interface) number. */
+    BCMOLT_EPON_PATH_10G_DS_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_10g_ds_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID__BEGIN                    = 0,
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT                      = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_10g_ds_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_stat_alarm_raised_id
+{
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT                       = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_ds_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_stat_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID__BEGIN                              = 0,
+    BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG                                 = 0,    /**< Configuration. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_ds_stat group. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_stat_id
+{
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID__BEGIN                                  = 0,
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES                                   = 0,    /**< Bytes. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES                                  = 1,    /**< Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64                               = 2,    /**< 64 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127                           = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255                          = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511                          = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023                         = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518                        = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047                        = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095                        = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216                        = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383                       = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES                        = 12,   /**< Broadcast Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES                              = 13,   /**< Data Bytes. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES                        = 14,   /**< Mulitcast Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES                          = 15,   /**< Unicast Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES                               = 16,   /**< OAM Bytes. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES                              = 17,   /**< OAM Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES                             = 18,   /**< Gate Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES                             = 19,   /**< MPCP Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES                            = 20,   /**< Abort Frames. */
+    BCMOLT_EPON_PATH_10G_DS_STAT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_stat_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_us_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_auto_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID__BEGIN                              = 0,
+    BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED                  = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED                   = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_us_cfg group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_US_CFG_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE                                = 0,    /**< Path FEC state. */
+    BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ                             = 1,    /**< Sync Time (TQ). */
+    BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER                             = 2,    /**< PRBS Checker. */
+    BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS                              = 3,    /**< PRBS status. */
+    BCMOLT_EPON_PATH_10G_US_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_us_key group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_key_id
+{
+    BCMOLT_EPON_PATH_10G_US_KEY_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI                                  = 0,    /**< EPON NI. */
+    BCMOLT_EPON_PATH_10G_US_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_10g_us_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID__BEGIN                    = 0,
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT                      = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_10g_us_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_stat_alarm_raised_id
+{
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT                       = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_us_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_stat_cfg_id
+{
+    BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID__BEGIN                              = 0,
+    BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG                                 = 0,    /**< Configuration. */
+    BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_10g_us_stat group. 
+ */
+typedef enum bcmolt_epon_path_10g_us_stat_id
+{
+    BCMOLT_EPON_PATH_10G_US_STAT_ID__BEGIN                                  = 0,
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES                                   = 0,    /**< Bytes. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES                                  = 1,    /**< Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64                               = 2,    /**< 64 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127                           = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255                          = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511                          = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023                         = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518                        = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047                        = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095                        = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216                        = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383                       = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES                        = 12,   /**< Broadcast Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES                              = 13,   /**< Data Bytes. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES                        = 14,   /**< Mulitcast Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES                          = 15,   /**< Unicast Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES                             = 16,   /**< MPCP Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES                               = 17,   /**< OAM Bytes. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES                              = 18,   /**< OAM Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES                           = 19,   /**< Report Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES                            = 20,   /**< Abort Frames. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR                               = 21,   /**< FCS Error. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR                             = 22,   /**< CRC8 Error. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT                             = 23,   /**< Out of Slot. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR                          = 24,   /**< Oversize Error. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR                              = 25,   /**< Runt Error. */
+    BCMOLT_EPON_PATH_10G_US_STAT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_stat_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_ds_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_auto_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED                   = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED                    = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_ds_cfg group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE                         = 0,    /**< Default FEC state. */
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE                                = 1,    /**< Raman mode. */
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE                             = 2,    /**< Turbo 2G mode. */
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR                            = 3,    /**< PRBS Generator. */
+    BCMOLT_EPON_PATH_1G_DS_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_ds_key group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_key_id
+{
+    BCMOLT_EPON_PATH_1G_DS_KEY_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI                                   = 0,    /**< EPON NI. */
+    BCMOLT_EPON_PATH_1G_DS_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_1g_ds_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT                       = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_1g_ds_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_stat_alarm_raised_id
+{
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID__BEGIN                      = 0,
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT                        = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_ds_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_stat_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG                                  = 0,    /**< Configuration. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_ds_stat group. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_stat_id
+{
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES                                    = 0,    /**< Bytes. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES                                   = 1,    /**< Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64                                = 2,    /**< 64 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127                            = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255                           = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511                           = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023                          = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518                         = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047                         = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095                         = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216                         = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383                        = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES                         = 12,   /**< Broadcast Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES                               = 13,   /**< Data Bytes. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES                         = 14,   /**< Mulitcast Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES                           = 15,   /**< Unicast Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES                                = 16,   /**< OAM Bytes. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES                               = 17,   /**< OAM Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES                              = 18,   /**< Gate Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES                              = 19,   /**< MPCP Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES                             = 20,   /**< Abort Frames. */
+    BCMOLT_EPON_PATH_1G_DS_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_stat_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_us_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_auto_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED                   = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED                    = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_auto_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_us_cfg group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_US_CFG_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE                         = 0,    /**< Default FEC state. */
+    BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ                              = 1,    /**< Sync Time (TQ). */
+    BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER                              = 2,    /**< PRBS Checker. */
+    BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS                               = 3,    /**< PRBS status. */
+    BCMOLT_EPON_PATH_1G_US_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_us_key group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_key_id
+{
+    BCMOLT_EPON_PATH_1G_US_KEY_ID__BEGIN                                    = 0,
+    BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI                                   = 0,    /**< EPON NI. */
+    BCMOLT_EPON_PATH_1G_US_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_key_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_1g_us_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_stat_alarm_cleared_id
+{
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID__BEGIN                     = 0,
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT                       = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * epon_path_1g_us_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_stat_alarm_raised_id
+{
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID__BEGIN                      = 0,
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT                        = 0,    /**< Statistic ID. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_us_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_stat_cfg_id
+{
+    BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID__BEGIN                               = 0,
+    BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG                                  = 0,    /**< Configuration. */
+    BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_stat_cfg_id;
+
+/** Identifiers for all properties contained in the epon_path_1g_us_stat group. 
+ */
+typedef enum bcmolt_epon_path_1g_us_stat_id
+{
+    BCMOLT_EPON_PATH_1G_US_STAT_ID__BEGIN                                   = 0,
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES                                    = 0,    /**< Bytes. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES                                   = 1,    /**< Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64                                = 2,    /**< 64 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127                            = 3,    /**< 65-127 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255                           = 4,    /**< 128-255 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511                           = 5,    /**< 256-511 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023                          = 6,    /**< 512-1023 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518                         = 7,    /**< 1024-1518 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047                         = 8,    /**< 1519-2047 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095                         = 9,    /**< 2048_4095 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216                         = 10,   /**< 4096-9216 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383                        = 11,   /**< 9217-16383 Byte Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES                         = 12,   /**< Broadcast Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES                               = 13,   /**< Data Bytes. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES                         = 14,   /**< Mulitcast Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES                           = 15,   /**< Unicast Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES                              = 16,   /**< MPCP Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES                                = 17,   /**< OAM Bytes. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES                               = 18,   /**< OAM Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES                            = 19,   /**< Report Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES                             = 20,   /**< Abort Frames. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR                                = 21,   /**< FCS Error. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR                              = 22,   /**< CRC8 Error. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT                              = 23,   /**< Out of Slot. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR                           = 24,   /**< Oversize Error. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR                               = 25,   /**< Runt Error. */
+    BCMOLT_EPON_PATH_1G_US_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_stat_id;
+
+/** Identifiers for all properties contained in the epon_rp_cfg group. 
+ */
+typedef enum bcmolt_epon_rp_cfg_id
+{
+    BCMOLT_EPON_RP_CFG_ID__BEGIN                                            = 0,
+    BCMOLT_EPON_RP_CFG_ID_BASE_LLID                                         = 0,    /**< Base logical link identifier. */
+    BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN                                      = 1,    /**< MPCP discovery enable. */
+    BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ                              = 2,    /**< MPCP discovery grant length TQ. */
+    BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT                               = 3,    /**< MPCP report timeout mS. */
+    BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW                      = 4,    /**< Maximum MPCP registrations per discovery window. */
+    BCMOLT_EPON_RP_CFG_ID_MAX_LINKS                                         = 5,    /**< Maximum number of links. */
+    BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH                        = 6,    /**< Default Upstream Bandwidth. */
+    BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION                                = 7,    /**< Rate of Refraction. */
+    BCMOLT_EPON_RP_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_rp_cfg_id;
+
+/** Identifiers for all properties contained in the epon_rp_key group. 
+ */
+typedef enum bcmolt_epon_rp_key_id
+{
+    BCMOLT_EPON_RP_KEY_ID__BEGIN                                            = 0,
+    BCMOLT_EPON_RP_KEY_ID_EPON_NI                                           = 0,    /**< EPON NI number. */
+    BCMOLT_EPON_RP_KEY_ID_LINK_RATE                                         = 1,    /**< Link rate. */
+    BCMOLT_EPON_RP_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_rp_key_id;
+
+/** Identifiers for all properties contained in the gpio_cfg group. 
+ */
+typedef enum bcmolt_gpio_cfg_id
+{
+    BCMOLT_GPIO_CFG_ID__BEGIN                                               = 0,
+    BCMOLT_GPIO_CFG_ID_DIRECTION                                            = 0,    /**< Direction. */
+    BCMOLT_GPIO_CFG_ID_VALUE                                                = 1,    /**< Value. */
+    BCMOLT_GPIO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpio_cfg_id;
+
+/** Identifiers for all properties contained in the gpio_key group. 
+ */
+typedef enum bcmolt_gpio_key_id
+{
+    BCMOLT_GPIO_KEY_ID__BEGIN                                               = 0,
+    BCMOLT_GPIO_KEY_ID_RESERVED                                             = 0,    /**< Reserved. */
+    BCMOLT_GPIO_KEY_ID_GPIO_ID                                              = 1,    /**< GPIO ID. */
+    BCMOLT_GPIO_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpio_key_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_auto_cfg group. 
+ */
+typedef enum bcmolt_gpon_alloc_auto_cfg_id
+{
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID__BEGIN                                    = 0,
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED                   = 0,    /**< Configuration Completed. */
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED                 = 1,    /**< Get alloc ID statistics completed. */
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED                        = 2,    /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED                         = 3,    /**< Stat Alarm Raised. */
+    BCMOLT_GPON_ALLOC_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_auto_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_cfg group. 
+ */
+typedef enum bcmolt_gpon_alloc_cfg_id
+{
+    BCMOLT_GPON_ALLOC_CFG_ID__BEGIN                                         = 0,
+    BCMOLT_GPON_ALLOC_CFG_ID_STATE                                          = 0,    /**< Alloc ID state. */
+    BCMOLT_GPON_ALLOC_CFG_ID_SLA                                            = 1,    /**< Alloc ID SLA. */
+    BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID                                         = 2,    /**< onu_id. */
+    BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS                                  = 3,    /**< Enable statistics collection on the alloc id. */
+    BCMOLT_GPON_ALLOC_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_alloc_configuration_completed group. 
+ */
+typedef enum bcmolt_gpon_alloc_configuration_completed_id
+{
+    BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID__BEGIN                     = 0,
+    BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS                     = 0,    /**< Status. */
+    BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE                  = 1,    /**< new state. */
+    BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_configuration_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_alloc_get_alloc_stats_completed group. 
+ */
+typedef enum bcmolt_gpon_alloc_get_alloc_stats_completed_id
+{
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__BEGIN                   = 0,
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS                   = 0,    /**< status. */
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED         = 1,    /**< Average NSR used bytes. */
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED    = 2,    /**< Average NSR allocated bytes. */
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT        = 3,    /**< Average SR report. */
+    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_get_alloc_stats_completed_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_get_stats group. 
+ */
+typedef enum bcmolt_gpon_alloc_get_stats_id
+{
+    BCMOLT_GPON_ALLOC_GET_STATS_ID__BEGIN                                   = 0,
+    BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES                            = 0,    /**< Number of cycles. */
+    BCMOLT_GPON_ALLOC_GET_STATS_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_get_stats_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_key group. 
+ */
+typedef enum bcmolt_gpon_alloc_key_id
+{
+    BCMOLT_GPON_ALLOC_KEY_ID__BEGIN                                         = 0,
+    BCMOLT_GPON_ALLOC_KEY_ID_PON_NI                                         = 0,    /**< PON network interface. */
+    BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID                                       = 1,    /**< Alloc ID. */
+    BCMOLT_GPON_ALLOC_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_key_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_set_state group. 
+ */
+typedef enum bcmolt_gpon_alloc_set_state_id
+{
+    BCMOLT_GPON_ALLOC_SET_STATE_ID__BEGIN                                   = 0,
+    BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE                                    = 0,    /**< State. */
+    BCMOLT_GPON_ALLOC_SET_STATE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_set_state_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_alloc_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_gpon_alloc_stat_alarm_cleared_id
+{
+    BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID__BEGIN                          = 0,
+    BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT                            = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_gpon_alloc_stat_alarm_raised_id
+{
+    BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID__BEGIN                           = 0,
+    BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT                             = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_stat_cfg group. 
+ */
+typedef enum bcmolt_gpon_alloc_stat_cfg_id
+{
+    BCMOLT_GPON_ALLOC_STAT_CFG_ID__BEGIN                                    = 0,
+    BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG                                       = 0,    /**< Configuration. */
+    BCMOLT_GPON_ALLOC_STAT_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_stat_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_alloc_stat group. 
+ */
+typedef enum bcmolt_gpon_alloc_stat_id
+{
+    BCMOLT_GPON_ALLOC_STAT_ID__BEGIN                                        = 0,
+    BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES                                      = 0,    /**< Received Bytes. */
+    BCMOLT_GPON_ALLOC_STAT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_stat_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_gem_port_auto_cfg_id
+{
+    BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED                = 0,    /**< Configuration Completed. */
+    BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED                     = 1,    /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED                      = 2,    /**< Stat Alarm Raised. */
+    BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_auto_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_cfg group. 
+ */
+typedef enum bcmolt_gpon_gem_port_cfg_id
+{
+    BCMOLT_GPON_GEM_PORT_CFG_ID__BEGIN                                      = 0,
+    BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION                               = 0,    /**< Configuration. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID                                      = 1,    /**< ONU ID. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE                              = 2,    /**< gem port state. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE                  = 3,    /**< Downstream encryption mode. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE                  = 4,    /**< Upstream destination queue. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL                                     = 5,    /**< control. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG                           = 6,    /**< Debug flow config. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT                       = 7,    /**< MAC table entry limit. */
+    BCMOLT_GPON_GEM_PORT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_gem_port_configuration_completed group. 
+ */
+typedef enum bcmolt_gpon_gem_port_configuration_completed_id
+{
+    BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID__BEGIN                  = 0,
+    BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS                  = 0,    /**< status. */
+    BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE               = 1,    /**< new state. */
+    BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_configuration_completed_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_key group. 
+ */
+typedef enum bcmolt_gpon_gem_port_key_id
+{
+    BCMOLT_GPON_GEM_PORT_KEY_ID__BEGIN                                      = 0,
+    BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI                                      = 0,    /**< PON network interface. */
+    BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID                                 = 1,    /**< GEM Port ID. */
+    BCMOLT_GPON_GEM_PORT_KEY_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_key_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_set_state 
+ * group. 
+ */
+typedef enum bcmolt_gpon_gem_port_set_state_id
+{
+    BCMOLT_GPON_GEM_PORT_SET_STATE_ID__BEGIN                                = 0,
+    BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE                                 = 0,    /**< State. */
+    BCMOLT_GPON_GEM_PORT_SET_STATE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_set_state_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_gem_port_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_gpon_gem_port_stat_alarm_cleared_id
+{
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID__BEGIN                       = 0,
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT                         = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_gem_port_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_gpon_gem_port_stat_alarm_raised_id
+{
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID__BEGIN                        = 0,
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT                          = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_gem_port_stat_cfg_id
+{
+    BCMOLT_GPON_GEM_PORT_STAT_CFG_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG                                    = 0,    /**< Configuration. */
+    BCMOLT_GPON_GEM_PORT_STAT_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_stat_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_gem_port_stat group. 
+ */
+typedef enum bcmolt_gpon_gem_port_stat_id
+{
+    BCMOLT_GPON_GEM_PORT_STAT_ID__BEGIN                                     = 0,
+    BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS                                 = 0,    /**< Received GEM frames. */
+    BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES                                   = 1,    /**< Received bytes. */
+    BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS                                 = 2,    /**< Transmitted GEM frames. */
+    BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES                                   = 3,    /**< Transmitted bytes. */
+    BCMOLT_GPON_GEM_PORT_STAT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_stat_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_auto_cfg group. 
+ */
+typedef enum bcmolt_gpon_iwf_auto_cfg_id
+{
+    BCMOLT_GPON_IWF_AUTO_CFG_ID__BEGIN                                      = 0,
+    BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED                   = 0,    /**< Flush MAC Table Completed. */
+    BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED                    = 1,    /**< Scan MAC Table Completed. */
+    BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED                          = 2,    /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED                           = 3,    /**< Stat Alarm Raised. */
+    BCMOLT_GPON_IWF_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_auto_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_cfg group. 
+ */
+typedef enum bcmolt_gpon_iwf_cfg_id
+{
+    BCMOLT_GPON_IWF_CFG_ID__BEGIN                                           = 0,
+    BCMOLT_GPON_IWF_CFG_ID_IWF_MODE                                         = 0,    /**< IWF mode. */
+    BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW                                 = 1,    /**< US tpid per flow. */
+    BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID                              = 2,    /**< US otag direct tpid. */
+    BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT                              = 3,    /**< US otag direct pbit. */
+    BCMOLT_GPON_IWF_CFG_ID_DS_TPID                                          = 4,    /**< DS tpid. */
+    BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION                          = 5,    /**< MAC table configuration. */
+    BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION                         = 6,    /**< Debug flow configuration. */
+    BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT                                  = 7,    /**< MAC table entry count. */
+    BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START              = 8,    /**< Vlan, flow, Gem forbidden range start value. */
+    BCMOLT_GPON_IWF_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_ds_egress_flow_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_ds_egress_flow_cfg_id
+{
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID__BEGIN                            = 0,
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT                          = 0,    /**< GEM port. */
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL                      = 1,    /**< Pbit control. */
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_ds_egress_flow_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_ds_egress_flow_key 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_ds_egress_flow_key_id
+{
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID__BEGIN                            = 0,
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI                            = 0,    /**< PON network interface. */
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID                           = 1,    /**< Flow ID. */
+    BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_ds_egress_flow_key_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_ds_ingress_flow_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_ds_ingress_flow_cfg_id
+{
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID__BEGIN                           = 0,
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD                   = 0,    /**< Mapping method. */
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG                      = 1,    /**< Mapping tag. */
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION                      = 2,    /**< VLAN action. */
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_ds_ingress_flow_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_ds_ingress_flow_key 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_ds_ingress_flow_key_id
+{
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID__BEGIN                           = 0,
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI                           = 0,    /**< PON network interface. */
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID                          = 1,    /**< vlan ID. */
+    BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID__NUM_OF          /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_ds_ingress_flow_key_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_iwf_flush_mac_table_completed group. 
+ */
+typedef enum bcmolt_gpon_iwf_flush_mac_table_completed_id
+{
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_flush_mac_table_completed_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_flush_mac_table 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_flush_mac_table_id
+{
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID__BEGIN                               = 0,
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL                              = 0,    /**< control. */
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID                                  = 1,    /**< VID. */
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID                              = 2,    /**< FLOW ID. */
+    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_flush_mac_table_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_key group. 
+ */
+typedef enum bcmolt_gpon_iwf_key_id
+{
+    BCMOLT_GPON_IWF_KEY_ID__BEGIN                                           = 0,
+    BCMOLT_GPON_IWF_KEY_ID_PON_NI                                           = 0,    /**< PON network interface. */
+    BCMOLT_GPON_IWF_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_key_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_auto_cfg_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID__BEGIN                            = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED                          = 0,    /**< MAC Aged. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED                       = 1,    /**< MAC Dropped. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE                          = 2,    /**< MAC Move. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC                           = 3,    /**< New MAC. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_auto_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_cfg 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_cfg_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID                                = 0,    /**< Flow ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT                                   = 1,    /**< static. */
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID                            = 2,    /**< GEM Port ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID                                 = 3,    /**< ONU ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_key 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_key_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI                                 = 0,    /**< PON network interface. */
+    BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS                            = 1,    /**< MAC address. */
+    BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN                                   = 2,    /**< VLAN. */
+    BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_key_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_mac_aged 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_mac_aged_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_AGED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_mac_aged_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_iwf_mac_table_mac_dropped group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_mac_dropped_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID__BEGIN                         = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID                        = 0,    /**< flow ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_mac_dropped_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_mac_move 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_mac_move_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID__BEGIN                            = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID                       = 0,    /**< old flow ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID                       = 1,    /**< new flow id. */
+    BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_mac_move_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_mac_table_new_mac 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_new_mac_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID__BEGIN                             = 0,
+    BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID                            = 0,    /**< flow ID. */
+    BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_new_mac_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_iwf_scan_mac_table_completed group. 
+ */
+typedef enum bcmolt_gpon_iwf_scan_mac_table_completed_id
+{
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID__BEGIN                      = 0,
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS                 = 0,    /**< MAC Address. */
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES                     = 1,    /**< Entries. */
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_scan_mac_table_completed_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_scan_mac_table 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_scan_mac_table_id
+{
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID__BEGIN                                = 0,
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS                           = 0,    /**< MAC Address. */
+    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_scan_mac_table_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_stat_alarm_cleared_id
+{
+    BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID__BEGIN                            = 0,
+    BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT                              = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_gpon_iwf_stat_alarm_raised_id
+{
+    BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID__BEGIN                             = 0,
+    BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT                               = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_stat_cfg group. 
+ */
+typedef enum bcmolt_gpon_iwf_stat_cfg_id
+{
+    BCMOLT_GPON_IWF_STAT_CFG_ID__BEGIN                                      = 0,
+    BCMOLT_GPON_IWF_STAT_CFG_ID_CFG                                         = 0,    /**< Configuration. */
+    BCMOLT_GPON_IWF_STAT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_stat_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_stat group. 
+ */
+typedef enum bcmolt_gpon_iwf_stat_id
+{
+    BCMOLT_GPON_IWF_STAT_ID__BEGIN                                          = 0,
+    BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT                                    = 0,    /**< DS hit event. */
+    BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT                                   = 1,    /**< DS miss event. */
+    BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT                       = 2,    /**< DS drop due to miss event. */
+    BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT                        = 3,    /**< DS drop due to hit event. */
+    BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM                         = 4,    /**< DS drop to disabled GEM. */
+    BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED                              = 5,    /**< New MAC discovered. */
+    BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT                                      = 6,    /**< Move event. */
+    BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL                   = 7,    /**< New MAC drop due to fifo full. */
+    BCMOLT_GPON_IWF_STAT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_stat_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_us_flow_cfg group. 
+ */
+typedef enum bcmolt_gpon_iwf_us_flow_cfg_id
+{
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID__BEGIN                                   = 0,
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID                                  = 0,    /**< Flow ID. */
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING                             = 1,    /**< MAC learning. */
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION                              = 2,    /**< VLAN action. */
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG                                 = 3,    /**< Vlan tag. */
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX                               = 4,    /**< TPID index. */
+    BCMOLT_GPON_IWF_US_FLOW_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_us_flow_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_iwf_us_flow_key group. 
+ */
+typedef enum bcmolt_gpon_iwf_us_flow_key_id
+{
+    BCMOLT_GPON_IWF_US_FLOW_KEY_ID__BEGIN                                   = 0,
+    BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI                                   = 0,    /**< PON network interface. */
+    BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID                              = 1,    /**< GEM Port  ID. */
+    BCMOLT_GPON_IWF_US_FLOW_KEY_ID__NUM_OF                  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_us_flow_key_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_activate_all_onus_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_activate_all_onus_completed_id
+{
+    BCMOLT_GPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_activate_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the gpon_ni_auto_cfg group. 
+ */
+typedef enum bcmolt_gpon_ni_auto_cfg_id
+{
+    BCMOLT_GPON_NI_AUTO_CFG_ID__BEGIN                                       = 0,
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED                  = 0,    /**< activate all onus completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE                          = 1,    /**< CPU Packets Failure. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED                = 2,    /**< deactivate all onus completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED                   = 3,    /**< disable all onus completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED                    = 4,    /**< enable all onus completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_LOS                                          = 5,    /**< LOS. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED                               = 6,    /**< ONU Discovered. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE                         = 7,    /**< ONU Upgrade Complete. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED             = 8,    /**< Protection Switching ONUs Ranged. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED    = 9,    /**< Protection Switching Switchover Completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME          = 10,   /**< Protection Switching Traffic Resume. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED                    = 11,   /**< Rogue detection completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START            = 12,   /**< Rogue ONU special map cycle start. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START        = 13,   /**< Serial Number Acquisition Cycle Start. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED       = 14,   /**< Standby PON Monitoring Cycle Completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED                           = 15,   /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED                            = 16,   /**< Stat Alarm Raised. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED                       = 17,   /**< State Change Completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED                        = 18,   /**< TOD request completed. */
+    BCMOLT_GPON_NI_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_auto_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_broadcast_ploam_packet group. 
+ */
+typedef enum bcmolt_gpon_ni_broadcast_ploam_packet_id
+{
+    BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID__BEGIN                         = 0,
+    BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM                          = 0,    /**< ploam. */
+    BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_broadcast_ploam_packet_id;
+
+/** Identifiers for all properties contained in the gpon_ni_cfg group. 
+ */
+typedef enum bcmolt_gpon_ni_cfg_id
+{
+    BCMOLT_GPON_NI_CFG_ID__BEGIN                                            = 0,
+    BCMOLT_GPON_NI_CFG_ID_PON_STATUS                                        = 0,    /**< PON status. */
+    BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH                               = 1,    /**< Available Bandwidth. */
+    BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS                             = 2,    /**< number of active onus. */
+    BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS                     = 3,    /**< number of active standby onus. */
+    BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS                                       = 4,    /**< PRBS status. */
+    BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE                                      = 5,    /**< Pon distance. */
+    BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE                               = 6,    /**< Ranging window size. */
+    BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY                    = 7,    /**< Pre-assigned Equalization Delay [bits]. */
+    BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER                                 = 8,    /**< EqD measurement cycles number. */
+    BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL                                       = 9,    /**< Power level. */
+    BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE                                       = 10,   /**< DS FEC mode. */
+    BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL                                     = 11,   /**< Drift control. */
+    BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL                         = 12,   /**< DS BER reporting interval in ms. */
+    BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD                               = 13,   /**< LOS alarm threshold. */
+    BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE                                 = 14,   /**< LOS initial value. */
+    BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS                             = 15,   /**< ONU alarms thresholds. */
+    BCMOLT_GPON_NI_CFG_ID_BER_MONITOR                                       = 16,   /**< BER monitoring params. */
+    BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT                                 = 17,   /**< Ploam ACK timeout. */
+    BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION                                    = 18,   /**< ONU activation. */
+    BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION                                    = 19,   /**< SN Acquisition . */
+    BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE                                      = 20,   /**< Key exchange. */
+    BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING                              = 21,   /**< Protection switching. */
+    BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE                         = 22,   /**< CBR RT Allocation profile. */
+    BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE                        = 23,   /**< CBR NRT Allocation Profile. */
+    BCMOLT_GPON_NI_CFG_ID_DBA                                               = 24,   /**< DBA. */
+    BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT                                  = 25,   /**< Power Management. */
+    BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS                       = 26,   /**< Rogue ONU detection process. */
+    BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING                   = 27,   /**< Periodic Standby PON monitoring. */
+    BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER                                      = 28,   /**< PRBS Checker. */
+    BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR                                    = 29,   /**< PRBS Generator. */
+    BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID                                 = 30,   /**< Minimum Data Alloc ID. */
+    BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION                        = 31,   /**< Automatic ONU deactivation. */
+    BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT                                = 32,   /**< US bandwidth Limit. */
+    BCMOLT_GPON_NI_CFG_ID_ALL_ONUS                                          = 33,   /**< all ONUs. */
+    BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS                               = 34,   /**< all multicast GEM ports. */
+    BCMOLT_GPON_NI_CFG_ID_DEBUG                                             = 35,   /**< PON NI debug parameters. */
+    BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS                                = 36,   /**< ONU upgrade params. */
+    BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT             = 37,   /**< protection switching type c wait before deactivation timeout. */
+    BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL                          = 38,   /**< bip32 indication control. */
+    BCMOLT_GPON_NI_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_ni_cpu_packets_failure 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_cpu_packets_failure_id
+{
+    BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID__BEGIN                            = 0,
+    BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR                             = 0,    /**< Error. */
+    BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID                       = 1,    /**< GEM Port ID. */
+    BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_cpu_packets_failure_id;
+
+/** Identifiers for all properties contained in the gpon_ni_cpu_packets group. 
+ */
+typedef enum bcmolt_gpon_ni_cpu_packets_id
+{
+    BCMOLT_GPON_NI_CPU_PACKETS_ID__BEGIN                                    = 0,
+    BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE                               = 0,    /**< packet type. */
+    BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC                                  = 1,    /**< calc crc. */
+    BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST                             = 2,    /**< gem port list. */
+    BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER                                    = 3,    /**< buffer. */
+    BCMOLT_GPON_NI_CPU_PACKETS_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_cpu_packets_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_deactivate_all_onus_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_deactivate_all_onus_completed_id
+{
+    BCMOLT_GPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_deactivate_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_disable_all_onus_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_disable_all_onus_completed_id
+{
+    BCMOLT_GPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_disable_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_disable_serial_number group. 
+ */
+typedef enum bcmolt_gpon_ni_disable_serial_number_id
+{
+    BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID__BEGIN                          = 0,
+    BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL                         = 0,    /**< control. */
+    BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER                   = 1,    /**< serial number. */
+    BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF     /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_disable_serial_number_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_enable_all_onus_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_enable_all_onus_completed_id
+{
+    BCMOLT_GPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_enable_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the gpon_ni_key group. 
+ */
+typedef enum bcmolt_gpon_ni_key_id
+{
+    BCMOLT_GPON_NI_KEY_ID__BEGIN                                            = 0,
+    BCMOLT_GPON_NI_KEY_ID_PON_NI                                            = 0,    /**< PON network interface. */
+    BCMOLT_GPON_NI_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_key_id;
+
+/** Identifiers for all properties contained in the gpon_ni_los group. 
+ */
+typedef enum bcmolt_gpon_ni_los_id
+{
+    BCMOLT_GPON_NI_LOS_ID__BEGIN                                            = 0,
+    BCMOLT_GPON_NI_LOS_ID_STATUS                                            = 0,    /**< status. */
+    BCMOLT_GPON_NI_LOS_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_los_id;
+
+/** Identifiers for all properties contained in the gpon_ni_onu_discovered 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_onu_discovered_id
+{
+    BCMOLT_GPON_NI_ONU_DISCOVERED_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER                          = 0,    /**< serial number. */
+    BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME                           = 1,    /**< ranging time. */
+    BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID                                 = 2,    /**< onu_id. */
+    BCMOLT_GPON_NI_ONU_DISCOVERED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_onu_discovered_id;
+
+/** Identifiers for all properties contained in the gpon_ni_onu_upgrade_complete 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_onu_upgrade_complete_id
+{
+    BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID__BEGIN                           = 0,
+    BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS                           = 0,    /**< Status. */
+    BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES          = 1,    /**< List of failed entities. */
+    BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_onu_upgrade_complete_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_protection_switching_onus_ranged group. 
+ */
+typedef enum bcmolt_gpon_ni_protection_switching_onus_ranged_id
+{
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__BEGIN               = 0,
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS                 = 0,            /**< ONUs. */
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF                              /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_protection_switching_onus_ranged_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_protection_switching_switchover_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_protection_switching_switchover_completed_id
+{
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__BEGIN      = 0,
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT      = 0,            /**< Result. */
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF                     /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_protection_switching_switchover_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_protection_switching_traffic_resume group. 
+ */
+typedef enum bcmolt_gpon_ni_protection_switching_traffic_resume_id
+{
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__BEGIN            = 0,
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT            = 0,            /**< Result. */
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF                           /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_protection_switching_traffic_resume_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_protection_switching_type_c_set_multiple_onu_state group. 
+ */
+typedef enum bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id
+{
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID__BEGIN     = 0,
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE  = 0,    /**< onu state. */
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST   = 1,    /**< onu list. */
+    BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID__NUM_OF            /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id;
+
+/** Identifiers for all properties contained in the gpon_ni_reset group. 
+ */
+typedef enum bcmolt_gpon_ni_reset_id
+{
+    BCMOLT_GPON_NI_RESET_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_reset_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_rogue_detection_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_rogue_detection_completed_id
+{
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID__BEGIN                              = 0,
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE                         = 0,    /**< Window type. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS                  = 1,    /**< Measurement status. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID                            = 2,    /**< Alloc ID. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID                              = 3,    /**< ONU ID. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION                      = 4,    /**< Is delineation. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED                               = 5,    /**< Is ED. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA                             = 6,    /**< Received data. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID               = 7,    /**< ploam_received_onu_id. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR            = 8,    /**< ploam_received_crc_error. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_rogue_detection_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_rogue_detection_window group. 
+ */
+typedef enum bcmolt_gpon_ni_rogue_detection_window_id
+{
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE                            = 0,    /**< Window type. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID                               = 1,    /**< Alloc ID. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID                                 = 2,    /**< ONU ID. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW                  = 3,    /**< Second ranging window. */
+    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_rogue_detection_window_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_rogue_onu_special_map_cycle_start group. 
+ */
+typedef enum bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id
+{
+    BCMOLT_GPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF     /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_serial_number_acquisition_cycle_start group. 
+ */
+typedef enum bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id
+{
+    BCMOLT_GPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id;
+
+/** Identifiers for all properties contained in the gpon_ni_set_onu_state group. 
+ */
+typedef enum bcmolt_gpon_ni_set_onu_state_id
+{
+    BCMOLT_GPON_NI_SET_ONU_STATE_ID__BEGIN                                          = 0,
+    BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE                                       = 0,    /**< ONU state. */
+    BCMOLT_GPON_NI_SET_ONU_STATE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_set_onu_state_id;
+
+/** Identifiers for all properties contained in the gpon_ni_set_pon_state group. 
+ */
+typedef enum bcmolt_gpon_ni_set_pon_state_id
+{
+    BCMOLT_GPON_NI_SET_PON_STATE_ID__BEGIN                                          = 0,
+    BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE                                       = 0,    /**< PON state. */
+    BCMOLT_GPON_NI_SET_PON_STATE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_set_pon_state_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_single_request_standby_pon_monitoring group. 
+ */
+typedef enum bcmolt_gpon_ni_single_request_standby_pon_monitoring_id
+{
+    BCMOLT_GPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_single_request_standby_pon_monitoring_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_standby_pon_monitoring_cycle_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id
+{
+    BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__BEGIN                         = 0,
+    BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER   = 0,    /**< number of detected delimiter. */
+    BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL           = 1,    /**< energy detect signal. */
+    BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id;
+
+/** Identifiers for all properties contained in the gpon_ni_start_onu_upgrade 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_start_onu_upgrade_id
+{
+    BCMOLT_GPON_NI_START_ONU_UPGRADE_ID__BEGIN                                              = 0,
+    BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS                                     = 0,    /**< List of ONU IDs. */
+    BCMOLT_GPON_NI_START_ONU_UPGRADE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_start_onu_upgrade_id;
+
+/** Identifiers for all properties contained in the gpon_ni_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_stat_alarm_cleared_id
+{
+    BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID__BEGIN                                             = 0,
+    BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT                                               = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the gpon_ni_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_gpon_ni_stat_alarm_raised_id
+{
+    BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID__BEGIN                                              = 0,
+    BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT                                                = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the gpon_ni_stat_cfg group. 
+ */
+typedef enum bcmolt_gpon_ni_stat_cfg_id
+{
+    BCMOLT_GPON_NI_STAT_CFG_ID__BEGIN                                                       = 0,
+    BCMOLT_GPON_NI_STAT_CFG_ID_CFG                                                          = 0,    /**< Configuration. */
+    BCMOLT_GPON_NI_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_stat_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_ni_stat group. 
+ */
+typedef enum bcmolt_gpon_ni_stat_id
+{
+    BCMOLT_GPON_NI_STAT_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS                                                    = 0,    /**< Received FEC codewords. */
+    BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED                                        = 1,    /**< Received uncorrected FEC codewords. */
+    BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES                                                       = 2,    /**< Received bytes protected by bip8. */
+    BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS                                                      = 3,    /**< Received bip8 errors. */
+    BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS                                                   = 4,    /**< Received GEM frames. */
+    BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED                                                   = 5,    /**< Received dropped GEM ID packets. */
+    BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE                                                      = 6,    /**< Received idle GEM frames. */
+    BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED                                                 = 7,    /**< Received corrected GEM frames. */
+    BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL                                                   = 8,    /**< Received illegal GEM frames. */
+    BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID                                             = 9,    /**< Received valid allocations. */
+    BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID                                           = 10,   /**< Received invalid allocations. */
+    BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED                                          = 11,   /**< Received disabled allocations. */
+    BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS                                                        = 12,   /**< Received Ploams. */
+    BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE                                               = 13,   /**< Received non idle Ploams. */
+    BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR                                                  = 14,   /**< Received error Ploams. */
+    BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED                                                = 15,   /**< Received dropped Ploams. */
+    BCMOLT_GPON_NI_STAT_ID_RX_CPU                                                           = 16,   /**< Received CPU packets. */
+    BCMOLT_GPON_NI_STAT_ID_RX_OMCI                                                          = 17,   /**< Received OMCI packets. */
+    BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR                                        = 18,   /**< Received OMCI packets with CRC errors. */
+    BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT                                             = 19,   /**< Received packets dropped due to length too short. */
+    BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG                                              = 20,   /**< Received packet dropped due to length too long. */
+    BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS                                                    = 21,   /**< Received packet dropped due to crc error. */
+    BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS                                                    = 22,   /**< Received packet dropped due to key error. */
+    BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS                                              = 23,   /**< Received packet dropped due to fragmentation error. */
+    BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED                                               = 24,   /**< Global dropped packets. */
+    BCMOLT_GPON_NI_STAT_ID_TX_GEM                                                           = 25,   /**< Transmitted GEM frames. */
+    BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS                                                        = 26,   /**< Transmitted Ploams. */
+    BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS                                                 = 27,   /**< Transmitted GEM fragments. */
+    BCMOLT_GPON_NI_STAT_ID_TX_CPU                                                           = 28,   /**< Transmitted CPU packets. */
+    BCMOLT_GPON_NI_STAT_ID_TX_OMCI                                                          = 29,   /**< Transmitted OMCI packets. */
+    BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED                                      = 30,   /**< Transmit packets dropped due to illegal length. */
+    BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH                                        = 31,   /**< Transmitted packet dropped due to illegal length. */
+    BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS                                             = 32,   /**< Dropped because of TPID miss. */
+    BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS                                              = 33,   /**< Dropped because of VID miss. */
+    BCMOLT_GPON_NI_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_stat_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_state_change_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_state_change_completed_id
+{
+    BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID__BEGIN                                         = 0,
+    BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT                                         = 0,    /**< Result. */
+    BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE                                 = 1,    /**< Previous state. */
+    BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE                                      = 2,    /**< New state. */
+    BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_state_change_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_ni_tod_request_completed group. 
+ */
+typedef enum bcmolt_gpon_ni_tod_request_completed_id
+{
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID__BEGIN                                          = 0,
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING                                      = 0,    /**< tod_string. */
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC                                             = 1,    /**< sfc. */
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC                                  = 2,    /**< rtc_offset_sec. */
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC                                 = 3,    /**< rtc_offset_nsec. */
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS                                          = 4,    /**< status. */
+    BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_tod_request_completed_id;
+
+/** Identifiers for all properties contained in the gpon_ni_tod_request group. 
+ */
+typedef enum bcmolt_gpon_ni_tod_request_id
+{
+    BCMOLT_GPON_NI_TOD_REQUEST_ID__NUM_OF           /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_tod_request_id;
+
+/** Identifiers for all properties contained in the gpon_onu_auto_cfg group. 
+ */
+typedef enum bcmolt_gpon_onu_auto_cfg_id
+{
+    BCMOLT_GPON_ONU_AUTO_CFG_ID__BEGIN                                                      = 0,
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED                        = 0,    /**< BER Interval Configuration Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI                                                         = 1,    /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI                                                         = 2,    /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI                                                        = 3,    /**< Drift of Window of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR                                                         = 4,    /**< ERR. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT                                         = 5,    /**< Invalid DBRu Report. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED                                      = 6,    /**< Key Exchange Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED                                  = 7,    /**< Key Exchange Cycle Skipped. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED                               = 8,    /**< Key Exchange Decrypt Required. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH                                   = 9,    /**< Key Exchange Key Mismatch. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT                            = 10,   /**< Key Exchange Key Request Timeout. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX                            = 11,   /**< Key Exchange Unconsecutive Index. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI                                                        = 12,   /**< LOAi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI                                                        = 13,   /**< LOki. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI                                                        = 14,   /**< MEMi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED                        = 15,   /**< OMCI PORT ID Configuration Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED                                    = 16,   /**< ONU Activation Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED                            = 17,   /**< onu activation standby completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM                                                   = 18,   /**< ONU Alarm. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED                                  = 19,   /**< ONU Deactivation Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED                                       = 20,   /**< ONU Disable Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED                                        = 21,   /**< ONU Enable Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION                                          = 22,   /**< Optical Reflection. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED                           = 23,   /**< Password Authentication Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE                                                         = 24,   /**< PEE. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT                                              = 25,   /**< Possible Drift. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE                               = 26,   /**< Power Management State Change. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_PST                                                         = 27,   /**< PST. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED                                           = 28,   /**< Ranging Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_REI                                                         = 29,   /**< REI. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED                                  = 30,   /**< RSSI Measurement Completed. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI                                                         = 31,   /**< Signal Degraded of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI                                                         = 32,   /**< Signal Fail of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED                                          = 33,   /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED                                           = 34,   /**< Stat Alarm Raised. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI                                                        = 35,   /**< SUFi. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI                                                        = 36,   /**< Transmission Interference Warning. */
+    BCMOLT_GPON_ONU_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_auto_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_ber_interval_configuration_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_ber_interval_configuration_completed_id
+{
+    BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID__BEGIN                          = 0,
+    BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL                    = 0,    /**< BER interval in ms. */
+    BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT                          = 1,    /**< Result. */
+    BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_ber_interval_configuration_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_cfg group. 
+ */
+typedef enum bcmolt_gpon_onu_cfg_id
+{
+    BCMOLT_GPON_ONU_CFG_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_CFG_ID_ONU_STATE                                                        = 0,    /**< onu state. */
+    BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER                                                    = 1,    /**< Serial number. */
+    BCMOLT_GPON_ONU_CFG_ID_PASSWORD                                                         = 2,    /**< password. */
+    BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING                                           = 3,    /**< auto password learning. */
+    BCMOLT_GPON_ONU_CFG_ID_US_FEC                                                           = 4,    /**< US FEC. */
+    BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID                                                     = 5,    /**< OMCI port ID. */
+    BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL                                        = 6,    /**< DS BER reporting interval in ms. */
+    BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY                                               = 7,    /**< AES encryption key. */
+    BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE                                                      = 8,    /**< alarm state. */
+    BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME                                                     = 9,    /**< ranging time. */
+    BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY                                         = 10,   /**< Disabled after Discovery. */
+    BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON                                              = 11,   /**< deactivation reason. */
+    BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS                                                    = 12,   /**< all GEM ports. */
+    BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS                                                       = 13,   /**< all allocs. */
+    BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C                                                    = 14,   /**< onu protection switching type c. */
+    BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME                                              = 15,   /**< Extended Guard Time. */
+    BCMOLT_GPON_ONU_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_onu_change_power_level 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_change_power_level_id
+{
+    BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID__BEGIN                                            = 0,
+    BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION                                = 0,    /**< power level action. */
+    BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_change_power_level_id;
+
+/** Identifiers for all properties contained in the gpon_onu_cpu_packet group. 
+ */
+typedef enum bcmolt_gpon_onu_cpu_packet_id
+{
+    BCMOLT_GPON_ONU_CPU_PACKET_ID__BEGIN                                                    = 0,
+    BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID                                                   = 0,    /**< port_id. */
+    BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK                                                    = 1,    /**< crc_ok. */
+    BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE                                               = 2,    /**< packet_size. */
+    BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER                                                    = 3,    /**< buffer. */
+    BCMOLT_GPON_ONU_CPU_PACKET_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_cpu_packet_id;
+
+/** Identifiers for all properties contained in the gpon_onu_cpu_packets group. 
+ */
+typedef enum bcmolt_gpon_onu_cpu_packets_id
+{
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID__BEGIN                                                   = 0,
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE                                              = 0,    /**< packet type. */
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC                                                 = 1,    /**< calc crc. */
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS                                        = 2,    /**< number of packets. */
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE                                              = 3,    /**< Single packet size. */
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER                                                   = 4,    /**< buffer. */
+    BCMOLT_GPON_ONU_CPU_PACKETS_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_cpu_packets_id;
+
+/** Identifiers for all properties contained in the gpon_onu_dfi group. 
+ */
+typedef enum bcmolt_gpon_onu_dfi_id
+{
+    BCMOLT_GPON_ONU_DFI_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS                                                     = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_DFI_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_dfi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_dgi group. 
+ */
+typedef enum bcmolt_gpon_onu_dgi_id
+{
+    BCMOLT_GPON_ONU_DGI_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS                                                     = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_DGI_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_dgi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_dowi group. 
+ */
+typedef enum bcmolt_gpon_onu_dowi_id
+{
+    BCMOLT_GPON_ONU_DOWI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS                                                    = 0,    /**< Alarm status. */
+    BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE                                                     = 1,    /**< Drift value. */
+    BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD                                                         = 2,    /**< New EQD. */
+    BCMOLT_GPON_ONU_DOWI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_dowi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_err group. 
+ */
+typedef enum bcmolt_gpon_onu_err_id
+{
+    BCMOLT_GPON_ONU_ERR_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS                                                      = 0,    /**< BIP8 errors. */
+    BCMOLT_GPON_ONU_ERR_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_err_id;
+
+/** Identifiers for all properties contained in the gpon_onu_invalid_dbru_report 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_invalid_dbru_report_id
+{
+    BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID__BEGIN                                           = 0,
+    BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID                                         = 0,    /**< Alloc-ID. */
+    BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_invalid_dbru_report_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_completed_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID__BEGIN                                        = 0,
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY                                       = 0,    /**< new key. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_cycle_skipped group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_cycle_skipped_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_cycle_skipped_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_decrypt_required group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_decrypt_required_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY                                = 0,    /**< new key. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_decrypt_required_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_key_mismatch group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_key_mismatch_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__BEGIN                                     = 0,
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY                               = 0,    /**< expected key. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY                               = 1,    /**< received key. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_key_mismatch_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_key_request_timeout group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_key_request_timeout_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_key_request_timeout_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_key_exchange_unconsecutive_index group. 
+ */
+typedef enum bcmolt_gpon_onu_key_exchange_unconsecutive_index_id
+{
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID__BEGIN                              = 0,
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX                      = 0,    /**< expected index. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX                        = 1,    /**< actual index. */
+    BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_exchange_unconsecutive_index_id;
+
+/** Identifiers for all properties contained in the gpon_onu_key group. 
+ */
+typedef enum bcmolt_gpon_onu_key_id
+{
+    BCMOLT_GPON_ONU_KEY_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_KEY_ID_PON_NI                                                           = 0,    /**< PON network interface. */
+    BCMOLT_GPON_ONU_KEY_ID_ONU_ID                                                           = 1,    /**< ONU ID. */
+    BCMOLT_GPON_ONU_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_key_id;
+
+/** Identifiers for all properties contained in the gpon_onu_loai group. 
+ */
+typedef enum bcmolt_gpon_onu_loai_id
+{
+    BCMOLT_GPON_ONU_LOAI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_LOAI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_loai_id;
+
+/** Identifiers for all properties contained in the gpon_onu_loki group. 
+ */
+typedef enum bcmolt_gpon_onu_loki_id
+{
+    BCMOLT_GPON_ONU_LOKI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_LOKI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_loki_id;
+
+/** Identifiers for all properties contained in the gpon_onu_memi group. 
+ */
+typedef enum bcmolt_gpon_onu_memi_id
+{
+    BCMOLT_GPON_ONU_MEMI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER                                                    = 0,    /**< PLOAM buffer. */
+    BCMOLT_GPON_ONU_MEMI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_memi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_omci_packet group. 
+ */
+typedef enum bcmolt_gpon_onu_omci_packet_id
+{
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID__BEGIN                                                   = 0,
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID                                                  = 0,    /**< port_id. */
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK                                                   = 1,    /**< crc_ok. */
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE                                              = 2,    /**< packet_size. */
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER                                                   = 3,    /**< buffer. */
+    BCMOLT_GPON_ONU_OMCI_PACKET_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_omci_packet_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_omci_port_id_configuration_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_omci_port_id_configuration_completed_id
+{
+    BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID__BEGIN                          = 0,
+    BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT                        = 0,    /**< GEM Port ID. */
+    BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS                          = 1,    /**< status. */
+    BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION                       = 2,    /**< Operation. */
+    BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_omci_port_id_configuration_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_onu_activation_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_activation_completed_id
+{
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID__BEGIN                                      = 0,
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS                                      = 0,    /**< status. */
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON                                 = 1,    /**< fail reason. */
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_activation_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_onu_activation_standby_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_activation_standby_completed_id
+{
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID__BEGIN                              = 0,
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT                              = 0,    /**< result. */
+    BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_activation_standby_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_onu_alarm group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_alarm_id
+{
+    BCMOLT_GPON_ONU_ONU_ALARM_ID__BEGIN                                                     = 0,
+    BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM                                                  = 0,    /**< onu alarm. */
+    BCMOLT_GPON_ONU_ONU_ALARM_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_alarm_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_onu_deactivation_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_deactivation_completed_id
+{
+    BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__BEGIN                                    = 0,
+    BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS                                    = 0,    /**< status. */
+    BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_deactivation_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_onu_disable_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_disable_completed_id
+{
+    BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID__BEGIN                                         = 0,
+    BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER                                  = 0,    /**< serial number. */
+    BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_disable_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_onu_enable_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_onu_enable_completed_id
+{
+    BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID__BEGIN                                          = 0,
+    BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER                                   = 0,    /**< serial number. */
+    BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_onu_enable_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_optical_reflection 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_optical_reflection_id
+{
+    BCMOLT_GPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_optical_reflection_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_password_authentication_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_password_authentication_completed_id
+{
+    BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID__BEGIN                             = 0,
+    BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS                             = 0,    /**< status. */
+    BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON                        = 1,    /**< fail reason. */
+    BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD                           = 2,    /**< password. */
+    BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_password_authentication_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_pee group. 
+ */
+typedef enum bcmolt_gpon_onu_pee_id
+{
+    BCMOLT_GPON_ONU_PEE_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS                                                     = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_PEE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_pee_id;
+
+/** Identifiers for all properties contained in the gpon_onu_ploam_packet group. 
+ */
+typedef enum bcmolt_gpon_onu_ploam_packet_id
+{
+    BCMOLT_GPON_ONU_PLOAM_PACKET_ID__BEGIN                                                  = 0,
+    BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM                                                   = 0,    /**< ploam. */
+    BCMOLT_GPON_ONU_PLOAM_PACKET_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_ploam_packet_id;
+
+/** Identifiers for all properties contained in the gpon_onu_possible_drift 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_possible_drift_id
+{
+    BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID__BEGIN                                                = 0,
+    BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS                                          = 0,    /**< Alarm Status. */
+    BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT                                       = 1,    /**< Estimated Drift. */
+    BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_possible_drift_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_power_management_state_change group. 
+ */
+typedef enum bcmolt_gpon_onu_power_management_state_change_id
+{
+    BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__BEGIN                                 = 0,
+    BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE                              = 0,    /**< Old State. */
+    BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE                              = 1,    /**< New State. */
+    BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON                                 = 2,    /**< Reason. */
+    BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_power_management_state_change_id;
+
+/** Identifiers for all properties contained in the gpon_onu_pst group. 
+ */
+typedef enum bcmolt_gpon_onu_pst_id
+{
+    BCMOLT_GPON_ONU_PST_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER                                                      = 0,    /**< link number. */
+    BCMOLT_GPON_ONU_PST_ID_K1                                                               = 1,    /**< K1. */
+    BCMOLT_GPON_ONU_PST_ID_K2                                                               = 2,    /**< K2. */
+    BCMOLT_GPON_ONU_PST_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_pst_id;
+
+/** Identifiers for all properties contained in the gpon_onu_ranging_completed 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_ranging_completed_id
+{
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID__BEGIN                                             = 0,
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS                                             = 0,    /**< status. */
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON                                        = 1,    /**< fail reason. */
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS                                   = 2,    /**< number of PLOAMs. */
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD                                                = 3,    /**< EQD. */
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL                                        = 4,    /**< Power Level. */
+    BCMOLT_GPON_ONU_RANGING_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_ranging_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_rei group. 
+ */
+typedef enum bcmolt_gpon_onu_rei_id
+{
+    BCMOLT_GPON_ONU_REI_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS                                                      = 0,    /**< BIP8 errors. */
+    BCMOLT_GPON_ONU_REI_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_rei_id;
+
+/** Identifiers for all properties contained in the 
+ * gpon_onu_rssi_measurement_completed group. 
+ */
+typedef enum bcmolt_gpon_onu_rssi_measurement_completed_id
+{
+    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__BEGIN                                    = 0,
+    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS                                    = 0,    /**< status. */
+    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON                               = 1,    /**< fail reason. */
+    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_rssi_measurement_completed_id;
+
+/** Identifiers for all properties contained in the gpon_onu_rssi_measurement 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_rssi_measurement_id
+{
+    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_rssi_measurement_id;
+
+/** Identifiers for all properties contained in the gpon_onu_sdi group. 
+ */
+typedef enum bcmolt_gpon_onu_sdi_id
+{
+    BCMOLT_GPON_ONU_SDI_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS                                                     = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_SDI_ID_BER                                                              = 1,    /**< BER. */
+    BCMOLT_GPON_ONU_SDI_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_sdi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_set_onu_state 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_set_onu_state_id
+{
+    BCMOLT_GPON_ONU_SET_ONU_STATE_ID__BEGIN                                                 = 0,
+    BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE                                              = 0,    /**< ONU state. */
+    BCMOLT_GPON_ONU_SET_ONU_STATE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_set_onu_state_id;
+
+/** Identifiers for all properties contained in the gpon_onu_sfi group. 
+ */
+typedef enum bcmolt_gpon_onu_sfi_id
+{
+    BCMOLT_GPON_ONU_SFI_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS                                                     = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_SFI_ID_BER                                                              = 1,    /**< BER. */
+    BCMOLT_GPON_ONU_SFI_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_sfi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_stat_alarm_cleared_id
+{
+    BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID__BEGIN                                            = 0,
+    BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT                                              = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the gpon_onu_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_gpon_onu_stat_alarm_raised_id
+{
+    BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID__BEGIN                                             = 0,
+    BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT                                               = 0,    /**< Statistic ID. */
+    BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the gpon_onu_stat_cfg group. 
+ */
+typedef enum bcmolt_gpon_onu_stat_cfg_id
+{
+    BCMOLT_GPON_ONU_STAT_CFG_ID__BEGIN                                                      = 0,
+    BCMOLT_GPON_ONU_STAT_CFG_ID_CFG                                                         = 0,    /**< Configuration. */
+    BCMOLT_GPON_ONU_STAT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_stat_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_onu_stat group. 
+ */
+typedef enum bcmolt_gpon_onu_stat_id
+{
+    BCMOLT_GPON_ONU_STAT_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS                                                   = 0,    /**< Total received FEC codewords. */
+    BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED                                             = 1,    /**< FEC codewords corrected bytes. */
+    BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED                                         = 2,    /**< FEC corrected codewords error . */
+    BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED                                       = 3,    /**< FEC not corrected codewords error. */
+    BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES                                                      = 4,    /**< Received bytes for BIP8. */
+    BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS                                                     = 5,    /**< Bit error according to BIP8. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR                                             = 6,    /**< Received PLOAMs with CRC error. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE                                              = 7,    /**< Received non idle PLOAMs. */
+    BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT                                                  = 8,    /**< Positive drift. */
+    BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT                                                  = 9,    /**< Negative drift. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_OMCI                                                         = 10,   /**< Received OMCI packets. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR                                       = 11,   /**< Received OMCI packets with CRC errors. */
+    BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED                                                    = 12,   /**< BER reported. */
+    BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST                                                = 13,   /**< Unreceived burst. */
+    BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS                                                     = 14,   /**< LCDG errors. */
+    BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS                                                      = 15,   /**< RDI errors. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_BYTES                                                        = 16,   /**< rx bytes. */
+    BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS                                                      = 17,   /**< rx packets. */
+    BCMOLT_GPON_ONU_STAT_ID_TX_BYTES                                                        = 18,   /**< tx bytes. */
+    BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS                                                      = 19,   /**< tx packets. */
+    BCMOLT_GPON_ONU_STAT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_stat_id;
+
+/** Identifiers for all properties contained in the gpon_onu_sufi group. 
+ */
+typedef enum bcmolt_gpon_onu_sufi_id
+{
+    BCMOLT_GPON_ONU_SUFI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_GPON_ONU_SUFI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_sufi_id;
+
+/** Identifiers for all properties contained in the gpon_onu_tiwi group. 
+ */
+typedef enum bcmolt_gpon_onu_tiwi_id
+{
+    BCMOLT_GPON_ONU_TIWI_ID__BEGIN                                                          = 0,
+    BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS                                                    = 0,    /**< Alarm status. */
+    BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE                                                     = 1,    /**< Drift value. */
+    BCMOLT_GPON_ONU_TIWI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_tiwi_id;
+
+/** Identifiers for all properties contained in the gpon_trx_cfg group. 
+ */
+typedef enum bcmolt_gpon_trx_cfg_id
+{
+    BCMOLT_GPON_TRX_CFG_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE                                                 = 0,    /**< transceiver type. */
+    BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION                                                 = 1,    /**< LA configuration. */
+    BCMOLT_GPON_TRX_CFG_ID_BCDR                                                             = 2,    /**< BCDR. */
+    BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC                                    = 3,    /**< LA ranging after no ed resync . */
+    BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC                                  = 4,    /**< BCDR ranging after no ed resync configuration. */
+    BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC                                       = 5,    /**< LA ranging after ed resync . */
+    BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC                                     = 6,    /**< BCDR ranging after ed resync. */
+    BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY                                               = 7,    /**< la resync polarity. */
+    BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY                                             = 8,    /**< BCDR resync polarity. */
+    BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS                                   = 9,    /**< bcdr ranging resync conditions. */
+    BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS                                     = 10,   /**< la ranging resync conditions. */
+    BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION                                                 = 11,   /**< RX configuration. */
+    BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION                             = 12,   /**< ranging control stages configuration. */
+    BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT                                                    = 13,   /**< Energy Detect. */
+    BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN                                        = 14,   /**< end of burst data pattern . */
+    BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN                                     = 15,   /**< end of burst ranging pattern. */
+    BCMOLT_GPON_TRX_CFG_ID_PREAMBLE                                                         = 16,   /**< Preamble. */
+    BCMOLT_GPON_TRX_CFG_ID_DELIMITER                                                        = 17,   /**< Delimiter. */
+    BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS                                                       = 18,   /**< Guard bits. */
+    BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION                                             = 19,   /**< serdes configuration. */
+    BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING                                                      = 20,   /**< PLO for ranging. */
+    BCMOLT_GPON_TRX_CFG_ID_PLO_DATA                                                         = 21,   /**< PLO for data. */
+    BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG                                               = 22,   /**< rssi normal config. */
+    BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL                                      = 23,   /**< ranging rssi resync control. */
+    BCMOLT_GPON_TRX_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_trx_cfg_id;
+
+/** Identifiers for all properties contained in the gpon_trx_key group. 
+ */
+typedef enum bcmolt_gpon_trx_key_id
+{
+    BCMOLT_GPON_TRX_KEY_ID__BEGIN                                                           = 0,
+    BCMOLT_GPON_TRX_KEY_ID_PON_NI                                                           = 0,    /**< PON network interface. */
+    BCMOLT_GPON_TRX_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_trx_key_id;
+
+/** Identifiers for all properties contained in the log_entry_auto_cfg group. 
+ */
+typedef enum bcmolt_log_entry_auto_cfg_id
+{
+    BCMOLT_LOG_ENTRY_AUTO_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED                                         = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED                                          = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_LOG_ENTRY_AUTO_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_auto_cfg_id;
+
+/** Identifiers for all properties contained in the log_entry_cfg group. 
+ */
+typedef enum bcmolt_log_entry_cfg_id
+{
+    BCMOLT_LOG_ENTRY_CFG_ID__BEGIN                                                          = 0,
+    BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL                                               = 0,    /**< default log level. */
+    BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE                                                = 1,    /**< default log type. */
+    BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT                                                 = 2,    /**< log level print. */
+    BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE                                                  = 3,    /**< log level save. */
+    BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE                                                        = 4,    /**< log type. */
+    BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE                                                       = 5,    /**< log_style. */
+    BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME                                                        = 6,    /**< log name. */
+    BCMOLT_LOG_ENTRY_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_cfg_id;
+
+/** Identifiers for all properties contained in the log_entry_key group. 
+ */
+typedef enum bcmolt_log_entry_key_id
+{
+    BCMOLT_LOG_ENTRY_KEY_ID__BEGIN                                                          = 0,
+    BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID                                                          = 0,    /**< log id. */
+    BCMOLT_LOG_ENTRY_KEY_ID_RESERVED                                                        = 1,    /**< reserved. */
+    BCMOLT_LOG_ENTRY_KEY_ID_NAME                                                            = 2,    /**< name. */
+    BCMOLT_LOG_ENTRY_KEY_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_key_id;
+
+/** Identifiers for all properties contained in the log_entry_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_log_entry_stat_alarm_cleared_id
+{
+    BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID__BEGIN                                           = 0,
+    BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT                                             = 0,    /**< Statistic ID. */
+    BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the log_entry_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_log_entry_stat_alarm_raised_id
+{
+    BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID__BEGIN                                            = 0,
+    BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT                                              = 0,    /**< Statistic ID. */
+    BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the log_entry_stat_cfg group. 
+ */
+typedef enum bcmolt_log_entry_stat_cfg_id
+{
+    BCMOLT_LOG_ENTRY_STAT_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG                                                        = 0,    /**< Configuration. */
+    BCMOLT_LOG_ENTRY_STAT_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_stat_cfg_id;
+
+/** Identifiers for all properties contained in the log_entry_stat group. 
+ */
+typedef enum bcmolt_log_entry_stat_id
+{
+    BCMOLT_LOG_ENTRY_STAT_ID__BEGIN                                                         = 0,
+    BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT                                                      = 0,    /**< msg count. */
+    BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT                                                 = 1,    /**< lost msg count. */
+    BCMOLT_LOG_ENTRY_STAT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_stat_id;
+
+/** Identifiers for all properties contained in the logger_auto_cfg group. 
+ */
+typedef enum bcmolt_logger_auto_cfg_id
+{
+    BCMOLT_LOGGER_AUTO_CFG_ID__BEGIN                                                        = 0,
+    BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED                                            = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED                                             = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_LOGGER_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_auto_cfg_id;
+
+/** Identifiers for all properties contained in the logger_cfg group. 
+ */
+typedef enum bcmolt_logger_cfg_id
+{
+    BCMOLT_LOGGER_CFG_ID__BEGIN                                                             = 0,
+    BCMOLT_LOGGER_CFG_ID_BUFFER                                                             = 0,    /**< buffer. */
+    BCMOLT_LOGGER_CFG_ID_WRAP_AROUND                                                        = 1,    /**< wrap around. */
+    BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ                                                   = 2,    /**< clear_after_read. */
+    BCMOLT_LOGGER_CFG_ID_ENABLE_LOG                                                         = 3,    /**< enable log. */
+    BCMOLT_LOGGER_CFG_ID_LOG_NAMES                                                          = 4,    /**< log_names. */
+    BCMOLT_LOGGER_CFG_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_cfg_id;
+
+/** Identifiers for all properties contained in the logger_clear_log group. 
+ */
+typedef enum bcmolt_logger_clear_log_id
+{
+    BCMOLT_LOGGER_CLEAR_LOG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_clear_log_id;
+
+/** Identifiers for all properties contained in the logger_key group. 
+ */
+typedef enum bcmolt_logger_key_id
+{
+    BCMOLT_LOGGER_KEY_ID__BEGIN                                                             = 0,
+    BCMOLT_LOGGER_KEY_ID_RESERVED                                                           = 0,    /**< reserved. */
+    BCMOLT_LOGGER_KEY_ID_FILE_ID                                                            = 1,    /**< file id. */
+    BCMOLT_LOGGER_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_key_id;
+
+/** Identifiers for all properties contained in the logger_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_logger_stat_alarm_cleared_id
+{
+    BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID__BEGIN                                              = 0,
+    BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT                                                = 0,    /**< Statistic ID. */
+    BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the logger_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_logger_stat_alarm_raised_id
+{
+    BCMOLT_LOGGER_STAT_ALARM_RAISED_ID__BEGIN                                               = 0,
+    BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT                                                 = 0,    /**< Statistic ID. */
+    BCMOLT_LOGGER_STAT_ALARM_RAISED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the logger_stat_cfg group. 
+ */
+typedef enum bcmolt_logger_stat_cfg_id
+{
+    BCMOLT_LOGGER_STAT_CFG_ID__BEGIN                                                        = 0,
+    BCMOLT_LOGGER_STAT_CFG_ID_CFG                                                           = 0,    /**< Configuration. */
+    BCMOLT_LOGGER_STAT_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_stat_cfg_id;
+
+/** Identifiers for all properties contained in the logger_stat group. 
+ */
+typedef enum bcmolt_logger_stat_id
+{
+    BCMOLT_LOGGER_STAT_ID__BEGIN                                                            = 0,
+    BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG                                                      = 0,    /**< lines in log. */
+    BCMOLT_LOGGER_STAT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_stat_id;
+
+/** Identifiers for all properties contained in the nni_auto_cfg group. 
+ */
+typedef enum bcmolt_nni_auto_cfg_id
+{
+    BCMOLT_NNI_AUTO_CFG_ID__BEGIN                                                           = 0,
+    BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED                                               = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED                                                = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED                                                   = 2,    /**< Status changed. */
+    BCMOLT_NNI_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_auto_cfg_id;
+
+/** Identifiers for all properties contained in the nni_cfg group. 
+ */
+typedef enum bcmolt_nni_cfg_id
+{
+    BCMOLT_NNI_CFG_ID__BEGIN                                                                = 0,
+    BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK                                                       = 0,    /**< Remote loopback. */
+    BCMOLT_NNI_CFG_ID_LINE_LOOPBACK                                                         = 1,    /**< Line loopback. */
+    BCMOLT_NNI_CFG_ID_MAC_ADDRESS                                                           = 2,    /**< Mac Address. */
+    BCMOLT_NNI_CFG_ID_NNI_STATUS                                                            = 3,    /**< NNI Status. */
+    BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS                                                     = 4,    /**< NNI Backup Status. */
+    BCMOLT_NNI_CFG_ID_ACTIVE_NNI                                                            = 5,    /**< Active NNI. */
+    BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS                                        = 6,    /**< NNI Status Polling Interval (ms). */
+    BCMOLT_NNI_CFG_ID_AUTOSWITCH                                                            = 7,    /**< Auto-Switch. */
+    BCMOLT_NNI_CFG_ID_FLOW_CONTROL                                                          = 8,    /**< Flow Control. */
+    BCMOLT_NNI_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_cfg_id;
+
+/** Identifiers for all properties contained in the nni_key group. 
+ */
+typedef enum bcmolt_nni_key_id
+{
+    BCMOLT_NNI_KEY_ID__BEGIN                                                                = 0,
+    BCMOLT_NNI_KEY_ID_PON_NI                                                                = 0,    /**< PON NI. */
+    BCMOLT_NNI_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_key_id;
+
+/** Identifiers for all properties contained in the nni_serdes_cfg group. 
+ */
+typedef enum bcmolt_nni_serdes_cfg_id
+{
+    BCMOLT_NNI_SERDES_CFG_ID__BEGIN                                                         = 0,
+    BCMOLT_NNI_SERDES_CFG_ID_RX_VGA                                                         = 0,    /**< Rx Vga. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_PF                                                          = 1,    /**< Rx PF. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF                                                        = 2,    /**< Rx LFPF. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1                                                        = 3,    /**< Rx DFE1. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2                                                        = 4,    /**< Rx DFE2. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3                                                        = 5,    /**< Rx DFE3. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4                                                        = 6,    /**< Rx DFE4. */
+    BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5                                                        = 7,    /**< Rx DFE5. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_PRE                                                         = 8,    /**< Tx Pre. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN                                                        = 9,    /**< Tx Main. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_POST1                                                       = 10,   /**< Tx Post1. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_POST2                                                       = 11,   /**< Tx Post2. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_POST3                                                       = 12,   /**< Tx Post3. */
+    BCMOLT_NNI_SERDES_CFG_ID_TX_AMP                                                         = 13,   /**< Tx Amp. */
+    BCMOLT_NNI_SERDES_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_serdes_cfg_id;
+
+/** Identifiers for all properties contained in the nni_serdes_key group. 
+ */
+typedef enum bcmolt_nni_serdes_key_id
+{
+    BCMOLT_NNI_SERDES_KEY_ID__BEGIN                                                         = 0,
+    BCMOLT_NNI_SERDES_KEY_ID_PON_NI                                                         = 0,    /**< PON NI. */
+    BCMOLT_NNI_SERDES_KEY_ID_INSTANCE                                                       = 1,    /**< Instance. */
+    BCMOLT_NNI_SERDES_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_serdes_key_id;
+
+/** Identifiers for all properties contained in the nni_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_nni_stat_alarm_cleared_id
+{
+    BCMOLT_NNI_STAT_ALARM_CLEARED_ID__BEGIN                                                 = 0,
+    BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT                                                   = 0,    /**< Statistic ID. */
+    BCMOLT_NNI_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the nni_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_nni_stat_alarm_raised_id
+{
+    BCMOLT_NNI_STAT_ALARM_RAISED_ID__BEGIN                                                  = 0,
+    BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT                                                    = 0,    /**< Statistic ID. */
+    BCMOLT_NNI_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the nni_stat_cfg group. 
+ */
+typedef enum bcmolt_nni_stat_cfg_id
+{
+    BCMOLT_NNI_STAT_CFG_ID__BEGIN                                                           = 0,
+    BCMOLT_NNI_STAT_CFG_ID_CFG                                                              = 0,    /**< Configuration. */
+    BCMOLT_NNI_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_stat_cfg_id;
+
+/** Identifiers for all properties contained in the nni_stat group. 
+ */
+typedef enum bcmolt_nni_stat_id
+{
+    BCMOLT_NNI_STAT_ID__BEGIN                                                               = 0,
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_64                                                         = 0,    /**< RX 64 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127                                                     = 1,    /**< RX 65-127 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255                                                    = 2,    /**< RX 128-255 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511                                                    = 3,    /**< RX 256-511 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023                                                   = 4,    /**< RX 512-1023 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518                                                  = 5,    /**< RX 1024-1518 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047                                                  = 6,    /**< RX 1519-2047 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095                                                  = 7,    /**< RX 2048-4095 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216                                                  = 8,    /**< RX 4096-9216 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383                                                 = 9,    /**< RX 9217-16383 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAMES                                                            = 10,   /**< RX Frames. */
+    BCMOLT_NNI_STAT_ID_RX_BYTES                                                             = 11,   /**< RX Bytes. */
+    BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES                                                       = 12,   /**< RX Good Frames. */
+    BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES                                                    = 13,   /**< RX Unicast Frames. */
+    BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES                                                  = 14,   /**< RX Multicast Frames. */
+    BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES                                                  = 15,   /**< RX Broadcast Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS                                                        = 16,   /**< RX FCS Errors. */
+    BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES                                                    = 17,   /**< RX Control Frames. */
+    BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES                                                      = 18,   /**< RX Pause Frames. */
+    BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES                                                        = 19,   /**< RX PFC Frames. */
+    BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE                                                = 20,   /**< RX Unsupported Opcode Frames. */
+    BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA                                                    = 21,   /**< RX Unsupported DA Frames. */
+    BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS                                                  = 22,   /**< RX Alignment Errors. */
+    BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE                                               = 23,   /**< RX Length Out of Range. */
+    BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS                                                       = 24,   /**< RX Code Errors. */
+    BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES                                                  = 25,   /**< RX Oversized Frames. */
+    BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES                                                     = 26,   /**< RX Jabber Frames. */
+    BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS                                                  = 27,   /**< RX MTU Check Errors. */
+    BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES                                                = 28,   /**< RX Promiscuous Frames. */
+    BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES                                                       = 29,   /**< RX VLAN Frames. */
+    BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES                                                = 30,   /**< RX Double VLAN Frames. */
+    BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES                                                  = 31,   /**< RX Truncated Frames. */
+    BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES                                                  = 32,   /**< RX Undersized Frames. */
+    BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES                                                 = 33,   /**< RX Fragmented Frames. */
+    BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES                                                       = 34,   /**< RX Runt Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_64                                                         = 35,   /**< TX 64 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127                                                     = 36,   /**< TX 65-127 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255                                                    = 37,   /**< TX 128-255 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511                                                    = 38,   /**< TX 256-511 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023                                                   = 39,   /**< TX 512-1023 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518                                                  = 40,   /**< TX 1024-1518 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047                                                  = 41,   /**< TX 1519-2047 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095                                                  = 42,   /**< TX 2048-4095 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216                                                  = 43,   /**< TX 4096-9216 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383                                                 = 44,   /**< TX 9217-16383 Byte Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAMES                                                            = 45,   /**< TX Frames. */
+    BCMOLT_NNI_STAT_ID_TX_BYTES                                                             = 46,   /**< TX Bytes. */
+    BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES                                                       = 47,   /**< TX Good Frames. */
+    BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES                                                    = 48,   /**< TX Unicast Frames. */
+    BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES                                                  = 49,   /**< TX Multicast Frames. */
+    BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES                                                  = 50,   /**< TX Broadcast Frames. */
+    BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES                                                      = 51,   /**< TX Pause Frames. */
+    BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES                                                        = 52,   /**< TX PFC Frames. */
+    BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES                                                     = 53,   /**< TX Jabber Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS                                                        = 54,   /**< TX FCS Errors. */
+    BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES                                                    = 55,   /**< TX Control Frames. */
+    BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES                                                   = 56,   /**< TX Oversize Frames. */
+    BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES                                                 = 57,   /**< TX Fragmented Frames. */
+    BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES                                                      = 58,   /**< TX Error Frames. */
+    BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES                                                       = 59,   /**< TX VLAN Frames. */
+    BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES                                                = 60,   /**< TX Double VLAN Frames. */
+    BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES                                                       = 61,   /**< TX Runt Frames. */
+    BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES                                                   = 62,   /**< TX Underrun Frames. */
+    BCMOLT_NNI_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_stat_id;
+
+/** Identifiers for all properties contained in the nni_status_changed group. 
+ */
+typedef enum bcmolt_nni_status_changed_id
+{
+    BCMOLT_NNI_STATUS_CHANGED_ID__BEGIN                                                     = 0,
+    BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS                                                 = 0,    /**< New NNI Link Status. */
+    BCMOLT_NNI_STATUS_CHANGED_ID_LINK                                                       = 1,    /**< Link. */
+    BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE                                            = 2,    /**< Previous Active. */
+    BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE                                                 = 3,    /**< New Active. */
+    BCMOLT_NNI_STATUS_CHANGED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_status_changed_id;
+
+/** Identifiers for all properties contained in the software_error_cfg group. 
+ */
+typedef enum bcmolt_software_error_cfg_id
+{
+    BCMOLT_SOFTWARE_ERROR_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY                                                      = 0,    /**< Entry. */
+    BCMOLT_SOFTWARE_ERROR_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_software_error_cfg_id;
+
+/** Identifiers for all properties contained in the software_error_key group. 
+ */
+typedef enum bcmolt_software_error_key_id
+{
+    BCMOLT_SOFTWARE_ERROR_KEY_ID__BEGIN                                                     = 0,
+    BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED                                                   = 0,    /**< Reserved. */
+    BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX                                                        = 1,    /**< Index. */
+    BCMOLT_SOFTWARE_ERROR_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_software_error_key_id;
+
+/** Identifiers for all properties contained in the trx_calibration_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_trx_calibration_auto_cfg_id
+{
+    BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID__BEGIN                                               = 0,
+    BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED               = 0,    /**< Capture window and statistic completed. */
+    BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_auto_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * trx_calibration_capture_window_and_statistic_completed group. 
+ */
+typedef enum bcmolt_trx_calibration_capture_window_and_statistic_completed_id
+{
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID__BEGIN                 = 0,
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW            = 0,    /**< data window. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW          = 1,    /**< strobe window. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN      = 2,    /**< edge rise min min. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX      = 3,    /**< edge rise min max. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN      = 4,    /**< edge rise max min. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX      = 5,    /**< edge rise max max. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN      = 6,    /**< edge fall min min . */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX      = 7,    /**< edge fall min max. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN      = 8,    /**< edge fall max min. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX      = 9,    /**< edge fall max max. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT                 = 10,   /**< result. */
+    BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_capture_window_and_statistic_completed_id;
+
+/** Identifiers for all properties contained in the trx_calibration_key group. 
+ */
+typedef enum bcmolt_trx_calibration_key_id
+{
+    BCMOLT_TRX_CALIBRATION_KEY_ID__BEGIN                                                    = 0,
+    BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED                                                  = 0,    /**< Reserved. */
+    BCMOLT_TRX_CALIBRATION_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_key_id;
+
+/** Identifiers for all properties contained in the 
+ * trx_calibration_start_capture_window group. 
+ */
+typedef enum bcmolt_trx_calibration_start_capture_window_id
+{
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID__BEGIN                                   = 0,
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI                                   = 0,    /**< pon_ni. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER                                  = 1,    /**< trigger. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE                                   = 2,    /**< strobe. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE                              = 3,    /**< window mode. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID                                   = 4,    /**< onu id. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION                         = 5,    /**< trigger position. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE               = 6,    /**< stop due to corrupt strobe. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET                             = 7,    /**< start offset. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET                               = 8,    /**< end offset. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES                         = 9,    /**< number of cycles. */
+    BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_start_capture_window_id;
+
+/** Identifiers for all properties contained in the 
+ * trx_calibration_stop_capture_window group. 
+ */
+typedef enum bcmolt_trx_calibration_stop_capture_window_id
+{
+    BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID__BEGIN                                    = 0,
+    BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI                                    = 0,    /**< pon_ni. */
+    BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_stop_capture_window_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_auto_cfg group. 
+ */
+typedef enum bcmolt_xgpon_alloc_auto_cfg_id
+{
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID__BEGIN                                                   = 0,
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED                                  = 0,    /**< Configuration Completed. */
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED                                = 1,    /**< Get alloc ID statistics completed. */
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED                                       = 2,    /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED                                        = 3,    /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_ALLOC_AUTO_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_auto_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_cfg group. 
+ */
+typedef enum bcmolt_xgpon_alloc_cfg_id
+{
+    BCMOLT_XGPON_ALLOC_CFG_ID__BEGIN                                                        = 0,
+    BCMOLT_XGPON_ALLOC_CFG_ID_STATE                                                         = 0,    /**< state. */
+    BCMOLT_XGPON_ALLOC_CFG_ID_SLA                                                           = 1,    /**< sla. */
+    BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID                                                        = 2,    /**< onu_id. */
+    BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS                                                 = 3,    /**< Enable statistics collection on the alloc id. */
+    BCMOLT_XGPON_ALLOC_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_alloc_configuration_completed group. 
+ */
+typedef enum bcmolt_xgpon_alloc_configuration_completed_id
+{
+    BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID__BEGIN                                    = 0,
+    BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS                                    = 0,    /**< status. */
+    BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE                                 = 1,    /**< new state. */
+    BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_configuration_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_alloc_get_alloc_stats_completed group. 
+ */
+typedef enum bcmolt_xgpon_alloc_get_alloc_stats_completed_id
+{
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__BEGIN                                  = 0,
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS                                  = 0,    /**< status. */
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED                        = 1,    /**< Average NSR used words. */
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED                   = 2,    /**< Average NSR allocated words. */
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT                       = 3,    /**< Average SR report. */
+    BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_get_alloc_stats_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_get_stats group. 
+ */
+typedef enum bcmolt_xgpon_alloc_get_stats_id
+{
+    BCMOLT_XGPON_ALLOC_GET_STATS_ID__BEGIN                                                  = 0,
+    BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES                                           = 0,    /**< Number of cycles. */
+    BCMOLT_XGPON_ALLOC_GET_STATS_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_get_stats_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_key group. 
+ */
+typedef enum bcmolt_xgpon_alloc_key_id
+{
+    BCMOLT_XGPON_ALLOC_KEY_ID__BEGIN                                                        = 0,
+    BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI                                                        = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID                                                      = 1,    /**< Alloc ID. */
+    BCMOLT_XGPON_ALLOC_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_key_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_set_state group. 
+ */
+typedef enum bcmolt_xgpon_alloc_set_state_id
+{
+    BCMOLT_XGPON_ALLOC_SET_STATE_ID__BEGIN                                                  = 0,
+    BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE                                                   = 0,    /**< State. */
+    BCMOLT_XGPON_ALLOC_SET_STATE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_set_state_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_alloc_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_xgpon_alloc_stat_alarm_cleared_id
+{
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT                                           = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_alloc_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_xgpon_alloc_stat_alarm_raised_id
+{
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID__BEGIN                                          = 0,
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT                                            = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_stat_cfg group. 
+ */
+typedef enum bcmolt_xgpon_alloc_stat_cfg_id
+{
+    BCMOLT_XGPON_ALLOC_STAT_CFG_ID__BEGIN                                                   = 0,
+    BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG                                                      = 0,    /**< Configuration. */
+    BCMOLT_XGPON_ALLOC_STAT_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_stat_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_alloc_stat group. 
+ */
+typedef enum bcmolt_xgpon_alloc_stat_id
+{
+    BCMOLT_XGPON_ALLOC_STAT_ID__BEGIN                                                       = 0,
+    BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES                                                     = 0,    /**< Received Bytes. */
+    BCMOLT_XGPON_ALLOC_STAT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_stat_id;
+
+/** Identifiers for all properties contained in the xgpon_gem_port_auto_cfg 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_auto_cfg_id
+{
+    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID__BEGIN                                                = 0,
+    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED                                    = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED                                     = 1,    /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_auto_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_gem_port_cfg group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_cfg_id
+{
+    BCMOLT_XGPON_GEM_PORT_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION                                              = 0,    /**< Configuration. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID                                                     = 1,    /**< ONU ID. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE                                             = 2,    /**< gem port state. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE                                            = 3,    /**< Encryption mode. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE                                 = 4,    /**< Upstream destination queue. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL                                                    = 5,    /**< control. */
+    BCMOLT_XGPON_GEM_PORT_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_gem_port_key group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_key_id
+{
+    BCMOLT_XGPON_GEM_PORT_KEY_ID__BEGIN                                                     = 0,
+    BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI                                                     = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID                                                = 1,    /**< GEM PORT ID. */
+    BCMOLT_XGPON_GEM_PORT_KEY_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_key_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_gem_port_stat_alarm_cleared group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_stat_alarm_cleared_id
+{
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID__BEGIN                                      = 0,
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT                                        = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_gem_port_stat_alarm_raised group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_stat_alarm_raised_id
+{
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID__BEGIN                                       = 0,
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT                                         = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the xgpon_gem_port_stat_cfg 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_stat_cfg_id
+{
+    BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID__BEGIN                                                = 0,
+    BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG                                                   = 0,    /**< Configuration. */
+    BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_stat_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_gem_port_stat group. 
+ */
+typedef enum bcmolt_xgpon_gem_port_stat_id
+{
+    BCMOLT_XGPON_GEM_PORT_STAT_ID__BEGIN                                                    = 0,
+    BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES                                                  = 0,    /**< TX bytes. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS                                                = 1,    /**< TX packets. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS                                                = 2,    /**< RX packets. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES                                                  = 3,    /**< RX bytes. */
+    BCMOLT_XGPON_GEM_PORT_STAT_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_stat_id;
+
+/** Identifiers for all properties contained in the xgpon_iwf_cfg group. 
+ */
+typedef enum bcmolt_xgpon_iwf_cfg_id
+{
+    BCMOLT_XGPON_IWF_CFG_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID                                             = 0,    /**< US otag direct tpid. */
+    BCMOLT_XGPON_IWF_CFG_ID_DS_TPID                                                         = 1,    /**< DS tpid. */
+    BCMOLT_XGPON_IWF_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_iwf_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_iwf_key group. 
+ */
+typedef enum bcmolt_xgpon_iwf_key_id
+{
+    BCMOLT_XGPON_IWF_KEY_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_IWF_KEY_ID_PON_NI                                                          = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_IWF_KEY_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_iwf_key_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_activate_all_onus_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_activate_all_onus_completed_id
+{
+    BCMOLT_XGPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_activate_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_adjust_tx_wavelength group. 
+ */
+typedef enum bcmolt_xgpon_ni_adjust_tx_wavelength_id
+{
+    BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID__BEGIN                                          = 0,
+    BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER                                   = 0,    /**< Seril number. */
+    BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION                   = 1,    /**< Frequncy adjustment direction. */
+    BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE                       = 2,    /**< Frequency adjustment size. */
+    BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_adjust_tx_wavelength_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_auto_cfg group. 
+ */
+typedef enum bcmolt_xgpon_ni_auto_cfg_id
+{
+    BCMOLT_XGPON_NI_AUTO_CFG_ID__BEGIN                                                      = 0,
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED                                 = 0,    /**< activate all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE                                         = 1,    /**< CPU Packets Failure. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED                               = 2,    /**< deactivate all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED                                  = 3,    /**< disable all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED                                   = 4,    /**< enable all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS                                                         = 5,    /**< LOS. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED                                              = 6,    /**< ONU Discovered. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE                                        = 7,    /**< ONU Upgrade Complete. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED                            = 8,    /**< Protection Switching ONUs Ranged. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED                   = 9,    /**< Protection Switching Switchover Completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME                         = 10,   /**< Protection Switching Traffic Resume. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED                                   = 11,   /**< Rogue detection completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START                           = 12,   /**< Rogue ONU special map cycle start. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START                       = 13,   /**< Serial Number Acquisition Cycle Start. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED                      = 14,   /**< Standby PON Monitoring Cycle Completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED                                          = 15,   /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED                                           = 16,   /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED                                      = 17,   /**< State Change Completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED                                       = 18,   /**< TOD request completed. */
+    BCMOLT_XGPON_NI_AUTO_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_auto_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_broadcast_ploam_packet group. 
+ */
+typedef enum bcmolt_xgpon_ni_broadcast_ploam_packet_id
+{
+    BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID__BEGIN                                        = 0,
+    BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM                                         = 0,    /**< ploam. */
+    BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_broadcast_ploam_packet_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_cfg group. 
+ */
+typedef enum bcmolt_xgpon_ni_cfg_id
+{
+    BCMOLT_XGPON_NI_CFG_ID__BEGIN                                                           = 0,
+    BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID                                                        = 0,    /**< HW pon id. */
+    BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH                                              = 1,    /**< Available Bandwidth. */
+    BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS                                            = 2,    /**< number of active onus. */
+    BCMOLT_XGPON_NI_CFG_ID_PON_STATUS                                                       = 3,    /**< PON status. */
+    BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE                                                     = 4,    /**< PON distance. */
+    BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE                                              = 5,    /**< Ranging window size. */
+    BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER                                                = 6,    /**< EqD measurement cycles number. */
+    BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL                                                    = 7,    /**< drift control. */
+    BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD                                              = 8,    /**< los alarm threshold. */
+    BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE                                                = 9,    /**< los initialization value. */
+    BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS                                            = 10,   /**< ONU alarms thresholds. */
+    BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR                                                      = 11,   /**< BER monitoring params. */
+    BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION                                                   = 12,   /**< ONU Activation. */
+    BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION                                                   = 13,   /**< sn acquisition. */
+    BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE                                                     = 14,   /**< key exchange. */
+    BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING                                             = 15,   /**< Protection switching. */
+    BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG                                       = 16,   /**< protection switching debug . */
+    BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE                                        = 17,   /**< CBR RT Allocation profile. */
+    BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE                                       = 18,   /**< CBR NRT Allocation Profile. */
+    BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT                                                 = 19,   /**< Power Management. */
+    BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS                                      = 20,   /**< Rogue ONU detection process. */
+    BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING                                  = 21,   /**< Periodic standby PON monitoring. */
+    BCMOLT_XGPON_NI_CFG_ID_DBA_MODE                                                         = 22,   /**< DBA mode. */
+    BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING                                                   = 23,   /**< Ploam handling. */
+    BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID                                                = 24,   /**< Minimum data alloc id. */
+    BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID                                             = 25,   /**< Minimum data port id. */
+    BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY                                                    = 26,   /**< multicast key. */
+    BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER                                                     = 27,   /**< PRBS Checker. */
+    BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR                                                   = 28,   /**< PRBS Generator. */
+    BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS                                                      = 29,   /**< PRBS status. */
+    BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION                                       = 30,   /**< Automatic ONU deactivation. */
+    BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT                                               = 31,   /**< US bandwidth Limit. */
+    BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS                                                         = 32,   /**< all ONUs. */
+    BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS                                              = 33,   /**< all multicast GEM ports. */
+    BCMOLT_XGPON_NI_CFG_ID_DEBUG                                                            = 34,   /**< PON NI debug parameters. */
+    BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS                                               = 35,   /**< ONU upgrade params. */
+    BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE                                                      = 36,   /**< DS FEC mode. */
+    BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE                                                         = 37,   /**< DBA type. */
+    BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING                                                       = 38,   /**< onu tuning. */
+    BCMOLT_XGPON_NI_CFG_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_cpu_packets_failure 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_cpu_packets_failure_id
+{
+    BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID__BEGIN                                           = 0,
+    BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR                                            = 0,    /**< Error. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID                                      = 1,    /**< GEM Port ID. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_cpu_packets_failure_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_cpu_packets group. 
+ */
+typedef enum bcmolt_xgpon_ni_cpu_packets_id
+{
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID__BEGIN                                                   = 0,
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE                                              = 0,    /**< packet type. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC                                                 = 1,    /**< calc crc. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST                                            = 2,    /**< gem port list. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER                                                   = 3,    /**< buffer. */
+    BCMOLT_XGPON_NI_CPU_PACKETS_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_cpu_packets_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_deactivate_all_onus_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_deactivate_all_onus_completed_id
+{
+    BCMOLT_XGPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_deactivate_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_disable_all_onus_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_disable_all_onus_completed_id
+{
+    BCMOLT_XGPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_disable_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_disable_serial_number group. 
+ */
+typedef enum bcmolt_xgpon_ni_disable_serial_number_id
+{
+    BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL                                        = 0,    /**< control. */
+    BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER                                  = 1,    /**< serial number. */
+    BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_disable_serial_number_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_enable_all_onus_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_enable_all_onus_completed_id
+{
+    BCMOLT_XGPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_enable_all_onus_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_key group. 
+ */
+typedef enum bcmolt_xgpon_ni_key_id
+{
+    BCMOLT_XGPON_NI_KEY_ID__BEGIN                                                           = 0,
+    BCMOLT_XGPON_NI_KEY_ID_PON_NI                                                           = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_NI_KEY_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_key_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_los group. 
+ */
+typedef enum bcmolt_xgpon_ni_los_id
+{
+    BCMOLT_XGPON_NI_LOS_ID__BEGIN                                                           = 0,
+    BCMOLT_XGPON_NI_LOS_ID_STATUS                                                           = 0,    /**< status. */
+    BCMOLT_XGPON_NI_LOS_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_los_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_onu_discovered 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_onu_discovered_id
+{
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID__BEGIN                                                = 0,
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER                                         = 0,    /**< serial number. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME                                          = 1,    /**< ranging time. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID                                                = 2,    /**< onu_id. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES                       = 3,    /**< upstream line rate capabilities. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID                             = 4,    /**< current downstream pon id. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID                               = 5,    /**< current upstream pon id. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD                                    = 6,    /**< calibration record. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY                                    = 7,    /**< tuning granularity. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME                                      = 8,    /**< step tuning time. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION                                           = 9,    /**< attenuetion. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES                          = 10,   /**< power levelling capabilities. */
+    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_onu_discovered_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_onu_upgrade_complete group. 
+ */
+typedef enum bcmolt_xgpon_ni_onu_upgrade_complete_id
+{
+    BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID__BEGIN                                          = 0,
+    BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS                                          = 0,    /**< Status. */
+    BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES                         = 1,    /**< List of failed entities. */
+    BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_onu_upgrade_complete_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_protection_switching_onus_ranged group. 
+ */
+typedef enum bcmolt_xgpon_ni_protection_switching_onus_ranged_id
+{
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__BEGIN                              = 0,
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS                                = 0,    /**< ONUs. */
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_protection_switching_onus_ranged_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_protection_switching_switchover_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_protection_switching_switchover_completed_id
+{
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__BEGIN                     = 0,
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT                     = 0,    /**< Result. */
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_protection_switching_switchover_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_protection_switching_traffic_resume group. 
+ */
+typedef enum bcmolt_xgpon_ni_protection_switching_traffic_resume_id
+{
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__BEGIN                           = 0,
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT                           = 0,    /**< Result. */
+    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_protection_switching_traffic_resume_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_reset group. 
+ */
+typedef enum bcmolt_xgpon_ni_reset_id
+{
+    BCMOLT_XGPON_NI_RESET_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_reset_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_rogue_detection_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_rogue_detection_completed_id
+{
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID__BEGIN                                     = 0,
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE                                = 0,    /**< Window type. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS                         = 1,    /**< Measurement status. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID                                   = 2,    /**< Alloc ID. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID                                     = 3,    /**< ONU ID. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION                             = 4,    /**< Is delineation. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED                                      = 5,    /**< Is ED. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA                                    = 6,    /**< Received data. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID                      = 7,    /**< ploam_received_onu_id. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR                   = 8,    /**< ploam_received_mic_error. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_rogue_detection_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_rogue_detection_window group. 
+ */
+typedef enum bcmolt_xgpon_ni_rogue_detection_window_id
+{
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID__BEGIN                                        = 0,
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE                                   = 0,    /**< Window type. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID                                      = 1,    /**< Alloc ID. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID                                        = 2,    /**< ONU ID. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW                         = 3,    /**< Second ranging window. */
+    BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_rogue_detection_window_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_rogue_onu_special_map_cycle_start group. 
+ */
+typedef enum bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id
+{
+    BCMOLT_XGPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_run_special_bw_map 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_run_special_bw_map_id
+{
+    BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID__BEGIN                                            = 0,
+    BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE                                   = 0,    /**< number of cycle. */
+    BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER                                 = 1,    /**< allocation number. */
+    BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY                                      = 2,    /**< bw map array. */
+    BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_run_special_bw_map_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_serial_number_acquisition_cycle_start group. 
+ */
+typedef enum bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id
+{
+    BCMOLT_XGPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_set_onu_state 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_set_onu_state_id
+{
+    BCMOLT_XGPON_NI_SET_ONU_STATE_ID__BEGIN                                                 = 0,
+    BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE                                              = 0,    /**< ONU state. */
+    BCMOLT_XGPON_NI_SET_ONU_STATE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_set_onu_state_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_set_pon_state 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_set_pon_state_id
+{
+    BCMOLT_XGPON_NI_SET_PON_STATE_ID__BEGIN                                                 = 0,
+    BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE                                              = 0,    /**< PON state. */
+    BCMOLT_XGPON_NI_SET_PON_STATE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_set_pon_state_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_single_request_standby_pon_monitoring group. 
+ */
+typedef enum bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id
+{
+    BCMOLT_XGPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_standby_pon_monitoring_cycle_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id
+{
+    BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__BEGIN                        = 0,
+    BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER  = 0,    /**< number of detected delimiter. */
+    BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL          = 1,    /**< energy detect signal. */
+    BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_start_onu_upgrade 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_start_onu_upgrade_id
+{
+    BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID__BEGIN                                             = 0,
+    BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS                                    = 0,    /**< List of ONU IDs. */
+    BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_start_onu_upgrade_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_stat_alarm_cleared_id
+{
+    BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID__BEGIN                                            = 0,
+    BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT                                              = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_ni_stat_alarm_raised_id
+{
+    BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID__BEGIN                                             = 0,
+    BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT                                               = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_stat_cfg group. 
+ */
+typedef enum bcmolt_xgpon_ni_stat_cfg_id
+{
+    BCMOLT_XGPON_NI_STAT_CFG_ID__BEGIN                                                      = 0,
+    BCMOLT_XGPON_NI_STAT_CFG_ID_CFG                                                         = 0,    /**< Configuration. */
+    BCMOLT_XGPON_NI_STAT_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_stat_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_stat group. 
+ */
+typedef enum bcmolt_xgpon_ni_stat_id
+{
+    BCMOLT_XGPON_NI_STAT_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS                                                   = 0,    /**< Receive FEC codewords. */
+    BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES                                                     = 1,    /**< Received bytes protected by bip32. */
+    BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS                                                    = 2,    /**< Received bip32 errors. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS                                                 = 3,    /**< Received valid XGTC headers. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED                                               = 4,    /**< Received corrected XGTC headers. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED                                             = 5,    /**< Received uncorrected XGTC headers. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGEM                                                         = 6,    /**< Received valid XGEM frames. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED                                                 = 7,    /**< Received dropped XGEM ID frames. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE                                                    = 8,    /**< Received idle XGEM frames. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED                                               = 9,    /**< Received corrected XGEM frames. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR                                                    = 10,   /**< Received packets with CRC error. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR                                               = 11,   /**< Received fragment errors. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED                                              = 12,   /**< Global dropped packets. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT                                            = 13,   /**< Received packets dropped due to length too short. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG                                             = 14,   /**< Received packet dropped due to length too long. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR                                                    = 15,   /**< Received key errors. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS                                                       = 16,   /**< Transmitted Ploams. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED                                               = 17,   /**< Received dropped Ploams. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID                                            = 18,   /**< Received valid allocations. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID                                          = 19,   /**< Received invalid allocations. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED                                         = 20,   /**< Received disabled allocations. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS                                                       = 21,   /**< Received Ploams. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE                                              = 22,   /**< Received non idle Ploams. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR                                                 = 23,   /**< Received error Ploams. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_CPU                                                          = 24,   /**< Received CPU packets. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_OMCI                                                         = 25,   /**< Received OMCI packets. */
+    BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR                                       = 26,   /**< Received OMCI packets with CRC errors. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS                                                      = 27,   /**< Transmitted packets. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_XGEM                                                         = 28,   /**< Transmitted XGEM fragments. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_CPU                                                          = 29,   /**< Transmitted CPU packets. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_OMCI                                                         = 30,   /**< Transmitted OMCI packets. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED                                     = 31,   /**< Transmit packets dropped due to illegal length. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH                                       = 32,   /**< Transmit packets dropped due to illegal length. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS                                            = 33,   /**< Transmit packets dropped due to TPID miss. */
+    BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS                                             = 34,   /**< Transmit packets droped due to VID miss. */
+    BCMOLT_XGPON_NI_STAT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_stat_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_state_change_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_state_change_completed_id
+{
+    BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID__BEGIN                                        = 0,
+    BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT                                        = 0,    /**< Result. */
+    BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE                                = 1,    /**< Previous state. */
+    BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE                                     = 2,    /**< new state. */
+    BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_state_change_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_ni_tod_request_completed group. 
+ */
+typedef enum bcmolt_xgpon_ni_tod_request_completed_id
+{
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING                                     = 0,    /**< tod_string. */
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC                                            = 1,    /**< sfc. */
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC                                 = 2,    /**< rtc_offset_sec. */
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC                                = 3,    /**< rtc_offset_nsec. */
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS                                         = 4,    /**< status. */
+    BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_tod_request_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_ni_tod_request group. 
+ */
+typedef enum bcmolt_xgpon_ni_tod_request_id
+{
+    BCMOLT_XGPON_NI_TOD_REQUEST_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_tod_request_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_adjust_tx_wavelength group. 
+ */
+typedef enum bcmolt_xgpon_onu_adjust_tx_wavelength_id
+{
+    BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION                 = 0,    /**< Frequency adjustment direction. */
+    BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE                      = 1,    /**< Frequency adjustment size. */
+    BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_adjust_tx_wavelength_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_auto_cfg group. 
+ */
+typedef enum bcmolt_xgpon_onu_auto_cfg_id
+{
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI                                                        = 0,    /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI                                                        = 1,    /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI                                                       = 2,    /**< Drift of Window of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT                                        = 3,    /**< Invalid DBRu Report. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED                                     = 4,    /**< Key Exchange Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED                                 = 5,    /**< Key Exchange Cycle Skipped. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH                                  = 6,    /**< Key Exchange Key Mismatch. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT                           = 7,    /**< Key Exchange Key Request Timeout. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI                                                      = 8,    /**< LOOCi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED                                   = 9,    /**< ONU Activation Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM                                                  = 10,   /**< ONU Alarm. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED                                 = 11,   /**< ONU Deactivation Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED                                      = 12,   /**< ONU Disable Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED                                       = 13,   /**< ONU Enable Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED                                    = 14,   /**< ONU Tuning in completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED                                   = 15,   /**< ONU Tuning out completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION                                         = 16,   /**< Optical Reflection. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT                                             = 17,   /**< Possible Drift. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT                                   = 18,   /**< Power consumption report. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT                                         = 19,   /**< Power level report. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE                              = 20,   /**< Power Management State Change. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI                                                       = 21,   /**< ploam queue status. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED                                          = 22,   /**< Ranging Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID                                            = 23,   /**< Registration ID. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED                                 = 24,   /**< RSSI Measurement Completed. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI                                                        = 25,   /**< Signal Degraded of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE                       = 26,   /**< secure mutual authentication failure. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI                                                        = 27,   /**< Signal Fail of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED                                         = 28,   /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED                                          = 29,   /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI                                                       = 30,   /**< SUFi. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI                                                       = 31,   /**< Transmission Interference Warning. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE                                            = 32,   /**< Tuning response. */
+    BCMOLT_XGPON_ONU_AUTO_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_auto_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_cfg group. 
+ */
+typedef enum bcmolt_xgpon_onu_cfg_id
+{
+    BCMOLT_XGPON_ONU_CFG_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE                                                       = 0,    /**< onu state. */
+    BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE                                                   = 1,    /**< onu old state. */
+    BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE                                                     = 2,    /**< alarm state. */
+    BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS                                    = 3,    /**< registration encryption keys. */
+    BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY                                          = 4,    /**< current encryption key. */
+    BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER                                                   = 5,    /**< serial number. */
+    BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID                                                 = 6,    /**< registration id. */
+    BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING                                   = 7,    /**< Registration ID auto learning. */
+    BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE                                           = 8,    /**< ranging burst profile. */
+    BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE                                              = 9,    /**< data burst profile. */
+    BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME                                                    = 10,   /**< ranging time. */
+    BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY                                        = 11,   /**< Disabled after Discovery. */
+    BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON                                             = 12,   /**< deactivation reason. */
+    BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS                                                   = 13,   /**< all GEM ports. */
+    BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS                                                      = 14,   /**< all allocs. */
+    BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME                                             = 15,   /**< Extended Guard Time. */
+    BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE                                                    = 16,   /**< US line rate. */
+    BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD                                              = 17,   /**< Calibration record. */
+    BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY                                              = 18,   /**< Tuning granularity. */
+    BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME                                                = 19,   /**< Step tuning time. */
+    BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES                                    = 20,   /**< Power levelling capabilities. */
+    BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS                                     = 21,   /**< Request registration status. */
+    BCMOLT_XGPON_ONU_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_cfg_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_change_power_levelling group. 
+ */
+typedef enum bcmolt_xgpon_onu_change_power_levelling_id
+{
+    BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID__BEGIN                                       = 0,
+    BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL                                      = 0,    /**< control. */
+    BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION                                  = 1,    /**< Attenuation. */
+    BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_change_power_levelling_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_cpu_packet group. 
+ */
+typedef enum bcmolt_xgpon_onu_cpu_packet_id
+{
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID__BEGIN                                                   = 0,
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID                                                  = 0,    /**< port id. */
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK                                                   = 1,    /**< crc ok. */
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE                                              = 2,    /**< packet size. */
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER                                                   = 3,    /**< buffer. */
+    BCMOLT_XGPON_ONU_CPU_PACKET_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_cpu_packet_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_cpu_packets group. 
+ */
+typedef enum bcmolt_xgpon_onu_cpu_packets_id
+{
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID__BEGIN                                                  = 0,
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE                                             = 0,    /**< packet type. */
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC                                                = 1,    /**< calc crc. */
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS                                       = 2,    /**< number of packets. */
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE                                             = 3,    /**< Single packet size. */
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER                                                  = 4,    /**< buffer. */
+    BCMOLT_XGPON_ONU_CPU_PACKETS_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_cpu_packets_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_dfi group. 
+ */
+typedef enum bcmolt_xgpon_onu_dfi_id
+{
+    BCMOLT_XGPON_ONU_DFI_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_DFI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_dfi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_dgi group. 
+ */
+typedef enum bcmolt_xgpon_onu_dgi_id
+{
+    BCMOLT_XGPON_ONU_DGI_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_DGI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_dgi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_dowi group. 
+ */
+typedef enum bcmolt_xgpon_onu_dowi_id
+{
+    BCMOLT_XGPON_ONU_DOWI_ID__BEGIN                                                         = 0,
+    BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS                                                   = 0,    /**< Alarm status. */
+    BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE                                                    = 1,    /**< Drift value. */
+    BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD                                                        = 2,    /**< New EQD. */
+    BCMOLT_XGPON_ONU_DOWI_ID__NUM_OF                    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_dowi_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_get_power_consumption group. 
+ */
+typedef enum bcmolt_xgpon_onu_get_power_consumption_id
+{
+    BCMOLT_XGPON_ONU_GET_POWER_CONSUMPTION_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_get_power_consumption_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_get_power_level 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_get_power_level_id
+{
+    BCMOLT_XGPON_ONU_GET_POWER_LEVEL_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_get_power_level_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_invalid_dbru_report group. 
+ */
+typedef enum bcmolt_xgpon_onu_invalid_dbru_report_id
+{
+    BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID__BEGIN                                          = 0,
+    BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID                                        = 0,    /**< Alloc-ID. */
+    BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_invalid_dbru_report_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_key_exchange_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_key_exchange_completed_id
+{
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID__BEGIN                                       = 0,
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY                                      = 0,    /**< new key. */
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF      /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_key_exchange_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_key_exchange_cycle_skipped group. 
+ */
+typedef enum bcmolt_xgpon_onu_key_exchange_cycle_skipped_id
+{
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_key_exchange_cycle_skipped_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_key_exchange_key_mismatch group. 
+ */
+typedef enum bcmolt_xgpon_onu_key_exchange_key_mismatch_id
+{
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__BEGIN                                    = 0,
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY                              = 0,    /**< expected key. */
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY                              = 1,    /**< received key. */
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF           /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_key_exchange_key_mismatch_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_key_exchange_key_request_timeout group. 
+ */
+typedef enum bcmolt_xgpon_onu_key_exchange_key_request_timeout_id
+{
+    BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_key_exchange_key_request_timeout_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_key group. 
+ */
+typedef enum bcmolt_xgpon_onu_key_id
+{
+    BCMOLT_XGPON_ONU_KEY_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_KEY_ID_PON_NI                                                          = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_ONU_KEY_ID_ONU_ID                                                          = 1,    /**< onu id. */
+    BCMOLT_XGPON_ONU_KEY_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_key_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_looci group. 
+ */
+typedef enum bcmolt_xgpon_onu_looci_id
+{
+    BCMOLT_XGPON_ONU_LOOCI_ID__BEGIN                                                        = 0,
+    BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS                                                  = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_LOOCI_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_looci_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_omci_packet group. 
+ */
+typedef enum bcmolt_xgpon_onu_omci_packet_id
+{
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID__BEGIN                                                  = 0,
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID                                                 = 0,    /**< port id. */
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK                                                  = 1,    /**< crc ok. */
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE                                             = 2,    /**< packet size. */
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER                                                  = 3,    /**< buffer. */
+    BCMOLT_XGPON_ONU_OMCI_PACKET_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_omci_packet_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_activation_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_activation_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID__BEGIN                                     = 0,
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS                                     = 0,    /**< status. */
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON                                = 1,    /**< fail reason. */
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID                            = 2,    /**< registration id. */
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS               = 3,    /**< registration encryption keys. */
+    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_activation_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_onu_alarm group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_alarm_id
+{
+    BCMOLT_XGPON_ONU_ONU_ALARM_ID__BEGIN                                                    = 0,
+    BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM                                                 = 0,    /**< onu alarm. */
+    BCMOLT_XGPON_ONU_ONU_ALARM_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_alarm_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_deactivation_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_deactivation_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__BEGIN                                   = 0,
+    BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS                                   = 0,    /**< Status. */
+    BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_deactivation_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_disable_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_disable_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID__BEGIN                                        = 0,
+    BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER                                 = 0,    /**< serial number. */
+    BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_disable_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_enable_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_enable_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER                                  = 0,    /**< serial number. */
+    BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_enable_completed_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_tuning_in_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_tuning_in_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID__BEGIN                                      = 0,
+    BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT                                      = 0,    /**< result. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON                                 = 1,    /**< fail reason. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_tuning_in_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_onu_tuning_in 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_tuning_in_id
+{
+    BCMOLT_XGPON_ONU_ONU_TUNING_IN_ID__NUM_OF           /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_tuning_in_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_onu_tuning_out_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_tuning_out_completed_id
+{
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID__BEGIN                                     = 0,
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT                                     = 0,    /**< result. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON                                = 1,    /**< fail reason. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_tuning_out_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_onu_tuning_out 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_onu_tuning_out_id
+{
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID__BEGIN                                               = 0,
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID                                     = 0,    /**< target ds pon id. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID                                     = 1,    /**< target us pon id. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH                                       = 2,    /**< time to switch. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK                                             = 3,    /**< rollback. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS                                               = 4,    /**< status. */
+    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID__NUM_OF      /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_onu_tuning_out_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_optical_reflection 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_optical_reflection_id
+{
+    BCMOLT_XGPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_optical_reflection_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_ploam_packet 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_ploam_packet_id
+{
+    BCMOLT_XGPON_ONU_PLOAM_PACKET_ID__BEGIN                                                 = 0,
+    BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY                                            = 0,    /**< default key. */
+    BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM                                                  = 1,    /**< ploam. */
+    BCMOLT_XGPON_ONU_PLOAM_PACKET_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_ploam_packet_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_possible_drift 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_possible_drift_id
+{
+    BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID__BEGIN                                               = 0,
+    BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS                                         = 0,    /**< Alarm Status. */
+    BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT                                      = 1,    /**< Estimated Drift. */
+    BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_possible_drift_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_power_consumption_report group. 
+ */
+typedef enum bcmolt_xgpon_onu_power_consumption_report_id
+{
+    BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID__BEGIN                                     = 0,
+    BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT                   = 0,    /**< power consumption report. */
+    BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_power_consumption_report_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_power_level_report 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_power_level_report_id
+{
+    BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID__BEGIN                                           = 0,
+    BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION                                      = 0,    /**< Attenuation. */
+    BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY                       = 1,    /**< Power levelling capability. */
+    BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_power_level_report_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_power_management_state_change group. 
+ */
+typedef enum bcmolt_xgpon_onu_power_management_state_change_id
+{
+    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__BEGIN                                = 0,
+    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE                             = 0,    /**< Old State. */
+    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE                             = 1,    /**< New State. */
+    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON                                = 2,    /**< Reason. */
+    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_power_management_state_change_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_pqsi group. 
+ */
+typedef enum bcmolt_xgpon_onu_pqsi_id
+{
+    BCMOLT_XGPON_ONU_PQSI_ID__BEGIN                                                         = 0,
+    BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS                                                   = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_PQSI_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_pqsi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_ranging_completed 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_ranging_completed_id
+{
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID__BEGIN                                            = 0,
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS                                            = 0,    /**< status. */
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON                                       = 1,    /**< fail reason. */
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD                                               = 2,    /**< EQD. */
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS                                  = 3,    /**< number of ploams. */
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL                                       = 4,    /**< power level. */
+    BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_ranging_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_registration_id 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_registration_id_id
+{
+    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID__BEGIN                                              = 0,
+    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID                                     = 0,    /**< Registration ID. */
+    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS                         = 1,    /**< request registration status. */
+    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON                    = 2,    /**< request registration fail reason. */
+    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_registration_id_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_request_registration group. 
+ */
+typedef enum bcmolt_xgpon_onu_request_registration_id
+{
+    BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID__BEGIN                                         = 0,
+    BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG                                       = 0,    /**< SMA flag. */
+    BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_request_registration_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_rssi_measurement_completed group. 
+ */
+typedef enum bcmolt_xgpon_onu_rssi_measurement_completed_id
+{
+    BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__BEGIN                                   = 0,
+    BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS                                   = 0,    /**< status. */
+    BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON                              = 1,    /**< fail reason. */
+    BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_rssi_measurement_completed_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_rssi_measurement 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_rssi_measurement_id
+{
+    BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF            /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_rssi_measurement_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_sdi group. 
+ */
+typedef enum bcmolt_xgpon_onu_sdi_id
+{
+    BCMOLT_XGPON_ONU_SDI_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_SDI_ID_BER                                                             = 1,    /**< BER. */
+    BCMOLT_XGPON_ONU_SDI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_sdi_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_secure_mutual_authentication_failure group. 
+ */
+typedef enum bcmolt_xgpon_onu_secure_mutual_authentication_failure_id
+{
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID__BEGIN                         = 0,
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS                         = 0,    /**< status. */
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON                    = 1,    /**< secure mutual authentication fail reason. */
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_secure_mutual_authentication_failure_id;
+
+/** Identifiers for all properties contained in the 
+ * xgpon_onu_secure_mutual_authentication group. 
+ */
+typedef enum bcmolt_xgpon_onu_secure_mutual_authentication_id
+{
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID__BEGIN                                 = 0,
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY                             = 0,    /**< master key. */
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER                                 = 1,    /**< OMCI data buffer. */
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC                                    = 2,    /**< mic. */
+    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_secure_mutual_authentication_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_set_onu_state 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_set_onu_state_id
+{
+    BCMOLT_XGPON_ONU_SET_ONU_STATE_ID__BEGIN                                                = 0,
+    BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE                                             = 0,    /**< ONU state. */
+    BCMOLT_XGPON_ONU_SET_ONU_STATE_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_set_onu_state_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_sfi group. 
+ */
+typedef enum bcmolt_xgpon_onu_sfi_id
+{
+    BCMOLT_XGPON_ONU_SFI_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS                                                    = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_SFI_ID_BER                                                             = 1,    /**< BER. */
+    BCMOLT_XGPON_ONU_SFI_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_sfi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_stat_alarm_cleared 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_stat_alarm_cleared_id
+{
+    BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID__BEGIN                                           = 0,
+    BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT                                             = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_stat_alarm_cleared_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_stat_alarm_raised 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_stat_alarm_raised_id
+{
+    BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID__BEGIN                                            = 0,
+    BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT                                              = 0,    /**< Statistic ID. */
+    BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_stat_alarm_raised_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_stat_cfg group. 
+ */
+typedef enum bcmolt_xgpon_onu_stat_cfg_id
+{
+    BCMOLT_XGPON_ONU_STAT_CFG_ID__BEGIN                                                     = 0,
+    BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG                                                        = 0,    /**< Configuration. */
+    BCMOLT_XGPON_ONU_STAT_CFG_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_stat_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_stat group. 
+ */
+typedef enum bcmolt_xgpon_onu_stat_id
+{
+    BCMOLT_XGPON_ONU_STAT_ID__BEGIN                                                         = 0,
+    BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT                                                 = 0,    /**< positive drift. */
+    BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT                                                 = 1,    /**< negative drift. */
+    BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION                                       = 2,    /**< delimiter miss detection. */
+    BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS                                                   = 3,    /**< bip32 errors. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS                                                       = 4,    /**< received words. */
+    BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS                                          = 5,    /**< fec corrected symbols. */
+    BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS                                        = 6,    /**< fec corrected codewords. */
+    BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS                                    = 7,    /**< fec uncorrectable codewords. */
+    BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS                                                  = 8,    /**< fec total codewords. */
+    BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS                                             = 9,    /**< fec corrected bits. */
+    BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS                                                = 10,   /**< xgem key error. */
+    BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS                                                      = 11,   /**< xgem loss . */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR                                            = 12,   /**< mic error ploam. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE                                             = 13,   /**< non idle ploam. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI                                                        = 14,   /**< Received OMCI packets. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR                                      = 15,   /**< Received OMCI packets with CRC errors. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES                                                       = 16,   /**< rx bytes. */
+    BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS                                                     = 17,   /**< rx packets. */
+    BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES                                                       = 18,   /**< tx bytes. */
+    BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS                                                     = 19,   /**< tx packets. */
+    BCMOLT_XGPON_ONU_STAT_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_stat_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_sufi group. 
+ */
+typedef enum bcmolt_xgpon_onu_sufi_id
+{
+    BCMOLT_XGPON_ONU_SUFI_ID__BEGIN                                                         = 0,
+    BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS                                                   = 0,    /**< alarm status. */
+    BCMOLT_XGPON_ONU_SUFI_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_sufi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_tiwi group. 
+ */
+typedef enum bcmolt_xgpon_onu_tiwi_id
+{
+    BCMOLT_XGPON_ONU_TIWI_ID__BEGIN                                                         = 0,
+    BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS                                                   = 0,    /**< Alarm status. */
+    BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE                                                    = 1,    /**< Drift value. */
+    BCMOLT_XGPON_ONU_TIWI_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_tiwi_id;
+
+/** Identifiers for all properties contained in the xgpon_onu_tuning_response 
+ * group. 
+ */
+typedef enum bcmolt_xgpon_onu_tuning_response_id
+{
+    BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID__BEGIN                                              = 0,
+    BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK                                                 = 0,    /**< ack. */
+    BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT                                              = 1,    /**< result. */
+    BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_tuning_response_id;
+
+/** Identifiers for all properties contained in the xgpon_trx_cfg group. 
+ */
+typedef enum bcmolt_xgpon_trx_cfg_id
+{
+    BCMOLT_XGPON_TRX_CFG_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE                                                   = 0,    /**< burst profile. */
+    BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG                                              = 1,    /**< transceiver config. */
+    BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE                                                = 2,    /**< trx type. */
+    BCMOLT_XGPON_TRX_CFG_ID_DEBUG                                                           = 3,    /**< debug. */
+    BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG                                              = 4,    /**< rssi normal config. */
+    BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG                                             = 5,    /**< rssi ranging config. */
+    BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION                                            = 6,    /**< serdes configuration. */
+    BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS                              = 7,    /**< burst profile delimiter max errors. */
+    BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT                                     = 8,    /**< ranging sm patterns at init. */
+    BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE                                  = 9,    /**< ranging sm patterns ED failure. */
+    BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS                                               = 10,   /**< reset on del miss. */
+    BCMOLT_XGPON_TRX_CFG_ID_ED_STATE                                                        = 11,   /**< ed state. */
+    BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED                                                       = 12,   /**< invert ED. */
+    BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET                                              = 13,   /**< end of burst reset. */
+    BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY                                                = 14,   /**< TRX reset polarity. */
+    BCMOLT_XGPON_TRX_CFG_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_trx_cfg_id;
+
+/** Identifiers for all properties contained in the xgpon_trx_key group. 
+ */
+typedef enum bcmolt_xgpon_trx_key_id
+{
+    BCMOLT_XGPON_TRX_KEY_ID__BEGIN                                                          = 0,
+    BCMOLT_XGPON_TRX_KEY_ID_PON_NI                                                          = 0,    /**< PON network interface. */
+    BCMOLT_XGPON_TRX_KEY_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_trx_key_id;
+
+/** Identifiers for all properties contained in the xpon_serdes_cfg group. 
+ */
+typedef enum bcmolt_xpon_serdes_cfg_id
+{
+    BCMOLT_XPON_SERDES_CFG_ID__BEGIN                                                        = 0,
+    BCMOLT_XPON_SERDES_CFG_ID_RX_VGA                                                        = 0,    /**< Rx Vga. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_PF                                                         = 1,    /**< Rx PF. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF                                                       = 2,    /**< Rx LFPF. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1                                                       = 3,    /**< Rx DFE1. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2                                                       = 4,    /**< Rx DFE2. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3                                                       = 5,    /**< Rx DFE3. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4                                                       = 6,    /**< Rx DFE4. */
+    BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5                                                       = 7,    /**< Rx DFE5. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_PRE                                                        = 8,    /**< Tx Pre. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN                                                       = 9,    /**< Tx Main. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_POST1                                                      = 10,   /**< Tx Post1. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_POST2                                                      = 11,   /**< Tx Post2. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_POST3                                                      = 12,   /**< Tx Post3. */
+    BCMOLT_XPON_SERDES_CFG_ID_TX_AMP                                                        = 13,   /**< Tx Amp. */
+    BCMOLT_XPON_SERDES_CFG_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xpon_serdes_cfg_id;
+
+/** Identifiers for all properties contained in the xpon_serdes_key group. 
+ */
+typedef enum bcmolt_xpon_serdes_key_id
+{
+    BCMOLT_XPON_SERDES_KEY_ID__BEGIN                                                        = 0,
+    BCMOLT_XPON_SERDES_KEY_ID_PON_NI                                                        = 0,    /**< PON NI. */
+    BCMOLT_XPON_SERDES_KEY_ID_INSTANCE                                                      = 1,    /**< Instance. */
+    BCMOLT_XPON_SERDES_KEY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_xpon_serdes_key_id;
+
+/** All object tags for all objects in the system. 
+ */
+typedef enum bcmolt_obj_tag
+{
+    BCMOLT_OBJ_TAG__BEGIN,
+    BCMOLT_OBJ_TAG_EPON                                                                     = 0,
+    BCMOLT_OBJ_TAG_AE,
+    BCMOLT_OBJ_TAG_GPON,
+    BCMOLT_OBJ_TAG_XGPON,
+    BCMOLT_OBJ_TAG__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_obj_tag;
+
+/* The following config modes are enabled for this build */
+#define BCMOLT_CONFIG_MODE_EPON 1
+
+/* The following config modes are enabled for this build */
+#define BCMOLT_CONFIG_MODE_AE   1
+
+/* The following config modes are enabled for this build */
+#define BCMOLT_CONFIG_MODE_GPON 1
+
+/* The following config modes are enabled for this build */
+#define BCMOLT_CONFIG_MODE_XGPON    1
+
+/** Identifiers for all objects in the system. 
+ */
+typedef enum bcmolt_obj_id
+{
+    BCMOLT_OBJ_ID__BEGIN,
+    BCMOLT_OBJ_ID_AE_NI                                                                     = 0,    /**< AE NI (Active Ethernet Network Interface) */
+    BCMOLT_OBJ_ID_AE_PATH_DS                                                                = 1,    /**< AE path downstream */
+    BCMOLT_OBJ_ID_AE_PATH_US                                                                = 2,    /**< AE path upstream */
+    BCMOLT_OBJ_ID_CHANNEL                                                                   = 3,    /**< Channel */
+    BCMOLT_OBJ_ID_DEBUG                                                                     = 4,    /**< Debug */
+    BCMOLT_OBJ_ID_DEVICE                                                                    = 5,    /**< Device */
+    BCMOLT_OBJ_ID_EPON_DENIED_LINK                                                          = 6,    /**< EPON Denied Link */
+    BCMOLT_OBJ_ID_EPON_LINK                                                                 = 7,    /**< EPON link */
+    BCMOLT_OBJ_ID_EPON_NI                                                                   = 8,    /**< EPON NI (EPON Network Interface) */
+    BCMOLT_OBJ_ID_EPON_ONU_10G_US                                                           = 9,    /**< EPON ONU 10G US */
+    BCMOLT_OBJ_ID_EPON_ONU_1G_US                                                            = 10,   /**< EPON ONU 1G US */
+    BCMOLT_OBJ_ID_EPON_PATH_10G_DS                                                          = 11,   /**< EPON path 10G downstream */
+    BCMOLT_OBJ_ID_EPON_PATH_10G_US                                                          = 12,   /**< EPON path 10G upstream */
+    BCMOLT_OBJ_ID_EPON_PATH_1G_DS                                                           = 13,   /**< EPON path 1G downstream */
+    BCMOLT_OBJ_ID_EPON_PATH_1G_US                                                           = 14,   /**< EPON path 1G upstream */
+    BCMOLT_OBJ_ID_EPON_RP                                                                   = 15,   /**< EPON Reconciliation Path */
+    BCMOLT_OBJ_ID_GPIO                                                                      = 16,   /**< GPIO */
+    BCMOLT_OBJ_ID_GPON_ALLOC                                                                = 17,   /**< GPON Alloc */
+    BCMOLT_OBJ_ID_GPON_GEM_PORT                                                             = 18,   /**< GPON GEM Port */
+    BCMOLT_OBJ_ID_GPON_IWF                                                                  = 19,   /**< GPON IWF */
+    BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW                                                   = 20,   /**< GPON IWF DS egress flow */
+    BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW                                                  = 21,   /**< GPON IWF DS ingress flow */
+    BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE                                                        = 22,   /**< GPON IWF MAC table */
+    BCMOLT_OBJ_ID_GPON_IWF_US_FLOW                                                          = 23,   /**< GPON IWF US flow */
+    BCMOLT_OBJ_ID_GPON_NI                                                                   = 24,   /**< GPON network interface */
+    BCMOLT_OBJ_ID_GPON_ONU                                                                  = 25,   /**< GPON ONU */
+    BCMOLT_OBJ_ID_GPON_TRX                                                                  = 26,   /**< GPON TRX */
+    BCMOLT_OBJ_ID_LOG_ENTRY                                                                 = 27,   /**< log entry */
+    BCMOLT_OBJ_ID_LOGGER                                                                    = 28,   /**< logger */
+    BCMOLT_OBJ_ID_NNI                                                                       = 29,   /**< NNI */
+    BCMOLT_OBJ_ID_NNI_SERDES                                                                = 30,   /**< nni_serdes */
+    BCMOLT_OBJ_ID_SOFTWARE_ERROR                                                            = 31,   /**< Software Error */
+    BCMOLT_OBJ_ID_TRX_CALIBRATION                                                           = 32,   /**< TRX Calibration */
+    BCMOLT_OBJ_ID_XGPON_ALLOC                                                               = 33,   /**< XGPON Alloc */
+    BCMOLT_OBJ_ID_XGPON_GEM_PORT                                                            = 34,   /**< XGPON GEM port */
+    BCMOLT_OBJ_ID_XGPON_IWF                                                                 = 35,   /**< XGPON IWF */
+    BCMOLT_OBJ_ID_XGPON_NI                                                                  = 36,   /**< XGPON network interface */
+    BCMOLT_OBJ_ID_XGPON_ONU                                                                 = 37,   /**< XGPON ONU */
+    BCMOLT_OBJ_ID_XGPON_TRX                                                                 = 38,   /**< XGPON TRX */
+    BCMOLT_OBJ_ID_XPON_SERDES                                                               = 39,   /**< xpon_serdes */
+    BCMOLT_OBJ_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_obj_id;
+
+/** Identifiers for all possible groups under all objects in the system. 
+ */
+typedef enum bcmolt_group_id
+{
+    BCMOLT_GROUP_ID__BEGIN,
+    BCMOLT_GROUP_ID_AE_NI_KEY                                                               = 0,    /**< AE NI (Active Ethernet Network Interface) - key */
+    BCMOLT_GROUP_ID_AE_NI_CFG                                                               = 1,    /**< AE NI (Active Ethernet Network Interface) - cfg */
+    BCMOLT_GROUP_ID_AE_NI_SET_AE_NI_EN_STATE                                                = 2,    /**< AE NI (Active Ethernet Network Interface) - Set AE NI Enable State */
+    BCMOLT_GROUP_ID_AE_PATH_DS_KEY                                                          = 3,    /**< AE path downstream - key */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT                                                         = 4,    /**< AE path downstream - stat */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_BYTES                                               = 5,    /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES                                              = 6,    /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_64                                           = 7,    /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_65_127                                       = 8,    /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_128_255                                      = 9,    /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_256_511                                      = 10,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_512_1023                                     = 11,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_1024_1518                                    = 12,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_1519_2047                                    = 13,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_2048_4095                                    = 14,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_4096_9216                                    = 15,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_9217_16383                                   = 16,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_BROADCAST_FRAMES                                    = 17,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_DATA_BYTES                                          = 18,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_MULTICAST_FRAMES                                    = 19,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_UNICAST_FRAMES                                      = 20,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_ABORT_FRAMES                                        = 21,   /**< AE path downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_ALARM_CLEARED                                           = 22,   /**< AE path downstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_AE_PATH_DS_STAT_ALARM_RAISED                                            = 23,   /**< AE path downstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_AE_PATH_DS_AUTO_CFG                                                     = 24,   /**< AE path downstream - Indication Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_KEY                                                          = 25,   /**< AE path upstream - key */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT                                                         = 26,   /**< AE path upstream - stat */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_BYTES                                               = 27,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES                                              = 28,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_64                                           = 29,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_65_127                                       = 30,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_128_255                                      = 31,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_256_511                                      = 32,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_512_1023                                     = 33,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_1024_1518                                    = 34,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_1519_2047                                    = 35,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_2048_4095                                    = 36,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_4096_9216                                    = 37,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_9217_16383                                   = 38,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_BROADCAST_FRAMES                                    = 39,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_DATA_BYTES                                          = 40,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_MULTICAST_FRAMES                                    = 41,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_UNICAST_FRAMES                                      = 42,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_ABORT_FRAMES                                        = 43,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FCS_ERROR                                           = 44,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_OVERSIZE_ERROR                                      = 45,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_RUNT_ERROR                                          = 46,   /**< AE path upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_ALARM_CLEARED                                           = 47,   /**< AE path upstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_AE_PATH_US_STAT_ALARM_RAISED                                            = 48,   /**< AE path upstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_AE_PATH_US_AUTO_CFG                                                     = 49,   /**< AE path upstream - Indication Configuration */
+    BCMOLT_GROUP_ID_CHANNEL_KEY                                                             = 50,   /**< Channel - key */
+    BCMOLT_GROUP_ID_CHANNEL_CFG                                                             = 51,   /**< Channel - cfg */
+    BCMOLT_GROUP_ID_DEBUG_KEY                                                               = 52,   /**< Debug - key */
+    BCMOLT_GROUP_ID_DEBUG_CFG                                                               = 53,   /**< Debug - cfg */
+    BCMOLT_GROUP_ID_DEBUG_CLI_OUTPUT                                                        = 54,   /**< Debug - cli_output */
+    BCMOLT_GROUP_ID_DEBUG_FILE_ALMOST_FULL                                                  = 55,   /**< Debug - file_almost_full */
+    BCMOLT_GROUP_ID_DEBUG_AUTO_CFG                                                          = 56,   /**< Debug - Indication Configuration */
+    BCMOLT_GROUP_ID_DEBUG_CLI_INPUT                                                         = 57,   /**< Debug - CLI_input */
+    BCMOLT_GROUP_ID_DEBUG_RESET_API_CAPTURE                                                 = 58,   /**< Debug - Reset API Capture */
+    BCMOLT_GROUP_ID_DEBUG_START_API_CAPTURE                                                 = 59,   /**< Debug - Start API Capture */
+    BCMOLT_GROUP_ID_DEBUG_STOP_API_CAPTURE                                                  = 60,   /**< Debug - Stop API Capture */
+    BCMOLT_GROUP_ID_DEVICE_KEY                                                              = 61,   /**< Device - key */
+    BCMOLT_GROUP_ID_DEVICE_CFG                                                              = 62,   /**< Device - cfg */
+    BCMOLT_GROUP_ID_DEVICE_CONNECTION_COMPLETE                                              = 63,   /**< Device - Connection Complete */
+    BCMOLT_GROUP_ID_DEVICE_CONNECTION_ESTABLISHED                                           = 64,   /**< Device - Connection Established (Internal) */
+    BCMOLT_GROUP_ID_DEVICE_CONNECTION_FAILURE                                               = 65,   /**< Device - Connection Failure */
+    BCMOLT_GROUP_ID_DEVICE_DDR_TEST_COMPLETE                                                = 66,   /**< Device - DDR Test Complete */
+    BCMOLT_GROUP_ID_DEVICE_DEVICE_KEEP_ALIVE                                                = 67,   /**< Device - Device Keep Alive (Internal) */
+    BCMOLT_GROUP_ID_DEVICE_DEVICE_READY                                                     = 68,   /**< Device - Device Ready (Internal) */
+    BCMOLT_GROUP_ID_DEVICE_DISCONNECTION_COMPLETE                                           = 69,   /**< Device - Disconnection Complete */
+    BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_COMPLETE                                          = 70,   /**< Device - Image Transfer Complete */
+    BCMOLT_GROUP_ID_DEVICE_INDICATIONS_DROPPED                                              = 71,   /**< Device - Indications Dropped */
+    BCMOLT_GROUP_ID_DEVICE_SW_ERROR                                                         = 72,   /**< Device - sw error */
+    BCMOLT_GROUP_ID_DEVICE_SW_EXCEPTION                                                     = 73,   /**< Device - sw exception */
+    BCMOLT_GROUP_ID_DEVICE_AUTO_CFG                                                         = 74,   /**< Device - Indication Configuration */
+    BCMOLT_GROUP_ID_DEVICE_CONNECT                                                          = 75,   /**< Device - Connect */
+    BCMOLT_GROUP_ID_DEVICE_DISCONNECT                                                       = 76,   /**< Device - Device Disconnect */
+    BCMOLT_GROUP_ID_DEVICE_HOST_KEEP_ALIVE                                                  = 77,   /**< Device - Host Keep Alive (Internal) */
+    BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_DATA                                              = 78,   /**< Device - Image Data Transfer Operation (Internal) */
+    BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_START                                             = 79,   /**< Device - Start Image Transfer Operation */
+    BCMOLT_GROUP_ID_DEVICE_RESET                                                            = 80,   /**< Device - Device Reset */
+    BCMOLT_GROUP_ID_DEVICE_RUN_DDR_TEST                                                     = 81,   /**< Device - Run DDR Test */
+    BCMOLT_GROUP_ID_DEVICE_SW_UPGRADE_ACTIVATE                                              = 82,   /**< Device - SW upgrade activate */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_KEY                                                    = 83,   /**< EPON Denied Link - key */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_CFG                                                    = 84,   /**< EPON Denied Link - cfg */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION                                 = 85,   /**< EPON Denied Link - Laser On/Off Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION                              = 86,   /**< EPON Denied Link - LLID Pool Empty Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_MAX_LINK_VIOLATION                                     = 87,   /**< EPON Denied Link - Max Link Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION                             = 88,   /**< EPON Denied Link - Overhead Profile Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_RANGE_VIOLATION                                        = 89,   /**< EPON Denied Link - Range Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_ROGUE_VIOLATION                                        = 90,   /**< EPON Denied Link - Rogue ONU Detected */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION                              = 91,   /**< EPON Denied Link - System Resource Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED                                 = 92,   /**< EPON Denied Link - TDM Channels Exhausted */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION                                 = 93,   /**< EPON Denied Link - Unknown Link Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION                           = 94,   /**< EPON Denied Link - Upstream Bandwidth Violation */
+    BCMOLT_GROUP_ID_EPON_DENIED_LINK_AUTO_CFG                                               = 95,   /**< EPON Denied Link - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY                                                           = 96,   /**< EPON link - key */
+    BCMOLT_GROUP_ID_EPON_LINK_CFG                                                           = 97,   /**< EPON link - cfg */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT                                                          = 98,   /**< EPON link - stat */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_DATA_BYTES                                        = 99,   /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_DATA_FRAMES                                       = 100,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_64                                         = 101,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_65_127                                     = 102,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_128_255                                    = 103,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_256_511                                    = 104,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_512_1023                                   = 105,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_1024_1518                                  = 106,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_1519_2047                                  = 107,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_2048_4095                                  = 108,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_4096_9216                                  = 109,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_9217_16383                                 = 110,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OAM_BYTES                                         = 111,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OAM_FRAMES                                        = 112,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_MPCP_FRAMES                                       = 113,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_BROADCAST_FRAMES                                  = 114,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_UNICAST_FRAMES                                    = 115,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_MULTICAST_FRAMES                                  = 116,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_REPORT_FRAMES                                     = 117,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FCS_ERROR                                         = 118,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OVERSIZE_ERROR                                    = 119,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_RUNT_ERROR                                        = 120,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_LINE_CODE_ERROR                                   = 121,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_LINE_CODE_ERROR_MAX                               = 122,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_DATA_BYTES                                        = 123,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_DATA_FRAMES                                       = 124,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_64                                         = 125,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_65_127                                     = 126,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_128_255                                    = 127,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_256_511                                    = 128,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_512_1023                                   = 129,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_1024_1518                                  = 130,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_1519_2047                                  = 131,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_2048_4095                                  = 132,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_4096_9216                                  = 133,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_9217_16383                                 = 134,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_OAM_BYTES                                         = 135,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_OAM_FRAMES                                        = 136,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_MPCP_FRAMES                                       = 137,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_BROADCAST_FRAMES                                  = 138,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_UNICAST_FRAMES                                    = 139,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_MULTICAST_FRAMES                                  = 140,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_GATES                                             = 141,  /**< EPON link - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST                           = 142,  /**< EPON link - Duplicate MPCP Registration Request */
+    BCMOLT_GROUP_ID_EPON_LINK_ENCRYPTION_ENABLED                                            = 143,  /**< EPON link - Encryption Enabled */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_FAILURE                                          = 144,  /**< EPON link - Key Exchange Failure */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STARTED                                          = 145,  /**< EPON link - key_exchange_started */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STOPPED                                          = 146,  /**< EPON link - key_exchange_stopped */
+    BCMOLT_GROUP_ID_EPON_LINK_LINK_DELETED                                                  = 147,  /**< EPON link - Link Deleted */
+    BCMOLT_GROUP_ID_EPON_LINK_LINK_SPEED_MISMATCH                                           = 148,  /**< EPON link - Link attempted to register at a different speed */
+    BCMOLT_GROUP_ID_EPON_LINK_MPCP_DEREGISTERED                                             = 149,  /**< EPON link - MPCP Deregistered */
+    BCMOLT_GROUP_ID_EPON_LINK_MPCP_DISCOVERED                                               = 150,  /**< EPON link - MPCP Discovered */
+    BCMOLT_GROUP_ID_EPON_LINK_MPCP_REG_ACK_TIMEOUT                                          = 151,  /**< EPON link - MPCP Reg Ack Timeout */
+    BCMOLT_GROUP_ID_EPON_LINK_MPCP_REPORT_TIMEOUT                                           = 152,  /**< EPON link - MPCP Report Timeout */
+    BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMEOUT                                         = 153,  /**< EPON link - OAM Keepalive Timeout */
+    BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STARTED                                   = 154,  /**< EPON link - OAM keepalive timer started */
+    BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STOPPED                                   = 155,  /**< EPON link - OAM keepalive timer stopped */
+    BCMOLT_GROUP_ID_EPON_LINK_PREPROVISIONED_LINK_CREATED                                   = 156,  /**< EPON link - Preprovisioned Link Created */
+    BCMOLT_GROUP_ID_EPON_LINK_PROTECTION_SWITCH_OCCURRED                                    = 157,  /**< EPON link - Protection Switch Occurred */
+    BCMOLT_GROUP_ID_EPON_LINK_RANGE_VALUE_CHANGED                                           = 158,  /**< EPON link - Range Value Changed */
+    BCMOLT_GROUP_ID_EPON_LINK_RERANGE_FAILURE                                               = 159,  /**< EPON link - Re-range failure */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_ALARM_CLEARED                                            = 160,  /**< EPON link - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_LINK_STAT_ALARM_RAISED                                             = 161,  /**< EPON link - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_LINK_STATIC_REGISTRATION_DONE                                      = 162,  /**< EPON link - Static registration done */
+    BCMOLT_GROUP_ID_EPON_LINK_AUTO_CFG                                                      = 163,  /**< EPON link - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_LINK_DELETE_LINK                                                   = 164,  /**< EPON link - Delete Link */
+    BCMOLT_GROUP_ID_EPON_LINK_FORCE_REDISCOVERY                                             = 165,  /**< EPON link - Force Link Rediscovery */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_START                                            = 166,  /**< EPON link - Key exchange start */
+    BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STOP                                             = 167,  /**< EPON link - Key exchange stop */
+    BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_START                                     = 168,  /**< EPON link - OAM Keepalive Timer Start */
+    BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STOP                                      = 169,  /**< EPON link - OAM Keepalive Timer Stop */
+    BCMOLT_GROUP_ID_EPON_LINK_STATIC_REGISTRATION                                           = 170,  /**< EPON link - static_registration */
+    BCMOLT_GROUP_ID_EPON_LINK_INJECT_FRAME                                                  = 171,  /**< EPON link - Inject Frame */
+    BCMOLT_GROUP_ID_EPON_LINK_FRAME_CAPTURED                                                = 172,  /**< EPON link - Frame Captured */
+    BCMOLT_GROUP_ID_EPON_NI_KEY                                                             = 173,  /**< EPON NI (EPON Network Interface) - key */
+    BCMOLT_GROUP_ID_EPON_NI_CFG                                                             = 174,  /**< EPON NI (EPON Network Interface) - cfg */
+    BCMOLT_GROUP_ID_EPON_NI_AUTO_ROGUE_SCAN_10G_FAILURE                                     = 175,  /**< EPON NI (EPON Network Interface) - 10G Epon Autonomous Rogue Scan failure detected */
+    BCMOLT_GROUP_ID_EPON_NI_AUTO_ROGUE_SCAN_1G_FAILURE                                      = 176,  /**< EPON NI (EPON Network Interface) - 1G Epon Autonomous Rogue Scan failure detected */
+    BCMOLT_GROUP_ID_EPON_NI_LLID_QUARANTINED                                                = 177,  /**< EPON NI (EPON Network Interface) - LLID Quarantined */
+    BCMOLT_GROUP_ID_EPON_NI_MPCP_TIMESTAMP_CHANGED                                          = 178,  /**< EPON NI (EPON Network Interface) - MPCP Timestamp Changed */
+    BCMOLT_GROUP_ID_EPON_NI_NO_REPORTS                                                      = 179,  /**< EPON NI (EPON Network Interface) - No Reports */
+    BCMOLT_GROUP_ID_EPON_NI_ONU_UPGRADE_COMPLETE                                            = 180,  /**< EPON NI (EPON Network Interface) - ONU Upgrade Complete */
+    BCMOLT_GROUP_ID_EPON_NI_RERANGE_FAILURE                                                 = 181,  /**< EPON NI (EPON Network Interface) - Re-range failure */
+    BCMOLT_GROUP_ID_EPON_NI_ROGUE_SCAN_COMPLETE                                             = 182,  /**< EPON NI (EPON Network Interface) - Rogue Scan is Complete */
+    BCMOLT_GROUP_ID_EPON_NI_RSSI_MEASUREMENT_COMPLETED                                      = 183,  /**< EPON NI (EPON Network Interface) - RSSI Measurement Completed */
+    BCMOLT_GROUP_ID_EPON_NI_STATE_CHANGE_COMPLETED                                          = 184,  /**< EPON NI (EPON Network Interface) - State Change Completed */
+    BCMOLT_GROUP_ID_EPON_NI_AUTO_CFG                                                        = 185,  /**< EPON NI (EPON Network Interface) - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_NI_ADD_LINK                                                        = 186,  /**< EPON NI (EPON Network Interface) - Add link */
+    BCMOLT_GROUP_ID_EPON_NI_ADD_MULTICAST_LINK                                              = 187,  /**< EPON NI (EPON Network Interface) - Add Mutlticastlink */
+    BCMOLT_GROUP_ID_EPON_NI_ADD_PROTECTED_STANDBY_LINK                                      = 188,  /**< EPON NI (EPON Network Interface) - Add Protected Standby Link */
+    BCMOLT_GROUP_ID_EPON_NI_ISSUE_RSSI_GRANT                                                = 189,  /**< EPON NI (EPON Network Interface) - Issue an Rx Power Measurement Request */
+    BCMOLT_GROUP_ID_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA                        = 190,  /**< EPON NI (EPON Network Interface) - Protection switching apply re-range delta */
+    BCMOLT_GROUP_ID_EPON_NI_ROGUE_LLID_SCAN                                                 = 191,  /**< EPON NI (EPON Network Interface) - Run Rogue LLID Scan */
+    BCMOLT_GROUP_ID_EPON_NI_SET_EPON_NI_EN_STATE                                            = 192,  /**< EPON NI (EPON Network Interface) - Set EPON NI Enable State */
+    BCMOLT_GROUP_ID_EPON_NI_START_ONU_UPGRADE                                               = 193,  /**< EPON NI (EPON Network Interface) - Start ONU Firmware Upgrade */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_KEY                                                     = 194,  /**< EPON ONU 10G US - key */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_CFG                                                     = 195,  /**< EPON ONU 10G US - cfg */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT                                                    = 196,  /**< EPON ONU 10G US - stat */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_CODE_WORDS_TOTAL                           = 197,  /**< EPON ONU 10G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_CODE_WORDS_DECODE_FAILS                    = 198,  /**< EPON ONU 10G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_ZEROES_CORRECTED                           = 199,  /**< EPON ONU 10G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_ONES_CORRECTED                             = 200,  /**< EPON ONU 10G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_ALARM_CLEARED                                      = 201,  /**< EPON ONU 10G US - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_ALARM_RAISED                                       = 202,  /**< EPON ONU 10G US - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_ONU_10G_US_AUTO_CFG                                                = 203,  /**< EPON ONU 10G US - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_KEY                                                      = 204,  /**< EPON ONU 1G US - key */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_CFG                                                      = 205,  /**< EPON ONU 1G US - cfg */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT                                                     = 206,  /**< EPON ONU 1G US - stat */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_GOOD_FRAMES                                     = 207,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_GOOD_BYTES                                      = 208,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_OVERSZ_FRAMES                                   = 209,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_NON_FEC_GOOD_FRAMES                             = 210,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_NON_FEC_GOOD_BYTES                              = 211,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_GOOD_FRAMES                                 = 212,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_GOOD_BYTES                                  = 213,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_FRAMES_EXC_ERRS                             = 214,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_NO_ERRS                                = 215,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_CORR_ERRS                              = 216,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_UNCORR_ERRS                            = 217,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_BYTES                                  = 218,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_ZEROES                                 = 219,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_ONES                                   = 220,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_UNDERSZ_FRAMES                                  = 221,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_ERRORSZ_FRAMES                                  = 222,  /**< EPON ONU 1G US - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_ALARM_CLEARED                                       = 223,  /**< EPON ONU 1G US - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_ALARM_RAISED                                        = 224,  /**< EPON ONU 1G US - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_ONU_1G_US_AUTO_CFG                                                 = 225,  /**< EPON ONU 1G US - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_KEY                                                    = 226,  /**< EPON path 10G downstream - key */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_CFG                                                    = 227,  /**< EPON path 10G downstream - cfg */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT                                                   = 228,  /**< EPON path 10G downstream - stat */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_BYTES                                         = 229,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES                                        = 230,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_64                                     = 231,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_65_127                                 = 232,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_128_255                                = 233,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_256_511                                = 234,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_512_1023                               = 235,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_1024_1518                              = 236,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_1519_2047                              = 237,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_2048_4095                              = 238,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_4096_9216                              = 239,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_9217_16383                             = 240,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_BROADCAST_FRAMES                              = 241,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_DATA_BYTES                                    = 242,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_MULTICAST_FRAMES                              = 243,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_UNICAST_FRAMES                                = 244,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_OAM_BYTES                                     = 245,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_OAM_FRAMES                                    = 246,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_GATE_FRAMES                                   = 247,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_MPCP_FRAMES                                   = 248,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_ABORT_FRAMES                                  = 249,  /**< EPON path 10G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_ALARM_CLEARED                                     = 250,  /**< EPON path 10G downstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_ALARM_RAISED                                      = 251,  /**< EPON path 10G downstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_DS_AUTO_CFG                                               = 252,  /**< EPON path 10G downstream - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_KEY                                                    = 253,  /**< EPON path 10G upstream - key */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_CFG                                                    = 254,  /**< EPON path 10G upstream - cfg */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT                                                   = 255,  /**< EPON path 10G upstream - stat */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_BYTES                                         = 256,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES                                        = 257,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_64                                     = 258,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_65_127                                 = 259,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_128_255                                = 260,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_256_511                                = 261,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_512_1023                               = 262,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_1024_1518                              = 263,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_1519_2047                              = 264,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_2048_4095                              = 265,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_4096_9216                              = 266,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_9217_16383                             = 267,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_BROADCAST_FRAMES                              = 268,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_DATA_BYTES                                    = 269,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_MULTICAST_FRAMES                              = 270,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_UNICAST_FRAMES                                = 271,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_MPCP_FRAMES                                   = 272,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OAM_BYTES                                     = 273,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OAM_FRAMES                                    = 274,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_REPORT_FRAMES                                 = 275,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_ABORT_FRAMES                                  = 276,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FCS_ERROR                                     = 277,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_CRC_8_ERROR                                   = 278,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OUT_OF_SLOT                                   = 279,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OVERSIZE_ERROR                                = 280,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_RUNT_ERROR                                    = 281,  /**< EPON path 10G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_ALARM_CLEARED                                     = 282,  /**< EPON path 10G upstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_ALARM_RAISED                                      = 283,  /**< EPON path 10G upstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_PATH_10G_US_AUTO_CFG                                               = 284,  /**< EPON path 10G upstream - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_KEY                                                     = 285,  /**< EPON path 1G downstream - key */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_CFG                                                     = 286,  /**< EPON path 1G downstream - cfg */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT                                                    = 287,  /**< EPON path 1G downstream - stat */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_BYTES                                          = 288,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES                                         = 289,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_64                                      = 290,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_65_127                                  = 291,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_128_255                                 = 292,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_256_511                                 = 293,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_512_1023                                = 294,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_1024_1518                               = 295,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_1519_2047                               = 296,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_2048_4095                               = 297,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_4096_9216                               = 298,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_9217_16383                              = 299,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_BROADCAST_FRAMES                               = 300,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_DATA_BYTES                                     = 301,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_MULTICAST_FRAMES                               = 302,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_UNICAST_FRAMES                                 = 303,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_OAM_BYTES                                      = 304,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_OAM_FRAMES                                     = 305,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_GATE_FRAMES                                    = 306,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_MPCP_FRAMES                                    = 307,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_ABORT_FRAMES                                   = 308,  /**< EPON path 1G downstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_ALARM_CLEARED                                      = 309,  /**< EPON path 1G downstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_ALARM_RAISED                                       = 310,  /**< EPON path 1G downstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_DS_AUTO_CFG                                                = 311,  /**< EPON path 1G downstream - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_KEY                                                     = 312,  /**< EPON path 1G upstream - key */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_CFG                                                     = 313,  /**< EPON path 1G upstream - cfg */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT                                                    = 314,  /**< EPON path 1G upstream - stat */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_BYTES                                          = 315,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES                                         = 316,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_64                                      = 317,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_65_127                                  = 318,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_128_255                                 = 319,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_256_511                                 = 320,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_512_1023                                = 321,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_1024_1518                               = 322,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_1519_2047                               = 323,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_2048_4095                               = 324,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_4096_9216                               = 325,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_9217_16383                              = 326,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_BROADCAST_FRAMES                               = 327,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_DATA_BYTES                                     = 328,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_MULTICAST_FRAMES                               = 329,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_UNICAST_FRAMES                                 = 330,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_MPCP_FRAMES                                    = 331,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OAM_BYTES                                      = 332,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OAM_FRAMES                                     = 333,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_REPORT_FRAMES                                  = 334,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_ABORT_FRAMES                                   = 335,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FCS_ERROR                                      = 336,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_CRC_8_ERROR                                    = 337,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OUT_OF_SLOT                                    = 338,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OVERSIZE_ERROR                                 = 339,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_RUNT_ERROR                                     = 340,  /**< EPON path 1G upstream - Statistic Configuration */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_ALARM_CLEARED                                      = 341,  /**< EPON path 1G upstream - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_ALARM_RAISED                                       = 342,  /**< EPON path 1G upstream - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_EPON_PATH_1G_US_AUTO_CFG                                                = 343,  /**< EPON path 1G upstream - Indication Configuration */
+    BCMOLT_GROUP_ID_EPON_RP_KEY                                                             = 344,  /**< EPON Reconciliation Path - key */
+    BCMOLT_GROUP_ID_EPON_RP_CFG                                                             = 345,  /**< EPON Reconciliation Path - cfg */
+    BCMOLT_GROUP_ID_GPIO_KEY                                                                = 346,  /**< GPIO - key */
+    BCMOLT_GROUP_ID_GPIO_CFG                                                                = 347,  /**< GPIO - cfg */
+    BCMOLT_GROUP_ID_GPON_ALLOC_KEY                                                          = 348,  /**< GPON Alloc - key */
+    BCMOLT_GROUP_ID_GPON_ALLOC_CFG                                                          = 349,  /**< GPON Alloc - cfg */
+    BCMOLT_GROUP_ID_GPON_ALLOC_STAT                                                         = 350,  /**< GPON Alloc - stat */
+    BCMOLT_GROUP_ID_GPON_ALLOC_STAT_CFG_RX_BYTES                                            = 351,  /**< GPON Alloc - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ALLOC_CONFIGURATION_COMPLETED                                      = 352,  /**< GPON Alloc - Configuration Completed */
+    BCMOLT_GROUP_ID_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED                                    = 353,  /**< GPON Alloc - Get alloc ID statistics completed */
+    BCMOLT_GROUP_ID_GPON_ALLOC_STAT_ALARM_CLEARED                                           = 354,  /**< GPON Alloc - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_GPON_ALLOC_STAT_ALARM_RAISED                                            = 355,  /**< GPON Alloc - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_GPON_ALLOC_AUTO_CFG                                                     = 356,  /**< GPON Alloc - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_ALLOC_GET_STATS                                                    = 357,  /**< GPON Alloc - Get statistics */
+    BCMOLT_GROUP_ID_GPON_ALLOC_SET_STATE                                                    = 358,  /**< GPON Alloc - Set state */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_KEY                                                       = 359,  /**< GPON GEM Port - key */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_CFG                                                       = 360,  /**< GPON GEM Port - cfg */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT                                                      = 361,  /**< GPON GEM Port - stat */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_RX_PACKETS                                       = 362,  /**< GPON GEM Port - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_RX_BYTES                                         = 363,  /**< GPON GEM Port - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_TX_PACKETS                                       = 364,  /**< GPON GEM Port - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_TX_BYTES                                         = 365,  /**< GPON GEM Port - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_CONFIGURATION_COMPLETED                                   = 366,  /**< GPON GEM Port - Configuration Completed */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_ALARM_CLEARED                                        = 367,  /**< GPON GEM Port - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_ALARM_RAISED                                         = 368,  /**< GPON GEM Port - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_AUTO_CFG                                                  = 369,  /**< GPON GEM Port - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_GEM_PORT_SET_STATE                                                 = 370,  /**< GPON GEM Port - Set state */
+    BCMOLT_GROUP_ID_GPON_IWF_KEY                                                            = 371,  /**< GPON IWF - key */
+    BCMOLT_GROUP_ID_GPON_IWF_CFG                                                            = 372,  /**< GPON IWF - cfg */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT                                                           = 373,  /**< GPON IWF - stat */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_HIT_EVENT                                          = 374,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_MISS_EVENT                                         = 375,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_DUE_TO_MISS_EVENT                             = 376,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_DUE_TO_HIT_EVENT                              = 377,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_TO_DISABLED_GEM                               = 378,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_NEW_MAC_DISCOVERED                                    = 379,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_MOVE_EVENT                                            = 380,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_NEW_MAC_DROP_DUE_TO_FIFO_FULL                         = 381,  /**< GPON IWF - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_FLUSH_MAC_TABLE_COMPLETED                                      = 382,  /**< GPON IWF - Flush MAC Table Completed */
+    BCMOLT_GROUP_ID_GPON_IWF_SCAN_MAC_TABLE_COMPLETED                                       = 383,  /**< GPON IWF - Scan MAC Table Completed */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_ALARM_CLEARED                                             = 384,  /**< GPON IWF - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_GPON_IWF_STAT_ALARM_RAISED                                              = 385,  /**< GPON IWF - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_GPON_IWF_AUTO_CFG                                                       = 386,  /**< GPON IWF - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_FLUSH_MAC_TABLE                                                = 387,  /**< GPON IWF - Flush MAC Table */
+    BCMOLT_GROUP_ID_GPON_IWF_SCAN_MAC_TABLE                                                 = 388,  /**< GPON IWF - Scan MAC Table */
+    BCMOLT_GROUP_ID_GPON_IWF_DS_EGRESS_FLOW_KEY                                             = 389,  /**< GPON IWF DS egress flow - key */
+    BCMOLT_GROUP_ID_GPON_IWF_DS_EGRESS_FLOW_CFG                                             = 390,  /**< GPON IWF DS egress flow - cfg */
+    BCMOLT_GROUP_ID_GPON_IWF_DS_INGRESS_FLOW_KEY                                            = 391,  /**< GPON IWF DS ingress flow - key */
+    BCMOLT_GROUP_ID_GPON_IWF_DS_INGRESS_FLOW_CFG                                            = 392,  /**< GPON IWF DS ingress flow - cfg */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_KEY                                                  = 393,  /**< GPON IWF MAC table - key */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_CFG                                                  = 394,  /**< GPON IWF MAC table - cfg */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_AGED                                             = 395,  /**< GPON IWF MAC table - MAC Aged */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_DROPPED                                          = 396,  /**< GPON IWF MAC table - MAC Dropped */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_MOVE                                             = 397,  /**< GPON IWF MAC table - MAC Move */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_NEW_MAC                                              = 398,  /**< GPON IWF MAC table - New MAC */
+    BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_AUTO_CFG                                             = 399,  /**< GPON IWF MAC table - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_IWF_US_FLOW_KEY                                                    = 400,  /**< GPON IWF US flow - key */
+    BCMOLT_GROUP_ID_GPON_IWF_US_FLOW_CFG                                                    = 401,  /**< GPON IWF US flow - cfg */
+    BCMOLT_GROUP_ID_GPON_NI_KEY                                                             = 402,  /**< GPON network interface - key */
+    BCMOLT_GROUP_ID_GPON_NI_CFG                                                             = 403,  /**< GPON network interface - cfg */
+    BCMOLT_GROUP_ID_GPON_NI_STAT                                                            = 404,  /**< GPON network interface - stat */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_FEC_CODEWORDS                                          = 405,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_FEC_CODEWORDS_UNCORRECTED                              = 406,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_BIP8_BYTES                                             = 407,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_BIP8_ERRORS                                            = 408,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_PACKETS                                         = 409,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_DROPPED                                         = 410,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_IDLE                                            = 411,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_CORRECTED                                       = 412,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_ILLEGAL                                         = 413,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_VALID                                   = 414,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_INVALID                                 = 415,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_DISABLED                                = 416,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS                                              = 417,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_NON_IDLE                                     = 418,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_ERROR                                        = 419,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_DROPPED                                      = 420,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_CPU                                                 = 421,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_OMCI                                                = 422,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR                              = 423,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_DROPPED_TOO_SHORT                                   = 424,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_DROPPED_TOO_LONG                                    = 425,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_CRC_ERRORS                                          = 426,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_KEY_ERRORS                                          = 427,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_FRAGMENTS_ERRORS                                    = 428,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PACKETS_DROPPED                                     = 429,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_GEM                                                 = 430,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_PLOAMS                                              = 431,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_GEM_FRAGMENTS                                       = 432,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_CPU                                                 = 433,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_OMCI                                                = 434,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_CPU_OMCI_PACKETS_DROPPED                            = 435,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_ILLEGAL_LENGTH                              = 436,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_TPID_MISS                                   = 437,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_VID_MISS                                    = 438,  /**< GPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_ACTIVATE_ALL_ONUS_COMPLETED                                     = 439,  /**< GPON network interface - activate all onus completed */
+    BCMOLT_GROUP_ID_GPON_NI_CPU_PACKETS_FAILURE                                             = 440,  /**< GPON network interface - CPU Packets Failure */
+    BCMOLT_GROUP_ID_GPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED                                   = 441,  /**< GPON network interface - deactivate all onus completed */
+    BCMOLT_GROUP_ID_GPON_NI_DISABLE_ALL_ONUS_COMPLETED                                      = 442,  /**< GPON network interface - disable all onus completed */
+    BCMOLT_GROUP_ID_GPON_NI_ENABLE_ALL_ONUS_COMPLETED                                       = 443,  /**< GPON network interface - enable all onus completed */
+    BCMOLT_GROUP_ID_GPON_NI_LOS                                                             = 444,  /**< GPON network interface - LOS */
+    BCMOLT_GROUP_ID_GPON_NI_ONU_DISCOVERED                                                  = 445,  /**< GPON network interface - ONU Discovered */
+    BCMOLT_GROUP_ID_GPON_NI_ONU_UPGRADE_COMPLETE                                            = 446,  /**< GPON network interface - ONU Upgrade Complete */
+    BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED                                = 447,  /**< GPON network interface - Protection Switching ONUs Ranged */
+    BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED                       = 448,  /**< GPON network interface - Protection Switching Switchover Completed */
+    BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME                             = 449,  /**< GPON network interface - Protection Switching Traffic Resume */
+    BCMOLT_GROUP_ID_GPON_NI_ROGUE_DETECTION_COMPLETED                                       = 450,  /**< GPON network interface - Rogue detection completed */
+    BCMOLT_GROUP_ID_GPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START                               = 451,  /**< GPON network interface - Rogue ONU special map cycle start */
+    BCMOLT_GROUP_ID_GPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START                           = 452,  /**< GPON network interface - Serial Number Acquisition Cycle Start */
+    BCMOLT_GROUP_ID_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED                          = 453,  /**< GPON network interface - Standby PON Monitoring Cycle Completed */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_ALARM_CLEARED                                              = 454,  /**< GPON network interface - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_GPON_NI_STAT_ALARM_RAISED                                               = 455,  /**< GPON network interface - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_GPON_NI_STATE_CHANGE_COMPLETED                                          = 456,  /**< GPON network interface - State Change Completed */
+    BCMOLT_GROUP_ID_GPON_NI_TOD_REQUEST_COMPLETED                                           = 457,  /**< GPON network interface - TOD request completed */
+    BCMOLT_GROUP_ID_GPON_NI_AUTO_CFG                                                        = 458,  /**< GPON network interface - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_NI_DISABLE_SERIAL_NUMBER                                           = 459,  /**< GPON network interface - Disable Serial Number */
+    BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE              = 460,  /**< GPON network interface - protection switching type c set multiple onu state */
+    BCMOLT_GROUP_ID_GPON_NI_RESET                                                           = 461,  /**< GPON network interface - Reset */
+    BCMOLT_GROUP_ID_GPON_NI_ROGUE_DETECTION_WINDOW                                          = 462,  /**< GPON network interface - Rogue Detection Window */
+    BCMOLT_GROUP_ID_GPON_NI_SET_ONU_STATE                                                   = 463,  /**< GPON network interface - Set ONU State */
+    BCMOLT_GROUP_ID_GPON_NI_SET_PON_STATE                                                   = 464,  /**< GPON network interface - Set PON State */
+    BCMOLT_GROUP_ID_GPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING                           = 465,  /**< GPON network interface - Single request for standby PON monitoring */
+    BCMOLT_GROUP_ID_GPON_NI_START_ONU_UPGRADE                                               = 466,  /**< GPON network interface - Start ONU Firmware Upgrade */
+    BCMOLT_GROUP_ID_GPON_NI_TOD_REQUEST                                                     = 467,  /**< GPON network interface - TOD request */
+    BCMOLT_GROUP_ID_GPON_NI_BROADCAST_PLOAM_PACKET                                          = 468,  /**< GPON network interface - Broadcast PLOAM Packet */
+    BCMOLT_GROUP_ID_GPON_NI_CPU_PACKETS                                                     = 469,  /**< GPON network interface - GPON CPU Packets */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY                                                            = 470,  /**< GPON ONU - key */
+    BCMOLT_GROUP_ID_GPON_ONU_CFG                                                            = 471,  /**< GPON ONU - cfg */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT                                                           = 472,  /**< GPON ONU - stat */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS                                         = 473,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_BYTES_CORRECTED                                   = 474,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS_CORRECTED                               = 475,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS_UNCORRECTED                             = 476,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BIP8_BYTES                                            = 477,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BIP8_ERRORS                                           = 478,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PLOAMS_CRC_ERROR                                   = 479,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PLOAMS_NON_IDLE                                    = 480,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_POSITIVE_DRIFT                                        = 481,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_NEGATIVE_DRIFT                                        = 482,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_OMCI                                               = 483,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR                             = 484,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BER_REPORTED                                          = 485,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_UNRECEIVED_BURST                                      = 486,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_LCDG_ERRORS                                           = 487,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RDI_ERRORS                                            = 488,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_BYTES                                              = 489,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PACKETS                                            = 490,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_TX_BYTES                                              = 491,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_TX_PACKETS                                            = 492,  /**< GPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED                           = 493,  /**< GPON ONU - BER Interval Configuration Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_DFI                                                            = 494,  /**< GPON ONU - Receive Dying-Gasp of ONUi */
+    BCMOLT_GROUP_ID_GPON_ONU_DGI                                                            = 495,  /**< GPON ONU - Receive Dying-Gasp of ONUi */
+    BCMOLT_GROUP_ID_GPON_ONU_DOWI                                                           = 496,  /**< GPON ONU - Drift of Window of ONUi */
+    BCMOLT_GROUP_ID_GPON_ONU_ERR                                                            = 497,  /**< GPON ONU - ERR */
+    BCMOLT_GROUP_ID_GPON_ONU_INVALID_DBRU_REPORT                                            = 498,  /**< GPON ONU - Invalid DBRu Report */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_COMPLETED                                         = 499,  /**< GPON ONU - Key Exchange Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED                                     = 500,  /**< GPON ONU - Key Exchange Cycle Skipped */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED                                  = 501,  /**< GPON ONU - Key Exchange Decrypt Required */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH                                      = 502,  /**< GPON ONU - Key Exchange Key Mismatch */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT                               = 503,  /**< GPON ONU - Key Exchange Key Request Timeout */
+    BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX                               = 504,  /**< GPON ONU - Key Exchange Unconsecutive Index */
+    BCMOLT_GROUP_ID_GPON_ONU_LOAI                                                           = 505,  /**< GPON ONU - LOAi */
+    BCMOLT_GROUP_ID_GPON_ONU_LOKI                                                           = 506,  /**< GPON ONU - LOki */
+    BCMOLT_GROUP_ID_GPON_ONU_MEMI                                                           = 507,  /**< GPON ONU - MEMi */
+    BCMOLT_GROUP_ID_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED                           = 508,  /**< GPON ONU - OMCI PORT ID Configuration Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_ACTIVATION_COMPLETED                                       = 509,  /**< GPON ONU - ONU Activation Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED                               = 510,  /**< GPON ONU - onu activation standby completed */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_ALARM                                                      = 511,  /**< GPON ONU - ONU Alarm */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_DEACTIVATION_COMPLETED                                     = 512,  /**< GPON ONU - ONU Deactivation Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_DISABLE_COMPLETED                                          = 513,  /**< GPON ONU - ONU Disable Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_ONU_ENABLE_COMPLETED                                           = 514,  /**< GPON ONU - ONU Enable Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_OPTICAL_REFLECTION                                             = 515,  /**< GPON ONU - Optical Reflection */
+    BCMOLT_GROUP_ID_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED                              = 516,  /**< GPON ONU - Password Authentication Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_PEE                                                            = 517,  /**< GPON ONU - PEE */
+    BCMOLT_GROUP_ID_GPON_ONU_POSSIBLE_DRIFT                                                 = 518,  /**< GPON ONU - Possible Drift */
+    BCMOLT_GROUP_ID_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE                                  = 519,  /**< GPON ONU - Power Management State Change */
+    BCMOLT_GROUP_ID_GPON_ONU_PST                                                            = 520,  /**< GPON ONU - PST */
+    BCMOLT_GROUP_ID_GPON_ONU_RANGING_COMPLETED                                              = 521,  /**< GPON ONU - Ranging Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_REI                                                            = 522,  /**< GPON ONU - REI */
+    BCMOLT_GROUP_ID_GPON_ONU_RSSI_MEASUREMENT_COMPLETED                                     = 523,  /**< GPON ONU - RSSI Measurement Completed */
+    BCMOLT_GROUP_ID_GPON_ONU_SDI                                                            = 524,  /**< GPON ONU - Signal Degraded of ONUi */
+    BCMOLT_GROUP_ID_GPON_ONU_SFI                                                            = 525,  /**< GPON ONU - Signal Fail of ONUi */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_ALARM_CLEARED                                             = 526,  /**< GPON ONU - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_GPON_ONU_STAT_ALARM_RAISED                                              = 527,  /**< GPON ONU - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_GPON_ONU_SUFI                                                           = 528,  /**< GPON ONU - SUFi */
+    BCMOLT_GROUP_ID_GPON_ONU_TIWI                                                           = 529,  /**< GPON ONU - Transmission Interference Warning */
+    BCMOLT_GROUP_ID_GPON_ONU_AUTO_CFG                                                       = 530,  /**< GPON ONU - Indication Configuration */
+    BCMOLT_GROUP_ID_GPON_ONU_CHANGE_POWER_LEVEL                                             = 531,  /**< GPON ONU - Change Power Level */
+    BCMOLT_GROUP_ID_GPON_ONU_RSSI_MEASUREMENT                                               = 532,  /**< GPON ONU - RSSI Measurement */
+    BCMOLT_GROUP_ID_GPON_ONU_SET_ONU_STATE                                                  = 533,  /**< GPON ONU - Set ONU State */
+    BCMOLT_GROUP_ID_GPON_ONU_CPU_PACKETS                                                    = 534,  /**< GPON ONU - GPON CPU Packets */
+    BCMOLT_GROUP_ID_GPON_ONU_PLOAM_PACKET                                                   = 535,  /**< GPON ONU - PLOAM Packet */
+    BCMOLT_GROUP_ID_GPON_ONU_CPU_PACKET                                                     = 536,  /**< GPON ONU - GPON CPU packet */
+    BCMOLT_GROUP_ID_GPON_ONU_OMCI_PACKET                                                    = 537,  /**< GPON ONU - GPON OMCI packet */
+    BCMOLT_GROUP_ID_GPON_TRX_KEY                                                            = 538,  /**< GPON TRX - key */
+    BCMOLT_GROUP_ID_GPON_TRX_CFG                                                            = 539,  /**< GPON TRX - cfg */
+    BCMOLT_GROUP_ID_LOG_ENTRY_KEY                                                           = 540,  /**< log entry - key */
+    BCMOLT_GROUP_ID_LOG_ENTRY_CFG                                                           = 541,  /**< log entry - cfg */
+    BCMOLT_GROUP_ID_LOG_ENTRY_STAT                                                          = 542,  /**< log entry - stat */
+    BCMOLT_GROUP_ID_LOG_ENTRY_STAT_CFG_MSG_COUNT                                            = 543,  /**< log entry - Statistic Configuration */
+    BCMOLT_GROUP_ID_LOG_ENTRY_STAT_CFG_LOST_MSG_COUNT                                       = 544,  /**< log entry - Statistic Configuration */
+    BCMOLT_GROUP_ID_LOG_ENTRY_STAT_ALARM_CLEARED                                            = 545,  /**< log entry - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_LOG_ENTRY_STAT_ALARM_RAISED                                             = 546,  /**< log entry - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_LOG_ENTRY_AUTO_CFG                                                      = 547,  /**< log entry - Indication Configuration */
+    BCMOLT_GROUP_ID_LOGGER_KEY                                                              = 548,  /**< logger - key */
+    BCMOLT_GROUP_ID_LOGGER_CFG                                                              = 549,  /**< logger - cfg */
+    BCMOLT_GROUP_ID_LOGGER_STAT                                                             = 550,  /**< logger - stat */
+    BCMOLT_GROUP_ID_LOGGER_STAT_CFG_LINES_IN_LOG                                            = 551,  /**< logger - Statistic Configuration */
+    BCMOLT_GROUP_ID_LOGGER_STAT_ALARM_CLEARED                                               = 552,  /**< logger - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_LOGGER_STAT_ALARM_RAISED                                                = 553,  /**< logger - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_LOGGER_AUTO_CFG                                                         = 554,  /**< logger - Indication Configuration */
+    BCMOLT_GROUP_ID_LOGGER_CLEAR_LOG                                                        = 555,  /**< logger - clear log */
+    BCMOLT_GROUP_ID_NNI_KEY                                                                 = 556,  /**< NNI - key */
+    BCMOLT_GROUP_ID_NNI_CFG                                                                 = 557,  /**< NNI - cfg */
+    BCMOLT_GROUP_ID_NNI_STAT                                                                = 558,  /**< NNI - stat */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_64                                               = 559,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_65_127                                           = 560,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_128_255                                          = 561,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_256_511                                          = 562,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_512_1023                                         = 563,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_1024_1518                                        = 564,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_1519_2047                                        = 565,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_2048_4095                                        = 566,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_4096_9216                                        = 567,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_9217_16383                                       = 568,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES                                                  = 569,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_BYTES                                                   = 570,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_GOOD_FRAMES                                             = 571,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNICAST_FRAMES                                          = 572,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_MULTICAST_FRAMES                                        = 573,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_BROADCAST_FRAMES                                        = 574,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FCS_ERRORS                                              = 575,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_CONTROL_FRAMES                                          = 576,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PAUSE_FRAMES                                            = 577,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PFC_FRAMES                                              = 578,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNSUPPORTED_OPCODE                                      = 579,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNSUPPORTED_DA                                          = 580,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_ALIGNMENT_ERRORS                                        = 581,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_LENGTH_OUT_OF_RANGE                                     = 582,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_CODE_ERRORS                                             = 583,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_OVERSIZED_FRAMES                                        = 584,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_JABBER_FRAMES                                           = 585,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_MTU_CHECK_ERRORS                                        = 586,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PROMISCUOUS_FRAMES                                      = 587,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_VLAN_FRAMES                                             = 588,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_DOUBLE_VLAN_FRAMES                                      = 589,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_TRUNCATED_FRAMES                                        = 590,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNDERSIZE_FRAMES                                        = 591,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAGMENTED_FRAMES                                       = 592,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_RUNT_FRAMES                                             = 593,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_64                                               = 594,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_65_127                                           = 595,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_128_255                                          = 596,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_256_511                                          = 597,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_512_1023                                         = 598,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_1024_1518                                        = 599,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_1519_2047                                        = 600,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_2048_4095                                        = 601,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_4096_9216                                        = 602,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_9217_16383                                       = 603,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES                                                  = 604,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_BYTES                                                   = 605,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_GOOD_FRAMES                                             = 606,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_UNICAST_FRAMES                                          = 607,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_MULTICAST_FRAMES                                        = 608,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_BROADCAST_FRAMES                                        = 609,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_PAUSE_FRAMES                                            = 610,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_PFC_FRAMES                                              = 611,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_JABBER_FRAMES                                           = 612,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FCS_ERRORS                                              = 613,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_CONTROL_FRAMES                                          = 614,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_OVERSIZE_FRAMES                                         = 615,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAGMENTED_FRAMES                                       = 616,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_ERROR_FRAMES                                            = 617,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_VLAN_FRAMES                                             = 618,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_DOUBLE_VLAN_FRAMES                                      = 619,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_RUNT_FRAMES                                             = 620,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_UNDERRUN_FRAMES                                         = 621,  /**< NNI - Statistic Configuration */
+    BCMOLT_GROUP_ID_NNI_STAT_ALARM_CLEARED                                                  = 622,  /**< NNI - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_NNI_STAT_ALARM_RAISED                                                   = 623,  /**< NNI - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_NNI_STATUS_CHANGED                                                      = 624,  /**< NNI - Status changed */
+    BCMOLT_GROUP_ID_NNI_AUTO_CFG                                                            = 625,  /**< NNI - Indication Configuration */
+    BCMOLT_GROUP_ID_NNI_SERDES_KEY                                                          = 626,  /**< nni_serdes - key */
+    BCMOLT_GROUP_ID_NNI_SERDES_CFG                                                          = 627,  /**< nni_serdes - cfg */
+    BCMOLT_GROUP_ID_SOFTWARE_ERROR_KEY                                                      = 628,  /**< Software Error - key */
+    BCMOLT_GROUP_ID_SOFTWARE_ERROR_CFG                                                      = 629,  /**< Software Error - cfg */
+    BCMOLT_GROUP_ID_TRX_CALIBRATION_KEY                                                     = 630,  /**< TRX Calibration - key */
+    BCMOLT_GROUP_ID_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED                  = 631,  /**< TRX Calibration - Capture window and statistic completed */
+    BCMOLT_GROUP_ID_TRX_CALIBRATION_AUTO_CFG                                                = 632,  /**< TRX Calibration - Indication Configuration */
+    BCMOLT_GROUP_ID_TRX_CALIBRATION_START_CAPTURE_WINDOW                                    = 633,  /**< TRX Calibration - start capture window */
+    BCMOLT_GROUP_ID_TRX_CALIBRATION_STOP_CAPTURE_WINDOW                                     = 634,  /**< TRX Calibration - stop capture window */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_KEY                                                         = 635,  /**< XGPON Alloc - key */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_CFG                                                         = 636,  /**< XGPON Alloc - cfg */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_STAT                                                        = 637,  /**< XGPON Alloc - stat */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_CFG_RX_BYTES                                           = 638,  /**< XGPON Alloc - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_CONFIGURATION_COMPLETED                                     = 639,  /**< XGPON Alloc - Configuration Completed */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED                                   = 640,  /**< XGPON Alloc - Get alloc ID statistics completed */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_ALARM_CLEARED                                          = 641,  /**< XGPON Alloc - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_ALARM_RAISED                                           = 642,  /**< XGPON Alloc - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_AUTO_CFG                                                    = 643,  /**< XGPON Alloc - Indication Configuration */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_GET_STATS                                                   = 644,  /**< XGPON Alloc - Get statistics */
+    BCMOLT_GROUP_ID_XGPON_ALLOC_SET_STATE                                                   = 645,  /**< XGPON Alloc - Set state */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_KEY                                                      = 646,  /**< XGPON GEM port - key */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_CFG                                                      = 647,  /**< XGPON GEM port - cfg */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT                                                     = 648,  /**< XGPON GEM port - stat */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_TX_BYTES                                        = 649,  /**< XGPON GEM port - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_TX_PACKETS                                      = 650,  /**< XGPON GEM port - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_RX_PACKETS                                      = 651,  /**< XGPON GEM port - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_RX_BYTES                                        = 652,  /**< XGPON GEM port - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_ALARM_CLEARED                                       = 653,  /**< XGPON GEM port - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_ALARM_RAISED                                        = 654,  /**< XGPON GEM port - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_XGPON_GEM_PORT_AUTO_CFG                                                 = 655,  /**< XGPON GEM port - Indication Configuration */
+    BCMOLT_GROUP_ID_XGPON_IWF_KEY                                                           = 656,  /**< XGPON IWF - key */
+    BCMOLT_GROUP_ID_XGPON_IWF_CFG                                                           = 657,  /**< XGPON IWF - cfg */
+    BCMOLT_GROUP_ID_XGPON_NI_KEY                                                            = 658,  /**< XGPON network interface - key */
+    BCMOLT_GROUP_ID_XGPON_NI_CFG                                                            = 659,  /**< XGPON network interface - cfg */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT                                                           = 660,  /**< XGPON network interface - stat */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_FEC_CODEWORDS                                         = 661,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_BIP32_BYTES                                           = 662,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_BIP32_ERRORS                                          = 663,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_HEADERS                                       = 664,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_CORRECTED                                     = 665,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_UNCORRECTED                                   = 666,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM                                               = 667,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_DROPPED                                       = 668,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_IDLE                                          = 669,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_CORRECTED                                     = 670,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_CRC_ERROR                                          = 671,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_FRAGMENT_ERROR                                     = 672,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PACKETS_DROPPED                                    = 673,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_DROPPED_TOO_SHORT                                  = 674,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_DROPPED_TOO_LONG                                   = 675,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_KEY_ERROR                                          = 676,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_PLOAMS                                             = 677,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_DROPPED                                     = 678,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_VALID                                  = 679,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_INVALID                                = 680,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_DISABLED                               = 681,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS                                             = 682,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_NON_IDLE                                    = 683,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_ERROR                                       = 684,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_CPU                                                = 685,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_OMCI                                               = 686,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR                             = 687,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_PACKETS                                            = 688,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_XGEM                                               = 689,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_CPU                                                = 690,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_OMCI                                               = 691,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_CPU_OMCI_PACKETS_DROPPED                           = 692,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_ILLEGAL_LENGTH                             = 693,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_TPID_MISS                                  = 694,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_VID_MISS                                   = 695,  /**< XGPON network interface - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_ACTIVATE_ALL_ONUS_COMPLETED                                    = 696,  /**< XGPON network interface - activate all onus completed */
+    BCMOLT_GROUP_ID_XGPON_NI_CPU_PACKETS_FAILURE                                            = 697,  /**< XGPON network interface - CPU Packets Failure */
+    BCMOLT_GROUP_ID_XGPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED                                  = 698,  /**< XGPON network interface - deactivate all onus completed */
+    BCMOLT_GROUP_ID_XGPON_NI_DISABLE_ALL_ONUS_COMPLETED                                     = 699,  /**< XGPON network interface - disable all onus completed */
+    BCMOLT_GROUP_ID_XGPON_NI_ENABLE_ALL_ONUS_COMPLETED                                      = 700,  /**< XGPON network interface - enable all onus completed */
+    BCMOLT_GROUP_ID_XGPON_NI_LOS                                                            = 701,  /**< XGPON network interface - LOS */
+    BCMOLT_GROUP_ID_XGPON_NI_ONU_DISCOVERED                                                 = 702,  /**< XGPON network interface - ONU Discovered */
+    BCMOLT_GROUP_ID_XGPON_NI_ONU_UPGRADE_COMPLETE                                           = 703,  /**< XGPON network interface - ONU Upgrade Complete */
+    BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED                               = 704,  /**< XGPON network interface - Protection Switching ONUs Ranged */
+    BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED                      = 705,  /**< XGPON network interface - Protection Switching Switchover Completed */
+    BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME                            = 706,  /**< XGPON network interface - Protection Switching Traffic Resume */
+    BCMOLT_GROUP_ID_XGPON_NI_ROGUE_DETECTION_COMPLETED                                      = 707,  /**< XGPON network interface - Rogue detection completed */
+    BCMOLT_GROUP_ID_XGPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START                              = 708,  /**< XGPON network interface - Rogue ONU special map cycle start */
+    BCMOLT_GROUP_ID_XGPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START                          = 709,  /**< XGPON network interface - Serial Number Acquisition Cycle Start */
+    BCMOLT_GROUP_ID_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED                         = 710,  /**< XGPON network interface - Standby PON Monitoring Cycle Completed */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_ALARM_CLEARED                                             = 711,  /**< XGPON network interface - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_XGPON_NI_STAT_ALARM_RAISED                                              = 712,  /**< XGPON network interface - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_XGPON_NI_STATE_CHANGE_COMPLETED                                         = 713,  /**< XGPON network interface - State Change Completed */
+    BCMOLT_GROUP_ID_XGPON_NI_TOD_REQUEST_COMPLETED                                          = 714,  /**< XGPON network interface - TOD request completed */
+    BCMOLT_GROUP_ID_XGPON_NI_AUTO_CFG                                                       = 715,  /**< XGPON network interface - Indication Configuration */
+    BCMOLT_GROUP_ID_XGPON_NI_ADJUST_TX_WAVELENGTH                                           = 716,  /**< XGPON network interface - Adjust Tx Wavelengh */
+    BCMOLT_GROUP_ID_XGPON_NI_DISABLE_SERIAL_NUMBER                                          = 717,  /**< XGPON network interface - Disable Serial Number */
+    BCMOLT_GROUP_ID_XGPON_NI_RESET                                                          = 718,  /**< XGPON network interface - Reset */
+    BCMOLT_GROUP_ID_XGPON_NI_ROGUE_DETECTION_WINDOW                                         = 719,  /**< XGPON network interface - Rogue Detection Window */
+    BCMOLT_GROUP_ID_XGPON_NI_RUN_SPECIAL_BW_MAP                                             = 720,  /**< XGPON network interface - Run Special BW Map */
+    BCMOLT_GROUP_ID_XGPON_NI_SET_ONU_STATE                                                  = 721,  /**< XGPON network interface - Set ONU State */
+    BCMOLT_GROUP_ID_XGPON_NI_SET_PON_STATE                                                  = 722,  /**< XGPON network interface - Set PON State */
+    BCMOLT_GROUP_ID_XGPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING                          = 723,  /**< XGPON network interface - Single request standby PON Monitoring */
+    BCMOLT_GROUP_ID_XGPON_NI_START_ONU_UPGRADE                                              = 724,  /**< XGPON network interface - Start ONU Firmware Upgrade */
+    BCMOLT_GROUP_ID_XGPON_NI_TOD_REQUEST                                                    = 725,  /**< XGPON network interface - TOD request */
+    BCMOLT_GROUP_ID_XGPON_NI_BROADCAST_PLOAM_PACKET                                         = 726,  /**< XGPON network interface - Broadcast PLOAM Packet */
+    BCMOLT_GROUP_ID_XGPON_NI_CPU_PACKETS                                                    = 727,  /**< XGPON network interface - XGPON CPU packets */
+    BCMOLT_GROUP_ID_XGPON_ONU_KEY                                                           = 728,  /**< XGPON ONU - key */
+    BCMOLT_GROUP_ID_XGPON_ONU_CFG                                                           = 729,  /**< XGPON ONU - cfg */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT                                                          = 730,  /**< XGPON ONU - stat */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_POSITIVE_DRIFT                                       = 731,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_NEGATIVE_DRIFT                                       = 732,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_DELIMITER_MISS_DETECTION                             = 733,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_BIP32_ERRORS                                         = 734,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_WORDS                                             = 735,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_SYMBOLS                                = 736,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_CODEWORDS                              = 737,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_UNCORRECTABLE_CODEWORDS                          = 738,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CODEWORDS                                        = 739,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_BITS                                   = 740,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_XGEM_KEY_ERRORS                                      = 741,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_XGEM_LOSS                                            = 742,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PLOAMS_MIC_ERROR                                  = 743,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PLOAMS_NON_IDLE                                   = 744,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_OMCI                                              = 745,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR                            = 746,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_BYTES                                             = 747,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PACKETS                                           = 748,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_TX_BYTES                                             = 749,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_TX_PACKETS                                           = 750,  /**< XGPON ONU - Statistic Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_DFI                                                           = 751,  /**< XGPON ONU - Receive Dying-Gasp of ONUi */
+    BCMOLT_GROUP_ID_XGPON_ONU_DGI                                                           = 752,  /**< XGPON ONU - Receive Dying-Gasp of ONUi */
+    BCMOLT_GROUP_ID_XGPON_ONU_DOWI                                                          = 753,  /**< XGPON ONU - Drift of Window of ONUi */
+    BCMOLT_GROUP_ID_XGPON_ONU_INVALID_DBRU_REPORT                                           = 754,  /**< XGPON ONU - Invalid DBRu Report */
+    BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_COMPLETED                                        = 755,  /**< XGPON ONU - Key Exchange Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED                                    = 756,  /**< XGPON ONU - Key Exchange Cycle Skipped */
+    BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH                                     = 757,  /**< XGPON ONU - Key Exchange Key Mismatch */
+    BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT                              = 758,  /**< XGPON ONU - Key Exchange Key Request Timeout */
+    BCMOLT_GROUP_ID_XGPON_ONU_LOOCI                                                         = 759,  /**< XGPON ONU - LOOCi */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_ACTIVATION_COMPLETED                                      = 760,  /**< XGPON ONU - ONU Activation Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_ALARM                                                     = 761,  /**< XGPON ONU - ONU Alarm */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_DEACTIVATION_COMPLETED                                    = 762,  /**< XGPON ONU - ONU Deactivation Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_DISABLE_COMPLETED                                         = 763,  /**< XGPON ONU - ONU Disable Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_ENABLE_COMPLETED                                          = 764,  /**< XGPON ONU - ONU Enable Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_IN_COMPLETED                                       = 765,  /**< XGPON ONU - ONU Tuning in completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_OUT_COMPLETED                                      = 766,  /**< XGPON ONU - ONU Tuning out completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_OPTICAL_REFLECTION                                            = 767,  /**< XGPON ONU - Optical Reflection */
+    BCMOLT_GROUP_ID_XGPON_ONU_POSSIBLE_DRIFT                                                = 768,  /**< XGPON ONU - Possible Drift */
+    BCMOLT_GROUP_ID_XGPON_ONU_POWER_CONSUMPTION_REPORT                                      = 769,  /**< XGPON ONU - Power consumption report */
+    BCMOLT_GROUP_ID_XGPON_ONU_POWER_LEVEL_REPORT                                            = 770,  /**< XGPON ONU - Power level report */
+    BCMOLT_GROUP_ID_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE                                 = 771,  /**< XGPON ONU - Power Management State Change */
+    BCMOLT_GROUP_ID_XGPON_ONU_PQSI                                                          = 772,  /**< XGPON ONU - ploam queue status */
+    BCMOLT_GROUP_ID_XGPON_ONU_RANGING_COMPLETED                                             = 773,  /**< XGPON ONU - Ranging Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_REGISTRATION_ID                                               = 774,  /**< XGPON ONU - Registration ID */
+    BCMOLT_GROUP_ID_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED                                    = 775,  /**< XGPON ONU - RSSI Measurement Completed */
+    BCMOLT_GROUP_ID_XGPON_ONU_SDI                                                           = 776,  /**< XGPON ONU - Signal Degraded of ONUi */
+    BCMOLT_GROUP_ID_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE                          = 777,  /**< XGPON ONU - secure mutual authentication failure */
+    BCMOLT_GROUP_ID_XGPON_ONU_SFI                                                           = 778,  /**< XGPON ONU - Signal Fail of ONUi */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_ALARM_CLEARED                                            = 779,  /**< XGPON ONU - Stat Alarm Cleared */
+    BCMOLT_GROUP_ID_XGPON_ONU_STAT_ALARM_RAISED                                             = 780,  /**< XGPON ONU - Stat Alarm Raised */
+    BCMOLT_GROUP_ID_XGPON_ONU_SUFI                                                          = 781,  /**< XGPON ONU - SUFi */
+    BCMOLT_GROUP_ID_XGPON_ONU_TIWI                                                          = 782,  /**< XGPON ONU - Transmission Interference Warning */
+    BCMOLT_GROUP_ID_XGPON_ONU_TUNING_RESPONSE                                               = 783,  /**< XGPON ONU - Tuning response */
+    BCMOLT_GROUP_ID_XGPON_ONU_AUTO_CFG                                                      = 784,  /**< XGPON ONU - Indication Configuration */
+    BCMOLT_GROUP_ID_XGPON_ONU_ADJUST_TX_WAVELENGTH                                          = 785,  /**< XGPON ONU - Adjust Tx wavelength */
+    BCMOLT_GROUP_ID_XGPON_ONU_CHANGE_POWER_LEVELLING                                        = 786,  /**< XGPON ONU - Change power levelling */
+    BCMOLT_GROUP_ID_XGPON_ONU_GET_POWER_CONSUMPTION                                         = 787,  /**< XGPON ONU - Get power consumption */
+    BCMOLT_GROUP_ID_XGPON_ONU_GET_POWER_LEVEL                                               = 788,  /**< XGPON ONU - Get power level */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_IN                                                 = 789,  /**< XGPON ONU - ONU Tuning in */
+    BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_OUT                                                = 790,  /**< XGPON ONU - ONU Tuning out */
+    BCMOLT_GROUP_ID_XGPON_ONU_REQUEST_REGISTRATION                                          = 791,  /**< XGPON ONU - Request registration */
+    BCMOLT_GROUP_ID_XGPON_ONU_RSSI_MEASUREMENT                                              = 792,  /**< XGPON ONU - RSSI Measurement */
+    BCMOLT_GROUP_ID_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION                                  = 793,  /**< XGPON ONU - Secure mutual authentication */
+    BCMOLT_GROUP_ID_XGPON_ONU_SET_ONU_STATE                                                 = 794,  /**< XGPON ONU - Set ONU State */
+    BCMOLT_GROUP_ID_XGPON_ONU_CPU_PACKETS                                                   = 795,  /**< XGPON ONU - XGPON CPU packets */
+    BCMOLT_GROUP_ID_XGPON_ONU_PLOAM_PACKET                                                  = 796,  /**< XGPON ONU - PLOAM Packet */
+    BCMOLT_GROUP_ID_XGPON_ONU_CPU_PACKET                                                    = 797,  /**< XGPON ONU - XGPON CPU packet */
+    BCMOLT_GROUP_ID_XGPON_ONU_OMCI_PACKET                                                   = 798,  /**< XGPON ONU - XGPON OMCI packet */
+    BCMOLT_GROUP_ID_XGPON_TRX_KEY                                                           = 799,  /**< XGPON TRX - key */
+    BCMOLT_GROUP_ID_XGPON_TRX_CFG                                                           = 800,  /**< XGPON TRX - cfg */
+    BCMOLT_GROUP_ID_XPON_SERDES_KEY                                                         = 801,  /**< xpon_serdes - key */
+    BCMOLT_GROUP_ID_XPON_SERDES_CFG                                                         = 802,  /**< xpon_serdes - cfg */
+    BCMOLT_GROUP_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_group_id;
+
+/** List of all ae_ni groups of type oper. 
+ */
+typedef enum bcmolt_ae_ni_oper_id
+{
+    BCMOLT_AE_NI_OPER_ID__BEGIN,
+    BCMOLT_AE_NI_OPER_ID_SET_AE_NI_EN_STATE                                                 = 0,    /**< Set AE NI Enable State. */
+    BCMOLT_AE_NI_OPER_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_ni_oper_id;
+
+/** List of all ae_path_ds groups of type auto. 
+ */
+typedef enum bcmolt_ae_path_ds_auto_id
+{
+    BCMOLT_AE_PATH_DS_AUTO_ID__BEGIN,
+    BCMOLT_AE_PATH_DS_AUTO_ID_STAT_ALARM_CLEARED                                            = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_AE_PATH_DS_AUTO_ID_STAT_ALARM_RAISED,    /**< Stat Alarm Raised. */
+    BCMOLT_AE_PATH_DS_AUTO_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_ds_auto_id;
+
+/** List of all ae_path_us groups of type auto. 
+ */
+typedef enum bcmolt_ae_path_us_auto_id
+{
+    BCMOLT_AE_PATH_US_AUTO_ID__BEGIN,
+    BCMOLT_AE_PATH_US_AUTO_ID_STAT_ALARM_CLEARED                                            = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_AE_PATH_US_AUTO_ID_STAT_ALARM_RAISED,    /**< Stat Alarm Raised. */
+    BCMOLT_AE_PATH_US_AUTO_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_ae_path_us_auto_id;
+
+/** List of all debug groups of type auto. 
+ */
+typedef enum bcmolt_debug_auto_id
+{
+    BCMOLT_DEBUG_AUTO_ID__BEGIN,
+    BCMOLT_DEBUG_AUTO_ID_CLI_OUTPUT                                                         = 0,    /**< cli_output. */
+    BCMOLT_DEBUG_AUTO_ID_FILE_ALMOST_FULL,  /**< file_almost_full. */
+    BCMOLT_DEBUG_AUTO_ID__NUM_OF            /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_auto_id;
+
+/** List of all debug groups of type oper. 
+ */
+typedef enum bcmolt_debug_oper_id
+{
+    BCMOLT_DEBUG_OPER_ID__BEGIN,
+    BCMOLT_DEBUG_OPER_ID_CLI_INPUT                                                          = 0,    /**< CLI_input. */
+    BCMOLT_DEBUG_OPER_ID_RESET_API_CAPTURE, /**< Reset API Capture. */
+    BCMOLT_DEBUG_OPER_ID_START_API_CAPTURE, /**< Start API Capture. */
+    BCMOLT_DEBUG_OPER_ID_STOP_API_CAPTURE,  /**< Stop API Capture. */
+    BCMOLT_DEBUG_OPER_ID__NUM_OF            /**< Number of enum entries, not an entry itself. */
+} bcmolt_debug_oper_id;
+
+/** List of all device groups of type auto. 
+ */
+typedef enum bcmolt_device_auto_id
+{
+    BCMOLT_DEVICE_AUTO_ID__BEGIN,
+    BCMOLT_DEVICE_AUTO_ID_CONNECTION_COMPLETE                                               = 0,    /**< Connection Complete. */
+    BCMOLT_DEVICE_AUTO_ID_CONNECTION_ESTABLISHED,   /**< Connection Established (Internal). */
+    BCMOLT_DEVICE_AUTO_ID_CONNECTION_FAILURE,       /**< Connection Failure. */
+    BCMOLT_DEVICE_AUTO_ID_DDR_TEST_COMPLETE,        /**< DDR Test Complete. */
+    BCMOLT_DEVICE_AUTO_ID_DEVICE_KEEP_ALIVE,        /**< Device Keep Alive (Internal). */
+    BCMOLT_DEVICE_AUTO_ID_DEVICE_READY,             /**< Device Ready (Internal). */
+    BCMOLT_DEVICE_AUTO_ID_DISCONNECTION_COMPLETE,   /**< Disconnection Complete. */
+    BCMOLT_DEVICE_AUTO_ID_IMAGE_TRANSFER_COMPLETE,  /**< Image Transfer Complete. */
+    BCMOLT_DEVICE_AUTO_ID_INDICATIONS_DROPPED,      /**< Indications Dropped. */
+    BCMOLT_DEVICE_AUTO_ID_SW_ERROR,                 /**< sw error. */
+    BCMOLT_DEVICE_AUTO_ID_SW_EXCEPTION,             /**< sw exception. */
+    BCMOLT_DEVICE_AUTO_ID__NUM_OF                   /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_auto_id;
+
+/** List of all device groups of type oper. 
+ */
+typedef enum bcmolt_device_oper_id
+{
+    BCMOLT_DEVICE_OPER_ID__BEGIN,
+    BCMOLT_DEVICE_OPER_ID_CONNECT                                                           = 0,    /**< Connect. */
+    BCMOLT_DEVICE_OPER_ID_DISCONNECT,           /**< Device Disconnect. */
+    BCMOLT_DEVICE_OPER_ID_HOST_KEEP_ALIVE,      /**< Host Keep Alive (Internal). */
+    BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA,  /**< Image Data Transfer Operation (Internal). */
+    BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START, /**< Start Image Transfer Operation. */
+    BCMOLT_DEVICE_OPER_ID_RESET,                /**< Device Reset. */
+    BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST,         /**< Run DDR Test. */
+    BCMOLT_DEVICE_OPER_ID_SW_UPGRADE_ACTIVATE,  /**< SW upgrade activate. */
+    BCMOLT_DEVICE_OPER_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_device_oper_id;
+
+/** List of all epon_denied_link groups of type auto. 
+ */
+typedef enum bcmolt_epon_denied_link_auto_id
+{
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID__BEGIN,
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_LASER_ON_OFF_VIOLATION                                  = 0,    /**< Laser On/Off Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_LLID_POOL_EMPTY_VIOLATION,      /**< LLID Pool Empty Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_MAX_LINK_VIOLATION,             /**< Max Link Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_OVERHEAD_PROFILE_VIOLATION,     /**< Overhead Profile Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_RANGE_VIOLATION,                /**< Range Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_ROGUE_VIOLATION,                /**< Rogue ONU Detected. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_SYSTEM_RESOURCE_VIOLATION,      /**< System Resource Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_TDM_CHANNELS_EXHAUSTED,         /**< TDM Channels Exhausted. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_UNKNOWN_LINK_VIOLATION,         /**< Unknown Link Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID_UPSTREAM_BANDWIDTH_VIOLATION,   /**< Upstream Bandwidth Violation. */
+    BCMOLT_EPON_DENIED_LINK_AUTO_ID__NUM_OF /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_denied_link_auto_id;
+
+/** List of all epon_link groups of type auto. 
+ */
+typedef enum bcmolt_epon_link_auto_id
+{
+    BCMOLT_EPON_LINK_AUTO_ID__BEGIN,
+    BCMOLT_EPON_LINK_AUTO_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST                            = 0,    /**< Duplicate MPCP Registration Request. */
+    BCMOLT_EPON_LINK_AUTO_ID_ENCRYPTION_ENABLED,            /**< Encryption Enabled. */
+    BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_FAILURE,          /**< Key Exchange Failure. */
+    BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_STARTED,          /**< key_exchange_started. */
+    BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_STOPPED,          /**< key_exchange_stopped. */
+    BCMOLT_EPON_LINK_AUTO_ID_LINK_DELETED,                  /**< Link Deleted. */
+    BCMOLT_EPON_LINK_AUTO_ID_LINK_SPEED_MISMATCH,           /**< Link attempted to register at a different speed. */
+    BCMOLT_EPON_LINK_AUTO_ID_MPCP_DEREGISTERED,             /**< MPCP Deregistered. */
+    BCMOLT_EPON_LINK_AUTO_ID_MPCP_DISCOVERED,               /**< MPCP Discovered. */
+    BCMOLT_EPON_LINK_AUTO_ID_MPCP_REG_ACK_TIMEOUT,          /**< MPCP Reg Ack Timeout. */
+    BCMOLT_EPON_LINK_AUTO_ID_MPCP_REPORT_TIMEOUT,           /**< MPCP Report Timeout. */
+    BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMEOUT,         /**< OAM Keepalive Timeout. */
+    BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMER_STARTED,   /**< OAM keepalive timer started. */
+    BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMER_STOPPED,   /**< OAM keepalive timer stopped. */
+    BCMOLT_EPON_LINK_AUTO_ID_PREPROVISIONED_LINK_CREATED,   /**< Preprovisioned Link Created. */
+    BCMOLT_EPON_LINK_AUTO_ID_PROTECTION_SWITCH_OCCURRED,    /**< Protection Switch Occurred. */
+    BCMOLT_EPON_LINK_AUTO_ID_RANGE_VALUE_CHANGED,           /**< Range Value Changed. */
+    BCMOLT_EPON_LINK_AUTO_ID_RERANGE_FAILURE,               /**< Re-range failure. */
+    BCMOLT_EPON_LINK_AUTO_ID_STAT_ALARM_CLEARED,            /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_LINK_AUTO_ID_STAT_ALARM_RAISED,             /**< Stat Alarm Raised. */
+    BCMOLT_EPON_LINK_AUTO_ID_STATIC_REGISTRATION_DONE,      /**< Static registration done. */
+    BCMOLT_EPON_LINK_AUTO_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_auto_id;
+
+/** List of all epon_link groups of type oper. 
+ */
+typedef enum bcmolt_epon_link_oper_id
+{
+    BCMOLT_EPON_LINK_OPER_ID__BEGIN,
+    BCMOLT_EPON_LINK_OPER_ID_DELETE_LINK                                                    = 0,    /**< Delete Link. */
+    BCMOLT_EPON_LINK_OPER_ID_FORCE_REDISCOVERY,         /**< Force Link Rediscovery. */
+    BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_START,        /**< Key exchange start. */
+    BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_STOP,         /**< Key exchange stop. */
+    BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_START, /**< OAM Keepalive Timer Start. */
+    BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_STOP,  /**< OAM Keepalive Timer Stop. */
+    BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION,       /**< static_registration. */
+    BCMOLT_EPON_LINK_OPER_ID__NUM_OF                    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_oper_id;
+
+/** List of all epon_link groups of type proxy. 
+ */
+typedef enum bcmolt_epon_link_proxy_id
+{
+    BCMOLT_EPON_LINK_PROXY_ID__BEGIN,
+    BCMOLT_EPON_LINK_PROXY_ID_INJECT_FRAME                                                  = 0,    /**< Inject Frame. */
+    BCMOLT_EPON_LINK_PROXY_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_proxy_id;
+
+/** List of all epon_link groups of type proxy_rx. 
+ */
+typedef enum bcmolt_epon_link_proxy_rx_id
+{
+    BCMOLT_EPON_LINK_PROXY_RX_ID__BEGIN,
+    BCMOLT_EPON_LINK_PROXY_RX_ID_FRAME_CAPTURED                                             = 0,    /**< Frame Captured. */
+    BCMOLT_EPON_LINK_PROXY_RX_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_link_proxy_rx_id;
+
+/** List of all epon_ni groups of type auto. 
+ */
+typedef enum bcmolt_epon_ni_auto_id
+{
+    BCMOLT_EPON_NI_AUTO_ID__BEGIN,
+    BCMOLT_EPON_NI_AUTO_ID_AUTO_ROGUE_SCAN_10G_FAILURE                                      = 0,    /**< 10G Epon Autonomous Rogue Scan failure detected. */
+    BCMOLT_EPON_NI_AUTO_ID_AUTO_ROGUE_SCAN_1G_FAILURE,  /**< 1G Epon Autonomous Rogue Scan failure detected. */
+    BCMOLT_EPON_NI_AUTO_ID_LLID_QUARANTINED,            /**< LLID Quarantined. */
+    BCMOLT_EPON_NI_AUTO_ID_MPCP_TIMESTAMP_CHANGED,      /**< MPCP Timestamp Changed. */
+    BCMOLT_EPON_NI_AUTO_ID_NO_REPORTS,                  /**< No Reports. */
+    BCMOLT_EPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE,        /**< ONU Upgrade Complete. */
+    BCMOLT_EPON_NI_AUTO_ID_RERANGE_FAILURE,             /**< Re-range failure. */
+    BCMOLT_EPON_NI_AUTO_ID_ROGUE_SCAN_COMPLETE,         /**< Rogue Scan is Complete. */
+    BCMOLT_EPON_NI_AUTO_ID_RSSI_MEASUREMENT_COMPLETED,  /**< RSSI Measurement Completed. */
+    BCMOLT_EPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED,      /**< State Change Completed. */
+    BCMOLT_EPON_NI_AUTO_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_auto_id;
+
+/** List of all epon_ni groups of type oper. 
+ */
+typedef enum bcmolt_epon_ni_oper_id
+{
+    BCMOLT_EPON_NI_OPER_ID__BEGIN,
+    BCMOLT_EPON_NI_OPER_ID_ADD_LINK                                                         = 0,    /**< Add link. */
+    BCMOLT_EPON_NI_OPER_ID_ADD_MULTICAST_LINK,          /**< Add Mutlticastlink. */
+    BCMOLT_EPON_NI_OPER_ID_ADD_PROTECTED_STANDBY_LINK,  /**< Add Protected Standby Link. */
+    BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT,            /**< Issue an Rx Power Measurement Request. */
+    BCMOLT_EPON_NI_OPER_ID_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA,    /**< Protection switching apply re-range delta. */
+    BCMOLT_EPON_NI_OPER_ID_ROGUE_LLID_SCAN,         /**< Run Rogue LLID Scan. */
+    BCMOLT_EPON_NI_OPER_ID_SET_EPON_NI_EN_STATE,    /**< Set EPON NI Enable State. */
+    BCMOLT_EPON_NI_OPER_ID_START_ONU_UPGRADE,       /**< Start ONU Firmware Upgrade. */
+    BCMOLT_EPON_NI_OPER_ID__NUM_OF                  /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_ni_oper_id;
+
+/** List of all epon_onu_10g_us groups of type auto. 
+ */
+typedef enum bcmolt_epon_onu_10g_us_auto_id
+{
+    BCMOLT_EPON_ONU_10G_US_AUTO_ID__BEGIN,
+    BCMOLT_EPON_ONU_10G_US_AUTO_ID_STAT_ALARM_CLEARED                                       = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_ONU_10G_US_AUTO_ID_STAT_ALARM_RAISED,   /**< Stat Alarm Raised. */
+    BCMOLT_EPON_ONU_10G_US_AUTO_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_10g_us_auto_id;
+
+/** List of all epon_onu_1g_us groups of type auto. 
+ */
+typedef enum bcmolt_epon_onu_1g_us_auto_id
+{
+    BCMOLT_EPON_ONU_1G_US_AUTO_ID__BEGIN,
+    BCMOLT_EPON_ONU_1G_US_AUTO_ID_STAT_ALARM_CLEARED                                        = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_ONU_1G_US_AUTO_ID_STAT_ALARM_RAISED,    /**< Stat Alarm Raised. */
+    BCMOLT_EPON_ONU_1G_US_AUTO_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_onu_1g_us_auto_id;
+
+/** List of all epon_path_10g_ds groups of type auto. 
+ */
+typedef enum bcmolt_epon_path_10g_ds_auto_id
+{
+    BCMOLT_EPON_PATH_10G_DS_AUTO_ID__BEGIN,
+    BCMOLT_EPON_PATH_10G_DS_AUTO_ID_STAT_ALARM_CLEARED                                      = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_10G_DS_AUTO_ID_STAT_ALARM_RAISED,  /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_10G_DS_AUTO_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_ds_auto_id;
+
+/** List of all epon_path_10g_us groups of type auto. 
+ */
+typedef enum bcmolt_epon_path_10g_us_auto_id
+{
+    BCMOLT_EPON_PATH_10G_US_AUTO_ID__BEGIN,
+    BCMOLT_EPON_PATH_10G_US_AUTO_ID_STAT_ALARM_CLEARED                                      = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_10G_US_AUTO_ID_STAT_ALARM_RAISED,  /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_10G_US_AUTO_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_10g_us_auto_id;
+
+/** List of all epon_path_1g_ds groups of type auto. 
+ */
+typedef enum bcmolt_epon_path_1g_ds_auto_id
+{
+    BCMOLT_EPON_PATH_1G_DS_AUTO_ID__BEGIN,
+    BCMOLT_EPON_PATH_1G_DS_AUTO_ID_STAT_ALARM_CLEARED                                       = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_1G_DS_AUTO_ID_STAT_ALARM_RAISED,   /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_1G_DS_AUTO_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_ds_auto_id;
+
+/** List of all epon_path_1g_us groups of type auto. 
+ */
+typedef enum bcmolt_epon_path_1g_us_auto_id
+{
+    BCMOLT_EPON_PATH_1G_US_AUTO_ID__BEGIN,
+    BCMOLT_EPON_PATH_1G_US_AUTO_ID_STAT_ALARM_CLEARED                                       = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_EPON_PATH_1G_US_AUTO_ID_STAT_ALARM_RAISED,   /**< Stat Alarm Raised. */
+    BCMOLT_EPON_PATH_1G_US_AUTO_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_epon_path_1g_us_auto_id;
+
+/** List of all gpon_alloc groups of type auto. 
+ */
+typedef enum bcmolt_gpon_alloc_auto_id
+{
+    BCMOLT_GPON_ALLOC_AUTO_ID__BEGIN,
+    BCMOLT_GPON_ALLOC_AUTO_ID_CONFIGURATION_COMPLETED                                       = 0,    /**< Configuration Completed. */
+    BCMOLT_GPON_ALLOC_AUTO_ID_GET_ALLOC_STATS_COMPLETED,    /**< Get alloc ID statistics completed. */
+    BCMOLT_GPON_ALLOC_AUTO_ID_STAT_ALARM_CLEARED,           /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_ALLOC_AUTO_ID_STAT_ALARM_RAISED,            /**< Stat Alarm Raised. */
+    BCMOLT_GPON_ALLOC_AUTO_ID__NUM_OF                       /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_auto_id;
+
+/** List of all gpon_alloc groups of type oper. 
+ */
+typedef enum bcmolt_gpon_alloc_oper_id
+{
+    BCMOLT_GPON_ALLOC_OPER_ID__BEGIN,
+    BCMOLT_GPON_ALLOC_OPER_ID_GET_STATS                                                     = 0,    /**< Get statistics. */
+    BCMOLT_GPON_ALLOC_OPER_ID_SET_STATE,    /**< Set state. */
+    BCMOLT_GPON_ALLOC_OPER_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_alloc_oper_id;
+
+/** List of all gpon_gem_port groups of type auto. 
+ */
+typedef enum bcmolt_gpon_gem_port_auto_id
+{
+    BCMOLT_GPON_GEM_PORT_AUTO_ID__BEGIN,
+    BCMOLT_GPON_GEM_PORT_AUTO_ID_CONFIGURATION_COMPLETED                                    = 0,    /**< Configuration Completed. */
+    BCMOLT_GPON_GEM_PORT_AUTO_ID_STAT_ALARM_CLEARED,    /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_GEM_PORT_AUTO_ID_STAT_ALARM_RAISED,     /**< Stat Alarm Raised. */
+    BCMOLT_GPON_GEM_PORT_AUTO_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_auto_id;
+
+/** List of all gpon_gem_port groups of type oper. 
+ */
+typedef enum bcmolt_gpon_gem_port_oper_id
+{
+    BCMOLT_GPON_GEM_PORT_OPER_ID__BEGIN,
+    BCMOLT_GPON_GEM_PORT_OPER_ID_SET_STATE                                                  = 0,    /**< Set state. */
+    BCMOLT_GPON_GEM_PORT_OPER_ID__NUM_OF    /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_gem_port_oper_id;
+
+/** List of all gpon_iwf groups of type auto. 
+ */
+typedef enum bcmolt_gpon_iwf_auto_id
+{
+    BCMOLT_GPON_IWF_AUTO_ID__BEGIN,
+    BCMOLT_GPON_IWF_AUTO_ID_FLUSH_MAC_TABLE_COMPLETED                                       = 0,    /**< Flush MAC Table Completed. */
+    BCMOLT_GPON_IWF_AUTO_ID_SCAN_MAC_TABLE_COMPLETED,   /**< Scan MAC Table Completed. */
+    BCMOLT_GPON_IWF_AUTO_ID_STAT_ALARM_CLEARED,         /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_IWF_AUTO_ID_STAT_ALARM_RAISED,          /**< Stat Alarm Raised. */
+    BCMOLT_GPON_IWF_AUTO_ID__NUM_OF                     /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_auto_id;
+
+/** List of all gpon_iwf groups of type oper. 
+ */
+typedef enum bcmolt_gpon_iwf_oper_id
+{
+    BCMOLT_GPON_IWF_OPER_ID__BEGIN,
+    BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE                                                 = 0,    /**< Flush MAC Table. */
+    BCMOLT_GPON_IWF_OPER_ID_SCAN_MAC_TABLE, /**< Scan MAC Table. */
+    BCMOLT_GPON_IWF_OPER_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_oper_id;
+
+/** List of all gpon_iwf_mac_table groups of type auto. 
+ */
+typedef enum bcmolt_gpon_iwf_mac_table_auto_id
+{
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID__BEGIN,
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_AGED                                              = 0,    /**< MAC Aged. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_DROPPED,  /**< MAC Dropped. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_MOVE,     /**< MAC Move. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_NEW_MAC,      /**< New MAC. */
+    BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_iwf_mac_table_auto_id;
+
+/** List of all gpon_ni groups of type auto. 
+ */
+typedef enum bcmolt_gpon_ni_auto_id
+{
+    BCMOLT_GPON_NI_AUTO_ID__BEGIN,
+    BCMOLT_GPON_NI_AUTO_ID_ACTIVATE_ALL_ONUS_COMPLETED                                      = 0,    /**< activate all onus completed. */
+    BCMOLT_GPON_NI_AUTO_ID_CPU_PACKETS_FAILURE,             /**< CPU Packets Failure. */
+    BCMOLT_GPON_NI_AUTO_ID_DEACTIVATE_ALL_ONUS_COMPLETED,   /**< deactivate all onus completed. */
+    BCMOLT_GPON_NI_AUTO_ID_DISABLE_ALL_ONUS_COMPLETED,      /**< disable all onus completed. */
+    BCMOLT_GPON_NI_AUTO_ID_ENABLE_ALL_ONUS_COMPLETED,       /**< enable all onus completed. */
+    BCMOLT_GPON_NI_AUTO_ID_LOS,                     /**< LOS. */
+    BCMOLT_GPON_NI_AUTO_ID_ONU_DISCOVERED,          /**< ONU Discovered. */
+    BCMOLT_GPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE,    /**< ONU Upgrade Complete. */
+    BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_ONUS_RANGED,            /**< Protection Switching ONUs Ranged. */
+    BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED,   /**< Protection Switching Switchover Completed. */
+    BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME,         /**< Protection Switching Traffic Resume. */
+    BCMOLT_GPON_NI_AUTO_ID_ROGUE_DETECTION_COMPLETED,                   /**< Rogue detection completed. */
+    BCMOLT_GPON_NI_AUTO_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START,           /**< Rogue ONU special map cycle start. */
+    BCMOLT_GPON_NI_AUTO_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START,       /**< Serial Number Acquisition Cycle Start. */
+    BCMOLT_GPON_NI_AUTO_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED,      /**< Standby PON Monitoring Cycle Completed. */
+    BCMOLT_GPON_NI_AUTO_ID_STAT_ALARM_CLEARED,      /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_NI_AUTO_ID_STAT_ALARM_RAISED,       /**< Stat Alarm Raised. */
+    BCMOLT_GPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED,  /**< State Change Completed. */
+    BCMOLT_GPON_NI_AUTO_ID_TOD_REQUEST_COMPLETED,   /**< TOD request completed. */
+    BCMOLT_GPON_NI_AUTO_ID__NUM_OF                  /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_auto_id;
+
+/** List of all gpon_ni groups of type oper. 
+ */
+typedef enum bcmolt_gpon_ni_oper_id
+{
+    BCMOLT_GPON_NI_OPER_ID__BEGIN,
+    BCMOLT_GPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER                                            = 0,    /**< Disable Serial Number. */
+    BCMOLT_GPON_NI_OPER_ID_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE,                      /**< protection switching type c set multiple onu state. */
+    BCMOLT_GPON_NI_OPER_ID_RESET,                   /**< Reset. */
+    BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW,  /**< Rogue Detection Window. */
+    BCMOLT_GPON_NI_OPER_ID_SET_ONU_STATE,           /**< Set ONU State. */
+    BCMOLT_GPON_NI_OPER_ID_SET_PON_STATE,           /**< Set PON State. */
+    BCMOLT_GPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING,   /**< Single request for standby PON monitoring. */
+    BCMOLT_GPON_NI_OPER_ID_START_ONU_UPGRADE,                       /**< Start ONU Firmware Upgrade. */
+    BCMOLT_GPON_NI_OPER_ID_TOD_REQUEST, /**< TOD request. */
+    BCMOLT_GPON_NI_OPER_ID__NUM_OF      /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_oper_id;
+
+/** List of all gpon_ni groups of type proxy. 
+ */
+typedef enum bcmolt_gpon_ni_proxy_id
+{
+    BCMOLT_GPON_NI_PROXY_ID__BEGIN,
+    BCMOLT_GPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET                                          = 0,    /**< Broadcast PLOAM Packet. */
+    BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS,    /**< GPON CPU Packets. */
+    BCMOLT_GPON_NI_PROXY_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_ni_proxy_id;
+
+/** List of all gpon_onu groups of type auto. 
+ */
+typedef enum bcmolt_gpon_onu_auto_id
+{
+    BCMOLT_GPON_ONU_AUTO_ID__BEGIN,
+    BCMOLT_GPON_ONU_AUTO_ID_BER_INTERVAL_CONFIGURATION_COMPLETED                            = 0,    /**< BER Interval Configuration Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_DFI,                        /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_ID_DGI,                        /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_ID_DOWI,                       /**< Drift of Window of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_ID_ERR,                        /**< ERR. */
+    BCMOLT_GPON_ONU_AUTO_ID_INVALID_DBRU_REPORT,        /**< Invalid DBRu Report. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_COMPLETED,     /**< Key Exchange Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_CYCLE_SKIPPED, /**< Key Exchange Cycle Skipped. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_DECRYPT_REQUIRED,      /**< Key Exchange Decrypt Required. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_MISMATCH,          /**< Key Exchange Key Mismatch. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT,   /**< Key Exchange Key Request Timeout. */
+    BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX,   /**< Key Exchange Unconsecutive Index. */
+    BCMOLT_GPON_ONU_AUTO_ID_LOAI,   /**< LOAi. */
+    BCMOLT_GPON_ONU_AUTO_ID_LOKI,   /**< LOki. */
+    BCMOLT_GPON_ONU_AUTO_ID_MEMI,   /**< MEMi. */
+    BCMOLT_GPON_ONU_AUTO_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED,   /**< OMCI PORT ID Configuration Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_ACTIVATION_COMPLETED,               /**< ONU Activation Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_ACTIVATION_STANDBY_COMPLETED,       /**< onu activation standby completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_ALARM,                  /**< ONU Alarm. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_DEACTIVATION_COMPLETED, /**< ONU Deactivation Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_DISABLE_COMPLETED,      /**< ONU Disable Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_ONU_ENABLE_COMPLETED,       /**< ONU Enable Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_OPTICAL_REFLECTION,         /**< Optical Reflection. */
+    BCMOLT_GPON_ONU_AUTO_ID_PASSWORD_AUTHENTICATION_COMPLETED,  /**< Password Authentication Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_PEE,            /**< PEE. */
+    BCMOLT_GPON_ONU_AUTO_ID_POSSIBLE_DRIFT, /**< Possible Drift. */
+    BCMOLT_GPON_ONU_AUTO_ID_POWER_MANAGEMENT_STATE_CHANGE,  /**< Power Management State Change. */
+    BCMOLT_GPON_ONU_AUTO_ID_PST,                        /**< PST. */
+    BCMOLT_GPON_ONU_AUTO_ID_RANGING_COMPLETED,          /**< Ranging Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_REI,                        /**< REI. */
+    BCMOLT_GPON_ONU_AUTO_ID_RSSI_MEASUREMENT_COMPLETED, /**< RSSI Measurement Completed. */
+    BCMOLT_GPON_ONU_AUTO_ID_SDI,                        /**< Signal Degraded of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_ID_SFI,                        /**< Signal Fail of ONUi. */
+    BCMOLT_GPON_ONU_AUTO_ID_STAT_ALARM_CLEARED,         /**< Stat Alarm Cleared. */
+    BCMOLT_GPON_ONU_AUTO_ID_STAT_ALARM_RAISED,          /**< Stat Alarm Raised. */
+    BCMOLT_GPON_ONU_AUTO_ID_SUFI,                       /**< SUFi. */
+    BCMOLT_GPON_ONU_AUTO_ID_TIWI,                       /**< Transmission Interference Warning. */
+    BCMOLT_GPON_ONU_AUTO_ID__NUM_OF                     /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_auto_id;
+
+/** List of all gpon_onu groups of type oper. 
+ */
+typedef enum bcmolt_gpon_onu_oper_id
+{
+    BCMOLT_GPON_ONU_OPER_ID__BEGIN,
+    BCMOLT_GPON_ONU_OPER_ID_CHANGE_POWER_LEVEL                                              = 0,    /**< Change Power Level. */
+    BCMOLT_GPON_ONU_OPER_ID_RSSI_MEASUREMENT,   /**< RSSI Measurement. */
+    BCMOLT_GPON_ONU_OPER_ID_SET_ONU_STATE,      /**< Set ONU State. */
+    BCMOLT_GPON_ONU_OPER_ID__NUM_OF             /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_oper_id;
+
+/** List of all gpon_onu groups of type proxy. 
+ */
+typedef enum bcmolt_gpon_onu_proxy_id
+{
+    BCMOLT_GPON_ONU_PROXY_ID__BEGIN,
+    BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS                                                    = 0,    /**< GPON CPU Packets. */
+    BCMOLT_GPON_ONU_PROXY_ID_PLOAM_PACKET,  /**< PLOAM Packet. */
+    BCMOLT_GPON_ONU_PROXY_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_proxy_id;
+
+/** List of all gpon_onu groups of type proxy_rx. 
+ */
+typedef enum bcmolt_gpon_onu_proxy_rx_id
+{
+    BCMOLT_GPON_ONU_PROXY_RX_ID__BEGIN,
+    BCMOLT_GPON_ONU_PROXY_RX_ID_CPU_PACKET                                                  = 0,    /**< GPON CPU packet. */
+    BCMOLT_GPON_ONU_PROXY_RX_ID_OMCI_PACKET,    /**< GPON OMCI packet. */
+    BCMOLT_GPON_ONU_PROXY_RX_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_gpon_onu_proxy_rx_id;
+
+/** List of all log_entry groups of type auto. 
+ */
+typedef enum bcmolt_log_entry_auto_id
+{
+    BCMOLT_LOG_ENTRY_AUTO_ID__BEGIN,
+    BCMOLT_LOG_ENTRY_AUTO_ID_STAT_ALARM_CLEARED                                             = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_LOG_ENTRY_AUTO_ID_STAT_ALARM_RAISED, /**< Stat Alarm Raised. */
+    BCMOLT_LOG_ENTRY_AUTO_ID__NUM_OF            /**< Number of enum entries, not an entry itself. */
+} bcmolt_log_entry_auto_id;
+
+/** List of all logger groups of type auto. 
+ */
+typedef enum bcmolt_logger_auto_id
+{
+    BCMOLT_LOGGER_AUTO_ID__BEGIN,
+    BCMOLT_LOGGER_AUTO_ID_STAT_ALARM_CLEARED                                                = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_LOGGER_AUTO_ID_STAT_ALARM_RAISED,    /**< Stat Alarm Raised. */
+    BCMOLT_LOGGER_AUTO_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_auto_id;
+
+/** List of all logger groups of type oper. 
+ */
+typedef enum bcmolt_logger_oper_id
+{
+    BCMOLT_LOGGER_OPER_ID__BEGIN,
+    BCMOLT_LOGGER_OPER_ID_CLEAR_LOG                                                         = 0,    /**< clear log. */
+    BCMOLT_LOGGER_OPER_ID__NUM_OF   /**< Number of enum entries, not an entry itself. */
+} bcmolt_logger_oper_id;
+
+/** List of all nni groups of type auto. 
+ */
+typedef enum bcmolt_nni_auto_id
+{
+    BCMOLT_NNI_AUTO_ID__BEGIN,
+    BCMOLT_NNI_AUTO_ID_STAT_ALARM_CLEARED                                                   = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_NNI_AUTO_ID_STAT_ALARM_RAISED,   /**< Stat Alarm Raised. */
+    BCMOLT_NNI_AUTO_ID_STATUS_CHANGED,      /**< Status changed. */
+    BCMOLT_NNI_AUTO_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_nni_auto_id;
+
+/** List of all trx_calibration groups of type auto. 
+ */
+typedef enum bcmolt_trx_calibration_auto_id
+{
+    BCMOLT_TRX_CALIBRATION_AUTO_ID__BEGIN,
+    BCMOLT_TRX_CALIBRATION_AUTO_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED                   = 0,    /**< Capture window and statistic completed. */
+    BCMOLT_TRX_CALIBRATION_AUTO_ID__NUM_OF  /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_auto_id;
+
+/** List of all trx_calibration groups of type oper. 
+ */
+typedef enum bcmolt_trx_calibration_oper_id
+{
+    BCMOLT_TRX_CALIBRATION_OPER_ID__BEGIN,
+    BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW                                     = 0,    /**< start capture window. */
+    BCMOLT_TRX_CALIBRATION_OPER_ID_STOP_CAPTURE_WINDOW, /**< stop capture window. */
+    BCMOLT_TRX_CALIBRATION_OPER_ID__NUM_OF              /**< Number of enum entries, not an entry itself. */
+} bcmolt_trx_calibration_oper_id;
+
+/** List of all xgpon_alloc groups of type auto. 
+ */
+typedef enum bcmolt_xgpon_alloc_auto_id
+{
+    BCMOLT_XGPON_ALLOC_AUTO_ID__BEGIN,
+    BCMOLT_XGPON_ALLOC_AUTO_ID_CONFIGURATION_COMPLETED                                      = 0,    /**< Configuration Completed. */
+    BCMOLT_XGPON_ALLOC_AUTO_ID_GET_ALLOC_STATS_COMPLETED,   /**< Get alloc ID statistics completed. */
+    BCMOLT_XGPON_ALLOC_AUTO_ID_STAT_ALARM_CLEARED,          /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_ALLOC_AUTO_ID_STAT_ALARM_RAISED,           /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_ALLOC_AUTO_ID__NUM_OF                      /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_auto_id;
+
+/** List of all xgpon_alloc groups of type oper. 
+ */
+typedef enum bcmolt_xgpon_alloc_oper_id
+{
+    BCMOLT_XGPON_ALLOC_OPER_ID__BEGIN,
+    BCMOLT_XGPON_ALLOC_OPER_ID_GET_STATS                                                    = 0,    /**< Get statistics. */
+    BCMOLT_XGPON_ALLOC_OPER_ID_SET_STATE,   /**< Set state. */
+    BCMOLT_XGPON_ALLOC_OPER_ID__NUM_OF      /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_alloc_oper_id;
+
+/** List of all xgpon_gem_port groups of type auto. 
+ */
+typedef enum bcmolt_xgpon_gem_port_auto_id
+{
+    BCMOLT_XGPON_GEM_PORT_AUTO_ID__BEGIN,
+    BCMOLT_XGPON_GEM_PORT_AUTO_ID_STAT_ALARM_CLEARED                                        = 0,    /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_GEM_PORT_AUTO_ID_STAT_ALARM_RAISED,    /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_GEM_PORT_AUTO_ID__NUM_OF               /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_gem_port_auto_id;
+
+/** List of all xgpon_ni groups of type auto. 
+ */
+typedef enum bcmolt_xgpon_ni_auto_id
+{
+    BCMOLT_XGPON_NI_AUTO_ID__BEGIN,
+    BCMOLT_XGPON_NI_AUTO_ID_ACTIVATE_ALL_ONUS_COMPLETED                                     = 0,    /**< activate all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_CPU_PACKETS_FAILURE,            /**< CPU Packets Failure. */
+    BCMOLT_XGPON_NI_AUTO_ID_DEACTIVATE_ALL_ONUS_COMPLETED,  /**< deactivate all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_DISABLE_ALL_ONUS_COMPLETED,     /**< disable all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_ENABLE_ALL_ONUS_COMPLETED,      /**< enable all onus completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_LOS,                    /**< LOS. */
+    BCMOLT_XGPON_NI_AUTO_ID_ONU_DISCOVERED,         /**< ONU Discovered. */
+    BCMOLT_XGPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE,   /**< ONU Upgrade Complete. */
+    BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_ONUS_RANGED,           /**< Protection Switching ONUs Ranged. */
+    BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED,  /**< Protection Switching Switchover Completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME,        /**< Protection Switching Traffic Resume. */
+    BCMOLT_XGPON_NI_AUTO_ID_ROGUE_DETECTION_COMPLETED,                  /**< Rogue detection completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START,          /**< Rogue ONU special map cycle start. */
+    BCMOLT_XGPON_NI_AUTO_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START,      /**< Serial Number Acquisition Cycle Start. */
+    BCMOLT_XGPON_NI_AUTO_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED,     /**< Standby PON Monitoring Cycle Completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_STAT_ALARM_CLEARED,     /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_NI_AUTO_ID_STAT_ALARM_RAISED,      /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED, /**< State Change Completed. */
+    BCMOLT_XGPON_NI_AUTO_ID_TOD_REQUEST_COMPLETED,  /**< TOD request completed. */
+    BCMOLT_XGPON_NI_AUTO_ID__NUM_OF                 /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_auto_id;
+
+/** List of all xgpon_ni groups of type oper. 
+ */
+typedef enum bcmolt_xgpon_ni_oper_id
+{
+    BCMOLT_XGPON_NI_OPER_ID__BEGIN,
+    BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH                                            = 0,    /**< Adjust Tx Wavelengh. */
+    BCMOLT_XGPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER,                  /**< Disable Serial Number. */
+    BCMOLT_XGPON_NI_OPER_ID_RESET,                                  /**< Reset. */
+    BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW,                 /**< Rogue Detection Window. */
+    BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP,                     /**< Run Special BW Map. */
+    BCMOLT_XGPON_NI_OPER_ID_SET_ONU_STATE,                          /**< Set ONU State. */
+    BCMOLT_XGPON_NI_OPER_ID_SET_PON_STATE,                          /**< Set PON State. */
+    BCMOLT_XGPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING,  /**< Single request standby PON Monitoring. */
+    BCMOLT_XGPON_NI_OPER_ID_START_ONU_UPGRADE,                      /**< Start ONU Firmware Upgrade. */
+    BCMOLT_XGPON_NI_OPER_ID_TOD_REQUEST,    /**< TOD request. */
+    BCMOLT_XGPON_NI_OPER_ID__NUM_OF         /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_oper_id;
+
+/** List of all xgpon_ni groups of type proxy. 
+ */
+typedef enum bcmolt_xgpon_ni_proxy_id
+{
+    BCMOLT_XGPON_NI_PROXY_ID__BEGIN,
+    BCMOLT_XGPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET                                         = 0,    /**< Broadcast PLOAM Packet. */
+    BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS,   /**< XGPON CPU packets. */
+    BCMOLT_XGPON_NI_PROXY_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_ni_proxy_id;
+
+/** List of all xgpon_onu groups of type auto. 
+ */
+typedef enum bcmolt_xgpon_onu_auto_id
+{
+    BCMOLT_XGPON_ONU_AUTO_ID__BEGIN,
+    BCMOLT_XGPON_ONU_AUTO_ID_DFI                                                            = 0,    /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_DGI,                       /**< Receive Dying-Gasp of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_DOWI,                      /**< Drift of Window of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_INVALID_DBRU_REPORT,       /**< Invalid DBRu Report. */
+    BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_COMPLETED,    /**< Key Exchange Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_CYCLE_SKIPPED,        /**< Key Exchange Cycle Skipped. */
+    BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_MISMATCH,         /**< Key Exchange Key Mismatch. */
+    BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT,  /**< Key Exchange Key Request Timeout. */
+    BCMOLT_XGPON_ONU_AUTO_ID_LOOCI,                     /**< LOOCi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_ACTIVATION_COMPLETED,  /**< ONU Activation Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_ALARM,                 /**< ONU Alarm. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_DEACTIVATION_COMPLETED,    /**< ONU Deactivation Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_DISABLE_COMPLETED,         /**< ONU Disable Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_ENABLE_COMPLETED,          /**< ONU Enable Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_TUNING_IN_COMPLETED,       /**< ONU Tuning in completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_ONU_TUNING_OUT_COMPLETED,      /**< ONU Tuning out completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_OPTICAL_REFLECTION,            /**< Optical Reflection. */
+    BCMOLT_XGPON_ONU_AUTO_ID_POSSIBLE_DRIFT,                /**< Possible Drift. */
+    BCMOLT_XGPON_ONU_AUTO_ID_POWER_CONSUMPTION_REPORT,      /**< Power consumption report. */
+    BCMOLT_XGPON_ONU_AUTO_ID_POWER_LEVEL_REPORT,            /**< Power level report. */
+    BCMOLT_XGPON_ONU_AUTO_ID_POWER_MANAGEMENT_STATE_CHANGE, /**< Power Management State Change. */
+    BCMOLT_XGPON_ONU_AUTO_ID_PQSI,              /**< ploam queue status. */
+    BCMOLT_XGPON_ONU_AUTO_ID_RANGING_COMPLETED, /**< Ranging Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_REGISTRATION_ID,   /**< Registration ID. */
+    BCMOLT_XGPON_ONU_AUTO_ID_RSSI_MEASUREMENT_COMPLETED,    /**< RSSI Measurement Completed. */
+    BCMOLT_XGPON_ONU_AUTO_ID_SDI,   /**< Signal Degraded of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE,  /**< secure mutual authentication failure. */
+    BCMOLT_XGPON_ONU_AUTO_ID_SFI,                   /**< Signal Fail of ONUi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_STAT_ALARM_CLEARED,    /**< Stat Alarm Cleared. */
+    BCMOLT_XGPON_ONU_AUTO_ID_STAT_ALARM_RAISED,     /**< Stat Alarm Raised. */
+    BCMOLT_XGPON_ONU_AUTO_ID_SUFI,                  /**< SUFi. */
+    BCMOLT_XGPON_ONU_AUTO_ID_TIWI,                  /**< Transmission Interference Warning. */
+    BCMOLT_XGPON_ONU_AUTO_ID_TUNING_RESPONSE,       /**< Tuning response. */
+    BCMOLT_XGPON_ONU_AUTO_ID__NUM_OF                /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_auto_id;
+
+/** List of all xgpon_onu groups of type oper. 
+ */
+typedef enum bcmolt_xgpon_onu_oper_id
+{
+    BCMOLT_XGPON_ONU_OPER_ID__BEGIN,
+    BCMOLT_XGPON_ONU_OPER_ID_ADJUST_TX_WAVELENGTH                                           = 0,    /**< Adjust Tx wavelength. */
+    BCMOLT_XGPON_ONU_OPER_ID_CHANGE_POWER_LEVELLING,        /**< Change power levelling. */
+    BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_CONSUMPTION,         /**< Get power consumption. */
+    BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_LEVEL,               /**< Get power level. */
+    BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_IN,                 /**< ONU Tuning in. */
+    BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT,                /**< ONU Tuning out. */
+    BCMOLT_XGPON_ONU_OPER_ID_REQUEST_REGISTRATION,          /**< Request registration. */
+    BCMOLT_XGPON_ONU_OPER_ID_RSSI_MEASUREMENT,              /**< RSSI Measurement. */
+    BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION,  /**< Secure mutual authentication. */
+    BCMOLT_XGPON_ONU_OPER_ID_SET_ONU_STATE,                 /**< Set ONU State. */
+    BCMOLT_XGPON_ONU_OPER_ID__NUM_OF                        /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_oper_id;
+
+/** List of all xgpon_onu groups of type proxy. 
+ */
+typedef enum bcmolt_xgpon_onu_proxy_id
+{
+    BCMOLT_XGPON_ONU_PROXY_ID__BEGIN,
+    BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS                                                   = 0,    /**< XGPON CPU packets. */
+    BCMOLT_XGPON_ONU_PROXY_ID_PLOAM_PACKET, /**< PLOAM Packet. */
+    BCMOLT_XGPON_ONU_PROXY_ID__NUM_OF       /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_proxy_id;
+
+/** List of all xgpon_onu groups of type proxy_rx. 
+ */
+typedef enum bcmolt_xgpon_onu_proxy_rx_id
+{
+    BCMOLT_XGPON_ONU_PROXY_RX_ID__BEGIN,
+    BCMOLT_XGPON_ONU_PROXY_RX_ID_CPU_PACKET                                                 = 0,    /**< XGPON CPU packet. */
+    BCMOLT_XGPON_ONU_PROXY_RX_ID_OMCI_PACKET,   /**< XGPON OMCI packet. */
+    BCMOLT_XGPON_ONU_PROXY_RX_ID__NUM_OF        /**< Number of enum entries, not an entry itself. */
+} bcmolt_xgpon_onu_proxy_rx_id;
+
+#define bcmolt_ae_ni_key_id_all_properties                                                  BCMOLT_AE_NI_KEY_ID__NUM_OF
+#define bcmolt_ae_ni_cfg_id_all_properties                                                  BCMOLT_AE_NI_CFG_ID__NUM_OF
+#define bcmolt_ae_ni_set_ae_ni_en_state_id_all_properties                                   BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID__NUM_OF
+#define bcmolt_ae_path_ds_key_id_all_properties                                             BCMOLT_AE_PATH_DS_KEY_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_id_all_properties                                            BCMOLT_AE_PATH_DS_STAT_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_cfg_id_all_properties                                        BCMOLT_AE_PATH_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_alarm_raised_id_all_properties                               BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_alarm_cleared_id_all_properties                              BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_ae_path_ds_auto_cfg_id_all_properties                                        BCMOLT_AE_PATH_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_ae_path_us_key_id_all_properties                                             BCMOLT_AE_PATH_US_KEY_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_id_all_properties                                            BCMOLT_AE_PATH_US_STAT_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_cfg_id_all_properties                                        BCMOLT_AE_PATH_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_alarm_raised_id_all_properties                               BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_alarm_cleared_id_all_properties                              BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_ae_path_us_auto_cfg_id_all_properties                                        BCMOLT_AE_PATH_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_channel_key_id_all_properties                                                BCMOLT_CHANNEL_KEY_ID__NUM_OF
+#define bcmolt_channel_cfg_id_all_properties                                                BCMOLT_CHANNEL_CFG_ID__NUM_OF
+#define bcmolt_debug_key_id_all_properties                                                  BCMOLT_DEBUG_KEY_ID__NUM_OF
+#define bcmolt_debug_cli_input_id_all_properties                                            BCMOLT_DEBUG_CLI_INPUT_ID__NUM_OF
+#define bcmolt_debug_cli_output_id_all_properties                                           BCMOLT_DEBUG_CLI_OUTPUT_ID__NUM_OF
+#define bcmolt_debug_cfg_id_all_properties                                                  BCMOLT_DEBUG_CFG_ID__NUM_OF
+#define bcmolt_debug_file_almost_full_id_all_properties                                     BCMOLT_DEBUG_FILE_ALMOST_FULL_ID__NUM_OF
+#define bcmolt_debug_start_api_capture_id_all_properties                                    BCMOLT_DEBUG_START_API_CAPTURE_ID__NUM_OF
+#define bcmolt_debug_stop_api_capture_id_all_properties                                     BCMOLT_DEBUG_STOP_API_CAPTURE_ID__NUM_OF
+#define bcmolt_debug_reset_api_capture_id_all_properties                                    BCMOLT_DEBUG_RESET_API_CAPTURE_ID__NUM_OF
+#define bcmolt_debug_auto_cfg_id_all_properties                                             BCMOLT_DEBUG_AUTO_CFG_ID__NUM_OF
+#define bcmolt_device_cfg_id_all_properties                                                 BCMOLT_DEVICE_CFG_ID__NUM_OF
+#define bcmolt_device_key_id_all_properties                                                 BCMOLT_DEVICE_KEY_ID__NUM_OF
+#define bcmolt_device_connect_id_all_properties                                             BCMOLT_DEVICE_CONNECT_ID__NUM_OF
+#define bcmolt_device_disconnect_id_all_properties                                          BCMOLT_DEVICE_DISCONNECT_ID__NUM_OF
+#define bcmolt_device_reset_id_all_properties                                               BCMOLT_DEVICE_RESET_ID__NUM_OF
+#define bcmolt_device_host_keep_alive_id_all_properties                                     BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID__NUM_OF
+#define bcmolt_device_sw_upgrade_activate_id_all_properties                                 BCMOLT_DEVICE_SW_UPGRADE_ACTIVATE_ID__NUM_OF
+#define bcmolt_device_device_ready_id_all_properties                                        BCMOLT_DEVICE_DEVICE_READY_ID__NUM_OF
+#define bcmolt_device_connection_established_id_all_properties                              BCMOLT_DEVICE_CONNECTION_ESTABLISHED_ID__NUM_OF
+#define bcmolt_device_device_keep_alive_id_all_properties                                   BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID__NUM_OF
+#define bcmolt_device_connection_failure_id_all_properties                                  BCMOLT_DEVICE_CONNECTION_FAILURE_ID__NUM_OF
+#define bcmolt_device_connection_complete_id_all_properties                                 BCMOLT_DEVICE_CONNECTION_COMPLETE_ID__NUM_OF
+#define bcmolt_device_disconnection_complete_id_all_properties                              BCMOLT_DEVICE_DISCONNECTION_COMPLETE_ID__NUM_OF
+#define bcmolt_device_sw_error_id_all_properties                                            BCMOLT_DEVICE_SW_ERROR_ID__NUM_OF
+#define bcmolt_device_sw_exception_id_all_properties                                        BCMOLT_DEVICE_SW_EXCEPTION_ID__NUM_OF
+#define bcmolt_device_indications_dropped_id_all_properties                                 BCMOLT_DEVICE_INDICATIONS_DROPPED_ID__NUM_OF
+#define bcmolt_device_image_transfer_start_id_all_properties                                BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID__NUM_OF
+#define bcmolt_device_image_transfer_data_id_all_properties                                 BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID__NUM_OF
+#define bcmolt_device_image_transfer_complete_id_all_properties                             BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID__NUM_OF
+#define bcmolt_device_run_ddr_test_id_all_properties                                        BCMOLT_DEVICE_RUN_DDR_TEST_ID__NUM_OF
+#define bcmolt_device_ddr_test_complete_id_all_properties                                   BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID__NUM_OF
+#define bcmolt_device_auto_cfg_id_all_properties                                            BCMOLT_DEVICE_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_denied_link_key_id_all_properties                                       BCMOLT_EPON_DENIED_LINK_KEY_ID__NUM_OF
+#define bcmolt_epon_denied_link_cfg_id_all_properties                                       BCMOLT_EPON_DENIED_LINK_CFG_ID__NUM_OF
+#define bcmolt_epon_denied_link_unknown_link_violation_id_all_properties                    BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_overhead_profile_violation_id_all_properties                BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_laser_on_off_violation_id_all_properties                    BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_max_link_violation_id_all_properties                        BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_llid_pool_empty_violation_id_all_properties                 BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_system_resource_violation_id_all_properties                 BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_range_violation_id_all_properties                           BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_tdm_channels_exhausted_id_all_properties                    BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID__NUM_OF
+#define bcmolt_epon_denied_link_rogue_violation_id_all_properties                           BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_upstream_bandwidth_violation_id_all_properties              BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_auto_cfg_id_all_properties                                  BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_link_key_id_all_properties                                              BCMOLT_EPON_LINK_KEY_ID__NUM_OF
+#define bcmolt_epon_link_cfg_id_all_properties                                              BCMOLT_EPON_LINK_CFG_ID__NUM_OF
+#define bcmolt_epon_link_stat_id_all_properties                                             BCMOLT_EPON_LINK_STAT_ID__NUM_OF
+#define bcmolt_epon_link_force_rediscovery_id_all_properties                                BCMOLT_EPON_LINK_FORCE_REDISCOVERY_ID__NUM_OF
+#define bcmolt_epon_link_delete_link_id_all_properties                                      BCMOLT_EPON_LINK_DELETE_LINK_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_failure_id_all_properties                             BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_link_encryption_enabled_id_all_properties                               BCMOLT_EPON_LINK_ENCRYPTION_ENABLED_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_reg_ack_timeout_id_all_properties                             BCMOLT_EPON_LINK_MPCP_REG_ACK_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_range_value_changed_id_all_properties                              BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID__NUM_OF
+#define bcmolt_epon_link_protection_switch_occurred_id_all_properties                       BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID__NUM_OF
+#define bcmolt_epon_link_duplicate_mpcp_registration_request_id_all_properties              BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID__NUM_OF
+#define bcmolt_epon_link_link_speed_mismatch_id_all_properties                              BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_report_timeout_id_all_properties                              BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timeout_id_all_properties                            BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_discovered_id_all_properties                                  BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_deregistered_id_all_properties                                BCMOLT_EPON_LINK_MPCP_DEREGISTERED_ID__NUM_OF
+#define bcmolt_epon_link_preprovisioned_link_created_id_all_properties                      BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_start_id_all_properties                        BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_stop_id_all_properties                         BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOP_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_start_id_all_properties                               BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_stop_id_all_properties                                BCMOLT_EPON_LINK_KEY_EXCHANGE_STOP_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_started_id_all_properties                      BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STARTED_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_stopped_id_all_properties                      BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOPPED_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_started_id_all_properties                             BCMOLT_EPON_LINK_KEY_EXCHANGE_STARTED_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_stopped_id_all_properties                             BCMOLT_EPON_LINK_KEY_EXCHANGE_STOPPED_ID__NUM_OF
+#define bcmolt_epon_link_static_registration_id_all_properties                              BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID__NUM_OF
+#define bcmolt_epon_link_static_registration_done_id_all_properties                         BCMOLT_EPON_LINK_STATIC_REGISTRATION_DONE_ID__NUM_OF
+#define bcmolt_epon_link_rerange_failure_id_all_properties                                  BCMOLT_EPON_LINK_RERANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_link_inject_frame_id_all_properties                                     BCMOLT_EPON_LINK_INJECT_FRAME_ID__NUM_OF
+#define bcmolt_epon_link_frame_captured_id_all_properties                                   BCMOLT_EPON_LINK_FRAME_CAPTURED_ID__NUM_OF
+#define bcmolt_epon_link_link_deleted_id_all_properties                                     BCMOLT_EPON_LINK_LINK_DELETED_ID__NUM_OF
+#define bcmolt_epon_link_stat_cfg_id_all_properties                                         BCMOLT_EPON_LINK_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_link_stat_alarm_raised_id_all_properties                                BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_link_stat_alarm_cleared_id_all_properties                               BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_link_auto_cfg_id_all_properties                                         BCMOLT_EPON_LINK_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_ni_key_id_all_properties                                                BCMOLT_EPON_NI_KEY_ID__NUM_OF
+#define bcmolt_epon_ni_cfg_id_all_properties                                                BCMOLT_EPON_NI_CFG_ID__NUM_OF
+#define bcmolt_epon_ni_set_epon_ni_en_state_id_all_properties                               BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID__NUM_OF
+#define bcmolt_epon_ni_issue_rssi_grant_id_all_properties                                   BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID__NUM_OF
+#define bcmolt_epon_ni_add_link_id_all_properties                                           BCMOLT_EPON_NI_ADD_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_add_multicast_link_id_all_properties                                 BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_add_protected_standby_link_id_all_properties                         BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_no_reports_id_all_properties                                         BCMOLT_EPON_NI_NO_REPORTS_ID__NUM_OF
+#define bcmolt_epon_ni_llid_quarantined_id_all_properties                                   BCMOLT_EPON_NI_LLID_QUARANTINED_ID__NUM_OF
+#define bcmolt_epon_ni_state_change_completed_id_all_properties                             BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_epon_ni_protection_switching_apply_rerange_delta_id_all_properties           BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID__NUM_OF
+#define bcmolt_epon_ni_rerange_failure_id_all_properties                                    BCMOLT_EPON_NI_RERANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_rssi_measurement_completed_id_all_properties                         BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_epon_ni_rogue_llid_scan_id_all_properties                                    BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID__NUM_OF
+#define bcmolt_epon_ni_start_onu_upgrade_id_all_properties                                  BCMOLT_EPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_epon_ni_onu_upgrade_complete_id_all_properties                               BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_epon_ni_rogue_scan_complete_id_all_properties                                BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID__NUM_OF
+#define bcmolt_epon_ni_mpcp_timestamp_changed_id_all_properties                             BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID__NUM_OF
+#define bcmolt_epon_ni_auto_rogue_scan_1g_failure_id_all_properties                         BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_1G_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_auto_rogue_scan_10g_failure_id_all_properties                        BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_10G_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_auto_cfg_id_all_properties                                           BCMOLT_EPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_key_id_all_properties                                        BCMOLT_EPON_ONU_10G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_id_all_properties                                       BCMOLT_EPON_ONU_10G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_cfg_id_all_properties                                        BCMOLT_EPON_ONU_10G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_cfg_id_all_properties                                   BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_alarm_raised_id_all_properties                          BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_alarm_cleared_id_all_properties                         BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_auto_cfg_id_all_properties                                   BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_key_id_all_properties                                         BCMOLT_EPON_ONU_1G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_id_all_properties                                        BCMOLT_EPON_ONU_1G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_cfg_id_all_properties                                         BCMOLT_EPON_ONU_1G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_cfg_id_all_properties                                    BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_alarm_raised_id_all_properties                           BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_alarm_cleared_id_all_properties                          BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_auto_cfg_id_all_properties                                    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_key_id_all_properties                                       BCMOLT_EPON_PATH_10G_DS_KEY_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_cfg_id_all_properties                                       BCMOLT_EPON_PATH_10G_DS_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_id_all_properties                                      BCMOLT_EPON_PATH_10G_DS_STAT_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_cfg_id_all_properties                                  BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_alarm_raised_id_all_properties                         BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_alarm_cleared_id_all_properties                        BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_auto_cfg_id_all_properties                                  BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_key_id_all_properties                                       BCMOLT_EPON_PATH_10G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_cfg_id_all_properties                                       BCMOLT_EPON_PATH_10G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_id_all_properties                                      BCMOLT_EPON_PATH_10G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_cfg_id_all_properties                                  BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_alarm_raised_id_all_properties                         BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_alarm_cleared_id_all_properties                        BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_auto_cfg_id_all_properties                                  BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_key_id_all_properties                                        BCMOLT_EPON_PATH_1G_DS_KEY_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_cfg_id_all_properties                                        BCMOLT_EPON_PATH_1G_DS_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_id_all_properties                                       BCMOLT_EPON_PATH_1G_DS_STAT_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_cfg_id_all_properties                                   BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_alarm_raised_id_all_properties                          BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_alarm_cleared_id_all_properties                         BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_auto_cfg_id_all_properties                                   BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_key_id_all_properties                                        BCMOLT_EPON_PATH_1G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_cfg_id_all_properties                                        BCMOLT_EPON_PATH_1G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_id_all_properties                                       BCMOLT_EPON_PATH_1G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_cfg_id_all_properties                                   BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_alarm_raised_id_all_properties                          BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_alarm_cleared_id_all_properties                         BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_auto_cfg_id_all_properties                                   BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_rp_key_id_all_properties                                                BCMOLT_EPON_RP_KEY_ID__NUM_OF
+#define bcmolt_epon_rp_cfg_id_all_properties                                                BCMOLT_EPON_RP_CFG_ID__NUM_OF
+#define bcmolt_gpio_key_id_all_properties                                                   BCMOLT_GPIO_KEY_ID__NUM_OF
+#define bcmolt_gpio_cfg_id_all_properties                                                   BCMOLT_GPIO_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_key_id_all_properties                                             BCMOLT_GPON_ALLOC_KEY_ID__NUM_OF
+#define bcmolt_gpon_alloc_cfg_id_all_properties                                             BCMOLT_GPON_ALLOC_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_id_all_properties                                            BCMOLT_GPON_ALLOC_STAT_ID__NUM_OF
+#define bcmolt_gpon_alloc_configuration_completed_id_all_properties                         BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_alloc_set_state_id_all_properties                                       BCMOLT_GPON_ALLOC_SET_STATE_ID__NUM_OF
+#define bcmolt_gpon_alloc_get_stats_id_all_properties                                       BCMOLT_GPON_ALLOC_GET_STATS_ID__NUM_OF
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id_all_properties                       BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_cfg_id_all_properties                                        BCMOLT_GPON_ALLOC_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_alarm_raised_id_all_properties                               BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_alarm_cleared_id_all_properties                              BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_alloc_auto_cfg_id_all_properties                                        BCMOLT_GPON_ALLOC_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_key_id_all_properties                                          BCMOLT_GPON_GEM_PORT_KEY_ID__NUM_OF
+#define bcmolt_gpon_gem_port_cfg_id_all_properties                                          BCMOLT_GPON_GEM_PORT_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_id_all_properties                                         BCMOLT_GPON_GEM_PORT_STAT_ID__NUM_OF
+#define bcmolt_gpon_gem_port_configuration_completed_id_all_properties                      BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_set_state_id_all_properties                                    BCMOLT_GPON_GEM_PORT_SET_STATE_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_cfg_id_all_properties                                     BCMOLT_GPON_GEM_PORT_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_alarm_raised_id_all_properties                            BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_alarm_cleared_id_all_properties                           BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_auto_cfg_id_all_properties                                     BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_key_id_all_properties                                               BCMOLT_GPON_IWF_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_cfg_id_all_properties                                               BCMOLT_GPON_IWF_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_id_all_properties                                              BCMOLT_GPON_IWF_STAT_ID__NUM_OF
+#define bcmolt_gpon_iwf_flush_mac_table_id_all_properties                                   BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID__NUM_OF
+#define bcmolt_gpon_iwf_scan_mac_table_id_all_properties                                    BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID__NUM_OF
+#define bcmolt_gpon_iwf_flush_mac_table_completed_id_all_properties                         BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_iwf_scan_mac_table_completed_id_all_properties                          BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_cfg_id_all_properties                                          BCMOLT_GPON_IWF_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_alarm_raised_id_all_properties                                 BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_alarm_cleared_id_all_properties                                BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_iwf_auto_cfg_id_all_properties                                          BCMOLT_GPON_IWF_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_egress_flow_key_id_all_properties                                BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_egress_flow_cfg_id_all_properties                                BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_ingress_flow_key_id_all_properties                               BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_all_properties                               BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_key_id_all_properties                                     BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_cfg_id_all_properties                                     BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_new_mac_id_all_properties                                 BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_aged_id_all_properties                                BCMOLT_GPON_IWF_MAC_TABLE_MAC_AGED_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_move_id_all_properties                                BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_dropped_id_all_properties                             BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id_all_properties                                BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_us_flow_key_id_all_properties                                       BCMOLT_GPON_IWF_US_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_us_flow_cfg_id_all_properties                                       BCMOLT_GPON_IWF_US_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_key_id_all_properties                                                BCMOLT_GPON_NI_KEY_ID__NUM_OF
+#define bcmolt_gpon_ni_cfg_id_all_properties                                                BCMOLT_GPON_NI_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_id_all_properties                                               BCMOLT_GPON_NI_STAT_ID__NUM_OF
+#define bcmolt_gpon_ni_set_pon_state_id_all_properties                                      BCMOLT_GPON_NI_SET_PON_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_reset_id_all_properties                                              BCMOLT_GPON_NI_RESET_ID__NUM_OF
+#define bcmolt_gpon_ni_disable_serial_number_id_all_properties                              BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF
+#define bcmolt_gpon_ni_single_request_standby_pon_monitoring_id_all_properties              BCMOLT_GPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF
+#define bcmolt_gpon_ni_set_onu_state_id_all_properties                                      BCMOLT_GPON_NI_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_state_change_completed_id_all_properties                             BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_los_id_all_properties                                                BCMOLT_GPON_NI_LOS_ID__NUM_OF
+#define bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id_all_properties              BCMOLT_GPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_traffic_resume_id_all_properties                BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_onus_ranged_id_all_properties                   BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_switchover_completed_id_all_properties          BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id_all_properties             BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_onu_discovered_id_all_properties                                     BCMOLT_GPON_NI_ONU_DISCOVERED_ID__NUM_OF
+#define bcmolt_gpon_ni_cpu_packets_failure_id_all_properties                                BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF
+#define bcmolt_gpon_ni_cpu_packets_id_all_properties                                        BCMOLT_GPON_NI_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_gpon_ni_broadcast_ploam_packet_id_all_properties                             BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_detection_window_id_all_properties                             BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_detection_completed_id_all_properties                          BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_deactivate_all_onus_completed_id_all_properties                      BCMOLT_GPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_disable_all_onus_completed_id_all_properties                         BCMOLT_GPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_activate_all_onus_completed_id_all_properties                        BCMOLT_GPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_enable_all_onus_completed_id_all_properties                          BCMOLT_GPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_tod_request_id_all_properties                                        BCMOLT_GPON_NI_TOD_REQUEST_ID__NUM_OF
+#define bcmolt_gpon_ni_tod_request_completed_id_all_properties                              BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id_all_properties BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_start_onu_upgrade_id_all_properties                                  BCMOLT_GPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_gpon_ni_onu_upgrade_complete_id_all_properties                               BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id_all_properties                  BCMOLT_GPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_cfg_id_all_properties                                           BCMOLT_GPON_NI_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_alarm_raised_id_all_properties                                  BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_alarm_cleared_id_all_properties                                 BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_ni_auto_cfg_id_all_properties                                           BCMOLT_GPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_key_id_all_properties                                               BCMOLT_GPON_ONU_KEY_ID__NUM_OF
+#define bcmolt_gpon_onu_cfg_id_all_properties                                               BCMOLT_GPON_ONU_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_id_all_properties                                              BCMOLT_GPON_ONU_STAT_ID__NUM_OF
+#define bcmolt_gpon_onu_set_onu_state_id_all_properties                                     BCMOLT_GPON_ONU_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_onu_rssi_measurement_id_all_properties                                  BCMOLT_GPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF
+#define bcmolt_gpon_onu_change_power_level_id_all_properties                                BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_alarm_id_all_properties                                         BCMOLT_GPON_ONU_ONU_ALARM_ID__NUM_OF
+#define bcmolt_gpon_onu_dowi_id_all_properties                                              BCMOLT_GPON_ONU_DOWI_ID__NUM_OF
+#define bcmolt_gpon_onu_sfi_id_all_properties                                               BCMOLT_GPON_ONU_SFI_ID__NUM_OF
+#define bcmolt_gpon_onu_sdi_id_all_properties                                               BCMOLT_GPON_ONU_SDI_ID__NUM_OF
+#define bcmolt_gpon_onu_dfi_id_all_properties                                               BCMOLT_GPON_ONU_DFI_ID__NUM_OF
+#define bcmolt_gpon_onu_sufi_id_all_properties                                              BCMOLT_GPON_ONU_SUFI_ID__NUM_OF
+#define bcmolt_gpon_onu_loai_id_all_properties                                              BCMOLT_GPON_ONU_LOAI_ID__NUM_OF
+#define bcmolt_gpon_onu_dgi_id_all_properties                                               BCMOLT_GPON_ONU_DGI_ID__NUM_OF
+#define bcmolt_gpon_onu_pee_id_all_properties                                               BCMOLT_GPON_ONU_PEE_ID__NUM_OF
+#define bcmolt_gpon_onu_pst_id_all_properties                                               BCMOLT_GPON_ONU_PST_ID__NUM_OF
+#define bcmolt_gpon_onu_tiwi_id_all_properties                                              BCMOLT_GPON_ONU_TIWI_ID__NUM_OF
+#define bcmolt_gpon_onu_loki_id_all_properties                                              BCMOLT_GPON_ONU_LOKI_ID__NUM_OF
+#define bcmolt_gpon_onu_memi_id_all_properties                                              BCMOLT_GPON_ONU_MEMI_ID__NUM_OF
+#define bcmolt_gpon_onu_omci_port_id_configuration_completed_id_all_properties              BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_ber_interval_configuration_completed_id_all_properties              BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_err_id_all_properties                                               BCMOLT_GPON_ONU_ERR_ID__NUM_OF
+#define bcmolt_gpon_onu_rei_id_all_properties                                               BCMOLT_GPON_ONU_REI_ID__NUM_OF
+#define bcmolt_gpon_onu_ranging_completed_id_all_properties                                 BCMOLT_GPON_ONU_RANGING_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_password_authentication_completed_id_all_properties                 BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_activation_completed_id_all_properties                          BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_deactivation_completed_id_all_properties                        BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_enable_completed_id_all_properties                              BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_disable_completed_id_all_properties                             BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_invalid_dbru_report_id_all_properties                               BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_completed_id_all_properties                            BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_key_request_timeout_id_all_properties                  BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_cycle_skipped_id_all_properties                        BCMOLT_GPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_key_mismatch_id_all_properties                         BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_all_properties                  BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID__NUM_OF
+#define bcmolt_gpon_onu_rssi_measurement_completed_id_all_properties                        BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_decrypt_required_id_all_properties                     BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID__NUM_OF
+#define bcmolt_gpon_onu_optical_reflection_id_all_properties                                BCMOLT_GPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF
+#define bcmolt_gpon_onu_cpu_packets_id_all_properties                                       BCMOLT_GPON_ONU_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_gpon_onu_ploam_packet_id_all_properties                                      BCMOLT_GPON_ONU_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_gpon_onu_cpu_packet_id_all_properties                                        BCMOLT_GPON_ONU_CPU_PACKET_ID__NUM_OF
+#define bcmolt_gpon_onu_omci_packet_id_all_properties                                       BCMOLT_GPON_ONU_OMCI_PACKET_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_activation_standby_completed_id_all_properties                  BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_power_management_state_change_id_all_properties                     BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF
+#define bcmolt_gpon_onu_possible_drift_id_all_properties                                    BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_cfg_id_all_properties                                          BCMOLT_GPON_ONU_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_alarm_raised_id_all_properties                                 BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_alarm_cleared_id_all_properties                                BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_onu_auto_cfg_id_all_properties                                          BCMOLT_GPON_ONU_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_trx_key_id_all_properties                                               BCMOLT_GPON_TRX_KEY_ID__NUM_OF
+#define bcmolt_gpon_trx_cfg_id_all_properties                                               BCMOLT_GPON_TRX_CFG_ID__NUM_OF
+#define bcmolt_log_entry_key_id_all_properties                                              BCMOLT_LOG_ENTRY_KEY_ID__NUM_OF
+#define bcmolt_log_entry_cfg_id_all_properties                                              BCMOLT_LOG_ENTRY_CFG_ID__NUM_OF
+#define bcmolt_log_entry_stat_id_all_properties                                             BCMOLT_LOG_ENTRY_STAT_ID__NUM_OF
+#define bcmolt_log_entry_stat_cfg_id_all_properties                                         BCMOLT_LOG_ENTRY_STAT_CFG_ID__NUM_OF
+#define bcmolt_log_entry_stat_alarm_raised_id_all_properties                                BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_log_entry_stat_alarm_cleared_id_all_properties                               BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_log_entry_auto_cfg_id_all_properties                                         BCMOLT_LOG_ENTRY_AUTO_CFG_ID__NUM_OF
+#define bcmolt_logger_key_id_all_properties                                                 BCMOLT_LOGGER_KEY_ID__NUM_OF
+#define bcmolt_logger_cfg_id_all_properties                                                 BCMOLT_LOGGER_CFG_ID__NUM_OF
+#define bcmolt_logger_stat_id_all_properties                                                BCMOLT_LOGGER_STAT_ID__NUM_OF
+#define bcmolt_logger_clear_log_id_all_properties                                           BCMOLT_LOGGER_CLEAR_LOG_ID__NUM_OF
+#define bcmolt_logger_stat_cfg_id_all_properties                                            BCMOLT_LOGGER_STAT_CFG_ID__NUM_OF
+#define bcmolt_logger_stat_alarm_raised_id_all_properties                                   BCMOLT_LOGGER_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_logger_stat_alarm_cleared_id_all_properties                                  BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_logger_auto_cfg_id_all_properties                                            BCMOLT_LOGGER_AUTO_CFG_ID__NUM_OF
+#define bcmolt_nni_key_id_all_properties                                                    BCMOLT_NNI_KEY_ID__NUM_OF
+#define bcmolt_nni_cfg_id_all_properties                                                    BCMOLT_NNI_CFG_ID__NUM_OF
+#define bcmolt_nni_stat_id_all_properties                                                   BCMOLT_NNI_STAT_ID__NUM_OF
+#define bcmolt_nni_status_changed_id_all_properties                                         BCMOLT_NNI_STATUS_CHANGED_ID__NUM_OF
+#define bcmolt_nni_stat_cfg_id_all_properties                                               BCMOLT_NNI_STAT_CFG_ID__NUM_OF
+#define bcmolt_nni_stat_alarm_raised_id_all_properties                                      BCMOLT_NNI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_nni_stat_alarm_cleared_id_all_properties                                     BCMOLT_NNI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_nni_auto_cfg_id_all_properties                                               BCMOLT_NNI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_nni_serdes_key_id_all_properties                                             BCMOLT_NNI_SERDES_KEY_ID__NUM_OF
+#define bcmolt_nni_serdes_cfg_id_all_properties                                             BCMOLT_NNI_SERDES_CFG_ID__NUM_OF
+#define bcmolt_software_error_key_id_all_properties                                         BCMOLT_SOFTWARE_ERROR_KEY_ID__NUM_OF
+#define bcmolt_software_error_cfg_id_all_properties                                         BCMOLT_SOFTWARE_ERROR_CFG_ID__NUM_OF
+#define bcmolt_trx_calibration_key_id_all_properties                                        BCMOLT_TRX_CALIBRATION_KEY_ID__NUM_OF
+#define bcmolt_trx_calibration_start_capture_window_id_all_properties                       BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID__NUM_OF
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_all_properties     BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID__NUM_OF
+#define bcmolt_trx_calibration_stop_capture_window_id_all_properties                        BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID__NUM_OF
+#define bcmolt_trx_calibration_auto_cfg_id_all_properties                                   BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_key_id_all_properties                                            BCMOLT_XGPON_ALLOC_KEY_ID__NUM_OF
+#define bcmolt_xgpon_alloc_cfg_id_all_properties                                            BCMOLT_XGPON_ALLOC_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_configuration_completed_id_all_properties                        BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_get_stats_id_all_properties                                      BCMOLT_XGPON_ALLOC_GET_STATS_ID__NUM_OF
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id_all_properties                      BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_set_state_id_all_properties                                      BCMOLT_XGPON_ALLOC_SET_STATE_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_id_all_properties                                           BCMOLT_XGPON_ALLOC_STAT_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_cfg_id_all_properties                                       BCMOLT_XGPON_ALLOC_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_alarm_raised_id_all_properties                              BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_alarm_cleared_id_all_properties                             BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_auto_cfg_id_all_properties                                       BCMOLT_XGPON_ALLOC_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_key_id_all_properties                                         BCMOLT_XGPON_GEM_PORT_KEY_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_cfg_id_all_properties                                         BCMOLT_XGPON_GEM_PORT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_id_all_properties                                        BCMOLT_XGPON_GEM_PORT_STAT_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_cfg_id_all_properties                                    BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_alarm_raised_id_all_properties                           BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_alarm_cleared_id_all_properties                          BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_auto_cfg_id_all_properties                                    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_iwf_key_id_all_properties                                              BCMOLT_XGPON_IWF_KEY_ID__NUM_OF
+#define bcmolt_xgpon_iwf_cfg_id_all_properties                                              BCMOLT_XGPON_IWF_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_key_id_all_properties                                               BCMOLT_XGPON_NI_KEY_ID__NUM_OF
+#define bcmolt_xgpon_ni_cfg_id_all_properties                                               BCMOLT_XGPON_NI_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_id_all_properties                                              BCMOLT_XGPON_NI_STAT_ID__NUM_OF
+#define bcmolt_xgpon_ni_set_pon_state_id_all_properties                                     BCMOLT_XGPON_NI_SET_PON_STATE_ID__NUM_OF
+#define bcmolt_xgpon_ni_reset_id_all_properties                                             BCMOLT_XGPON_NI_RESET_ID__NUM_OF
+#define bcmolt_xgpon_ni_disable_serial_number_id_all_properties                             BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF
+#define bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id_all_properties             BCMOLT_XGPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF
+#define bcmolt_xgpon_ni_set_onu_state_id_all_properties                                     BCMOLT_XGPON_NI_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_xgpon_ni_run_special_bw_map_id_all_properties                                BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_detection_window_id_all_properties                            BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF
+#define bcmolt_xgpon_ni_state_change_completed_id_all_properties                            BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_los_id_all_properties                                               BCMOLT_XGPON_NI_LOS_ID__NUM_OF
+#define bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id_all_properties             BCMOLT_XGPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_traffic_resume_id_all_properties               BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_onus_ranged_id_all_properties                  BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_switchover_completed_id_all_properties         BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id_all_properties            BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_onu_discovered_id_all_properties                                    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID__NUM_OF
+#define bcmolt_xgpon_ni_cpu_packets_failure_id_all_properties                               BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF
+#define bcmolt_xgpon_ni_cpu_packets_id_all_properties                                       BCMOLT_XGPON_NI_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_xgpon_ni_broadcast_ploam_packet_id_all_properties                            BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_all_properties                         BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_deactivate_all_onus_completed_id_all_properties                     BCMOLT_XGPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_disable_all_onus_completed_id_all_properties                        BCMOLT_XGPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_activate_all_onus_completed_id_all_properties                       BCMOLT_XGPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_enable_all_onus_completed_id_all_properties                         BCMOLT_XGPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_tod_request_completed_id_all_properties                             BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_tod_request_id_all_properties                                       BCMOLT_XGPON_NI_TOD_REQUEST_ID__NUM_OF
+#define bcmolt_xgpon_ni_start_onu_upgrade_id_all_properties                                 BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_xgpon_ni_onu_upgrade_complete_id_all_properties                              BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id_all_properties                 BCMOLT_XGPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF
+#define bcmolt_xgpon_ni_adjust_tx_wavelength_id_all_properties                              BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_cfg_id_all_properties                                          BCMOLT_XGPON_NI_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_alarm_raised_id_all_properties                                 BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_alarm_cleared_id_all_properties                                BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_ni_auto_cfg_id_all_properties                                          BCMOLT_XGPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_id_all_properties                                              BCMOLT_XGPON_ONU_KEY_ID__NUM_OF
+#define bcmolt_xgpon_onu_cfg_id_all_properties                                              BCMOLT_XGPON_ONU_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_id_all_properties                                             BCMOLT_XGPON_ONU_STAT_ID__NUM_OF
+#define bcmolt_xgpon_onu_set_onu_state_id_all_properties                                    BCMOLT_XGPON_ONU_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_xgpon_onu_rssi_measurement_id_all_properties                                 BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_alarm_id_all_properties                                        BCMOLT_XGPON_ONU_ONU_ALARM_ID__NUM_OF
+#define bcmolt_xgpon_onu_dowi_id_all_properties                                             BCMOLT_XGPON_ONU_DOWI_ID__NUM_OF
+#define bcmolt_xgpon_onu_sfi_id_all_properties                                              BCMOLT_XGPON_ONU_SFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_sdi_id_all_properties                                              BCMOLT_XGPON_ONU_SDI_ID__NUM_OF
+#define bcmolt_xgpon_onu_dfi_id_all_properties                                              BCMOLT_XGPON_ONU_DFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_pqsi_id_all_properties                                             BCMOLT_XGPON_ONU_PQSI_ID__NUM_OF
+#define bcmolt_xgpon_onu_sufi_id_all_properties                                             BCMOLT_XGPON_ONU_SUFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_tiwi_id_all_properties                                             BCMOLT_XGPON_ONU_TIWI_ID__NUM_OF
+#define bcmolt_xgpon_onu_looci_id_all_properties                                            BCMOLT_XGPON_ONU_LOOCI_ID__NUM_OF
+#define bcmolt_xgpon_onu_ranging_completed_id_all_properties                                BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_activation_completed_id_all_properties                         BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_deactivation_completed_id_all_properties                       BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_enable_completed_id_all_properties                             BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_disable_completed_id_all_properties                            BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_rssi_measurement_completed_id_all_properties                       BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_invalid_dbru_report_id_all_properties                              BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_completed_id_all_properties                           BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_key_request_timeout_id_all_properties                 BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_cycle_skipped_id_all_properties                       BCMOLT_XGPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_key_mismatch_id_all_properties                        BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF
+#define bcmolt_xgpon_onu_optical_reflection_id_all_properties                               BCMOLT_XGPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF
+#define bcmolt_xgpon_onu_ploam_packet_id_all_properties                                     BCMOLT_XGPON_ONU_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_onu_cpu_packets_id_all_properties                                      BCMOLT_XGPON_ONU_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_xgpon_onu_cpu_packet_id_all_properties                                       BCMOLT_XGPON_ONU_CPU_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_onu_omci_packet_id_all_properties                                      BCMOLT_XGPON_ONU_OMCI_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_onu_dgi_id_all_properties                                              BCMOLT_XGPON_ONU_DGI_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_management_state_change_id_all_properties                    BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF
+#define bcmolt_xgpon_onu_possible_drift_id_all_properties                                   BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF
+#define bcmolt_xgpon_onu_request_registration_id_all_properties                             BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID__NUM_OF
+#define bcmolt_xgpon_onu_change_power_levelling_id_all_properties                           BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID__NUM_OF
+#define bcmolt_xgpon_onu_get_power_level_id_all_properties                                  BCMOLT_XGPON_ONU_GET_POWER_LEVEL_ID__NUM_OF
+#define bcmolt_xgpon_onu_get_power_consumption_id_all_properties                            BCMOLT_XGPON_ONU_GET_POWER_CONSUMPTION_ID__NUM_OF
+#define bcmolt_xgpon_onu_adjust_tx_wavelength_id_all_properties                             BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID__NUM_OF
+#define bcmolt_xgpon_onu_registration_id_id_all_properties                                  BCMOLT_XGPON_ONU_REGISTRATION_ID_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_level_report_id_all_properties                               BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_consumption_report_id_all_properties                         BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_secure_mutual_authentication_id_all_properties                     BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID__NUM_OF
+#define bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_all_properties             BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_in_id_all_properties                                    BCMOLT_XGPON_ONU_ONU_TUNING_IN_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_out_id_all_properties                                   BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_out_completed_id_all_properties                         BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_in_completed_id_all_properties                          BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_tuning_response_id_all_properties                                  BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_cfg_id_all_properties                                         BCMOLT_XGPON_ONU_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_alarm_raised_id_all_properties                                BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_alarm_cleared_id_all_properties                               BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_onu_auto_cfg_id_all_properties                                         BCMOLT_XGPON_ONU_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_trx_key_id_all_properties                                              BCMOLT_XGPON_TRX_KEY_ID__NUM_OF
+#define bcmolt_xgpon_trx_cfg_id_all_properties                                              BCMOLT_XGPON_TRX_CFG_ID__NUM_OF
+#define bcmolt_xpon_serdes_key_id_all_properties                                            BCMOLT_XPON_SERDES_KEY_ID__NUM_OF
+#define bcmolt_xpon_serdes_cfg_id_all_properties                                            BCMOLT_XPON_SERDES_CFG_ID__NUM_OF
+
+/* The following are required for the API Init/Set/etc macros */
+#define bcmolt_obj_id__begin                                                                    BCMOLT_OBJ_ID__BEGIN
+#define bcmolt_obj_id_ae_ni                                                                     BCMOLT_OBJ_ID_AE_NI
+#define bcmolt_obj_id_ae_path_ds                                                                BCMOLT_OBJ_ID_AE_PATH_DS
+#define bcmolt_obj_id_ae_path_us                                                                BCMOLT_OBJ_ID_AE_PATH_US
+#define bcmolt_obj_id_channel                                                                   BCMOLT_OBJ_ID_CHANNEL
+#define bcmolt_obj_id_debug                                                                     BCMOLT_OBJ_ID_DEBUG
+#define bcmolt_obj_id_device                                                                    BCMOLT_OBJ_ID_DEVICE
+#define bcmolt_obj_id_epon_denied_link                                                          BCMOLT_OBJ_ID_EPON_DENIED_LINK
+#define bcmolt_obj_id_epon_link                                                                 BCMOLT_OBJ_ID_EPON_LINK
+#define bcmolt_obj_id_epon_ni                                                                   BCMOLT_OBJ_ID_EPON_NI
+#define bcmolt_obj_id_epon_onu_10g_us                                                           BCMOLT_OBJ_ID_EPON_ONU_10G_US
+#define bcmolt_obj_id_epon_onu_1g_us                                                            BCMOLT_OBJ_ID_EPON_ONU_1G_US
+#define bcmolt_obj_id_epon_path_10g_ds                                                          BCMOLT_OBJ_ID_EPON_PATH_10G_DS
+#define bcmolt_obj_id_epon_path_10g_us                                                          BCMOLT_OBJ_ID_EPON_PATH_10G_US
+#define bcmolt_obj_id_epon_path_1g_ds                                                           BCMOLT_OBJ_ID_EPON_PATH_1G_DS
+#define bcmolt_obj_id_epon_path_1g_us                                                           BCMOLT_OBJ_ID_EPON_PATH_1G_US
+#define bcmolt_obj_id_epon_rp                                                                   BCMOLT_OBJ_ID_EPON_RP
+#define bcmolt_obj_id_gpio                                                                      BCMOLT_OBJ_ID_GPIO
+#define bcmolt_obj_id_gpon_alloc                                                                BCMOLT_OBJ_ID_GPON_ALLOC
+#define bcmolt_obj_id_gpon_gem_port                                                             BCMOLT_OBJ_ID_GPON_GEM_PORT
+#define bcmolt_obj_id_gpon_iwf                                                                  BCMOLT_OBJ_ID_GPON_IWF
+#define bcmolt_obj_id_gpon_iwf_ds_egress_flow                                                   BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW
+#define bcmolt_obj_id_gpon_iwf_ds_ingress_flow                                                  BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW
+#define bcmolt_obj_id_gpon_iwf_mac_table                                                        BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE
+#define bcmolt_obj_id_gpon_iwf_us_flow                                                          BCMOLT_OBJ_ID_GPON_IWF_US_FLOW
+#define bcmolt_obj_id_gpon_ni                                                                   BCMOLT_OBJ_ID_GPON_NI
+#define bcmolt_obj_id_gpon_onu                                                                  BCMOLT_OBJ_ID_GPON_ONU
+#define bcmolt_obj_id_gpon_trx                                                                  BCMOLT_OBJ_ID_GPON_TRX
+#define bcmolt_obj_id_log_entry                                                                 BCMOLT_OBJ_ID_LOG_ENTRY
+#define bcmolt_obj_id_logger                                                                    BCMOLT_OBJ_ID_LOGGER
+#define bcmolt_obj_id_nni                                                                       BCMOLT_OBJ_ID_NNI
+#define bcmolt_obj_id_nni_serdes                                                                BCMOLT_OBJ_ID_NNI_SERDES
+#define bcmolt_obj_id_software_error                                                            BCMOLT_OBJ_ID_SOFTWARE_ERROR
+#define bcmolt_obj_id_trx_calibration                                                           BCMOLT_OBJ_ID_TRX_CALIBRATION
+#define bcmolt_obj_id_xgpon_alloc                                                               BCMOLT_OBJ_ID_XGPON_ALLOC
+#define bcmolt_obj_id_xgpon_gem_port                                                            BCMOLT_OBJ_ID_XGPON_GEM_PORT
+#define bcmolt_obj_id_xgpon_iwf                                                                 BCMOLT_OBJ_ID_XGPON_IWF
+#define bcmolt_obj_id_xgpon_ni                                                                  BCMOLT_OBJ_ID_XGPON_NI
+#define bcmolt_obj_id_xgpon_onu                                                                 BCMOLT_OBJ_ID_XGPON_ONU
+#define bcmolt_obj_id_xgpon_trx                                                                 BCMOLT_OBJ_ID_XGPON_TRX
+#define bcmolt_obj_id_xpon_serdes                                                               BCMOLT_OBJ_ID_XPON_SERDES
+#define bcmolt_obj_id__num_of                                                                   BCMOLT_OBJ_ID__NUM_OF
+#define bcmolt_ae_ni_oper_id__begin                                                             BCMOLT_AE_NI_OPER_ID__BEGIN
+#define bcmolt_ae_ni_oper_id_set_ae_ni_en_state                                                 BCMOLT_AE_NI_OPER_ID_SET_AE_NI_EN_STATE
+#define bcmolt_ae_ni_oper_id__num_of                                                            BCMOLT_AE_NI_OPER_ID__NUM_OF
+#define bcmolt_ae_path_ds_auto_id__begin                                                        BCMOLT_AE_PATH_DS_AUTO_ID__BEGIN
+#define bcmolt_ae_path_ds_auto_id_stat_alarm_cleared                                            BCMOLT_AE_PATH_DS_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_ae_path_ds_auto_id_stat_alarm_raised                                             BCMOLT_AE_PATH_DS_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_ae_path_ds_auto_id__num_of                                                       BCMOLT_AE_PATH_DS_AUTO_ID__NUM_OF
+#define bcmolt_ae_path_us_auto_id__begin                                                        BCMOLT_AE_PATH_US_AUTO_ID__BEGIN
+#define bcmolt_ae_path_us_auto_id_stat_alarm_cleared                                            BCMOLT_AE_PATH_US_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_ae_path_us_auto_id_stat_alarm_raised                                             BCMOLT_AE_PATH_US_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_ae_path_us_auto_id__num_of                                                       BCMOLT_AE_PATH_US_AUTO_ID__NUM_OF
+#define bcmolt_debug_auto_id__begin                                                             BCMOLT_DEBUG_AUTO_ID__BEGIN
+#define bcmolt_debug_auto_id_cli_output                                                         BCMOLT_DEBUG_AUTO_ID_CLI_OUTPUT
+#define bcmolt_debug_auto_id_file_almost_full                                                   BCMOLT_DEBUG_AUTO_ID_FILE_ALMOST_FULL
+#define bcmolt_debug_auto_id__num_of                                                            BCMOLT_DEBUG_AUTO_ID__NUM_OF
+#define bcmolt_debug_oper_id__begin                                                             BCMOLT_DEBUG_OPER_ID__BEGIN
+#define bcmolt_debug_oper_id_cli_input                                                          BCMOLT_DEBUG_OPER_ID_CLI_INPUT
+#define bcmolt_debug_oper_id_reset_api_capture                                                  BCMOLT_DEBUG_OPER_ID_RESET_API_CAPTURE
+#define bcmolt_debug_oper_id_start_api_capture                                                  BCMOLT_DEBUG_OPER_ID_START_API_CAPTURE
+#define bcmolt_debug_oper_id_stop_api_capture                                                   BCMOLT_DEBUG_OPER_ID_STOP_API_CAPTURE
+#define bcmolt_debug_oper_id__num_of                                                            BCMOLT_DEBUG_OPER_ID__NUM_OF
+#define bcmolt_device_auto_id__begin                                                            BCMOLT_DEVICE_AUTO_ID__BEGIN
+#define bcmolt_device_auto_id_connection_complete                                               BCMOLT_DEVICE_AUTO_ID_CONNECTION_COMPLETE
+#define bcmolt_device_auto_id_connection_established                                            BCMOLT_DEVICE_AUTO_ID_CONNECTION_ESTABLISHED
+#define bcmolt_device_auto_id_connection_failure                                                BCMOLT_DEVICE_AUTO_ID_CONNECTION_FAILURE
+#define bcmolt_device_auto_id_ddr_test_complete                                                 BCMOLT_DEVICE_AUTO_ID_DDR_TEST_COMPLETE
+#define bcmolt_device_auto_id_device_keep_alive                                                 BCMOLT_DEVICE_AUTO_ID_DEVICE_KEEP_ALIVE
+#define bcmolt_device_auto_id_device_ready                                                      BCMOLT_DEVICE_AUTO_ID_DEVICE_READY
+#define bcmolt_device_auto_id_disconnection_complete                                            BCMOLT_DEVICE_AUTO_ID_DISCONNECTION_COMPLETE
+#define bcmolt_device_auto_id_image_transfer_complete                                           BCMOLT_DEVICE_AUTO_ID_IMAGE_TRANSFER_COMPLETE
+#define bcmolt_device_auto_id_indications_dropped                                               BCMOLT_DEVICE_AUTO_ID_INDICATIONS_DROPPED
+#define bcmolt_device_auto_id_sw_error                                                          BCMOLT_DEVICE_AUTO_ID_SW_ERROR
+#define bcmolt_device_auto_id_sw_exception                                                      BCMOLT_DEVICE_AUTO_ID_SW_EXCEPTION
+#define bcmolt_device_auto_id__num_of                                                           BCMOLT_DEVICE_AUTO_ID__NUM_OF
+#define bcmolt_device_oper_id__begin                                                            BCMOLT_DEVICE_OPER_ID__BEGIN
+#define bcmolt_device_oper_id_connect                                                           BCMOLT_DEVICE_OPER_ID_CONNECT
+#define bcmolt_device_oper_id_disconnect                                                        BCMOLT_DEVICE_OPER_ID_DISCONNECT
+#define bcmolt_device_oper_id_host_keep_alive                                                   BCMOLT_DEVICE_OPER_ID_HOST_KEEP_ALIVE
+#define bcmolt_device_oper_id_image_transfer_data                                               BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_DATA
+#define bcmolt_device_oper_id_image_transfer_start                                              BCMOLT_DEVICE_OPER_ID_IMAGE_TRANSFER_START
+#define bcmolt_device_oper_id_reset                                                             BCMOLT_DEVICE_OPER_ID_RESET
+#define bcmolt_device_oper_id_run_ddr_test                                                      BCMOLT_DEVICE_OPER_ID_RUN_DDR_TEST
+#define bcmolt_device_oper_id_sw_upgrade_activate                                               BCMOLT_DEVICE_OPER_ID_SW_UPGRADE_ACTIVATE
+#define bcmolt_device_oper_id__num_of                                                           BCMOLT_DEVICE_OPER_ID__NUM_OF
+#define bcmolt_epon_denied_link_auto_id__begin                                                  BCMOLT_EPON_DENIED_LINK_AUTO_ID__BEGIN
+#define bcmolt_epon_denied_link_auto_id_laser_on_off_violation                                  BCMOLT_EPON_DENIED_LINK_AUTO_ID_LASER_ON_OFF_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_llid_pool_empty_violation                               BCMOLT_EPON_DENIED_LINK_AUTO_ID_LLID_POOL_EMPTY_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_max_link_violation                                      BCMOLT_EPON_DENIED_LINK_AUTO_ID_MAX_LINK_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_overhead_profile_violation                              BCMOLT_EPON_DENIED_LINK_AUTO_ID_OVERHEAD_PROFILE_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_range_violation                                         BCMOLT_EPON_DENIED_LINK_AUTO_ID_RANGE_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_rogue_violation                                         BCMOLT_EPON_DENIED_LINK_AUTO_ID_ROGUE_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_system_resource_violation                               BCMOLT_EPON_DENIED_LINK_AUTO_ID_SYSTEM_RESOURCE_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_tdm_channels_exhausted                                  BCMOLT_EPON_DENIED_LINK_AUTO_ID_TDM_CHANNELS_EXHAUSTED
+#define bcmolt_epon_denied_link_auto_id_unknown_link_violation                                  BCMOLT_EPON_DENIED_LINK_AUTO_ID_UNKNOWN_LINK_VIOLATION
+#define bcmolt_epon_denied_link_auto_id_upstream_bandwidth_violation                            BCMOLT_EPON_DENIED_LINK_AUTO_ID_UPSTREAM_BANDWIDTH_VIOLATION
+#define bcmolt_epon_denied_link_auto_id__num_of                                                 BCMOLT_EPON_DENIED_LINK_AUTO_ID__NUM_OF
+#define bcmolt_epon_link_auto_id__begin                                                         BCMOLT_EPON_LINK_AUTO_ID__BEGIN
+#define bcmolt_epon_link_auto_id_duplicate_mpcp_registration_request                            BCMOLT_EPON_LINK_AUTO_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST
+#define bcmolt_epon_link_auto_id_encryption_enabled                                             BCMOLT_EPON_LINK_AUTO_ID_ENCRYPTION_ENABLED
+#define bcmolt_epon_link_auto_id_key_exchange_failure                                           BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_FAILURE
+#define bcmolt_epon_link_auto_id_key_exchange_started                                           BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_STARTED
+#define bcmolt_epon_link_auto_id_key_exchange_stopped                                           BCMOLT_EPON_LINK_AUTO_ID_KEY_EXCHANGE_STOPPED
+#define bcmolt_epon_link_auto_id_link_deleted                                                   BCMOLT_EPON_LINK_AUTO_ID_LINK_DELETED
+#define bcmolt_epon_link_auto_id_link_speed_mismatch                                            BCMOLT_EPON_LINK_AUTO_ID_LINK_SPEED_MISMATCH
+#define bcmolt_epon_link_auto_id_mpcp_deregistered                                              BCMOLT_EPON_LINK_AUTO_ID_MPCP_DEREGISTERED
+#define bcmolt_epon_link_auto_id_mpcp_discovered                                                BCMOLT_EPON_LINK_AUTO_ID_MPCP_DISCOVERED
+#define bcmolt_epon_link_auto_id_mpcp_reg_ack_timeout                                           BCMOLT_EPON_LINK_AUTO_ID_MPCP_REG_ACK_TIMEOUT
+#define bcmolt_epon_link_auto_id_mpcp_report_timeout                                            BCMOLT_EPON_LINK_AUTO_ID_MPCP_REPORT_TIMEOUT
+#define bcmolt_epon_link_auto_id_oam_keepalive_timeout                                          BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMEOUT
+#define bcmolt_epon_link_auto_id_oam_keepalive_timer_started                                    BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMER_STARTED
+#define bcmolt_epon_link_auto_id_oam_keepalive_timer_stopped                                    BCMOLT_EPON_LINK_AUTO_ID_OAM_KEEPALIVE_TIMER_STOPPED
+#define bcmolt_epon_link_auto_id_preprovisioned_link_created                                    BCMOLT_EPON_LINK_AUTO_ID_PREPROVISIONED_LINK_CREATED
+#define bcmolt_epon_link_auto_id_protection_switch_occurred                                     BCMOLT_EPON_LINK_AUTO_ID_PROTECTION_SWITCH_OCCURRED
+#define bcmolt_epon_link_auto_id_range_value_changed                                            BCMOLT_EPON_LINK_AUTO_ID_RANGE_VALUE_CHANGED
+#define bcmolt_epon_link_auto_id_rerange_failure                                                BCMOLT_EPON_LINK_AUTO_ID_RERANGE_FAILURE
+#define bcmolt_epon_link_auto_id_stat_alarm_cleared                                             BCMOLT_EPON_LINK_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_link_auto_id_stat_alarm_raised                                              BCMOLT_EPON_LINK_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_link_auto_id_static_registration_done                                       BCMOLT_EPON_LINK_AUTO_ID_STATIC_REGISTRATION_DONE
+#define bcmolt_epon_link_auto_id__num_of                                                        BCMOLT_EPON_LINK_AUTO_ID__NUM_OF
+#define bcmolt_epon_link_oper_id__begin                                                         BCMOLT_EPON_LINK_OPER_ID__BEGIN
+#define bcmolt_epon_link_oper_id_delete_link                                                    BCMOLT_EPON_LINK_OPER_ID_DELETE_LINK
+#define bcmolt_epon_link_oper_id_force_rediscovery                                              BCMOLT_EPON_LINK_OPER_ID_FORCE_REDISCOVERY
+#define bcmolt_epon_link_oper_id_key_exchange_start                                             BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_START
+#define bcmolt_epon_link_oper_id_key_exchange_stop                                              BCMOLT_EPON_LINK_OPER_ID_KEY_EXCHANGE_STOP
+#define bcmolt_epon_link_oper_id_oam_keepalive_timer_start                                      BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_START
+#define bcmolt_epon_link_oper_id_oam_keepalive_timer_stop                                       BCMOLT_EPON_LINK_OPER_ID_OAM_KEEPALIVE_TIMER_STOP
+#define bcmolt_epon_link_oper_id_static_registration                                            BCMOLT_EPON_LINK_OPER_ID_STATIC_REGISTRATION
+#define bcmolt_epon_link_oper_id__num_of                                                        BCMOLT_EPON_LINK_OPER_ID__NUM_OF
+#define bcmolt_epon_link_proxy_id__begin                                                        BCMOLT_EPON_LINK_PROXY_ID__BEGIN
+#define bcmolt_epon_link_proxy_id_inject_frame                                                  BCMOLT_EPON_LINK_PROXY_ID_INJECT_FRAME
+#define bcmolt_epon_link_proxy_id__num_of                                                       BCMOLT_EPON_LINK_PROXY_ID__NUM_OF
+#define bcmolt_epon_link_proxy_rx_id__begin                                                     BCMOLT_EPON_LINK_PROXY_RX_ID__BEGIN
+#define bcmolt_epon_link_proxy_rx_id_frame_captured                                             BCMOLT_EPON_LINK_PROXY_RX_ID_FRAME_CAPTURED
+#define bcmolt_epon_link_proxy_rx_id__num_of                                                    BCMOLT_EPON_LINK_PROXY_RX_ID__NUM_OF
+#define bcmolt_epon_ni_auto_id__begin                                                           BCMOLT_EPON_NI_AUTO_ID__BEGIN
+#define bcmolt_epon_ni_auto_id_auto_rogue_scan_10g_failure                                      BCMOLT_EPON_NI_AUTO_ID_AUTO_ROGUE_SCAN_10G_FAILURE
+#define bcmolt_epon_ni_auto_id_auto_rogue_scan_1g_failure                                       BCMOLT_EPON_NI_AUTO_ID_AUTO_ROGUE_SCAN_1G_FAILURE
+#define bcmolt_epon_ni_auto_id_llid_quarantined                                                 BCMOLT_EPON_NI_AUTO_ID_LLID_QUARANTINED
+#define bcmolt_epon_ni_auto_id_mpcp_timestamp_changed                                           BCMOLT_EPON_NI_AUTO_ID_MPCP_TIMESTAMP_CHANGED
+#define bcmolt_epon_ni_auto_id_no_reports                                                       BCMOLT_EPON_NI_AUTO_ID_NO_REPORTS
+#define bcmolt_epon_ni_auto_id_onu_upgrade_complete                                             BCMOLT_EPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_epon_ni_auto_id_rerange_failure                                                  BCMOLT_EPON_NI_AUTO_ID_RERANGE_FAILURE
+#define bcmolt_epon_ni_auto_id_rogue_scan_complete                                              BCMOLT_EPON_NI_AUTO_ID_ROGUE_SCAN_COMPLETE
+#define bcmolt_epon_ni_auto_id_rssi_measurement_completed                                       BCMOLT_EPON_NI_AUTO_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_epon_ni_auto_id_state_change_completed                                           BCMOLT_EPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_epon_ni_auto_id__num_of                                                          BCMOLT_EPON_NI_AUTO_ID__NUM_OF
+#define bcmolt_epon_ni_oper_id__begin                                                           BCMOLT_EPON_NI_OPER_ID__BEGIN
+#define bcmolt_epon_ni_oper_id_add_link                                                         BCMOLT_EPON_NI_OPER_ID_ADD_LINK
+#define bcmolt_epon_ni_oper_id_add_multicast_link                                               BCMOLT_EPON_NI_OPER_ID_ADD_MULTICAST_LINK
+#define bcmolt_epon_ni_oper_id_add_protected_standby_link                                       BCMOLT_EPON_NI_OPER_ID_ADD_PROTECTED_STANDBY_LINK
+#define bcmolt_epon_ni_oper_id_issue_rssi_grant                                                 BCMOLT_EPON_NI_OPER_ID_ISSUE_RSSI_GRANT
+#define bcmolt_epon_ni_oper_id_protection_switching_apply_rerange_delta                         BCMOLT_EPON_NI_OPER_ID_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA
+#define bcmolt_epon_ni_oper_id_rogue_llid_scan                                                  BCMOLT_EPON_NI_OPER_ID_ROGUE_LLID_SCAN
+#define bcmolt_epon_ni_oper_id_set_epon_ni_en_state                                             BCMOLT_EPON_NI_OPER_ID_SET_EPON_NI_EN_STATE
+#define bcmolt_epon_ni_oper_id_start_onu_upgrade                                                BCMOLT_EPON_NI_OPER_ID_START_ONU_UPGRADE
+#define bcmolt_epon_ni_oper_id__num_of                                                          BCMOLT_EPON_NI_OPER_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_auto_id__begin                                                   BCMOLT_EPON_ONU_10G_US_AUTO_ID__BEGIN
+#define bcmolt_epon_onu_10g_us_auto_id_stat_alarm_cleared                                       BCMOLT_EPON_ONU_10G_US_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_onu_10g_us_auto_id_stat_alarm_raised                                        BCMOLT_EPON_ONU_10G_US_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_onu_10g_us_auto_id__num_of                                                  BCMOLT_EPON_ONU_10G_US_AUTO_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_auto_id__begin                                                    BCMOLT_EPON_ONU_1G_US_AUTO_ID__BEGIN
+#define bcmolt_epon_onu_1g_us_auto_id_stat_alarm_cleared                                        BCMOLT_EPON_ONU_1G_US_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_onu_1g_us_auto_id_stat_alarm_raised                                         BCMOLT_EPON_ONU_1G_US_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_onu_1g_us_auto_id__num_of                                                   BCMOLT_EPON_ONU_1G_US_AUTO_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_auto_id__begin                                                  BCMOLT_EPON_PATH_10G_DS_AUTO_ID__BEGIN
+#define bcmolt_epon_path_10g_ds_auto_id_stat_alarm_cleared                                      BCMOLT_EPON_PATH_10G_DS_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_10g_ds_auto_id_stat_alarm_raised                                       BCMOLT_EPON_PATH_10G_DS_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_10g_ds_auto_id__num_of                                                 BCMOLT_EPON_PATH_10G_DS_AUTO_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_auto_id__begin                                                  BCMOLT_EPON_PATH_10G_US_AUTO_ID__BEGIN
+#define bcmolt_epon_path_10g_us_auto_id_stat_alarm_cleared                                      BCMOLT_EPON_PATH_10G_US_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_10g_us_auto_id_stat_alarm_raised                                       BCMOLT_EPON_PATH_10G_US_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_10g_us_auto_id__num_of                                                 BCMOLT_EPON_PATH_10G_US_AUTO_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_auto_id__begin                                                   BCMOLT_EPON_PATH_1G_DS_AUTO_ID__BEGIN
+#define bcmolt_epon_path_1g_ds_auto_id_stat_alarm_cleared                                       BCMOLT_EPON_PATH_1G_DS_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_1g_ds_auto_id_stat_alarm_raised                                        BCMOLT_EPON_PATH_1G_DS_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_1g_ds_auto_id__num_of                                                  BCMOLT_EPON_PATH_1G_DS_AUTO_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_auto_id__begin                                                   BCMOLT_EPON_PATH_1G_US_AUTO_ID__BEGIN
+#define bcmolt_epon_path_1g_us_auto_id_stat_alarm_cleared                                       BCMOLT_EPON_PATH_1G_US_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_1g_us_auto_id_stat_alarm_raised                                        BCMOLT_EPON_PATH_1G_US_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_1g_us_auto_id__num_of                                                  BCMOLT_EPON_PATH_1G_US_AUTO_ID__NUM_OF
+#define bcmolt_gpon_alloc_auto_id__begin                                                        BCMOLT_GPON_ALLOC_AUTO_ID__BEGIN
+#define bcmolt_gpon_alloc_auto_id_configuration_completed                                       BCMOLT_GPON_ALLOC_AUTO_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_alloc_auto_id_get_alloc_stats_completed                                     BCMOLT_GPON_ALLOC_AUTO_ID_GET_ALLOC_STATS_COMPLETED
+#define bcmolt_gpon_alloc_auto_id_stat_alarm_cleared                                            BCMOLT_GPON_ALLOC_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_alloc_auto_id_stat_alarm_raised                                             BCMOLT_GPON_ALLOC_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_alloc_auto_id__num_of                                                       BCMOLT_GPON_ALLOC_AUTO_ID__NUM_OF
+#define bcmolt_gpon_alloc_oper_id__begin                                                        BCMOLT_GPON_ALLOC_OPER_ID__BEGIN
+#define bcmolt_gpon_alloc_oper_id_get_stats                                                     BCMOLT_GPON_ALLOC_OPER_ID_GET_STATS
+#define bcmolt_gpon_alloc_oper_id_set_state                                                     BCMOLT_GPON_ALLOC_OPER_ID_SET_STATE
+#define bcmolt_gpon_alloc_oper_id__num_of                                                       BCMOLT_GPON_ALLOC_OPER_ID__NUM_OF
+#define bcmolt_gpon_gem_port_auto_id__begin                                                     BCMOLT_GPON_GEM_PORT_AUTO_ID__BEGIN
+#define bcmolt_gpon_gem_port_auto_id_configuration_completed                                    BCMOLT_GPON_GEM_PORT_AUTO_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_gem_port_auto_id_stat_alarm_cleared                                         BCMOLT_GPON_GEM_PORT_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_gem_port_auto_id_stat_alarm_raised                                          BCMOLT_GPON_GEM_PORT_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_gem_port_auto_id__num_of                                                    BCMOLT_GPON_GEM_PORT_AUTO_ID__NUM_OF
+#define bcmolt_gpon_gem_port_oper_id__begin                                                     BCMOLT_GPON_GEM_PORT_OPER_ID__BEGIN
+#define bcmolt_gpon_gem_port_oper_id_set_state                                                  BCMOLT_GPON_GEM_PORT_OPER_ID_SET_STATE
+#define bcmolt_gpon_gem_port_oper_id__num_of                                                    BCMOLT_GPON_GEM_PORT_OPER_ID__NUM_OF
+#define bcmolt_gpon_iwf_auto_id__begin                                                          BCMOLT_GPON_IWF_AUTO_ID__BEGIN
+#define bcmolt_gpon_iwf_auto_id_flush_mac_table_completed                                       BCMOLT_GPON_IWF_AUTO_ID_FLUSH_MAC_TABLE_COMPLETED
+#define bcmolt_gpon_iwf_auto_id_scan_mac_table_completed                                        BCMOLT_GPON_IWF_AUTO_ID_SCAN_MAC_TABLE_COMPLETED
+#define bcmolt_gpon_iwf_auto_id_stat_alarm_cleared                                              BCMOLT_GPON_IWF_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_iwf_auto_id_stat_alarm_raised                                               BCMOLT_GPON_IWF_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_iwf_auto_id__num_of                                                         BCMOLT_GPON_IWF_AUTO_ID__NUM_OF
+#define bcmolt_gpon_iwf_oper_id__begin                                                          BCMOLT_GPON_IWF_OPER_ID__BEGIN
+#define bcmolt_gpon_iwf_oper_id_flush_mac_table                                                 BCMOLT_GPON_IWF_OPER_ID_FLUSH_MAC_TABLE
+#define bcmolt_gpon_iwf_oper_id_scan_mac_table                                                  BCMOLT_GPON_IWF_OPER_ID_SCAN_MAC_TABLE
+#define bcmolt_gpon_iwf_oper_id__num_of                                                         BCMOLT_GPON_IWF_OPER_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_auto_id__begin                                                BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID__BEGIN
+#define bcmolt_gpon_iwf_mac_table_auto_id_mac_aged                                              BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_AGED
+#define bcmolt_gpon_iwf_mac_table_auto_id_mac_dropped                                           BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_DROPPED
+#define bcmolt_gpon_iwf_mac_table_auto_id_mac_move                                              BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_MAC_MOVE
+#define bcmolt_gpon_iwf_mac_table_auto_id_new_mac                                               BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID_NEW_MAC
+#define bcmolt_gpon_iwf_mac_table_auto_id__num_of                                               BCMOLT_GPON_IWF_MAC_TABLE_AUTO_ID__NUM_OF
+#define bcmolt_gpon_ni_auto_id__begin                                                           BCMOLT_GPON_NI_AUTO_ID__BEGIN
+#define bcmolt_gpon_ni_auto_id_activate_all_onus_completed                                      BCMOLT_GPON_NI_AUTO_ID_ACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_id_cpu_packets_failure                                              BCMOLT_GPON_NI_AUTO_ID_CPU_PACKETS_FAILURE
+#define bcmolt_gpon_ni_auto_id_deactivate_all_onus_completed                                    BCMOLT_GPON_NI_AUTO_ID_DEACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_id_disable_all_onus_completed                                       BCMOLT_GPON_NI_AUTO_ID_DISABLE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_id_enable_all_onus_completed                                        BCMOLT_GPON_NI_AUTO_ID_ENABLE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_id_los                                                              BCMOLT_GPON_NI_AUTO_ID_LOS
+#define bcmolt_gpon_ni_auto_id_onu_discovered                                                   BCMOLT_GPON_NI_AUTO_ID_ONU_DISCOVERED
+#define bcmolt_gpon_ni_auto_id_onu_upgrade_complete                                             BCMOLT_GPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_gpon_ni_auto_id_protection_switching_onus_ranged                                 BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_ONUS_RANGED
+#define bcmolt_gpon_ni_auto_id_protection_switching_switchover_completed                        BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED
+#define bcmolt_gpon_ni_auto_id_protection_switching_traffic_resume                              BCMOLT_GPON_NI_AUTO_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME
+#define bcmolt_gpon_ni_auto_id_rogue_detection_completed                                        BCMOLT_GPON_NI_AUTO_ID_ROGUE_DETECTION_COMPLETED
+#define bcmolt_gpon_ni_auto_id_rogue_onu_special_map_cycle_start                                BCMOLT_GPON_NI_AUTO_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START
+#define bcmolt_gpon_ni_auto_id_serial_number_acquisition_cycle_start                            BCMOLT_GPON_NI_AUTO_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START
+#define bcmolt_gpon_ni_auto_id_standby_pon_monitoring_cycle_completed                           BCMOLT_GPON_NI_AUTO_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED
+#define bcmolt_gpon_ni_auto_id_stat_alarm_cleared                                               BCMOLT_GPON_NI_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_ni_auto_id_stat_alarm_raised                                                BCMOLT_GPON_NI_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_ni_auto_id_state_change_completed                                           BCMOLT_GPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_gpon_ni_auto_id_tod_request_completed                                            BCMOLT_GPON_NI_AUTO_ID_TOD_REQUEST_COMPLETED
+#define bcmolt_gpon_ni_auto_id__num_of                                                          BCMOLT_GPON_NI_AUTO_ID__NUM_OF
+#define bcmolt_gpon_ni_oper_id__begin                                                           BCMOLT_GPON_NI_OPER_ID__BEGIN
+#define bcmolt_gpon_ni_oper_id_disable_serial_number                                            BCMOLT_GPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER
+#define bcmolt_gpon_ni_oper_id_protection_switching_type_c_set_multiple_onu_state               BCMOLT_GPON_NI_OPER_ID_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE
+#define bcmolt_gpon_ni_oper_id_reset                                                            BCMOLT_GPON_NI_OPER_ID_RESET
+#define bcmolt_gpon_ni_oper_id_rogue_detection_window                                           BCMOLT_GPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW
+#define bcmolt_gpon_ni_oper_id_set_onu_state                                                    BCMOLT_GPON_NI_OPER_ID_SET_ONU_STATE
+#define bcmolt_gpon_ni_oper_id_set_pon_state                                                    BCMOLT_GPON_NI_OPER_ID_SET_PON_STATE
+#define bcmolt_gpon_ni_oper_id_single_request_standby_pon_monitoring                            BCMOLT_GPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING
+#define bcmolt_gpon_ni_oper_id_start_onu_upgrade                                                BCMOLT_GPON_NI_OPER_ID_START_ONU_UPGRADE
+#define bcmolt_gpon_ni_oper_id_tod_request                                                      BCMOLT_GPON_NI_OPER_ID_TOD_REQUEST
+#define bcmolt_gpon_ni_oper_id__num_of                                                          BCMOLT_GPON_NI_OPER_ID__NUM_OF
+#define bcmolt_gpon_ni_proxy_id__begin                                                          BCMOLT_GPON_NI_PROXY_ID__BEGIN
+#define bcmolt_gpon_ni_proxy_id_broadcast_ploam_packet                                          BCMOLT_GPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET
+#define bcmolt_gpon_ni_proxy_id_cpu_packets                                                     BCMOLT_GPON_NI_PROXY_ID_CPU_PACKETS
+#define bcmolt_gpon_ni_proxy_id__num_of                                                         BCMOLT_GPON_NI_PROXY_ID__NUM_OF
+#define bcmolt_gpon_onu_auto_id__begin                                                          BCMOLT_GPON_ONU_AUTO_ID__BEGIN
+#define bcmolt_gpon_onu_auto_id_ber_interval_configuration_completed                            BCMOLT_GPON_ONU_AUTO_ID_BER_INTERVAL_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_onu_auto_id_dfi                                                             BCMOLT_GPON_ONU_AUTO_ID_DFI
+#define bcmolt_gpon_onu_auto_id_dgi                                                             BCMOLT_GPON_ONU_AUTO_ID_DGI
+#define bcmolt_gpon_onu_auto_id_dowi                                                            BCMOLT_GPON_ONU_AUTO_ID_DOWI
+#define bcmolt_gpon_onu_auto_id_err                                                             BCMOLT_GPON_ONU_AUTO_ID_ERR
+#define bcmolt_gpon_onu_auto_id_invalid_dbru_report                                             BCMOLT_GPON_ONU_AUTO_ID_INVALID_DBRU_REPORT
+#define bcmolt_gpon_onu_auto_id_key_exchange_completed                                          BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_COMPLETED
+#define bcmolt_gpon_onu_auto_id_key_exchange_cycle_skipped                                      BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_CYCLE_SKIPPED
+#define bcmolt_gpon_onu_auto_id_key_exchange_decrypt_required                                   BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_DECRYPT_REQUIRED
+#define bcmolt_gpon_onu_auto_id_key_exchange_key_mismatch                                       BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_MISMATCH
+#define bcmolt_gpon_onu_auto_id_key_exchange_key_request_timeout                                BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT
+#define bcmolt_gpon_onu_auto_id_key_exchange_unconsecutive_index                                BCMOLT_GPON_ONU_AUTO_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX
+#define bcmolt_gpon_onu_auto_id_loai                                                            BCMOLT_GPON_ONU_AUTO_ID_LOAI
+#define bcmolt_gpon_onu_auto_id_loki                                                            BCMOLT_GPON_ONU_AUTO_ID_LOKI
+#define bcmolt_gpon_onu_auto_id_memi                                                            BCMOLT_GPON_ONU_AUTO_ID_MEMI
+#define bcmolt_gpon_onu_auto_id_omci_port_id_configuration_completed                            BCMOLT_GPON_ONU_AUTO_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_onu_auto_id_onu_activation_completed                                        BCMOLT_GPON_ONU_AUTO_ID_ONU_ACTIVATION_COMPLETED
+#define bcmolt_gpon_onu_auto_id_onu_activation_standby_completed                                BCMOLT_GPON_ONU_AUTO_ID_ONU_ACTIVATION_STANDBY_COMPLETED
+#define bcmolt_gpon_onu_auto_id_onu_alarm                                                       BCMOLT_GPON_ONU_AUTO_ID_ONU_ALARM
+#define bcmolt_gpon_onu_auto_id_onu_deactivation_completed                                      BCMOLT_GPON_ONU_AUTO_ID_ONU_DEACTIVATION_COMPLETED
+#define bcmolt_gpon_onu_auto_id_onu_disable_completed                                           BCMOLT_GPON_ONU_AUTO_ID_ONU_DISABLE_COMPLETED
+#define bcmolt_gpon_onu_auto_id_onu_enable_completed                                            BCMOLT_GPON_ONU_AUTO_ID_ONU_ENABLE_COMPLETED
+#define bcmolt_gpon_onu_auto_id_optical_reflection                                              BCMOLT_GPON_ONU_AUTO_ID_OPTICAL_REFLECTION
+#define bcmolt_gpon_onu_auto_id_password_authentication_completed                               BCMOLT_GPON_ONU_AUTO_ID_PASSWORD_AUTHENTICATION_COMPLETED
+#define bcmolt_gpon_onu_auto_id_pee                                                             BCMOLT_GPON_ONU_AUTO_ID_PEE
+#define bcmolt_gpon_onu_auto_id_possible_drift                                                  BCMOLT_GPON_ONU_AUTO_ID_POSSIBLE_DRIFT
+#define bcmolt_gpon_onu_auto_id_power_management_state_change                                   BCMOLT_GPON_ONU_AUTO_ID_POWER_MANAGEMENT_STATE_CHANGE
+#define bcmolt_gpon_onu_auto_id_pst                                                             BCMOLT_GPON_ONU_AUTO_ID_PST
+#define bcmolt_gpon_onu_auto_id_ranging_completed                                               BCMOLT_GPON_ONU_AUTO_ID_RANGING_COMPLETED
+#define bcmolt_gpon_onu_auto_id_rei                                                             BCMOLT_GPON_ONU_AUTO_ID_REI
+#define bcmolt_gpon_onu_auto_id_rssi_measurement_completed                                      BCMOLT_GPON_ONU_AUTO_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_gpon_onu_auto_id_sdi                                                             BCMOLT_GPON_ONU_AUTO_ID_SDI
+#define bcmolt_gpon_onu_auto_id_sfi                                                             BCMOLT_GPON_ONU_AUTO_ID_SFI
+#define bcmolt_gpon_onu_auto_id_stat_alarm_cleared                                              BCMOLT_GPON_ONU_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_onu_auto_id_stat_alarm_raised                                               BCMOLT_GPON_ONU_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_onu_auto_id_sufi                                                            BCMOLT_GPON_ONU_AUTO_ID_SUFI
+#define bcmolt_gpon_onu_auto_id_tiwi                                                            BCMOLT_GPON_ONU_AUTO_ID_TIWI
+#define bcmolt_gpon_onu_auto_id__num_of                                                         BCMOLT_GPON_ONU_AUTO_ID__NUM_OF
+#define bcmolt_gpon_onu_oper_id__begin                                                          BCMOLT_GPON_ONU_OPER_ID__BEGIN
+#define bcmolt_gpon_onu_oper_id_change_power_level                                              BCMOLT_GPON_ONU_OPER_ID_CHANGE_POWER_LEVEL
+#define bcmolt_gpon_onu_oper_id_rssi_measurement                                                BCMOLT_GPON_ONU_OPER_ID_RSSI_MEASUREMENT
+#define bcmolt_gpon_onu_oper_id_set_onu_state                                                   BCMOLT_GPON_ONU_OPER_ID_SET_ONU_STATE
+#define bcmolt_gpon_onu_oper_id__num_of                                                         BCMOLT_GPON_ONU_OPER_ID__NUM_OF
+#define bcmolt_gpon_onu_proxy_id__begin                                                         BCMOLT_GPON_ONU_PROXY_ID__BEGIN
+#define bcmolt_gpon_onu_proxy_id_cpu_packets                                                    BCMOLT_GPON_ONU_PROXY_ID_CPU_PACKETS
+#define bcmolt_gpon_onu_proxy_id_ploam_packet                                                   BCMOLT_GPON_ONU_PROXY_ID_PLOAM_PACKET
+#define bcmolt_gpon_onu_proxy_id__num_of                                                        BCMOLT_GPON_ONU_PROXY_ID__NUM_OF
+#define bcmolt_gpon_onu_proxy_rx_id__begin                                                      BCMOLT_GPON_ONU_PROXY_RX_ID__BEGIN
+#define bcmolt_gpon_onu_proxy_rx_id_cpu_packet                                                  BCMOLT_GPON_ONU_PROXY_RX_ID_CPU_PACKET
+#define bcmolt_gpon_onu_proxy_rx_id_omci_packet                                                 BCMOLT_GPON_ONU_PROXY_RX_ID_OMCI_PACKET
+#define bcmolt_gpon_onu_proxy_rx_id__num_of                                                     BCMOLT_GPON_ONU_PROXY_RX_ID__NUM_OF
+#define bcmolt_log_entry_auto_id__begin                                                         BCMOLT_LOG_ENTRY_AUTO_ID__BEGIN
+#define bcmolt_log_entry_auto_id_stat_alarm_cleared                                             BCMOLT_LOG_ENTRY_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_log_entry_auto_id_stat_alarm_raised                                              BCMOLT_LOG_ENTRY_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_log_entry_auto_id__num_of                                                        BCMOLT_LOG_ENTRY_AUTO_ID__NUM_OF
+#define bcmolt_logger_auto_id__begin                                                            BCMOLT_LOGGER_AUTO_ID__BEGIN
+#define bcmolt_logger_auto_id_stat_alarm_cleared                                                BCMOLT_LOGGER_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_logger_auto_id_stat_alarm_raised                                                 BCMOLT_LOGGER_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_logger_auto_id__num_of                                                           BCMOLT_LOGGER_AUTO_ID__NUM_OF
+#define bcmolt_logger_oper_id__begin                                                            BCMOLT_LOGGER_OPER_ID__BEGIN
+#define bcmolt_logger_oper_id_clear_log                                                         BCMOLT_LOGGER_OPER_ID_CLEAR_LOG
+#define bcmolt_logger_oper_id__num_of                                                           BCMOLT_LOGGER_OPER_ID__NUM_OF
+#define bcmolt_nni_auto_id__begin                                                               BCMOLT_NNI_AUTO_ID__BEGIN
+#define bcmolt_nni_auto_id_stat_alarm_cleared                                                   BCMOLT_NNI_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_nni_auto_id_stat_alarm_raised                                                    BCMOLT_NNI_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_nni_auto_id_status_changed                                                       BCMOLT_NNI_AUTO_ID_STATUS_CHANGED
+#define bcmolt_nni_auto_id__num_of                                                              BCMOLT_NNI_AUTO_ID__NUM_OF
+#define bcmolt_trx_calibration_auto_id__begin                                                   BCMOLT_TRX_CALIBRATION_AUTO_ID__BEGIN
+#define bcmolt_trx_calibration_auto_id_capture_window_and_statistic_completed                   BCMOLT_TRX_CALIBRATION_AUTO_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED
+#define bcmolt_trx_calibration_auto_id__num_of                                                  BCMOLT_TRX_CALIBRATION_AUTO_ID__NUM_OF
+#define bcmolt_trx_calibration_oper_id__begin                                                   BCMOLT_TRX_CALIBRATION_OPER_ID__BEGIN
+#define bcmolt_trx_calibration_oper_id_start_capture_window                                     BCMOLT_TRX_CALIBRATION_OPER_ID_START_CAPTURE_WINDOW
+#define bcmolt_trx_calibration_oper_id_stop_capture_window                                      BCMOLT_TRX_CALIBRATION_OPER_ID_STOP_CAPTURE_WINDOW
+#define bcmolt_trx_calibration_oper_id__num_of                                                  BCMOLT_TRX_CALIBRATION_OPER_ID__NUM_OF
+#define bcmolt_xgpon_alloc_auto_id__begin                                                       BCMOLT_XGPON_ALLOC_AUTO_ID__BEGIN
+#define bcmolt_xgpon_alloc_auto_id_configuration_completed                                      BCMOLT_XGPON_ALLOC_AUTO_ID_CONFIGURATION_COMPLETED
+#define bcmolt_xgpon_alloc_auto_id_get_alloc_stats_completed                                    BCMOLT_XGPON_ALLOC_AUTO_ID_GET_ALLOC_STATS_COMPLETED
+#define bcmolt_xgpon_alloc_auto_id_stat_alarm_cleared                                           BCMOLT_XGPON_ALLOC_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_alloc_auto_id_stat_alarm_raised                                            BCMOLT_XGPON_ALLOC_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_alloc_auto_id__num_of                                                      BCMOLT_XGPON_ALLOC_AUTO_ID__NUM_OF
+#define bcmolt_xgpon_alloc_oper_id__begin                                                       BCMOLT_XGPON_ALLOC_OPER_ID__BEGIN
+#define bcmolt_xgpon_alloc_oper_id_get_stats                                                    BCMOLT_XGPON_ALLOC_OPER_ID_GET_STATS
+#define bcmolt_xgpon_alloc_oper_id_set_state                                                    BCMOLT_XGPON_ALLOC_OPER_ID_SET_STATE
+#define bcmolt_xgpon_alloc_oper_id__num_of                                                      BCMOLT_XGPON_ALLOC_OPER_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_auto_id__begin                                                    BCMOLT_XGPON_GEM_PORT_AUTO_ID__BEGIN
+#define bcmolt_xgpon_gem_port_auto_id_stat_alarm_cleared                                        BCMOLT_XGPON_GEM_PORT_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_gem_port_auto_id_stat_alarm_raised                                         BCMOLT_XGPON_GEM_PORT_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_gem_port_auto_id__num_of                                                   BCMOLT_XGPON_GEM_PORT_AUTO_ID__NUM_OF
+#define bcmolt_xgpon_ni_auto_id__begin                                                          BCMOLT_XGPON_NI_AUTO_ID__BEGIN
+#define bcmolt_xgpon_ni_auto_id_activate_all_onus_completed                                     BCMOLT_XGPON_NI_AUTO_ID_ACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_cpu_packets_failure                                             BCMOLT_XGPON_NI_AUTO_ID_CPU_PACKETS_FAILURE
+#define bcmolt_xgpon_ni_auto_id_deactivate_all_onus_completed                                   BCMOLT_XGPON_NI_AUTO_ID_DEACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_disable_all_onus_completed                                      BCMOLT_XGPON_NI_AUTO_ID_DISABLE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_enable_all_onus_completed                                       BCMOLT_XGPON_NI_AUTO_ID_ENABLE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_los                                                             BCMOLT_XGPON_NI_AUTO_ID_LOS
+#define bcmolt_xgpon_ni_auto_id_onu_discovered                                                  BCMOLT_XGPON_NI_AUTO_ID_ONU_DISCOVERED
+#define bcmolt_xgpon_ni_auto_id_onu_upgrade_complete                                            BCMOLT_XGPON_NI_AUTO_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_xgpon_ni_auto_id_protection_switching_onus_ranged                                BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_ONUS_RANGED
+#define bcmolt_xgpon_ni_auto_id_protection_switching_switchover_completed                       BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_protection_switching_traffic_resume                             BCMOLT_XGPON_NI_AUTO_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME
+#define bcmolt_xgpon_ni_auto_id_rogue_detection_completed                                       BCMOLT_XGPON_NI_AUTO_ID_ROGUE_DETECTION_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_rogue_onu_special_map_cycle_start                               BCMOLT_XGPON_NI_AUTO_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START
+#define bcmolt_xgpon_ni_auto_id_serial_number_acquisition_cycle_start                           BCMOLT_XGPON_NI_AUTO_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START
+#define bcmolt_xgpon_ni_auto_id_standby_pon_monitoring_cycle_completed                          BCMOLT_XGPON_NI_AUTO_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_stat_alarm_cleared                                              BCMOLT_XGPON_NI_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_ni_auto_id_stat_alarm_raised                                               BCMOLT_XGPON_NI_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_ni_auto_id_state_change_completed                                          BCMOLT_XGPON_NI_AUTO_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_xgpon_ni_auto_id_tod_request_completed                                           BCMOLT_XGPON_NI_AUTO_ID_TOD_REQUEST_COMPLETED
+#define bcmolt_xgpon_ni_auto_id__num_of                                                         BCMOLT_XGPON_NI_AUTO_ID__NUM_OF
+#define bcmolt_xgpon_ni_oper_id__begin                                                          BCMOLT_XGPON_NI_OPER_ID__BEGIN
+#define bcmolt_xgpon_ni_oper_id_adjust_tx_wavelength                                            BCMOLT_XGPON_NI_OPER_ID_ADJUST_TX_WAVELENGTH
+#define bcmolt_xgpon_ni_oper_id_disable_serial_number                                           BCMOLT_XGPON_NI_OPER_ID_DISABLE_SERIAL_NUMBER
+#define bcmolt_xgpon_ni_oper_id_reset                                                           BCMOLT_XGPON_NI_OPER_ID_RESET
+#define bcmolt_xgpon_ni_oper_id_rogue_detection_window                                          BCMOLT_XGPON_NI_OPER_ID_ROGUE_DETECTION_WINDOW
+#define bcmolt_xgpon_ni_oper_id_run_special_bw_map                                              BCMOLT_XGPON_NI_OPER_ID_RUN_SPECIAL_BW_MAP
+#define bcmolt_xgpon_ni_oper_id_set_onu_state                                                   BCMOLT_XGPON_NI_OPER_ID_SET_ONU_STATE
+#define bcmolt_xgpon_ni_oper_id_set_pon_state                                                   BCMOLT_XGPON_NI_OPER_ID_SET_PON_STATE
+#define bcmolt_xgpon_ni_oper_id_single_request_standby_pon_monitoring                           BCMOLT_XGPON_NI_OPER_ID_SINGLE_REQUEST_STANDBY_PON_MONITORING
+#define bcmolt_xgpon_ni_oper_id_start_onu_upgrade                                               BCMOLT_XGPON_NI_OPER_ID_START_ONU_UPGRADE
+#define bcmolt_xgpon_ni_oper_id_tod_request                                                     BCMOLT_XGPON_NI_OPER_ID_TOD_REQUEST
+#define bcmolt_xgpon_ni_oper_id__num_of                                                         BCMOLT_XGPON_NI_OPER_ID__NUM_OF
+#define bcmolt_xgpon_ni_proxy_id__begin                                                         BCMOLT_XGPON_NI_PROXY_ID__BEGIN
+#define bcmolt_xgpon_ni_proxy_id_broadcast_ploam_packet                                         BCMOLT_XGPON_NI_PROXY_ID_BROADCAST_PLOAM_PACKET
+#define bcmolt_xgpon_ni_proxy_id_cpu_packets                                                    BCMOLT_XGPON_NI_PROXY_ID_CPU_PACKETS
+#define bcmolt_xgpon_ni_proxy_id__num_of                                                        BCMOLT_XGPON_NI_PROXY_ID__NUM_OF
+#define bcmolt_xgpon_onu_auto_id__begin                                                         BCMOLT_XGPON_ONU_AUTO_ID__BEGIN
+#define bcmolt_xgpon_onu_auto_id_dfi                                                            BCMOLT_XGPON_ONU_AUTO_ID_DFI
+#define bcmolt_xgpon_onu_auto_id_dgi                                                            BCMOLT_XGPON_ONU_AUTO_ID_DGI
+#define bcmolt_xgpon_onu_auto_id_dowi                                                           BCMOLT_XGPON_ONU_AUTO_ID_DOWI
+#define bcmolt_xgpon_onu_auto_id_invalid_dbru_report                                            BCMOLT_XGPON_ONU_AUTO_ID_INVALID_DBRU_REPORT
+#define bcmolt_xgpon_onu_auto_id_key_exchange_completed                                         BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_key_exchange_cycle_skipped                                     BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_CYCLE_SKIPPED
+#define bcmolt_xgpon_onu_auto_id_key_exchange_key_mismatch                                      BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_MISMATCH
+#define bcmolt_xgpon_onu_auto_id_key_exchange_key_request_timeout                               BCMOLT_XGPON_ONU_AUTO_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT
+#define bcmolt_xgpon_onu_auto_id_looci                                                          BCMOLT_XGPON_ONU_AUTO_ID_LOOCI
+#define bcmolt_xgpon_onu_auto_id_onu_activation_completed                                       BCMOLT_XGPON_ONU_AUTO_ID_ONU_ACTIVATION_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_onu_alarm                                                      BCMOLT_XGPON_ONU_AUTO_ID_ONU_ALARM
+#define bcmolt_xgpon_onu_auto_id_onu_deactivation_completed                                     BCMOLT_XGPON_ONU_AUTO_ID_ONU_DEACTIVATION_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_onu_disable_completed                                          BCMOLT_XGPON_ONU_AUTO_ID_ONU_DISABLE_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_onu_enable_completed                                           BCMOLT_XGPON_ONU_AUTO_ID_ONU_ENABLE_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_onu_tuning_in_completed                                        BCMOLT_XGPON_ONU_AUTO_ID_ONU_TUNING_IN_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_onu_tuning_out_completed                                       BCMOLT_XGPON_ONU_AUTO_ID_ONU_TUNING_OUT_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_optical_reflection                                             BCMOLT_XGPON_ONU_AUTO_ID_OPTICAL_REFLECTION
+#define bcmolt_xgpon_onu_auto_id_possible_drift                                                 BCMOLT_XGPON_ONU_AUTO_ID_POSSIBLE_DRIFT
+#define bcmolt_xgpon_onu_auto_id_power_consumption_report                                       BCMOLT_XGPON_ONU_AUTO_ID_POWER_CONSUMPTION_REPORT
+#define bcmolt_xgpon_onu_auto_id_power_level_report                                             BCMOLT_XGPON_ONU_AUTO_ID_POWER_LEVEL_REPORT
+#define bcmolt_xgpon_onu_auto_id_power_management_state_change                                  BCMOLT_XGPON_ONU_AUTO_ID_POWER_MANAGEMENT_STATE_CHANGE
+#define bcmolt_xgpon_onu_auto_id_pqsi                                                           BCMOLT_XGPON_ONU_AUTO_ID_PQSI
+#define bcmolt_xgpon_onu_auto_id_ranging_completed                                              BCMOLT_XGPON_ONU_AUTO_ID_RANGING_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_registration_id                                                BCMOLT_XGPON_ONU_AUTO_ID_REGISTRATION_ID
+#define bcmolt_xgpon_onu_auto_id_rssi_measurement_completed                                     BCMOLT_XGPON_ONU_AUTO_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_xgpon_onu_auto_id_sdi                                                            BCMOLT_XGPON_ONU_AUTO_ID_SDI
+#define bcmolt_xgpon_onu_auto_id_secure_mutual_authentication_failure                           BCMOLT_XGPON_ONU_AUTO_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE
+#define bcmolt_xgpon_onu_auto_id_sfi                                                            BCMOLT_XGPON_ONU_AUTO_ID_SFI
+#define bcmolt_xgpon_onu_auto_id_stat_alarm_cleared                                             BCMOLT_XGPON_ONU_AUTO_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_onu_auto_id_stat_alarm_raised                                              BCMOLT_XGPON_ONU_AUTO_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_onu_auto_id_sufi                                                           BCMOLT_XGPON_ONU_AUTO_ID_SUFI
+#define bcmolt_xgpon_onu_auto_id_tiwi                                                           BCMOLT_XGPON_ONU_AUTO_ID_TIWI
+#define bcmolt_xgpon_onu_auto_id_tuning_response                                                BCMOLT_XGPON_ONU_AUTO_ID_TUNING_RESPONSE
+#define bcmolt_xgpon_onu_auto_id__num_of                                                        BCMOLT_XGPON_ONU_AUTO_ID__NUM_OF
+#define bcmolt_xgpon_onu_oper_id__begin                                                         BCMOLT_XGPON_ONU_OPER_ID__BEGIN
+#define bcmolt_xgpon_onu_oper_id_adjust_tx_wavelength                                           BCMOLT_XGPON_ONU_OPER_ID_ADJUST_TX_WAVELENGTH
+#define bcmolt_xgpon_onu_oper_id_change_power_levelling                                         BCMOLT_XGPON_ONU_OPER_ID_CHANGE_POWER_LEVELLING
+#define bcmolt_xgpon_onu_oper_id_get_power_consumption                                          BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_CONSUMPTION
+#define bcmolt_xgpon_onu_oper_id_get_power_level                                                BCMOLT_XGPON_ONU_OPER_ID_GET_POWER_LEVEL
+#define bcmolt_xgpon_onu_oper_id_onu_tuning_in                                                  BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_IN
+#define bcmolt_xgpon_onu_oper_id_onu_tuning_out                                                 BCMOLT_XGPON_ONU_OPER_ID_ONU_TUNING_OUT
+#define bcmolt_xgpon_onu_oper_id_request_registration                                           BCMOLT_XGPON_ONU_OPER_ID_REQUEST_REGISTRATION
+#define bcmolt_xgpon_onu_oper_id_rssi_measurement                                               BCMOLT_XGPON_ONU_OPER_ID_RSSI_MEASUREMENT
+#define bcmolt_xgpon_onu_oper_id_secure_mutual_authentication                                   BCMOLT_XGPON_ONU_OPER_ID_SECURE_MUTUAL_AUTHENTICATION
+#define bcmolt_xgpon_onu_oper_id_set_onu_state                                                  BCMOLT_XGPON_ONU_OPER_ID_SET_ONU_STATE
+#define bcmolt_xgpon_onu_oper_id__num_of                                                        BCMOLT_XGPON_ONU_OPER_ID__NUM_OF
+#define bcmolt_xgpon_onu_proxy_id__begin                                                        BCMOLT_XGPON_ONU_PROXY_ID__BEGIN
+#define bcmolt_xgpon_onu_proxy_id_cpu_packets                                                   BCMOLT_XGPON_ONU_PROXY_ID_CPU_PACKETS
+#define bcmolt_xgpon_onu_proxy_id_ploam_packet                                                  BCMOLT_XGPON_ONU_PROXY_ID_PLOAM_PACKET
+#define bcmolt_xgpon_onu_proxy_id__num_of                                                       BCMOLT_XGPON_ONU_PROXY_ID__NUM_OF
+#define bcmolt_xgpon_onu_proxy_rx_id__begin                                                     BCMOLT_XGPON_ONU_PROXY_RX_ID__BEGIN
+#define bcmolt_xgpon_onu_proxy_rx_id_cpu_packet                                                 BCMOLT_XGPON_ONU_PROXY_RX_ID_CPU_PACKET
+#define bcmolt_xgpon_onu_proxy_rx_id_omci_packet                                                BCMOLT_XGPON_ONU_PROXY_RX_ID_OMCI_PACKET
+#define bcmolt_xgpon_onu_proxy_rx_id__num_of                                                    BCMOLT_XGPON_ONU_PROXY_RX_ID__NUM_OF
+#define bcmolt_ae_ni_key_id_ae_ni                                                               BCMOLT_AE_NI_KEY_ID_AE_NI
+#define bcmolt_ae_ni_key_id__num_of                                                             BCMOLT_AE_NI_KEY_ID__NUM_OF
+#define bcmolt_ae_ni_cfg_id_mac_address                                                         BCMOLT_AE_NI_CFG_ID_MAC_ADDRESS
+#define bcmolt_ae_ni_cfg_id_ae_ni_en                                                            BCMOLT_AE_NI_CFG_ID_AE_NI_EN
+#define bcmolt_ae_ni_cfg_id_mtu_10g                                                             BCMOLT_AE_NI_CFG_ID_MTU_10G
+#define bcmolt_ae_ni_cfg_id_prbs_generator                                                      BCMOLT_AE_NI_CFG_ID_PRBS_GENERATOR
+#define bcmolt_ae_ni_cfg_id_prbs_checker                                                        BCMOLT_AE_NI_CFG_ID_PRBS_CHECKER
+#define bcmolt_ae_ni_cfg_id_prbs_status                                                         BCMOLT_AE_NI_CFG_ID_PRBS_STATUS
+#define bcmolt_ae_ni_cfg_id__num_of                                                             BCMOLT_AE_NI_CFG_ID__NUM_OF
+#define bcmolt_ae_ni_set_ae_ni_en_state_id_new_state                                            BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID_NEW_STATE
+#define bcmolt_ae_ni_set_ae_ni_en_state_id__num_of                                              BCMOLT_AE_NI_SET_AE_NI_EN_STATE_ID__NUM_OF
+#define bcmolt_ae_path_ds_key_id_ae_ni                                                          BCMOLT_AE_PATH_DS_KEY_ID_AE_NI
+#define bcmolt_ae_path_ds_key_id__num_of                                                        BCMOLT_AE_PATH_DS_KEY_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_id_bytes                                                         BCMOLT_AE_PATH_DS_STAT_ID_BYTES
+#define bcmolt_ae_path_ds_stat_id_frames                                                        BCMOLT_AE_PATH_DS_STAT_ID_FRAMES
+#define bcmolt_ae_path_ds_stat_id_frames_64                                                     BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_64
+#define bcmolt_ae_path_ds_stat_id_frames_65_127                                                 BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_65_127
+#define bcmolt_ae_path_ds_stat_id_frames_128_255                                                BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_128_255
+#define bcmolt_ae_path_ds_stat_id_frames_256_511                                                BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_256_511
+#define bcmolt_ae_path_ds_stat_id_frames_512_1023                                               BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_512_1023
+#define bcmolt_ae_path_ds_stat_id_frames_1024_1518                                              BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1024_1518
+#define bcmolt_ae_path_ds_stat_id_frames_1519_2047                                              BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_1519_2047
+#define bcmolt_ae_path_ds_stat_id_frames_2048_4095                                              BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_2048_4095
+#define bcmolt_ae_path_ds_stat_id_frames_4096_9216                                              BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_4096_9216
+#define bcmolt_ae_path_ds_stat_id_frames_9217_16383                                             BCMOLT_AE_PATH_DS_STAT_ID_FRAMES_9217_16383
+#define bcmolt_ae_path_ds_stat_id_broadcast_frames                                              BCMOLT_AE_PATH_DS_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_ae_path_ds_stat_id_data_bytes                                                    BCMOLT_AE_PATH_DS_STAT_ID_DATA_BYTES
+#define bcmolt_ae_path_ds_stat_id_multicast_frames                                              BCMOLT_AE_PATH_DS_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_ae_path_ds_stat_id_unicast_frames                                                BCMOLT_AE_PATH_DS_STAT_ID_UNICAST_FRAMES
+#define bcmolt_ae_path_ds_stat_id_abort_frames                                                  BCMOLT_AE_PATH_DS_STAT_ID_ABORT_FRAMES
+#define bcmolt_ae_path_ds_stat_id__num_of                                                       BCMOLT_AE_PATH_DS_STAT_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_cfg_id_cfg                                                       BCMOLT_AE_PATH_DS_STAT_CFG_ID_CFG
+#define bcmolt_ae_path_ds_stat_cfg_id__num_of                                                   BCMOLT_AE_PATH_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_alarm_cleared_id_stat                                            BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_ae_path_ds_stat_alarm_cleared_id__num_of                                         BCMOLT_AE_PATH_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_ae_path_ds_stat_alarm_raised_id_stat                                             BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_ae_path_ds_stat_alarm_raised_id__num_of                                          BCMOLT_AE_PATH_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_ae_path_ds_auto_cfg_id_stat_alarm_cleared                                        BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_ae_path_ds_auto_cfg_id_stat_alarm_raised                                         BCMOLT_AE_PATH_DS_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_ae_path_ds_auto_cfg_id__num_of                                                   BCMOLT_AE_PATH_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_ae_path_us_key_id_ae_ni                                                          BCMOLT_AE_PATH_US_KEY_ID_AE_NI
+#define bcmolt_ae_path_us_key_id__num_of                                                        BCMOLT_AE_PATH_US_KEY_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_id_bytes                                                         BCMOLT_AE_PATH_US_STAT_ID_BYTES
+#define bcmolt_ae_path_us_stat_id_frames                                                        BCMOLT_AE_PATH_US_STAT_ID_FRAMES
+#define bcmolt_ae_path_us_stat_id_frames_64                                                     BCMOLT_AE_PATH_US_STAT_ID_FRAMES_64
+#define bcmolt_ae_path_us_stat_id_frames_65_127                                                 BCMOLT_AE_PATH_US_STAT_ID_FRAMES_65_127
+#define bcmolt_ae_path_us_stat_id_frames_128_255                                                BCMOLT_AE_PATH_US_STAT_ID_FRAMES_128_255
+#define bcmolt_ae_path_us_stat_id_frames_256_511                                                BCMOLT_AE_PATH_US_STAT_ID_FRAMES_256_511
+#define bcmolt_ae_path_us_stat_id_frames_512_1023                                               BCMOLT_AE_PATH_US_STAT_ID_FRAMES_512_1023
+#define bcmolt_ae_path_us_stat_id_frames_1024_1518                                              BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1024_1518
+#define bcmolt_ae_path_us_stat_id_frames_1519_2047                                              BCMOLT_AE_PATH_US_STAT_ID_FRAMES_1519_2047
+#define bcmolt_ae_path_us_stat_id_frames_2048_4095                                              BCMOLT_AE_PATH_US_STAT_ID_FRAMES_2048_4095
+#define bcmolt_ae_path_us_stat_id_frames_4096_9216                                              BCMOLT_AE_PATH_US_STAT_ID_FRAMES_4096_9216
+#define bcmolt_ae_path_us_stat_id_frames_9217_16383                                             BCMOLT_AE_PATH_US_STAT_ID_FRAMES_9217_16383
+#define bcmolt_ae_path_us_stat_id_broadcast_frames                                              BCMOLT_AE_PATH_US_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_ae_path_us_stat_id_data_bytes                                                    BCMOLT_AE_PATH_US_STAT_ID_DATA_BYTES
+#define bcmolt_ae_path_us_stat_id_multicast_frames                                              BCMOLT_AE_PATH_US_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_ae_path_us_stat_id_unicast_frames                                                BCMOLT_AE_PATH_US_STAT_ID_UNICAST_FRAMES
+#define bcmolt_ae_path_us_stat_id_abort_frames                                                  BCMOLT_AE_PATH_US_STAT_ID_ABORT_FRAMES
+#define bcmolt_ae_path_us_stat_id_fcs_error                                                     BCMOLT_AE_PATH_US_STAT_ID_FCS_ERROR
+#define bcmolt_ae_path_us_stat_id_oversize_error                                                BCMOLT_AE_PATH_US_STAT_ID_OVERSIZE_ERROR
+#define bcmolt_ae_path_us_stat_id_runt_error                                                    BCMOLT_AE_PATH_US_STAT_ID_RUNT_ERROR
+#define bcmolt_ae_path_us_stat_id__num_of                                                       BCMOLT_AE_PATH_US_STAT_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_cfg_id_cfg                                                       BCMOLT_AE_PATH_US_STAT_CFG_ID_CFG
+#define bcmolt_ae_path_us_stat_cfg_id__num_of                                                   BCMOLT_AE_PATH_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_alarm_cleared_id_stat                                            BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_ae_path_us_stat_alarm_cleared_id__num_of                                         BCMOLT_AE_PATH_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_ae_path_us_stat_alarm_raised_id_stat                                             BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_ae_path_us_stat_alarm_raised_id__num_of                                          BCMOLT_AE_PATH_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_ae_path_us_auto_cfg_id_stat_alarm_cleared                                        BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_ae_path_us_auto_cfg_id_stat_alarm_raised                                         BCMOLT_AE_PATH_US_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_ae_path_us_auto_cfg_id__num_of                                                   BCMOLT_AE_PATH_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_channel_key_id_pon_ni                                                            BCMOLT_CHANNEL_KEY_ID_PON_NI
+#define bcmolt_channel_key_id__num_of                                                           BCMOLT_CHANNEL_KEY_ID__NUM_OF
+#define bcmolt_channel_cfg_id_operation_control                                                 BCMOLT_CHANNEL_CFG_ID_OPERATION_CONTROL
+#define bcmolt_channel_cfg_id_tol                                                               BCMOLT_CHANNEL_CFG_ID_TOL
+#define bcmolt_channel_cfg_id_system_profile                                                    BCMOLT_CHANNEL_CFG_ID_SYSTEM_PROFILE
+#define bcmolt_channel_cfg_id_channel_profile                                                   BCMOLT_CHANNEL_CFG_ID_CHANNEL_PROFILE
+#define bcmolt_channel_cfg_id__num_of                                                           BCMOLT_CHANNEL_CFG_ID__NUM_OF
+#define bcmolt_debug_key_id_reserved                                                            BCMOLT_DEBUG_KEY_ID_RESERVED
+#define bcmolt_debug_key_id__num_of                                                             BCMOLT_DEBUG_KEY_ID__NUM_OF
+#define bcmolt_debug_cfg_id_console_redirection                                                 BCMOLT_DEBUG_CFG_ID_CONSOLE_REDIRECTION
+#define bcmolt_debug_cfg_id_indications_dropped                                                 BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED
+#define bcmolt_debug_cfg_id_file_used_percent                                                   BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT
+#define bcmolt_debug_cfg_id_api_capture_cfg                                                     BCMOLT_DEBUG_CFG_ID_API_CAPTURE_CFG
+#define bcmolt_debug_cfg_id_api_capture_stats                                                   BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS
+#define bcmolt_debug_cfg_id_api_capture_buffer_read                                             BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER_READ
+#define bcmolt_debug_cfg_id_api_capture_buffer                                                  BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER
+#define bcmolt_debug_cfg_id__num_of                                                             BCMOLT_DEBUG_CFG_ID__NUM_OF
+#define bcmolt_debug_cli_output_id_data                                                         BCMOLT_DEBUG_CLI_OUTPUT_ID_DATA
+#define bcmolt_debug_cli_output_id__num_of                                                      BCMOLT_DEBUG_CLI_OUTPUT_ID__NUM_OF
+#define bcmolt_debug_file_almost_full_id__num_of                                                BCMOLT_DEBUG_FILE_ALMOST_FULL_ID__NUM_OF
+#define bcmolt_debug_auto_cfg_id_cli_output                                                     BCMOLT_DEBUG_AUTO_CFG_ID_CLI_OUTPUT
+#define bcmolt_debug_auto_cfg_id_file_almost_full                                               BCMOLT_DEBUG_AUTO_CFG_ID_FILE_ALMOST_FULL
+#define bcmolt_debug_auto_cfg_id__num_of                                                        BCMOLT_DEBUG_AUTO_CFG_ID__NUM_OF
+#define bcmolt_debug_cli_input_id_data                                                          BCMOLT_DEBUG_CLI_INPUT_ID_DATA
+#define bcmolt_debug_cli_input_id__num_of                                                       BCMOLT_DEBUG_CLI_INPUT_ID__NUM_OF
+#define bcmolt_debug_reset_api_capture_id__num_of                                               BCMOLT_DEBUG_RESET_API_CAPTURE_ID__NUM_OF
+#define bcmolt_debug_start_api_capture_id__num_of                                               BCMOLT_DEBUG_START_API_CAPTURE_ID__NUM_OF
+#define bcmolt_debug_stop_api_capture_id__num_of                                                BCMOLT_DEBUG_STOP_API_CAPTURE_ID__NUM_OF
+#define bcmolt_device_key_id_reserved                                                           BCMOLT_DEVICE_KEY_ID_RESERVED
+#define bcmolt_device_key_id__num_of                                                            BCMOLT_DEVICE_KEY_ID__NUM_OF
+#define bcmolt_device_cfg_id_system_mode                                                        BCMOLT_DEVICE_CFG_ID_SYSTEM_MODE
+#define bcmolt_device_cfg_id_keepalive_interval                                                 BCMOLT_DEVICE_CFG_ID_KEEPALIVE_INTERVAL
+#define bcmolt_device_cfg_id_keepalive_tolerance                                                BCMOLT_DEVICE_CFG_ID_KEEPALIVE_TOLERANCE
+#define bcmolt_device_cfg_id_firmware_sw_version                                                BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION
+#define bcmolt_device_cfg_id_host_sw_version                                                    BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION
+#define bcmolt_device_cfg_id_chip_revision                                                      BCMOLT_DEVICE_CFG_ID_CHIP_REVISION
+#define bcmolt_device_cfg_id_state                                                              BCMOLT_DEVICE_CFG_ID_STATE
+#define bcmolt_device_cfg_id_debug                                                              BCMOLT_DEVICE_CFG_ID_DEBUG
+#define bcmolt_device_cfg_id_nni_speed                                                          BCMOLT_DEVICE_CFG_ID_NNI_SPEED
+#define bcmolt_device_cfg_id_protection_switching_ext_irq                                       BCMOLT_DEVICE_CFG_ID_PROTECTION_SWITCHING_EXT_IRQ
+#define bcmolt_device_cfg_id_epon_clock_transport_sample_delay                                  BCMOLT_DEVICE_CFG_ID_EPON_CLOCK_TRANSPORT_SAMPLE_DELAY
+#define bcmolt_device_cfg_id_indication_shaping                                                 BCMOLT_DEVICE_CFG_ID_INDICATION_SHAPING
+#define bcmolt_device_cfg_id_chip_temperature                                                   BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE
+#define bcmolt_device_cfg_id_gpon_xgpon_tod_enable                                              BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_ENABLE
+#define bcmolt_device_cfg_id_gpon_xgpon_tod_gpio_pin                                            BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_GPIO_PIN
+#define bcmolt_device_cfg_id_gpon_xgpon_tod_connected_internally                                BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_CONNECTED_INTERNALLY
+#define bcmolt_device_cfg_id_epon_8021_as_tod_format                                            BCMOLT_DEVICE_CFG_ID_EPON_8021_AS_TOD_FORMAT
+#define bcmolt_device_cfg_id_epon_shaper_mode                                                   BCMOLT_DEVICE_CFG_ID_EPON_SHAPER_MODE
+#define bcmolt_device_cfg_id_embedded_image_list                                                BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST
+#define bcmolt_device_cfg_id_chip_voltage                                                       BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE
+#define bcmolt_device_cfg_id_epon_tod_string                                                    BCMOLT_DEVICE_CFG_ID_EPON_TOD_STRING
+#define bcmolt_device_cfg_id_xgpon_num_of_onus                                                  BCMOLT_DEVICE_CFG_ID_XGPON_NUM_OF_ONUS
+#define bcmolt_device_cfg_id_device_ip_address                                                  BCMOLT_DEVICE_CFG_ID_DEVICE_IP_ADDRESS
+#define bcmolt_device_cfg_id_device_udp_port                                                    BCMOLT_DEVICE_CFG_ID_DEVICE_UDP_PORT
+#define bcmolt_device_cfg_id_tod_uart_baudrate                                                  BCMOLT_DEVICE_CFG_ID_TOD_UART_BAUDRATE
+#define bcmolt_device_cfg_id_gpon_xgpon_tod_string_length                                       BCMOLT_DEVICE_CFG_ID_GPON_XGPON_TOD_STRING_LENGTH
+#define bcmolt_device_cfg_id__num_of                                                            BCMOLT_DEVICE_CFG_ID__NUM_OF
+#define bcmolt_device_connection_complete_id_standalone                                         BCMOLT_DEVICE_CONNECTION_COMPLETE_ID_STANDALONE
+#define bcmolt_device_connection_complete_id__num_of                                            BCMOLT_DEVICE_CONNECTION_COMPLETE_ID__NUM_OF
+#define bcmolt_device_connection_established_id__num_of                                         BCMOLT_DEVICE_CONNECTION_ESTABLISHED_ID__NUM_OF
+#define bcmolt_device_connection_failure_id_reason                                              BCMOLT_DEVICE_CONNECTION_FAILURE_ID_REASON
+#define bcmolt_device_connection_failure_id__num_of                                             BCMOLT_DEVICE_CONNECTION_FAILURE_ID__NUM_OF
+#define bcmolt_device_ddr_test_complete_id_ddr_test                                             BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID_DDR_TEST
+#define bcmolt_device_ddr_test_complete_id__num_of                                              BCMOLT_DEVICE_DDR_TEST_COMPLETE_ID__NUM_OF
+#define bcmolt_device_device_keep_alive_id_sequence_number                                      BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_SEQUENCE_NUMBER
+#define bcmolt_device_device_keep_alive_id_time_stamp                                           BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID_TIME_STAMP
+#define bcmolt_device_device_keep_alive_id__num_of                                              BCMOLT_DEVICE_DEVICE_KEEP_ALIVE_ID__NUM_OF
+#define bcmolt_device_device_ready_id_firmware_sw_version                                       BCMOLT_DEVICE_DEVICE_READY_ID_FIRMWARE_SW_VERSION
+#define bcmolt_device_device_ready_id_system_mode                                               BCMOLT_DEVICE_DEVICE_READY_ID_SYSTEM_MODE
+#define bcmolt_device_device_ready_id_nni_speed                                                 BCMOLT_DEVICE_DEVICE_READY_ID_NNI_SPEED
+#define bcmolt_device_device_ready_id_chip_revision                                             BCMOLT_DEVICE_DEVICE_READY_ID_CHIP_REVISION
+#define bcmolt_device_device_ready_id_tod_enable                                                BCMOLT_DEVICE_DEVICE_READY_ID_TOD_ENABLE
+#define bcmolt_device_device_ready_id_tod_gpio_pin                                              BCMOLT_DEVICE_DEVICE_READY_ID_TOD_GPIO_PIN
+#define bcmolt_device_device_ready_id__num_of                                                   BCMOLT_DEVICE_DEVICE_READY_ID__NUM_OF
+#define bcmolt_device_disconnection_complete_id__num_of                                         BCMOLT_DEVICE_DISCONNECTION_COMPLETE_ID__NUM_OF
+#define bcmolt_device_image_transfer_complete_id_image_type                                     BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_IMAGE_TYPE
+#define bcmolt_device_image_transfer_complete_id_block_number                                   BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_BLOCK_NUMBER
+#define bcmolt_device_image_transfer_complete_id_status                                         BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID_STATUS
+#define bcmolt_device_image_transfer_complete_id__num_of                                        BCMOLT_DEVICE_IMAGE_TRANSFER_COMPLETE_ID__NUM_OF
+#define bcmolt_device_indications_dropped_id_total_count                                        BCMOLT_DEVICE_INDICATIONS_DROPPED_ID_TOTAL_COUNT
+#define bcmolt_device_indications_dropped_id__num_of                                            BCMOLT_DEVICE_INDICATIONS_DROPPED_ID__NUM_OF
+#define bcmolt_device_sw_error_id_task_name                                                     BCMOLT_DEVICE_SW_ERROR_ID_TASK_NAME
+#define bcmolt_device_sw_error_id_file_name                                                     BCMOLT_DEVICE_SW_ERROR_ID_FILE_NAME
+#define bcmolt_device_sw_error_id_line_number                                                   BCMOLT_DEVICE_SW_ERROR_ID_LINE_NUMBER
+#define bcmolt_device_sw_error_id_pon_ni                                                        BCMOLT_DEVICE_SW_ERROR_ID_PON_NI
+#define bcmolt_device_sw_error_id__num_of                                                       BCMOLT_DEVICE_SW_ERROR_ID__NUM_OF
+#define bcmolt_device_sw_exception_id_cpu_id                                                    BCMOLT_DEVICE_SW_EXCEPTION_ID_CPU_ID
+#define bcmolt_device_sw_exception_id_text                                                      BCMOLT_DEVICE_SW_EXCEPTION_ID_TEXT
+#define bcmolt_device_sw_exception_id__num_of                                                   BCMOLT_DEVICE_SW_EXCEPTION_ID__NUM_OF
+#define bcmolt_device_auto_cfg_id_connection_complete                                           BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_COMPLETE
+#define bcmolt_device_auto_cfg_id_connection_established                                        BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_ESTABLISHED
+#define bcmolt_device_auto_cfg_id_connection_failure                                            BCMOLT_DEVICE_AUTO_CFG_ID_CONNECTION_FAILURE
+#define bcmolt_device_auto_cfg_id_ddr_test_complete                                             BCMOLT_DEVICE_AUTO_CFG_ID_DDR_TEST_COMPLETE
+#define bcmolt_device_auto_cfg_id_device_keep_alive                                             BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_KEEP_ALIVE
+#define bcmolt_device_auto_cfg_id_device_ready                                                  BCMOLT_DEVICE_AUTO_CFG_ID_DEVICE_READY
+#define bcmolt_device_auto_cfg_id_disconnection_complete                                        BCMOLT_DEVICE_AUTO_CFG_ID_DISCONNECTION_COMPLETE
+#define bcmolt_device_auto_cfg_id_image_transfer_complete                                       BCMOLT_DEVICE_AUTO_CFG_ID_IMAGE_TRANSFER_COMPLETE
+#define bcmolt_device_auto_cfg_id_indications_dropped                                           BCMOLT_DEVICE_AUTO_CFG_ID_INDICATIONS_DROPPED
+#define bcmolt_device_auto_cfg_id_sw_error                                                      BCMOLT_DEVICE_AUTO_CFG_ID_SW_ERROR
+#define bcmolt_device_auto_cfg_id_sw_exception                                                  BCMOLT_DEVICE_AUTO_CFG_ID_SW_EXCEPTION
+#define bcmolt_device_auto_cfg_id__num_of                                                       BCMOLT_DEVICE_AUTO_CFG_ID__NUM_OF
+#define bcmolt_device_connect_id__num_of                                                        BCMOLT_DEVICE_CONNECT_ID__NUM_OF
+#define bcmolt_device_disconnect_id__num_of                                                     BCMOLT_DEVICE_DISCONNECT_ID__NUM_OF
+#define bcmolt_device_host_keep_alive_id_sequence_number                                        BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_SEQUENCE_NUMBER
+#define bcmolt_device_host_keep_alive_id_time_stamp                                             BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID_TIME_STAMP
+#define bcmolt_device_host_keep_alive_id__num_of                                                BCMOLT_DEVICE_HOST_KEEP_ALIVE_ID__NUM_OF
+#define bcmolt_device_image_transfer_data_id_block_number                                       BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_BLOCK_NUMBER
+#define bcmolt_device_image_transfer_data_id_more_data                                          BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_MORE_DATA
+#define bcmolt_device_image_transfer_data_id_data                                               BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID_DATA
+#define bcmolt_device_image_transfer_data_id__num_of                                            BCMOLT_DEVICE_IMAGE_TRANSFER_DATA_ID__NUM_OF
+#define bcmolt_device_image_transfer_start_id_image_type                                        BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_TYPE
+#define bcmolt_device_image_transfer_start_id_image_size                                        BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_SIZE
+#define bcmolt_device_image_transfer_start_id_crc32                                             BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_CRC32
+#define bcmolt_device_image_transfer_start_id_image_name                                        BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID_IMAGE_NAME
+#define bcmolt_device_image_transfer_start_id__num_of                                           BCMOLT_DEVICE_IMAGE_TRANSFER_START_ID__NUM_OF
+#define bcmolt_device_reset_id_mode                                                             BCMOLT_DEVICE_RESET_ID_MODE
+#define bcmolt_device_reset_id__num_of                                                          BCMOLT_DEVICE_RESET_ID__NUM_OF
+#define bcmolt_device_run_ddr_test_id_cpu                                                       BCMOLT_DEVICE_RUN_DDR_TEST_ID_CPU
+#define bcmolt_device_run_ddr_test_id_ras_0                                                     BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_0
+#define bcmolt_device_run_ddr_test_id_ras_1                                                     BCMOLT_DEVICE_RUN_DDR_TEST_ID_RAS_1
+#define bcmolt_device_run_ddr_test_id__num_of                                                   BCMOLT_DEVICE_RUN_DDR_TEST_ID__NUM_OF
+#define bcmolt_device_sw_upgrade_activate_id__num_of                                            BCMOLT_DEVICE_SW_UPGRADE_ACTIVATE_ID__NUM_OF
+#define bcmolt_epon_denied_link_key_id_epon_ni                                                  BCMOLT_EPON_DENIED_LINK_KEY_ID_EPON_NI
+#define bcmolt_epon_denied_link_key_id_mac_address                                              BCMOLT_EPON_DENIED_LINK_KEY_ID_MAC_ADDRESS
+#define bcmolt_epon_denied_link_key_id__num_of                                                  BCMOLT_EPON_DENIED_LINK_KEY_ID__NUM_OF
+#define bcmolt_epon_denied_link_cfg_id_alarm_state                                              BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE
+#define bcmolt_epon_denied_link_cfg_id__num_of                                                  BCMOLT_EPON_DENIED_LINK_CFG_ID__NUM_OF
+#define bcmolt_epon_denied_link_laser_on_off_violation_id_alarm_status                          BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_laser_on_off_violation_id__num_of                               BCMOLT_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_llid_pool_empty_violation_id_alarm_status                       BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_llid_pool_empty_violation_id__num_of                            BCMOLT_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_max_link_violation_id_alarm_status                              BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_max_link_violation_id__num_of                                   BCMOLT_EPON_DENIED_LINK_MAX_LINK_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_overhead_profile_violation_id_alarm_status                      BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_overhead_profile_violation_id__num_of                           BCMOLT_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_range_violation_id_alarm_status                                 BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_range_violation_id__num_of                                      BCMOLT_EPON_DENIED_LINK_RANGE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_rogue_violation_id_alarm_status                                 BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_rogue_violation_id__num_of                                      BCMOLT_EPON_DENIED_LINK_ROGUE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_system_resource_violation_id_alarm_status                       BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_system_resource_violation_id__num_of                            BCMOLT_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_tdm_channels_exhausted_id_alarm_status                          BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_tdm_channels_exhausted_id__num_of                               BCMOLT_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED_ID__NUM_OF
+#define bcmolt_epon_denied_link_unknown_link_violation_id_alarm_status                          BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_unknown_link_violation_id__num_of                               BCMOLT_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_upstream_bandwidth_violation_id_alarm_status                    BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID_ALARM_STATUS
+#define bcmolt_epon_denied_link_upstream_bandwidth_violation_id__num_of                         BCMOLT_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION_ID__NUM_OF
+#define bcmolt_epon_denied_link_auto_cfg_id_laser_on_off_violation                              BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LASER_ON_OFF_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_llid_pool_empty_violation                           BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_LLID_POOL_EMPTY_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_max_link_violation                                  BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_MAX_LINK_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_overhead_profile_violation                          BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_OVERHEAD_PROFILE_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_range_violation                                     BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_RANGE_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_rogue_violation                                     BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_ROGUE_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_system_resource_violation                           BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_SYSTEM_RESOURCE_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_tdm_channels_exhausted                              BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_TDM_CHANNELS_EXHAUSTED
+#define bcmolt_epon_denied_link_auto_cfg_id_unknown_link_violation                              BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UNKNOWN_LINK_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id_upstream_bandwidth_violation                        BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID_UPSTREAM_BANDWIDTH_VIOLATION
+#define bcmolt_epon_denied_link_auto_cfg_id__num_of                                             BCMOLT_EPON_DENIED_LINK_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_link_key_id_epon_ni                                                         BCMOLT_EPON_LINK_KEY_ID_EPON_NI
+#define bcmolt_epon_link_key_id_mac_address                                                     BCMOLT_EPON_LINK_KEY_ID_MAC_ADDRESS
+#define bcmolt_epon_link_key_id__num_of                                                         BCMOLT_EPON_LINK_KEY_ID__NUM_OF
+#define bcmolt_epon_link_cfg_id_link_rate                                                       BCMOLT_EPON_LINK_CFG_ID_LINK_RATE
+#define bcmolt_epon_link_cfg_id_state_flags                                                     BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS
+#define bcmolt_epon_link_cfg_id_llid                                                            BCMOLT_EPON_LINK_CFG_ID_LLID
+#define bcmolt_epon_link_cfg_id_laser_on_time_tq                                                BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ
+#define bcmolt_epon_link_cfg_id_laser_off_time_tq                                               BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ
+#define bcmolt_epon_link_cfg_id_range_value_tq                                                  BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ
+#define bcmolt_epon_link_cfg_id_distance                                                        BCMOLT_EPON_LINK_CFG_ID_DISTANCE
+#define bcmolt_epon_link_cfg_id_alarm_state                                                     BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE
+#define bcmolt_epon_link_cfg_id_tunnel_id                                                       BCMOLT_EPON_LINK_CFG_ID_TUNNEL_ID
+#define bcmolt_epon_link_cfg_id_onu_id                                                          BCMOLT_EPON_LINK_CFG_ID_ONU_ID
+#define bcmolt_epon_link_cfg_id_min_laser_overhead                                              BCMOLT_EPON_LINK_CFG_ID_MIN_LASER_OVERHEAD
+#define bcmolt_epon_link_cfg_id_key_exchange_config                                             BCMOLT_EPON_LINK_CFG_ID_KEY_EXCHANGE_CONFIG
+#define bcmolt_epon_link_cfg_id_epon_encryption                                                 BCMOLT_EPON_LINK_CFG_ID_EPON_ENCRYPTION
+#define bcmolt_epon_link_cfg_id_fec_enable                                                      BCMOLT_EPON_LINK_CFG_ID_FEC_ENABLE
+#define bcmolt_epon_link_cfg_id_oam_heartbeat_config                                            BCMOLT_EPON_LINK_CFG_ID_OAM_HEARTBEAT_CONFIG
+#define bcmolt_epon_link_cfg_id_upstream_bandwidth                                              BCMOLT_EPON_LINK_CFG_ID_UPSTREAM_BANDWIDTH
+#define bcmolt_epon_link_cfg_id_ubd_info                                                        BCMOLT_EPON_LINK_CFG_ID_UBD_INFO
+#define bcmolt_epon_link_cfg_id_clock_transport_enable                                          BCMOLT_EPON_LINK_CFG_ID_CLOCK_TRANSPORT_ENABLE
+#define bcmolt_epon_link_cfg_id_pending_grants                                                  BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS
+#define bcmolt_epon_link_cfg_id_link_type                                                       BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE
+#define bcmolt_epon_link_cfg_id__num_of                                                         BCMOLT_EPON_LINK_CFG_ID__NUM_OF
+#define bcmolt_epon_link_stat_id_rx_data_bytes                                                  BCMOLT_EPON_LINK_STAT_ID_RX_DATA_BYTES
+#define bcmolt_epon_link_stat_id_rx_data_frames                                                 BCMOLT_EPON_LINK_STAT_ID_RX_DATA_FRAMES
+#define bcmolt_epon_link_stat_id_rx_frames_64                                                   BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_64
+#define bcmolt_epon_link_stat_id_rx_frames_65_127                                               BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_65_127
+#define bcmolt_epon_link_stat_id_rx_frames_128_255                                              BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_128_255
+#define bcmolt_epon_link_stat_id_rx_frames_256_511                                              BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_256_511
+#define bcmolt_epon_link_stat_id_rx_frames_512_1023                                             BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_512_1023
+#define bcmolt_epon_link_stat_id_rx_frames_1024_1518                                            BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1024_1518
+#define bcmolt_epon_link_stat_id_rx_frames_1519_2047                                            BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_1519_2047
+#define bcmolt_epon_link_stat_id_rx_frames_2048_4095                                            BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_2048_4095
+#define bcmolt_epon_link_stat_id_rx_frames_4096_9216                                            BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_4096_9216
+#define bcmolt_epon_link_stat_id_rx_frames_9217_16383                                           BCMOLT_EPON_LINK_STAT_ID_RX_FRAMES_9217_16383
+#define bcmolt_epon_link_stat_id_rx_oam_bytes                                                   BCMOLT_EPON_LINK_STAT_ID_RX_OAM_BYTES
+#define bcmolt_epon_link_stat_id_rx_oam_frames                                                  BCMOLT_EPON_LINK_STAT_ID_RX_OAM_FRAMES
+#define bcmolt_epon_link_stat_id_rx_mpcp_frames                                                 BCMOLT_EPON_LINK_STAT_ID_RX_MPCP_FRAMES
+#define bcmolt_epon_link_stat_id_rx_broadcast_frames                                            BCMOLT_EPON_LINK_STAT_ID_RX_BROADCAST_FRAMES
+#define bcmolt_epon_link_stat_id_rx_unicast_frames                                              BCMOLT_EPON_LINK_STAT_ID_RX_UNICAST_FRAMES
+#define bcmolt_epon_link_stat_id_rx_multicast_frames                                            BCMOLT_EPON_LINK_STAT_ID_RX_MULTICAST_FRAMES
+#define bcmolt_epon_link_stat_id_rx_report_frames                                               BCMOLT_EPON_LINK_STAT_ID_RX_REPORT_FRAMES
+#define bcmolt_epon_link_stat_id_rx_fcs_error                                                   BCMOLT_EPON_LINK_STAT_ID_RX_FCS_ERROR
+#define bcmolt_epon_link_stat_id_rx_oversize_error                                              BCMOLT_EPON_LINK_STAT_ID_RX_OVERSIZE_ERROR
+#define bcmolt_epon_link_stat_id_rx_runt_error                                                  BCMOLT_EPON_LINK_STAT_ID_RX_RUNT_ERROR
+#define bcmolt_epon_link_stat_id_rx_line_code_error                                             BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR
+#define bcmolt_epon_link_stat_id_rx_line_code_error_max                                         BCMOLT_EPON_LINK_STAT_ID_RX_LINE_CODE_ERROR_MAX
+#define bcmolt_epon_link_stat_id_tx_data_bytes                                                  BCMOLT_EPON_LINK_STAT_ID_TX_DATA_BYTES
+#define bcmolt_epon_link_stat_id_tx_data_frames                                                 BCMOLT_EPON_LINK_STAT_ID_TX_DATA_FRAMES
+#define bcmolt_epon_link_stat_id_tx_frames_64                                                   BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_64
+#define bcmolt_epon_link_stat_id_tx_frames_65_127                                               BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_65_127
+#define bcmolt_epon_link_stat_id_tx_frames_128_255                                              BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_128_255
+#define bcmolt_epon_link_stat_id_tx_frames_256_511                                              BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_256_511
+#define bcmolt_epon_link_stat_id_tx_frames_512_1023                                             BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_512_1023
+#define bcmolt_epon_link_stat_id_tx_frames_1024_1518                                            BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1024_1518
+#define bcmolt_epon_link_stat_id_tx_frames_1519_2047                                            BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_1519_2047
+#define bcmolt_epon_link_stat_id_tx_frames_2048_4095                                            BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_2048_4095
+#define bcmolt_epon_link_stat_id_tx_frames_4096_9216                                            BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_4096_9216
+#define bcmolt_epon_link_stat_id_tx_frames_9217_16383                                           BCMOLT_EPON_LINK_STAT_ID_TX_FRAMES_9217_16383
+#define bcmolt_epon_link_stat_id_tx_oam_bytes                                                   BCMOLT_EPON_LINK_STAT_ID_TX_OAM_BYTES
+#define bcmolt_epon_link_stat_id_tx_oam_frames                                                  BCMOLT_EPON_LINK_STAT_ID_TX_OAM_FRAMES
+#define bcmolt_epon_link_stat_id_tx_mpcp_frames                                                 BCMOLT_EPON_LINK_STAT_ID_TX_MPCP_FRAMES
+#define bcmolt_epon_link_stat_id_tx_broadcast_frames                                            BCMOLT_EPON_LINK_STAT_ID_TX_BROADCAST_FRAMES
+#define bcmolt_epon_link_stat_id_tx_unicast_frames                                              BCMOLT_EPON_LINK_STAT_ID_TX_UNICAST_FRAMES
+#define bcmolt_epon_link_stat_id_tx_multicast_frames                                            BCMOLT_EPON_LINK_STAT_ID_TX_MULTICAST_FRAMES
+#define bcmolt_epon_link_stat_id_tx_gates                                                       BCMOLT_EPON_LINK_STAT_ID_TX_GATES
+#define bcmolt_epon_link_stat_id__num_of                                                        BCMOLT_EPON_LINK_STAT_ID__NUM_OF
+#define bcmolt_epon_link_stat_cfg_id_cfg                                                        BCMOLT_EPON_LINK_STAT_CFG_ID_CFG
+#define bcmolt_epon_link_stat_cfg_id__num_of                                                    BCMOLT_EPON_LINK_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_link_duplicate_mpcp_registration_request_id_initial_range_tq                BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_INITIAL_RANGE_TQ
+#define bcmolt_epon_link_duplicate_mpcp_registration_request_id_current_range_tq                BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID_CURRENT_RANGE_TQ
+#define bcmolt_epon_link_duplicate_mpcp_registration_request_id__num_of                         BCMOLT_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST_ID__NUM_OF
+#define bcmolt_epon_link_encryption_enabled_id__num_of                                          BCMOLT_EPON_LINK_ENCRYPTION_ENABLED_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_failure_id_alarm_status                                   BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID_ALARM_STATUS
+#define bcmolt_epon_link_key_exchange_failure_id__num_of                                        BCMOLT_EPON_LINK_KEY_EXCHANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_started_id__num_of                                        BCMOLT_EPON_LINK_KEY_EXCHANGE_STARTED_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_stopped_id__num_of                                        BCMOLT_EPON_LINK_KEY_EXCHANGE_STOPPED_ID__NUM_OF
+#define bcmolt_epon_link_link_deleted_id__num_of                                                BCMOLT_EPON_LINK_LINK_DELETED_ID__NUM_OF
+#define bcmolt_epon_link_link_speed_mismatch_id_previous_rate                                   BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_PREVIOUS_RATE
+#define bcmolt_epon_link_link_speed_mismatch_id_current_rate                                    BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID_CURRENT_RATE
+#define bcmolt_epon_link_link_speed_mismatch_id__num_of                                         BCMOLT_EPON_LINK_LINK_SPEED_MISMATCH_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_deregistered_id__num_of                                           BCMOLT_EPON_LINK_MPCP_DEREGISTERED_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_discovered_id_link_info                                           BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID_LINK_INFO
+#define bcmolt_epon_link_mpcp_discovered_id__num_of                                             BCMOLT_EPON_LINK_MPCP_DISCOVERED_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_reg_ack_timeout_id__num_of                                        BCMOLT_EPON_LINK_MPCP_REG_ACK_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_mpcp_report_timeout_id_alarm_status                                    BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID_ALARM_STATUS
+#define bcmolt_epon_link_mpcp_report_timeout_id__num_of                                         BCMOLT_EPON_LINK_MPCP_REPORT_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timeout_id_alarm_status                                  BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID_ALARM_STATUS
+#define bcmolt_epon_link_oam_keepalive_timeout_id__num_of                                       BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMEOUT_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_started_id__num_of                                 BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STARTED_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_stopped_id__num_of                                 BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOPPED_ID__NUM_OF
+#define bcmolt_epon_link_preprovisioned_link_created_id_link_info                               BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID_LINK_INFO
+#define bcmolt_epon_link_preprovisioned_link_created_id__num_of                                 BCMOLT_EPON_LINK_PREPROVISIONED_LINK_CREATED_ID__NUM_OF
+#define bcmolt_epon_link_protection_switch_occurred_id_protection_status                        BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_PROTECTION_STATUS
+#define bcmolt_epon_link_protection_switch_occurred_id_range_value_tq                           BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID_RANGE_VALUE_TQ
+#define bcmolt_epon_link_protection_switch_occurred_id__num_of                                  BCMOLT_EPON_LINK_PROTECTION_SWITCH_OCCURRED_ID__NUM_OF
+#define bcmolt_epon_link_range_value_changed_id_range_value_tq                                  BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID_RANGE_VALUE_TQ
+#define bcmolt_epon_link_range_value_changed_id__num_of                                         BCMOLT_EPON_LINK_RANGE_VALUE_CHANGED_ID__NUM_OF
+#define bcmolt_epon_link_rerange_failure_id__num_of                                             BCMOLT_EPON_LINK_RERANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_link_stat_alarm_cleared_id_stat                                             BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_link_stat_alarm_cleared_id__num_of                                          BCMOLT_EPON_LINK_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_link_stat_alarm_raised_id_stat                                              BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_link_stat_alarm_raised_id__num_of                                           BCMOLT_EPON_LINK_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_link_static_registration_done_id__num_of                                    BCMOLT_EPON_LINK_STATIC_REGISTRATION_DONE_ID__NUM_OF
+#define bcmolt_epon_link_auto_cfg_id_duplicate_mpcp_registration_request                        BCMOLT_EPON_LINK_AUTO_CFG_ID_DUPLICATE_MPCP_REGISTRATION_REQUEST
+#define bcmolt_epon_link_auto_cfg_id_encryption_enabled                                         BCMOLT_EPON_LINK_AUTO_CFG_ID_ENCRYPTION_ENABLED
+#define bcmolt_epon_link_auto_cfg_id_key_exchange_failure                                       BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_FAILURE
+#define bcmolt_epon_link_auto_cfg_id_key_exchange_started                                       BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STARTED
+#define bcmolt_epon_link_auto_cfg_id_key_exchange_stopped                                       BCMOLT_EPON_LINK_AUTO_CFG_ID_KEY_EXCHANGE_STOPPED
+#define bcmolt_epon_link_auto_cfg_id_link_deleted                                               BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_DELETED
+#define bcmolt_epon_link_auto_cfg_id_link_speed_mismatch                                        BCMOLT_EPON_LINK_AUTO_CFG_ID_LINK_SPEED_MISMATCH
+#define bcmolt_epon_link_auto_cfg_id_mpcp_deregistered                                          BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DEREGISTERED
+#define bcmolt_epon_link_auto_cfg_id_mpcp_discovered                                            BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_DISCOVERED
+#define bcmolt_epon_link_auto_cfg_id_mpcp_reg_ack_timeout                                       BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REG_ACK_TIMEOUT
+#define bcmolt_epon_link_auto_cfg_id_mpcp_report_timeout                                        BCMOLT_EPON_LINK_AUTO_CFG_ID_MPCP_REPORT_TIMEOUT
+#define bcmolt_epon_link_auto_cfg_id_oam_keepalive_timeout                                      BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMEOUT
+#define bcmolt_epon_link_auto_cfg_id_oam_keepalive_timer_started                                BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STARTED
+#define bcmolt_epon_link_auto_cfg_id_oam_keepalive_timer_stopped                                BCMOLT_EPON_LINK_AUTO_CFG_ID_OAM_KEEPALIVE_TIMER_STOPPED
+#define bcmolt_epon_link_auto_cfg_id_preprovisioned_link_created                                BCMOLT_EPON_LINK_AUTO_CFG_ID_PREPROVISIONED_LINK_CREATED
+#define bcmolt_epon_link_auto_cfg_id_protection_switch_occurred                                 BCMOLT_EPON_LINK_AUTO_CFG_ID_PROTECTION_SWITCH_OCCURRED
+#define bcmolt_epon_link_auto_cfg_id_range_value_changed                                        BCMOLT_EPON_LINK_AUTO_CFG_ID_RANGE_VALUE_CHANGED
+#define bcmolt_epon_link_auto_cfg_id_rerange_failure                                            BCMOLT_EPON_LINK_AUTO_CFG_ID_RERANGE_FAILURE
+#define bcmolt_epon_link_auto_cfg_id_stat_alarm_cleared                                         BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_link_auto_cfg_id_stat_alarm_raised                                          BCMOLT_EPON_LINK_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_link_auto_cfg_id_static_registration_done                                   BCMOLT_EPON_LINK_AUTO_CFG_ID_STATIC_REGISTRATION_DONE
+#define bcmolt_epon_link_auto_cfg_id__num_of                                                    BCMOLT_EPON_LINK_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_link_delete_link_id__num_of                                                 BCMOLT_EPON_LINK_DELETE_LINK_ID__NUM_OF
+#define bcmolt_epon_link_force_rediscovery_id__num_of                                           BCMOLT_EPON_LINK_FORCE_REDISCOVERY_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_start_id_period                                           BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID_PERIOD
+#define bcmolt_epon_link_key_exchange_start_id__num_of                                          BCMOLT_EPON_LINK_KEY_EXCHANGE_START_ID__NUM_OF
+#define bcmolt_epon_link_key_exchange_stop_id__num_of                                           BCMOLT_EPON_LINK_KEY_EXCHANGE_STOP_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_start_id_send_period                               BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID_SEND_PERIOD
+#define bcmolt_epon_link_oam_keepalive_timer_start_id__num_of                                   BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_START_ID__NUM_OF
+#define bcmolt_epon_link_oam_keepalive_timer_stop_id__num_of                                    BCMOLT_EPON_LINK_OAM_KEEPALIVE_TIMER_STOP_ID__NUM_OF
+#define bcmolt_epon_link_static_registration_id_laseron_time_tq                                 BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASERON_TIME_TQ
+#define bcmolt_epon_link_static_registration_id_laseroff_time_tq                                BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_LASEROFF_TIME_TQ
+#define bcmolt_epon_link_static_registration_id_range_value_tq                                  BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_RANGE_VALUE_TQ
+#define bcmolt_epon_link_static_registration_id_pending_grants                                  BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID_PENDING_GRANTS
+#define bcmolt_epon_link_static_registration_id__num_of                                         BCMOLT_EPON_LINK_STATIC_REGISTRATION_ID__NUM_OF
+#define bcmolt_epon_link_inject_frame_id_frame                                                  BCMOLT_EPON_LINK_INJECT_FRAME_ID_FRAME
+#define bcmolt_epon_link_inject_frame_id__num_of                                                BCMOLT_EPON_LINK_INJECT_FRAME_ID__NUM_OF
+#define bcmolt_epon_link_frame_captured_id_frame                                                BCMOLT_EPON_LINK_FRAME_CAPTURED_ID_FRAME
+#define bcmolt_epon_link_frame_captured_id__num_of                                              BCMOLT_EPON_LINK_FRAME_CAPTURED_ID__NUM_OF
+#define bcmolt_epon_ni_key_id_epon_ni                                                           BCMOLT_EPON_NI_KEY_ID_EPON_NI
+#define bcmolt_epon_ni_key_id__num_of                                                           BCMOLT_EPON_NI_KEY_ID__NUM_OF
+#define bcmolt_epon_ni_cfg_id_mac_address                                                       BCMOLT_EPON_NI_CFG_ID_MAC_ADDRESS
+#define bcmolt_epon_ni_cfg_id_epon_ni_en                                                        BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN
+#define bcmolt_epon_ni_cfg_id_registration_behavior                                             BCMOLT_EPON_NI_CFG_ID_REGISTRATION_BEHAVIOR
+#define bcmolt_epon_ni_cfg_id_mtu_1g                                                            BCMOLT_EPON_NI_CFG_ID_MTU_1G
+#define bcmolt_epon_ni_cfg_id_mtu_10g                                                           BCMOLT_EPON_NI_CFG_ID_MTU_10G
+#define bcmolt_epon_ni_cfg_id_minimum_fiber_length                                              BCMOLT_EPON_NI_CFG_ID_MINIMUM_FIBER_LENGTH
+#define bcmolt_epon_ni_cfg_id_maximum_fiber_length                                              BCMOLT_EPON_NI_CFG_ID_MAXIMUM_FIBER_LENGTH
+#define bcmolt_epon_ni_cfg_id_grant_spacing_tq                                                  BCMOLT_EPON_NI_CFG_ID_GRANT_SPACING_TQ
+#define bcmolt_epon_ni_cfg_id_epon_logical_link_options                                         BCMOLT_EPON_NI_CFG_ID_EPON_LOGICAL_LINK_OPTIONS
+#define bcmolt_epon_ni_cfg_id_mpcp_discovery_period_ms                                          BCMOLT_EPON_NI_CFG_ID_MPCP_DISCOVERY_PERIOD_MS
+#define bcmolt_epon_ni_cfg_id_alarm_state                                                       BCMOLT_EPON_NI_CFG_ID_ALARM_STATE
+#define bcmolt_epon_ni_cfg_id_all_links                                                         BCMOLT_EPON_NI_CFG_ID_ALL_LINKS
+#define bcmolt_epon_ni_cfg_id_encryption_cfg                                                    BCMOLT_EPON_NI_CFG_ID_ENCRYPTION_CFG
+#define bcmolt_epon_ni_cfg_id_protection_switching_cfg                                          BCMOLT_EPON_NI_CFG_ID_PROTECTION_SWITCHING_CFG
+#define bcmolt_epon_ni_cfg_id_clock_transport_cfg                                               BCMOLT_EPON_NI_CFG_ID_CLOCK_TRANSPORT_CFG
+#define bcmolt_epon_ni_cfg_id_dropdown_weights                                                  BCMOLT_EPON_NI_CFG_ID_DROPDOWN_WEIGHTS
+#define bcmolt_epon_ni_cfg_id_approximate_solicited_usage                                       BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE
+#define bcmolt_epon_ni_cfg_id_approximate_tdm_usage                                             BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE
+#define bcmolt_epon_ni_cfg_id_no_reports_soak_time                                              BCMOLT_EPON_NI_CFG_ID_NO_REPORTS_SOAK_TIME
+#define bcmolt_epon_ni_cfg_id_pon_aggregate_shaper                                              BCMOLT_EPON_NI_CFG_ID_PON_AGGREGATE_SHAPER
+#define bcmolt_epon_ni_cfg_id_estimated_pon_latency_tq                                          BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ
+#define bcmolt_epon_ni_cfg_id_onu_upgrade_params                                                BCMOLT_EPON_NI_CFG_ID_ONU_UPGRADE_PARAMS
+#define bcmolt_epon_ni_cfg_id_auto_rogue_detect_10g_en                                          BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_EN
+#define bcmolt_epon_ni_cfg_id_auto_rogue_detect_1g_en                                           BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_1G_EN
+#define bcmolt_epon_ni_cfg_id_auto_rogue_detect_10g_threshold                                   BCMOLT_EPON_NI_CFG_ID_AUTO_ROGUE_DETECT_10G_THRESHOLD
+#define bcmolt_epon_ni_cfg_id__num_of                                                           BCMOLT_EPON_NI_CFG_ID__NUM_OF
+#define bcmolt_epon_ni_auto_rogue_scan_10g_failure_id__num_of                                   BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_10G_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_auto_rogue_scan_1g_failure_id__num_of                                    BCMOLT_EPON_NI_AUTO_ROGUE_SCAN_1G_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_llid_quarantined_id_llid                                                 BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LLID
+#define bcmolt_epon_ni_llid_quarantined_id_link_rate                                            BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_RATE
+#define bcmolt_epon_ni_llid_quarantined_id_link_mac                                             BCMOLT_EPON_NI_LLID_QUARANTINED_ID_LINK_MAC
+#define bcmolt_epon_ni_llid_quarantined_id_range_value_tq                                       BCMOLT_EPON_NI_LLID_QUARANTINED_ID_RANGE_VALUE_TQ
+#define bcmolt_epon_ni_llid_quarantined_id__num_of                                              BCMOLT_EPON_NI_LLID_QUARANTINED_ID__NUM_OF
+#define bcmolt_epon_ni_mpcp_timestamp_changed_id_mpcp_timestamp                                 BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID_MPCP_TIMESTAMP
+#define bcmolt_epon_ni_mpcp_timestamp_changed_id__num_of                                        BCMOLT_EPON_NI_MPCP_TIMESTAMP_CHANGED_ID__NUM_OF
+#define bcmolt_epon_ni_no_reports_id_alarm_status                                               BCMOLT_EPON_NI_NO_REPORTS_ID_ALARM_STATUS
+#define bcmolt_epon_ni_no_reports_id__num_of                                                    BCMOLT_EPON_NI_NO_REPORTS_ID__NUM_OF
+#define bcmolt_epon_ni_onu_upgrade_complete_id_status                                           BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS
+#define bcmolt_epon_ni_onu_upgrade_complete_id_list_of_failed_entities                          BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES
+#define bcmolt_epon_ni_onu_upgrade_complete_id__num_of                                          BCMOLT_EPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_epon_ni_rerange_failure_id__num_of                                               BCMOLT_EPON_NI_RERANGE_FAILURE_ID__NUM_OF
+#define bcmolt_epon_ni_rogue_scan_complete_id_return_ind_status                                 BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID_RETURN_IND_STATUS
+#define bcmolt_epon_ni_rogue_scan_complete_id__num_of                                           BCMOLT_EPON_NI_ROGUE_SCAN_COMPLETE_ID__NUM_OF
+#define bcmolt_epon_ni_rssi_measurement_completed_id_status                                     BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_STATUS
+#define bcmolt_epon_ni_rssi_measurement_completed_id_llid                                       BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LLID
+#define bcmolt_epon_ni_rssi_measurement_completed_id_link_mac                                   BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID_LINK_MAC
+#define bcmolt_epon_ni_rssi_measurement_completed_id__num_of                                    BCMOLT_EPON_NI_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_epon_ni_state_change_completed_id_new_state                                      BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE
+#define bcmolt_epon_ni_state_change_completed_id__num_of                                        BCMOLT_EPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_epon_ni_auto_cfg_id_auto_rogue_scan_10g_failure                                  BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_10G_FAILURE
+#define bcmolt_epon_ni_auto_cfg_id_auto_rogue_scan_1g_failure                                   BCMOLT_EPON_NI_AUTO_CFG_ID_AUTO_ROGUE_SCAN_1G_FAILURE
+#define bcmolt_epon_ni_auto_cfg_id_llid_quarantined                                             BCMOLT_EPON_NI_AUTO_CFG_ID_LLID_QUARANTINED
+#define bcmolt_epon_ni_auto_cfg_id_mpcp_timestamp_changed                                       BCMOLT_EPON_NI_AUTO_CFG_ID_MPCP_TIMESTAMP_CHANGED
+#define bcmolt_epon_ni_auto_cfg_id_no_reports                                                   BCMOLT_EPON_NI_AUTO_CFG_ID_NO_REPORTS
+#define bcmolt_epon_ni_auto_cfg_id_onu_upgrade_complete                                         BCMOLT_EPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_epon_ni_auto_cfg_id_rerange_failure                                              BCMOLT_EPON_NI_AUTO_CFG_ID_RERANGE_FAILURE
+#define bcmolt_epon_ni_auto_cfg_id_rogue_scan_complete                                          BCMOLT_EPON_NI_AUTO_CFG_ID_ROGUE_SCAN_COMPLETE
+#define bcmolt_epon_ni_auto_cfg_id_rssi_measurement_completed                                   BCMOLT_EPON_NI_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_epon_ni_auto_cfg_id_state_change_completed                                       BCMOLT_EPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_epon_ni_auto_cfg_id__num_of                                                      BCMOLT_EPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_ni_add_link_id_mac_address                                                  BCMOLT_EPON_NI_ADD_LINK_ID_MAC_ADDRESS
+#define bcmolt_epon_ni_add_link_id_rate                                                         BCMOLT_EPON_NI_ADD_LINK_ID_RATE
+#define bcmolt_epon_ni_add_link_id__num_of                                                      BCMOLT_EPON_NI_ADD_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_add_multicast_link_id_mac_address                                        BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_MAC_ADDRESS
+#define bcmolt_epon_ni_add_multicast_link_id_rate                                               BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID_RATE
+#define bcmolt_epon_ni_add_multicast_link_id__num_of                                            BCMOLT_EPON_NI_ADD_MULTICAST_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_add_protected_standby_link_id_mac_address                                BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_MAC_ADDRESS
+#define bcmolt_epon_ni_add_protected_standby_link_id_working_link_info                          BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID_WORKING_LINK_INFO
+#define bcmolt_epon_ni_add_protected_standby_link_id__num_of                                    BCMOLT_EPON_NI_ADD_PROTECTED_STANDBY_LINK_ID__NUM_OF
+#define bcmolt_epon_ni_issue_rssi_grant_id_granted_link                                         BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_GRANTED_LINK
+#define bcmolt_epon_ni_issue_rssi_grant_id_trigger_width                                        BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_WIDTH
+#define bcmolt_epon_ni_issue_rssi_grant_id_trigger_delay                                        BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_TRIGGER_DELAY
+#define bcmolt_epon_ni_issue_rssi_grant_id_sample_period                                        BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID_SAMPLE_PERIOD
+#define bcmolt_epon_ni_issue_rssi_grant_id__num_of                                              BCMOLT_EPON_NI_ISSUE_RSSI_GRANT_ID__NUM_OF
+#define bcmolt_epon_ni_protection_switching_apply_rerange_delta_id_rerange_delta                BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID_RERANGE_DELTA
+#define bcmolt_epon_ni_protection_switching_apply_rerange_delta_id__num_of                      BCMOLT_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA_ID__NUM_OF
+#define bcmolt_epon_ni_rogue_llid_scan_id_mode                                                  BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_MODE
+#define bcmolt_epon_ni_rogue_llid_scan_id_llid                                                  BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID_LLID
+#define bcmolt_epon_ni_rogue_llid_scan_id__num_of                                               BCMOLT_EPON_NI_ROGUE_LLID_SCAN_ID__NUM_OF
+#define bcmolt_epon_ni_set_epon_ni_en_state_id_new_state                                        BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID_NEW_STATE
+#define bcmolt_epon_ni_set_epon_ni_en_state_id__num_of                                          BCMOLT_EPON_NI_SET_EPON_NI_EN_STATE_ID__NUM_OF
+#define bcmolt_epon_ni_start_onu_upgrade_id_list_of_onu_ids                                     BCMOLT_EPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS
+#define bcmolt_epon_ni_start_onu_upgrade_id__num_of                                             BCMOLT_EPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_key_id_epon_ni                                                   BCMOLT_EPON_ONU_10G_US_KEY_ID_EPON_NI
+#define bcmolt_epon_onu_10g_us_key_id_onu_id                                                    BCMOLT_EPON_ONU_10G_US_KEY_ID_ONU_ID
+#define bcmolt_epon_onu_10g_us_key_id__num_of                                                   BCMOLT_EPON_ONU_10G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_cfg_id_all_links                                                 BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS
+#define bcmolt_epon_onu_10g_us_cfg_id__num_of                                                   BCMOLT_EPON_ONU_10G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_id_fec_code_words_total                                     BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_TOTAL
+#define bcmolt_epon_onu_10g_us_stat_id_fec_code_words_decode_fails                              BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_CODE_WORDS_DECODE_FAILS
+#define bcmolt_epon_onu_10g_us_stat_id_fec_zeroes_corrected                                     BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ZEROES_CORRECTED
+#define bcmolt_epon_onu_10g_us_stat_id_fec_ones_corrected                                       BCMOLT_EPON_ONU_10G_US_STAT_ID_FEC_ONES_CORRECTED
+#define bcmolt_epon_onu_10g_us_stat_id__num_of                                                  BCMOLT_EPON_ONU_10G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_cfg_id_cfg                                                  BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID_CFG
+#define bcmolt_epon_onu_10g_us_stat_cfg_id__num_of                                              BCMOLT_EPON_ONU_10G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_alarm_cleared_id_stat                                       BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_onu_10g_us_stat_alarm_cleared_id__num_of                                    BCMOLT_EPON_ONU_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_stat_alarm_raised_id_stat                                        BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_onu_10g_us_stat_alarm_raised_id__num_of                                     BCMOLT_EPON_ONU_10G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_onu_10g_us_auto_cfg_id_stat_alarm_cleared                                   BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_onu_10g_us_auto_cfg_id_stat_alarm_raised                                    BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_onu_10g_us_auto_cfg_id__num_of                                              BCMOLT_EPON_ONU_10G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_key_id_epon_ni                                                    BCMOLT_EPON_ONU_1G_US_KEY_ID_EPON_NI
+#define bcmolt_epon_onu_1g_us_key_id_onu_id                                                     BCMOLT_EPON_ONU_1G_US_KEY_ID_ONU_ID
+#define bcmolt_epon_onu_1g_us_key_id__num_of                                                    BCMOLT_EPON_ONU_1G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_cfg_id_all_links                                                  BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS
+#define bcmolt_epon_onu_1g_us_cfg_id__num_of                                                    BCMOLT_EPON_ONU_1G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_id_good_frames                                               BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id_good_bytes                                                BCMOLT_EPON_ONU_1G_US_STAT_ID_GOOD_BYTES
+#define bcmolt_epon_onu_1g_us_stat_id_oversz_frames                                             BCMOLT_EPON_ONU_1G_US_STAT_ID_OVERSZ_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id_non_fec_good_frames                                       BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id_non_fec_good_bytes                                        BCMOLT_EPON_ONU_1G_US_STAT_ID_NON_FEC_GOOD_BYTES
+#define bcmolt_epon_onu_1g_us_stat_id_fec_good_frames                                           BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id_fec_good_bytes                                            BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_GOOD_BYTES
+#define bcmolt_epon_onu_1g_us_stat_id_fec_frames_exc_errs                                       BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_FRAMES_EXC_ERRS
+#define bcmolt_epon_onu_1g_us_stat_id_fec_blks_no_errs                                          BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_NO_ERRS
+#define bcmolt_epon_onu_1g_us_stat_id_fec_blks_corr_errs                                        BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_CORR_ERRS
+#define bcmolt_epon_onu_1g_us_stat_id_fec_blks_uncorr_errs                                      BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_BLKS_UNCORR_ERRS
+#define bcmolt_epon_onu_1g_us_stat_id_fec_corr_bytes                                            BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_BYTES
+#define bcmolt_epon_onu_1g_us_stat_id_fec_corr_zeroes                                           BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ZEROES
+#define bcmolt_epon_onu_1g_us_stat_id_fec_corr_ones                                             BCMOLT_EPON_ONU_1G_US_STAT_ID_FEC_CORR_ONES
+#define bcmolt_epon_onu_1g_us_stat_id_undersz_frames                                            BCMOLT_EPON_ONU_1G_US_STAT_ID_UNDERSZ_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id_errorsz_frames                                            BCMOLT_EPON_ONU_1G_US_STAT_ID_ERRORSZ_FRAMES
+#define bcmolt_epon_onu_1g_us_stat_id__num_of                                                   BCMOLT_EPON_ONU_1G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_cfg_id_cfg                                                   BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID_CFG
+#define bcmolt_epon_onu_1g_us_stat_cfg_id__num_of                                               BCMOLT_EPON_ONU_1G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_alarm_cleared_id_stat                                        BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_onu_1g_us_stat_alarm_cleared_id__num_of                                     BCMOLT_EPON_ONU_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_stat_alarm_raised_id_stat                                         BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_onu_1g_us_stat_alarm_raised_id__num_of                                      BCMOLT_EPON_ONU_1G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_onu_1g_us_auto_cfg_id_stat_alarm_cleared                                    BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_onu_1g_us_auto_cfg_id_stat_alarm_raised                                     BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_onu_1g_us_auto_cfg_id__num_of                                               BCMOLT_EPON_ONU_1G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_key_id_epon_ni                                                  BCMOLT_EPON_PATH_10G_DS_KEY_ID_EPON_NI
+#define bcmolt_epon_path_10g_ds_key_id__num_of                                                  BCMOLT_EPON_PATH_10G_DS_KEY_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_cfg_id_fec_state                                                BCMOLT_EPON_PATH_10G_DS_CFG_ID_FEC_STATE
+#define bcmolt_epon_path_10g_ds_cfg_id_prbs_generator                                           BCMOLT_EPON_PATH_10G_DS_CFG_ID_PRBS_GENERATOR
+#define bcmolt_epon_path_10g_ds_cfg_id__num_of                                                  BCMOLT_EPON_PATH_10G_DS_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_id_bytes                                                   BCMOLT_EPON_PATH_10G_DS_STAT_ID_BYTES
+#define bcmolt_epon_path_10g_ds_stat_id_frames                                                  BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_frames_64                                               BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_64
+#define bcmolt_epon_path_10g_ds_stat_id_frames_65_127                                           BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_65_127
+#define bcmolt_epon_path_10g_ds_stat_id_frames_128_255                                          BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_128_255
+#define bcmolt_epon_path_10g_ds_stat_id_frames_256_511                                          BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_256_511
+#define bcmolt_epon_path_10g_ds_stat_id_frames_512_1023                                         BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_512_1023
+#define bcmolt_epon_path_10g_ds_stat_id_frames_1024_1518                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1024_1518
+#define bcmolt_epon_path_10g_ds_stat_id_frames_1519_2047                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_1519_2047
+#define bcmolt_epon_path_10g_ds_stat_id_frames_2048_4095                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_2048_4095
+#define bcmolt_epon_path_10g_ds_stat_id_frames_4096_9216                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_4096_9216
+#define bcmolt_epon_path_10g_ds_stat_id_frames_9217_16383                                       BCMOLT_EPON_PATH_10G_DS_STAT_ID_FRAMES_9217_16383
+#define bcmolt_epon_path_10g_ds_stat_id_broadcast_frames                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_data_bytes                                              BCMOLT_EPON_PATH_10G_DS_STAT_ID_DATA_BYTES
+#define bcmolt_epon_path_10g_ds_stat_id_multicast_frames                                        BCMOLT_EPON_PATH_10G_DS_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_unicast_frames                                          BCMOLT_EPON_PATH_10G_DS_STAT_ID_UNICAST_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_oam_bytes                                               BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_BYTES
+#define bcmolt_epon_path_10g_ds_stat_id_oam_frames                                              BCMOLT_EPON_PATH_10G_DS_STAT_ID_OAM_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_gate_frames                                             BCMOLT_EPON_PATH_10G_DS_STAT_ID_GATE_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_mpcp_frames                                             BCMOLT_EPON_PATH_10G_DS_STAT_ID_MPCP_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id_abort_frames                                            BCMOLT_EPON_PATH_10G_DS_STAT_ID_ABORT_FRAMES
+#define bcmolt_epon_path_10g_ds_stat_id__num_of                                                 BCMOLT_EPON_PATH_10G_DS_STAT_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_cfg_id_cfg                                                 BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID_CFG
+#define bcmolt_epon_path_10g_ds_stat_cfg_id__num_of                                             BCMOLT_EPON_PATH_10G_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_alarm_cleared_id_stat                                      BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_path_10g_ds_stat_alarm_cleared_id__num_of                                   BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_stat_alarm_raised_id_stat                                       BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_path_10g_ds_stat_alarm_raised_id__num_of                                    BCMOLT_EPON_PATH_10G_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_10g_ds_auto_cfg_id_stat_alarm_cleared                                  BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_10g_ds_auto_cfg_id_stat_alarm_raised                                   BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_10g_ds_auto_cfg_id__num_of                                             BCMOLT_EPON_PATH_10G_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_key_id_epon_ni                                                  BCMOLT_EPON_PATH_10G_US_KEY_ID_EPON_NI
+#define bcmolt_epon_path_10g_us_key_id__num_of                                                  BCMOLT_EPON_PATH_10G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_cfg_id_fec_state                                                BCMOLT_EPON_PATH_10G_US_CFG_ID_FEC_STATE
+#define bcmolt_epon_path_10g_us_cfg_id_sync_time_tq                                             BCMOLT_EPON_PATH_10G_US_CFG_ID_SYNC_TIME_TQ
+#define bcmolt_epon_path_10g_us_cfg_id_prbs_checker                                             BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_CHECKER
+#define bcmolt_epon_path_10g_us_cfg_id_prbs_status                                              BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS
+#define bcmolt_epon_path_10g_us_cfg_id__num_of                                                  BCMOLT_EPON_PATH_10G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_id_bytes                                                   BCMOLT_EPON_PATH_10G_US_STAT_ID_BYTES
+#define bcmolt_epon_path_10g_us_stat_id_frames                                                  BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_frames_64                                               BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_64
+#define bcmolt_epon_path_10g_us_stat_id_frames_65_127                                           BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_65_127
+#define bcmolt_epon_path_10g_us_stat_id_frames_128_255                                          BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_128_255
+#define bcmolt_epon_path_10g_us_stat_id_frames_256_511                                          BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_256_511
+#define bcmolt_epon_path_10g_us_stat_id_frames_512_1023                                         BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_512_1023
+#define bcmolt_epon_path_10g_us_stat_id_frames_1024_1518                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1024_1518
+#define bcmolt_epon_path_10g_us_stat_id_frames_1519_2047                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_1519_2047
+#define bcmolt_epon_path_10g_us_stat_id_frames_2048_4095                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_2048_4095
+#define bcmolt_epon_path_10g_us_stat_id_frames_4096_9216                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_4096_9216
+#define bcmolt_epon_path_10g_us_stat_id_frames_9217_16383                                       BCMOLT_EPON_PATH_10G_US_STAT_ID_FRAMES_9217_16383
+#define bcmolt_epon_path_10g_us_stat_id_broadcast_frames                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_data_bytes                                              BCMOLT_EPON_PATH_10G_US_STAT_ID_DATA_BYTES
+#define bcmolt_epon_path_10g_us_stat_id_multicast_frames                                        BCMOLT_EPON_PATH_10G_US_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_unicast_frames                                          BCMOLT_EPON_PATH_10G_US_STAT_ID_UNICAST_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_mpcp_frames                                             BCMOLT_EPON_PATH_10G_US_STAT_ID_MPCP_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_oam_bytes                                               BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_BYTES
+#define bcmolt_epon_path_10g_us_stat_id_oam_frames                                              BCMOLT_EPON_PATH_10G_US_STAT_ID_OAM_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_report_frames                                           BCMOLT_EPON_PATH_10G_US_STAT_ID_REPORT_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_abort_frames                                            BCMOLT_EPON_PATH_10G_US_STAT_ID_ABORT_FRAMES
+#define bcmolt_epon_path_10g_us_stat_id_fcs_error                                               BCMOLT_EPON_PATH_10G_US_STAT_ID_FCS_ERROR
+#define bcmolt_epon_path_10g_us_stat_id_crc_8_error                                             BCMOLT_EPON_PATH_10G_US_STAT_ID_CRC_8_ERROR
+#define bcmolt_epon_path_10g_us_stat_id_out_of_slot                                             BCMOLT_EPON_PATH_10G_US_STAT_ID_OUT_OF_SLOT
+#define bcmolt_epon_path_10g_us_stat_id_oversize_error                                          BCMOLT_EPON_PATH_10G_US_STAT_ID_OVERSIZE_ERROR
+#define bcmolt_epon_path_10g_us_stat_id_runt_error                                              BCMOLT_EPON_PATH_10G_US_STAT_ID_RUNT_ERROR
+#define bcmolt_epon_path_10g_us_stat_id__num_of                                                 BCMOLT_EPON_PATH_10G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_cfg_id_cfg                                                 BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID_CFG
+#define bcmolt_epon_path_10g_us_stat_cfg_id__num_of                                             BCMOLT_EPON_PATH_10G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_alarm_cleared_id_stat                                      BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_path_10g_us_stat_alarm_cleared_id__num_of                                   BCMOLT_EPON_PATH_10G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_stat_alarm_raised_id_stat                                       BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_path_10g_us_stat_alarm_raised_id__num_of                                    BCMOLT_EPON_PATH_10G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_10g_us_auto_cfg_id_stat_alarm_cleared                                  BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_10g_us_auto_cfg_id_stat_alarm_raised                                   BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_10g_us_auto_cfg_id__num_of                                             BCMOLT_EPON_PATH_10G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_key_id_epon_ni                                                   BCMOLT_EPON_PATH_1G_DS_KEY_ID_EPON_NI
+#define bcmolt_epon_path_1g_ds_key_id__num_of                                                   BCMOLT_EPON_PATH_1G_DS_KEY_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_cfg_id_default_fec_state                                         BCMOLT_EPON_PATH_1G_DS_CFG_ID_DEFAULT_FEC_STATE
+#define bcmolt_epon_path_1g_ds_cfg_id_raman_mode                                                BCMOLT_EPON_PATH_1G_DS_CFG_ID_RAMAN_MODE
+#define bcmolt_epon_path_1g_ds_cfg_id_turbo_2g_mode                                             BCMOLT_EPON_PATH_1G_DS_CFG_ID_TURBO_2G_MODE
+#define bcmolt_epon_path_1g_ds_cfg_id_prbs_generator                                            BCMOLT_EPON_PATH_1G_DS_CFG_ID_PRBS_GENERATOR
+#define bcmolt_epon_path_1g_ds_cfg_id__num_of                                                   BCMOLT_EPON_PATH_1G_DS_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_id_bytes                                                    BCMOLT_EPON_PATH_1G_DS_STAT_ID_BYTES
+#define bcmolt_epon_path_1g_ds_stat_id_frames                                                   BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_frames_64                                                BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_64
+#define bcmolt_epon_path_1g_ds_stat_id_frames_65_127                                            BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_65_127
+#define bcmolt_epon_path_1g_ds_stat_id_frames_128_255                                           BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_128_255
+#define bcmolt_epon_path_1g_ds_stat_id_frames_256_511                                           BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_256_511
+#define bcmolt_epon_path_1g_ds_stat_id_frames_512_1023                                          BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_512_1023
+#define bcmolt_epon_path_1g_ds_stat_id_frames_1024_1518                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1024_1518
+#define bcmolt_epon_path_1g_ds_stat_id_frames_1519_2047                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_1519_2047
+#define bcmolt_epon_path_1g_ds_stat_id_frames_2048_4095                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_2048_4095
+#define bcmolt_epon_path_1g_ds_stat_id_frames_4096_9216                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_4096_9216
+#define bcmolt_epon_path_1g_ds_stat_id_frames_9217_16383                                        BCMOLT_EPON_PATH_1G_DS_STAT_ID_FRAMES_9217_16383
+#define bcmolt_epon_path_1g_ds_stat_id_broadcast_frames                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_data_bytes                                               BCMOLT_EPON_PATH_1G_DS_STAT_ID_DATA_BYTES
+#define bcmolt_epon_path_1g_ds_stat_id_multicast_frames                                         BCMOLT_EPON_PATH_1G_DS_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_unicast_frames                                           BCMOLT_EPON_PATH_1G_DS_STAT_ID_UNICAST_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_oam_bytes                                                BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_BYTES
+#define bcmolt_epon_path_1g_ds_stat_id_oam_frames                                               BCMOLT_EPON_PATH_1G_DS_STAT_ID_OAM_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_gate_frames                                              BCMOLT_EPON_PATH_1G_DS_STAT_ID_GATE_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_mpcp_frames                                              BCMOLT_EPON_PATH_1G_DS_STAT_ID_MPCP_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id_abort_frames                                             BCMOLT_EPON_PATH_1G_DS_STAT_ID_ABORT_FRAMES
+#define bcmolt_epon_path_1g_ds_stat_id__num_of                                                  BCMOLT_EPON_PATH_1G_DS_STAT_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_cfg_id_cfg                                                  BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID_CFG
+#define bcmolt_epon_path_1g_ds_stat_cfg_id__num_of                                              BCMOLT_EPON_PATH_1G_DS_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_alarm_cleared_id_stat                                       BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_path_1g_ds_stat_alarm_cleared_id__num_of                                    BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_stat_alarm_raised_id_stat                                        BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_path_1g_ds_stat_alarm_raised_id__num_of                                     BCMOLT_EPON_PATH_1G_DS_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_1g_ds_auto_cfg_id_stat_alarm_cleared                                   BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_1g_ds_auto_cfg_id_stat_alarm_raised                                    BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_1g_ds_auto_cfg_id__num_of                                              BCMOLT_EPON_PATH_1G_DS_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_key_id_epon_ni                                                   BCMOLT_EPON_PATH_1G_US_KEY_ID_EPON_NI
+#define bcmolt_epon_path_1g_us_key_id__num_of                                                   BCMOLT_EPON_PATH_1G_US_KEY_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_cfg_id_default_fec_state                                         BCMOLT_EPON_PATH_1G_US_CFG_ID_DEFAULT_FEC_STATE
+#define bcmolt_epon_path_1g_us_cfg_id_sync_time_tq                                              BCMOLT_EPON_PATH_1G_US_CFG_ID_SYNC_TIME_TQ
+#define bcmolt_epon_path_1g_us_cfg_id_prbs_checker                                              BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_CHECKER
+#define bcmolt_epon_path_1g_us_cfg_id_prbs_status                                               BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS
+#define bcmolt_epon_path_1g_us_cfg_id__num_of                                                   BCMOLT_EPON_PATH_1G_US_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_id_bytes                                                    BCMOLT_EPON_PATH_1G_US_STAT_ID_BYTES
+#define bcmolt_epon_path_1g_us_stat_id_frames                                                   BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_frames_64                                                BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_64
+#define bcmolt_epon_path_1g_us_stat_id_frames_65_127                                            BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_65_127
+#define bcmolt_epon_path_1g_us_stat_id_frames_128_255                                           BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_128_255
+#define bcmolt_epon_path_1g_us_stat_id_frames_256_511                                           BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_256_511
+#define bcmolt_epon_path_1g_us_stat_id_frames_512_1023                                          BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_512_1023
+#define bcmolt_epon_path_1g_us_stat_id_frames_1024_1518                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1024_1518
+#define bcmolt_epon_path_1g_us_stat_id_frames_1519_2047                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_1519_2047
+#define bcmolt_epon_path_1g_us_stat_id_frames_2048_4095                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_2048_4095
+#define bcmolt_epon_path_1g_us_stat_id_frames_4096_9216                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_4096_9216
+#define bcmolt_epon_path_1g_us_stat_id_frames_9217_16383                                        BCMOLT_EPON_PATH_1G_US_STAT_ID_FRAMES_9217_16383
+#define bcmolt_epon_path_1g_us_stat_id_broadcast_frames                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_BROADCAST_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_data_bytes                                               BCMOLT_EPON_PATH_1G_US_STAT_ID_DATA_BYTES
+#define bcmolt_epon_path_1g_us_stat_id_multicast_frames                                         BCMOLT_EPON_PATH_1G_US_STAT_ID_MULTICAST_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_unicast_frames                                           BCMOLT_EPON_PATH_1G_US_STAT_ID_UNICAST_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_mpcp_frames                                              BCMOLT_EPON_PATH_1G_US_STAT_ID_MPCP_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_oam_bytes                                                BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_BYTES
+#define bcmolt_epon_path_1g_us_stat_id_oam_frames                                               BCMOLT_EPON_PATH_1G_US_STAT_ID_OAM_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_report_frames                                            BCMOLT_EPON_PATH_1G_US_STAT_ID_REPORT_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_abort_frames                                             BCMOLT_EPON_PATH_1G_US_STAT_ID_ABORT_FRAMES
+#define bcmolt_epon_path_1g_us_stat_id_fcs_error                                                BCMOLT_EPON_PATH_1G_US_STAT_ID_FCS_ERROR
+#define bcmolt_epon_path_1g_us_stat_id_crc_8_error                                              BCMOLT_EPON_PATH_1G_US_STAT_ID_CRC_8_ERROR
+#define bcmolt_epon_path_1g_us_stat_id_out_of_slot                                              BCMOLT_EPON_PATH_1G_US_STAT_ID_OUT_OF_SLOT
+#define bcmolt_epon_path_1g_us_stat_id_oversize_error                                           BCMOLT_EPON_PATH_1G_US_STAT_ID_OVERSIZE_ERROR
+#define bcmolt_epon_path_1g_us_stat_id_runt_error                                               BCMOLT_EPON_PATH_1G_US_STAT_ID_RUNT_ERROR
+#define bcmolt_epon_path_1g_us_stat_id__num_of                                                  BCMOLT_EPON_PATH_1G_US_STAT_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_cfg_id_cfg                                                  BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID_CFG
+#define bcmolt_epon_path_1g_us_stat_cfg_id__num_of                                              BCMOLT_EPON_PATH_1G_US_STAT_CFG_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_alarm_cleared_id_stat                                       BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_epon_path_1g_us_stat_alarm_cleared_id__num_of                                    BCMOLT_EPON_PATH_1G_US_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_stat_alarm_raised_id_stat                                        BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_epon_path_1g_us_stat_alarm_raised_id__num_of                                     BCMOLT_EPON_PATH_1G_US_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_epon_path_1g_us_auto_cfg_id_stat_alarm_cleared                                   BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_epon_path_1g_us_auto_cfg_id_stat_alarm_raised                                    BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_epon_path_1g_us_auto_cfg_id__num_of                                              BCMOLT_EPON_PATH_1G_US_AUTO_CFG_ID__NUM_OF
+#define bcmolt_epon_rp_key_id_epon_ni                                                           BCMOLT_EPON_RP_KEY_ID_EPON_NI
+#define bcmolt_epon_rp_key_id_link_rate                                                         BCMOLT_EPON_RP_KEY_ID_LINK_RATE
+#define bcmolt_epon_rp_key_id__num_of                                                           BCMOLT_EPON_RP_KEY_ID__NUM_OF
+#define bcmolt_epon_rp_cfg_id_base_llid                                                         BCMOLT_EPON_RP_CFG_ID_BASE_LLID
+#define bcmolt_epon_rp_cfg_id_mpcp_disc_en                                                      BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_EN
+#define bcmolt_epon_rp_cfg_id_mpcp_disc_gnt_len_tq                                              BCMOLT_EPON_RP_CFG_ID_MPCP_DISC_GNT_LEN_TQ
+#define bcmolt_epon_rp_cfg_id_mpcp_report_timeout                                               BCMOLT_EPON_RP_CFG_ID_MPCP_REPORT_TIMEOUT
+#define bcmolt_epon_rp_cfg_id_max_mpcp_reg_per_disc_window                                      BCMOLT_EPON_RP_CFG_ID_MAX_MPCP_REG_PER_DISC_WINDOW
+#define bcmolt_epon_rp_cfg_id_max_links                                                         BCMOLT_EPON_RP_CFG_ID_MAX_LINKS
+#define bcmolt_epon_rp_cfg_id_default_upstream_bandwidth                                        BCMOLT_EPON_RP_CFG_ID_DEFAULT_UPSTREAM_BANDWIDTH
+#define bcmolt_epon_rp_cfg_id_rate_of_refraction                                                BCMOLT_EPON_RP_CFG_ID_RATE_OF_REFRACTION
+#define bcmolt_epon_rp_cfg_id__num_of                                                           BCMOLT_EPON_RP_CFG_ID__NUM_OF
+#define bcmolt_gpio_key_id_reserved                                                             BCMOLT_GPIO_KEY_ID_RESERVED
+#define bcmolt_gpio_key_id_gpio_id                                                              BCMOLT_GPIO_KEY_ID_GPIO_ID
+#define bcmolt_gpio_key_id__num_of                                                              BCMOLT_GPIO_KEY_ID__NUM_OF
+#define bcmolt_gpio_cfg_id_direction                                                            BCMOLT_GPIO_CFG_ID_DIRECTION
+#define bcmolt_gpio_cfg_id_value                                                                BCMOLT_GPIO_CFG_ID_VALUE
+#define bcmolt_gpio_cfg_id__num_of                                                              BCMOLT_GPIO_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_key_id_pon_ni                                                         BCMOLT_GPON_ALLOC_KEY_ID_PON_NI
+#define bcmolt_gpon_alloc_key_id_alloc_id                                                       BCMOLT_GPON_ALLOC_KEY_ID_ALLOC_ID
+#define bcmolt_gpon_alloc_key_id__num_of                                                        BCMOLT_GPON_ALLOC_KEY_ID__NUM_OF
+#define bcmolt_gpon_alloc_cfg_id_state                                                          BCMOLT_GPON_ALLOC_CFG_ID_STATE
+#define bcmolt_gpon_alloc_cfg_id_sla                                                            BCMOLT_GPON_ALLOC_CFG_ID_SLA
+#define bcmolt_gpon_alloc_cfg_id_onu_id                                                         BCMOLT_GPON_ALLOC_CFG_ID_ONU_ID
+#define bcmolt_gpon_alloc_cfg_id_collect_stats                                                  BCMOLT_GPON_ALLOC_CFG_ID_COLLECT_STATS
+#define bcmolt_gpon_alloc_cfg_id__num_of                                                        BCMOLT_GPON_ALLOC_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_id_rx_bytes                                                      BCMOLT_GPON_ALLOC_STAT_ID_RX_BYTES
+#define bcmolt_gpon_alloc_stat_id__num_of                                                       BCMOLT_GPON_ALLOC_STAT_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_cfg_id_cfg                                                       BCMOLT_GPON_ALLOC_STAT_CFG_ID_CFG
+#define bcmolt_gpon_alloc_stat_cfg_id__num_of                                                   BCMOLT_GPON_ALLOC_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_configuration_completed_id_status                                     BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_alloc_configuration_completed_id_new_state                                  BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE
+#define bcmolt_gpon_alloc_configuration_completed_id__num_of                                    BCMOLT_GPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id_status                                   BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id_average_nsr_used                         BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id_average_nsr_allocated                    BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id_average_sr_report                        BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT
+#define bcmolt_gpon_alloc_get_alloc_stats_completed_id__num_of                                  BCMOLT_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_alarm_cleared_id_stat                                            BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_gpon_alloc_stat_alarm_cleared_id__num_of                                         BCMOLT_GPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_alloc_stat_alarm_raised_id_stat                                             BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_gpon_alloc_stat_alarm_raised_id__num_of                                          BCMOLT_GPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_alloc_auto_cfg_id_configuration_completed                                   BCMOLT_GPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_alloc_auto_cfg_id_get_alloc_stats_completed                                 BCMOLT_GPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED
+#define bcmolt_gpon_alloc_auto_cfg_id_stat_alarm_cleared                                        BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_alloc_auto_cfg_id_stat_alarm_raised                                         BCMOLT_GPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_alloc_auto_cfg_id__num_of                                                   BCMOLT_GPON_ALLOC_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_alloc_get_stats_id_num_of_cycles                                            BCMOLT_GPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES
+#define bcmolt_gpon_alloc_get_stats_id__num_of                                                  BCMOLT_GPON_ALLOC_GET_STATS_ID__NUM_OF
+#define bcmolt_gpon_alloc_set_state_id_state                                                    BCMOLT_GPON_ALLOC_SET_STATE_ID_STATE
+#define bcmolt_gpon_alloc_set_state_id__num_of                                                  BCMOLT_GPON_ALLOC_SET_STATE_ID__NUM_OF
+#define bcmolt_gpon_gem_port_key_id_pon_ni                                                      BCMOLT_GPON_GEM_PORT_KEY_ID_PON_NI
+#define bcmolt_gpon_gem_port_key_id_gem_port_id                                                 BCMOLT_GPON_GEM_PORT_KEY_ID_GEM_PORT_ID
+#define bcmolt_gpon_gem_port_key_id__num_of                                                     BCMOLT_GPON_GEM_PORT_KEY_ID__NUM_OF
+#define bcmolt_gpon_gem_port_cfg_id_configuration                                               BCMOLT_GPON_GEM_PORT_CFG_ID_CONFIGURATION
+#define bcmolt_gpon_gem_port_cfg_id_onu_id                                                      BCMOLT_GPON_GEM_PORT_CFG_ID_ONU_ID
+#define bcmolt_gpon_gem_port_cfg_id_gem_port_state                                              BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE
+#define bcmolt_gpon_gem_port_cfg_id_downstream_encryption_mode                                  BCMOLT_GPON_GEM_PORT_CFG_ID_DOWNSTREAM_ENCRYPTION_MODE
+#define bcmolt_gpon_gem_port_cfg_id_upstream_destination_queue                                  BCMOLT_GPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE
+#define bcmolt_gpon_gem_port_cfg_id_control                                                     BCMOLT_GPON_GEM_PORT_CFG_ID_CONTROL
+#define bcmolt_gpon_gem_port_cfg_id_debug_flow_config                                           BCMOLT_GPON_GEM_PORT_CFG_ID_DEBUG_FLOW_CONFIG
+#define bcmolt_gpon_gem_port_cfg_id_mac_table_entry_limit                                       BCMOLT_GPON_GEM_PORT_CFG_ID_MAC_TABLE_ENTRY_LIMIT
+#define bcmolt_gpon_gem_port_cfg_id__num_of                                                     BCMOLT_GPON_GEM_PORT_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_id_rx_packets                                                 BCMOLT_GPON_GEM_PORT_STAT_ID_RX_PACKETS
+#define bcmolt_gpon_gem_port_stat_id_rx_bytes                                                   BCMOLT_GPON_GEM_PORT_STAT_ID_RX_BYTES
+#define bcmolt_gpon_gem_port_stat_id_tx_packets                                                 BCMOLT_GPON_GEM_PORT_STAT_ID_TX_PACKETS
+#define bcmolt_gpon_gem_port_stat_id_tx_bytes                                                   BCMOLT_GPON_GEM_PORT_STAT_ID_TX_BYTES
+#define bcmolt_gpon_gem_port_stat_id__num_of                                                    BCMOLT_GPON_GEM_PORT_STAT_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_cfg_id_cfg                                                    BCMOLT_GPON_GEM_PORT_STAT_CFG_ID_CFG
+#define bcmolt_gpon_gem_port_stat_cfg_id__num_of                                                BCMOLT_GPON_GEM_PORT_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_configuration_completed_id_status                                  BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_gem_port_configuration_completed_id_new_state                               BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID_NEW_STATE
+#define bcmolt_gpon_gem_port_configuration_completed_id__num_of                                 BCMOLT_GPON_GEM_PORT_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_alarm_cleared_id_stat                                         BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_gpon_gem_port_stat_alarm_cleared_id__num_of                                      BCMOLT_GPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_stat_alarm_raised_id_stat                                          BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_gpon_gem_port_stat_alarm_raised_id__num_of                                       BCMOLT_GPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_gem_port_auto_cfg_id_configuration_completed                                BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_gem_port_auto_cfg_id_stat_alarm_cleared                                     BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_gem_port_auto_cfg_id_stat_alarm_raised                                      BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_gem_port_auto_cfg_id__num_of                                                BCMOLT_GPON_GEM_PORT_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_gem_port_set_state_id_state                                                 BCMOLT_GPON_GEM_PORT_SET_STATE_ID_STATE
+#define bcmolt_gpon_gem_port_set_state_id__num_of                                               BCMOLT_GPON_GEM_PORT_SET_STATE_ID__NUM_OF
+#define bcmolt_gpon_iwf_key_id_pon_ni                                                           BCMOLT_GPON_IWF_KEY_ID_PON_NI
+#define bcmolt_gpon_iwf_key_id__num_of                                                          BCMOLT_GPON_IWF_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_cfg_id_iwf_mode                                                         BCMOLT_GPON_IWF_CFG_ID_IWF_MODE
+#define bcmolt_gpon_iwf_cfg_id_us_tpid_per_flow                                                 BCMOLT_GPON_IWF_CFG_ID_US_TPID_PER_FLOW
+#define bcmolt_gpon_iwf_cfg_id_us_otag_direct_tpid                                              BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID
+#define bcmolt_gpon_iwf_cfg_id_us_otag_direct_pbit                                              BCMOLT_GPON_IWF_CFG_ID_US_OTAG_DIRECT_PBIT
+#define bcmolt_gpon_iwf_cfg_id_ds_tpid                                                          BCMOLT_GPON_IWF_CFG_ID_DS_TPID
+#define bcmolt_gpon_iwf_cfg_id_mac_table_configuration                                          BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_CONFIGURATION
+#define bcmolt_gpon_iwf_cfg_id_debug_flow_configuration                                         BCMOLT_GPON_IWF_CFG_ID_DEBUG_FLOW_CONFIGURATION
+#define bcmolt_gpon_iwf_cfg_id_mac_table_count                                                  BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT
+#define bcmolt_gpon_iwf_cfg_id_forbidden_vlan_flow_gem_range_start                              BCMOLT_GPON_IWF_CFG_ID_FORBIDDEN_VLAN_FLOW_GEM_RANGE_START
+#define bcmolt_gpon_iwf_cfg_id__num_of                                                          BCMOLT_GPON_IWF_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_id_ds_hit_event                                                    BCMOLT_GPON_IWF_STAT_ID_DS_HIT_EVENT
+#define bcmolt_gpon_iwf_stat_id_ds_miss_event                                                   BCMOLT_GPON_IWF_STAT_ID_DS_MISS_EVENT
+#define bcmolt_gpon_iwf_stat_id_ds_drop_due_to_miss_event                                       BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_MISS_EVENT
+#define bcmolt_gpon_iwf_stat_id_ds_drop_due_to_hit_event                                        BCMOLT_GPON_IWF_STAT_ID_DS_DROP_DUE_TO_HIT_EVENT
+#define bcmolt_gpon_iwf_stat_id_ds_drop_to_disabled_gem                                         BCMOLT_GPON_IWF_STAT_ID_DS_DROP_TO_DISABLED_GEM
+#define bcmolt_gpon_iwf_stat_id_new_mac_discovered                                              BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DISCOVERED
+#define bcmolt_gpon_iwf_stat_id_move_event                                                      BCMOLT_GPON_IWF_STAT_ID_MOVE_EVENT
+#define bcmolt_gpon_iwf_stat_id_new_mac_drop_due_to_fifo_full                                   BCMOLT_GPON_IWF_STAT_ID_NEW_MAC_DROP_DUE_TO_FIFO_FULL
+#define bcmolt_gpon_iwf_stat_id__num_of                                                         BCMOLT_GPON_IWF_STAT_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_cfg_id_cfg                                                         BCMOLT_GPON_IWF_STAT_CFG_ID_CFG
+#define bcmolt_gpon_iwf_stat_cfg_id__num_of                                                     BCMOLT_GPON_IWF_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_flush_mac_table_completed_id__num_of                                    BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_iwf_scan_mac_table_completed_id_mac_address                                 BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_MAC_ADDRESS
+#define bcmolt_gpon_iwf_scan_mac_table_completed_id_entries                                     BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID_ENTRIES
+#define bcmolt_gpon_iwf_scan_mac_table_completed_id__num_of                                     BCMOLT_GPON_IWF_SCAN_MAC_TABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_alarm_cleared_id_stat                                              BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_gpon_iwf_stat_alarm_cleared_id__num_of                                           BCMOLT_GPON_IWF_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_iwf_stat_alarm_raised_id_stat                                               BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_gpon_iwf_stat_alarm_raised_id__num_of                                            BCMOLT_GPON_IWF_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_iwf_auto_cfg_id_flush_mac_table_completed                                   BCMOLT_GPON_IWF_AUTO_CFG_ID_FLUSH_MAC_TABLE_COMPLETED
+#define bcmolt_gpon_iwf_auto_cfg_id_scan_mac_table_completed                                    BCMOLT_GPON_IWF_AUTO_CFG_ID_SCAN_MAC_TABLE_COMPLETED
+#define bcmolt_gpon_iwf_auto_cfg_id_stat_alarm_cleared                                          BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_iwf_auto_cfg_id_stat_alarm_raised                                           BCMOLT_GPON_IWF_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_iwf_auto_cfg_id__num_of                                                     BCMOLT_GPON_IWF_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_flush_mac_table_id_control                                              BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_CONTROL
+#define bcmolt_gpon_iwf_flush_mac_table_id_vid                                                  BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_VID
+#define bcmolt_gpon_iwf_flush_mac_table_id_flow_id                                              BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID_FLOW_ID
+#define bcmolt_gpon_iwf_flush_mac_table_id__num_of                                              BCMOLT_GPON_IWF_FLUSH_MAC_TABLE_ID__NUM_OF
+#define bcmolt_gpon_iwf_scan_mac_table_id_mac_address                                           BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID_MAC_ADDRESS
+#define bcmolt_gpon_iwf_scan_mac_table_id__num_of                                               BCMOLT_GPON_IWF_SCAN_MAC_TABLE_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_egress_flow_key_id_pon_ni                                            BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_PON_NI
+#define bcmolt_gpon_iwf_ds_egress_flow_key_id_flow_id                                           BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID_FLOW_ID
+#define bcmolt_gpon_iwf_ds_egress_flow_key_id__num_of                                           BCMOLT_GPON_IWF_DS_EGRESS_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_egress_flow_cfg_id_gem_port                                          BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_GEM_PORT
+#define bcmolt_gpon_iwf_ds_egress_flow_cfg_id_pbit_control                                      BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID_PBIT_CONTROL
+#define bcmolt_gpon_iwf_ds_egress_flow_cfg_id__num_of                                           BCMOLT_GPON_IWF_DS_EGRESS_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_ingress_flow_key_id_pon_ni                                           BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_PON_NI
+#define bcmolt_gpon_iwf_ds_ingress_flow_key_id_vlan_id                                          BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID_VLAN_ID
+#define bcmolt_gpon_iwf_ds_ingress_flow_key_id__num_of                                          BCMOLT_GPON_IWF_DS_INGRESS_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_mapping_method                                   BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_METHOD
+#define bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_mapping_tag                                      BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_MAPPING_TAG
+#define bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_vlan_action                                      BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID_VLAN_ACTION
+#define bcmolt_gpon_iwf_ds_ingress_flow_cfg_id__num_of                                          BCMOLT_GPON_IWF_DS_INGRESS_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_key_id_pon_ni                                                 BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_PON_NI
+#define bcmolt_gpon_iwf_mac_table_key_id_mac_address                                            BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_MAC_ADDRESS
+#define bcmolt_gpon_iwf_mac_table_key_id_vlan                                                   BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID_VLAN
+#define bcmolt_gpon_iwf_mac_table_key_id__num_of                                                BCMOLT_GPON_IWF_MAC_TABLE_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_cfg_id_flow_id                                                BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_FLOW_ID
+#define bcmolt_gpon_iwf_mac_table_cfg_id_stat                                                   BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_STAT
+#define bcmolt_gpon_iwf_mac_table_cfg_id_gem_port_id                                            BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID
+#define bcmolt_gpon_iwf_mac_table_cfg_id_onu_id                                                 BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID
+#define bcmolt_gpon_iwf_mac_table_cfg_id__num_of                                                BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_aged_id__num_of                                           BCMOLT_GPON_IWF_MAC_TABLE_MAC_AGED_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_dropped_id_flow_id                                        BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID_FLOW_ID
+#define bcmolt_gpon_iwf_mac_table_mac_dropped_id__num_of                                        BCMOLT_GPON_IWF_MAC_TABLE_MAC_DROPPED_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_mac_move_id_old_flow_id                                       BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_OLD_FLOW_ID
+#define bcmolt_gpon_iwf_mac_table_mac_move_id_new_flow_id                                       BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID_NEW_FLOW_ID
+#define bcmolt_gpon_iwf_mac_table_mac_move_id__num_of                                           BCMOLT_GPON_IWF_MAC_TABLE_MAC_MOVE_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_new_mac_id_flow_id                                            BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID_FLOW_ID
+#define bcmolt_gpon_iwf_mac_table_new_mac_id__num_of                                            BCMOLT_GPON_IWF_MAC_TABLE_NEW_MAC_ID__NUM_OF
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id_mac_aged                                          BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_AGED
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id_mac_dropped                                       BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_DROPPED
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id_mac_move                                          BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_MAC_MOVE
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id_new_mac                                           BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID_NEW_MAC
+#define bcmolt_gpon_iwf_mac_table_auto_cfg_id__num_of                                           BCMOLT_GPON_IWF_MAC_TABLE_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_iwf_us_flow_key_id_pon_ni                                                   BCMOLT_GPON_IWF_US_FLOW_KEY_ID_PON_NI
+#define bcmolt_gpon_iwf_us_flow_key_id_gem_port_id                                              BCMOLT_GPON_IWF_US_FLOW_KEY_ID_GEM_PORT_ID
+#define bcmolt_gpon_iwf_us_flow_key_id__num_of                                                  BCMOLT_GPON_IWF_US_FLOW_KEY_ID__NUM_OF
+#define bcmolt_gpon_iwf_us_flow_cfg_id_flow_id                                                  BCMOLT_GPON_IWF_US_FLOW_CFG_ID_FLOW_ID
+#define bcmolt_gpon_iwf_us_flow_cfg_id_mac_learning                                             BCMOLT_GPON_IWF_US_FLOW_CFG_ID_MAC_LEARNING
+#define bcmolt_gpon_iwf_us_flow_cfg_id_vlan_action                                              BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_ACTION
+#define bcmolt_gpon_iwf_us_flow_cfg_id_vlan_tag                                                 BCMOLT_GPON_IWF_US_FLOW_CFG_ID_VLAN_TAG
+#define bcmolt_gpon_iwf_us_flow_cfg_id_tpid_index                                               BCMOLT_GPON_IWF_US_FLOW_CFG_ID_TPID_INDEX
+#define bcmolt_gpon_iwf_us_flow_cfg_id__num_of                                                  BCMOLT_GPON_IWF_US_FLOW_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_key_id_pon_ni                                                            BCMOLT_GPON_NI_KEY_ID_PON_NI
+#define bcmolt_gpon_ni_key_id__num_of                                                           BCMOLT_GPON_NI_KEY_ID__NUM_OF
+#define bcmolt_gpon_ni_cfg_id_pon_status                                                        BCMOLT_GPON_NI_CFG_ID_PON_STATUS
+#define bcmolt_gpon_ni_cfg_id_available_bandwidth                                               BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH
+#define bcmolt_gpon_ni_cfg_id_number_of_active_onus                                             BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS
+#define bcmolt_gpon_ni_cfg_id_number_of_active_standby_onus                                     BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS
+#define bcmolt_gpon_ni_cfg_id_prbs_status                                                       BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS
+#define bcmolt_gpon_ni_cfg_id_pon_distance                                                      BCMOLT_GPON_NI_CFG_ID_PON_DISTANCE
+#define bcmolt_gpon_ni_cfg_id_ranging_window_size                                               BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE
+#define bcmolt_gpon_ni_cfg_id_preassigned_equalization_delay                                    BCMOLT_GPON_NI_CFG_ID_PREASSIGNED_EQUALIZATION_DELAY
+#define bcmolt_gpon_ni_cfg_id_eqd_cycles_number                                                 BCMOLT_GPON_NI_CFG_ID_EQD_CYCLES_NUMBER
+#define bcmolt_gpon_ni_cfg_id_power_level                                                       BCMOLT_GPON_NI_CFG_ID_POWER_LEVEL
+#define bcmolt_gpon_ni_cfg_id_ds_fec_mode                                                       BCMOLT_GPON_NI_CFG_ID_DS_FEC_MODE
+#define bcmolt_gpon_ni_cfg_id_drift_control                                                     BCMOLT_GPON_NI_CFG_ID_DRIFT_CONTROL
+#define bcmolt_gpon_ni_cfg_id_ds_ber_reporting_interval                                         BCMOLT_GPON_NI_CFG_ID_DS_BER_REPORTING_INTERVAL
+#define bcmolt_gpon_ni_cfg_id_los_alarm_threshold                                               BCMOLT_GPON_NI_CFG_ID_LOS_ALARM_THRESHOLD
+#define bcmolt_gpon_ni_cfg_id_los_initial_value                                                 BCMOLT_GPON_NI_CFG_ID_LOS_INITIAL_VALUE
+#define bcmolt_gpon_ni_cfg_id_onu_alarms_thresholds                                             BCMOLT_GPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS
+#define bcmolt_gpon_ni_cfg_id_ber_monitor                                                       BCMOLT_GPON_NI_CFG_ID_BER_MONITOR
+#define bcmolt_gpon_ni_cfg_id_ploam_ack_timeout                                                 BCMOLT_GPON_NI_CFG_ID_PLOAM_ACK_TIMEOUT
+#define bcmolt_gpon_ni_cfg_id_onu_activation                                                    BCMOLT_GPON_NI_CFG_ID_ONU_ACTIVATION
+#define bcmolt_gpon_ni_cfg_id_sn_acquisition                                                    BCMOLT_GPON_NI_CFG_ID_SN_ACQUISITION
+#define bcmolt_gpon_ni_cfg_id_key_exchange                                                      BCMOLT_GPON_NI_CFG_ID_KEY_EXCHANGE
+#define bcmolt_gpon_ni_cfg_id_protection_switching                                              BCMOLT_GPON_NI_CFG_ID_PROTECTION_SWITCHING
+#define bcmolt_gpon_ni_cfg_id_cbr_rt_allocation_profile                                         BCMOLT_GPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE
+#define bcmolt_gpon_ni_cfg_id_cbr_nrt_allocation_profile                                        BCMOLT_GPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE
+#define bcmolt_gpon_ni_cfg_id_dba                                                               BCMOLT_GPON_NI_CFG_ID_DBA
+#define bcmolt_gpon_ni_cfg_id_power_management                                                  BCMOLT_GPON_NI_CFG_ID_POWER_MANAGEMENT
+#define bcmolt_gpon_ni_cfg_id_rogue_onu_detection_process                                       BCMOLT_GPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS
+#define bcmolt_gpon_ni_cfg_id_periodic_standby_pon_monitoring                                   BCMOLT_GPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING
+#define bcmolt_gpon_ni_cfg_id_prbs_checker                                                      BCMOLT_GPON_NI_CFG_ID_PRBS_CHECKER
+#define bcmolt_gpon_ni_cfg_id_prbs_generator                                                    BCMOLT_GPON_NI_CFG_ID_PRBS_GENERATOR
+#define bcmolt_gpon_ni_cfg_id_min_data_alloc_id                                                 BCMOLT_GPON_NI_CFG_ID_MIN_DATA_ALLOC_ID
+#define bcmolt_gpon_ni_cfg_id_automatic_onu_deactivation                                        BCMOLT_GPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION
+#define bcmolt_gpon_ni_cfg_id_us_bandwidth_limit                                                BCMOLT_GPON_NI_CFG_ID_US_BANDWIDTH_LIMIT
+#define bcmolt_gpon_ni_cfg_id_all_onus                                                          BCMOLT_GPON_NI_CFG_ID_ALL_ONUS
+#define bcmolt_gpon_ni_cfg_id_all_mcast_gem_ports                                               BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS
+#define bcmolt_gpon_ni_cfg_id_debug                                                             BCMOLT_GPON_NI_CFG_ID_DEBUG
+#define bcmolt_gpon_ni_cfg_id_onu_upgrade_params                                                BCMOLT_GPON_NI_CFG_ID_ONU_UPGRADE_PARAMS
+#define bcmolt_gpon_ni_cfg_id_ps_c_wait_before_deactivation_timeout                             BCMOLT_GPON_NI_CFG_ID_PS_C_WAIT_BEFORE_DEACTIVATION_TIMEOUT
+#define bcmolt_gpon_ni_cfg_id_bip32_indication_control                                          BCMOLT_GPON_NI_CFG_ID_BIP32_INDICATION_CONTROL
+#define bcmolt_gpon_ni_cfg_id__num_of                                                           BCMOLT_GPON_NI_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_id_fec_codewords                                                    BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS
+#define bcmolt_gpon_ni_stat_id_fec_codewords_uncorrected                                        BCMOLT_GPON_NI_STAT_ID_FEC_CODEWORDS_UNCORRECTED
+#define bcmolt_gpon_ni_stat_id_bip8_bytes                                                       BCMOLT_GPON_NI_STAT_ID_BIP8_BYTES
+#define bcmolt_gpon_ni_stat_id_bip8_errors                                                      BCMOLT_GPON_NI_STAT_ID_BIP8_ERRORS
+#define bcmolt_gpon_ni_stat_id_rx_gem_packets                                                   BCMOLT_GPON_NI_STAT_ID_RX_GEM_PACKETS
+#define bcmolt_gpon_ni_stat_id_rx_gem_dropped                                                   BCMOLT_GPON_NI_STAT_ID_RX_GEM_DROPPED
+#define bcmolt_gpon_ni_stat_id_rx_gem_idle                                                      BCMOLT_GPON_NI_STAT_ID_RX_GEM_IDLE
+#define bcmolt_gpon_ni_stat_id_rx_gem_corrected                                                 BCMOLT_GPON_NI_STAT_ID_RX_GEM_CORRECTED
+#define bcmolt_gpon_ni_stat_id_rx_gem_illegal                                                   BCMOLT_GPON_NI_STAT_ID_RX_GEM_ILLEGAL
+#define bcmolt_gpon_ni_stat_id_rx_allocations_valid                                             BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_VALID
+#define bcmolt_gpon_ni_stat_id_rx_allocations_invalid                                           BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID
+#define bcmolt_gpon_ni_stat_id_rx_allocations_disabled                                          BCMOLT_GPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED
+#define bcmolt_gpon_ni_stat_id_rx_ploams                                                        BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS
+#define bcmolt_gpon_ni_stat_id_rx_ploams_non_idle                                               BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE
+#define bcmolt_gpon_ni_stat_id_rx_ploams_error                                                  BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_ERROR
+#define bcmolt_gpon_ni_stat_id_rx_ploams_dropped                                                BCMOLT_GPON_NI_STAT_ID_RX_PLOAMS_DROPPED
+#define bcmolt_gpon_ni_stat_id_rx_cpu                                                           BCMOLT_GPON_NI_STAT_ID_RX_CPU
+#define bcmolt_gpon_ni_stat_id_rx_omci                                                          BCMOLT_GPON_NI_STAT_ID_RX_OMCI
+#define bcmolt_gpon_ni_stat_id_rx_omci_packets_crc_error                                        BCMOLT_GPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR
+#define bcmolt_gpon_ni_stat_id_rx_dropped_too_short                                             BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT
+#define bcmolt_gpon_ni_stat_id_rx_dropped_too_long                                              BCMOLT_GPON_NI_STAT_ID_RX_DROPPED_TOO_LONG
+#define bcmolt_gpon_ni_stat_id_rx_crc_errors                                                    BCMOLT_GPON_NI_STAT_ID_RX_CRC_ERRORS
+#define bcmolt_gpon_ni_stat_id_rx_key_errors                                                    BCMOLT_GPON_NI_STAT_ID_RX_KEY_ERRORS
+#define bcmolt_gpon_ni_stat_id_rx_fragments_errors                                              BCMOLT_GPON_NI_STAT_ID_RX_FRAGMENTS_ERRORS
+#define bcmolt_gpon_ni_stat_id_rx_packets_dropped                                               BCMOLT_GPON_NI_STAT_ID_RX_PACKETS_DROPPED
+#define bcmolt_gpon_ni_stat_id_tx_gem                                                           BCMOLT_GPON_NI_STAT_ID_TX_GEM
+#define bcmolt_gpon_ni_stat_id_tx_ploams                                                        BCMOLT_GPON_NI_STAT_ID_TX_PLOAMS
+#define bcmolt_gpon_ni_stat_id_tx_gem_fragments                                                 BCMOLT_GPON_NI_STAT_ID_TX_GEM_FRAGMENTS
+#define bcmolt_gpon_ni_stat_id_tx_cpu                                                           BCMOLT_GPON_NI_STAT_ID_TX_CPU
+#define bcmolt_gpon_ni_stat_id_tx_omci                                                          BCMOLT_GPON_NI_STAT_ID_TX_OMCI
+#define bcmolt_gpon_ni_stat_id_tx_cpu_omci_packets_dropped                                      BCMOLT_GPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED
+#define bcmolt_gpon_ni_stat_id_tx_dropped_illegal_length                                        BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH
+#define bcmolt_gpon_ni_stat_id_tx_dropped_tpid_miss                                             BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_TPID_MISS
+#define bcmolt_gpon_ni_stat_id_tx_dropped_vid_miss                                              BCMOLT_GPON_NI_STAT_ID_TX_DROPPED_VID_MISS
+#define bcmolt_gpon_ni_stat_id__num_of                                                          BCMOLT_GPON_NI_STAT_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_cfg_id_cfg                                                          BCMOLT_GPON_NI_STAT_CFG_ID_CFG
+#define bcmolt_gpon_ni_stat_cfg_id__num_of                                                      BCMOLT_GPON_NI_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_activate_all_onus_completed_id__num_of                                   BCMOLT_GPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_cpu_packets_failure_id_error                                             BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_ERROR
+#define bcmolt_gpon_ni_cpu_packets_failure_id_gem_port_id                                       BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID
+#define bcmolt_gpon_ni_cpu_packets_failure_id__num_of                                           BCMOLT_GPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF
+#define bcmolt_gpon_ni_deactivate_all_onus_completed_id__num_of                                 BCMOLT_GPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_disable_all_onus_completed_id__num_of                                    BCMOLT_GPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_enable_all_onus_completed_id__num_of                                     BCMOLT_GPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_los_id_status                                                            BCMOLT_GPON_NI_LOS_ID_STATUS
+#define bcmolt_gpon_ni_los_id__num_of                                                           BCMOLT_GPON_NI_LOS_ID__NUM_OF
+#define bcmolt_gpon_ni_onu_discovered_id_serial_number                                          BCMOLT_GPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER
+#define bcmolt_gpon_ni_onu_discovered_id_ranging_time                                           BCMOLT_GPON_NI_ONU_DISCOVERED_ID_RANGING_TIME
+#define bcmolt_gpon_ni_onu_discovered_id_onu_id                                                 BCMOLT_GPON_NI_ONU_DISCOVERED_ID_ONU_ID
+#define bcmolt_gpon_ni_onu_discovered_id__num_of                                                BCMOLT_GPON_NI_ONU_DISCOVERED_ID__NUM_OF
+#define bcmolt_gpon_ni_onu_upgrade_complete_id_status                                           BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS
+#define bcmolt_gpon_ni_onu_upgrade_complete_id_list_of_failed_entities                          BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES
+#define bcmolt_gpon_ni_onu_upgrade_complete_id__num_of                                          BCMOLT_GPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_onus_ranged_id_onus                                 BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS
+#define bcmolt_gpon_ni_protection_switching_onus_ranged_id__num_of                              BCMOLT_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_switchover_completed_id_result                      BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT
+#define bcmolt_gpon_ni_protection_switching_switchover_completed_id__num_of                     BCMOLT_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_traffic_resume_id_result                            BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT
+#define bcmolt_gpon_ni_protection_switching_traffic_resume_id__num_of                           BCMOLT_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_detection_completed_id_window_type                                 BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE
+#define bcmolt_gpon_ni_rogue_detection_completed_id_measurement_status                          BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS
+#define bcmolt_gpon_ni_rogue_detection_completed_id_alloc_id                                    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID
+#define bcmolt_gpon_ni_rogue_detection_completed_id_onu_id                                      BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID
+#define bcmolt_gpon_ni_rogue_detection_completed_id_is_delineation                              BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION
+#define bcmolt_gpon_ni_rogue_detection_completed_id_is_ed                                       BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED
+#define bcmolt_gpon_ni_rogue_detection_completed_id_rx_data                                     BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA
+#define bcmolt_gpon_ni_rogue_detection_completed_id_ploam_received_onu_id                       BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID
+#define bcmolt_gpon_ni_rogue_detection_completed_id_ploam_received_crc_error                    BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_CRC_ERROR
+#define bcmolt_gpon_ni_rogue_detection_completed_id__num_of                                     BCMOLT_GPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id__num_of                             BCMOLT_GPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF
+#define bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id__num_of                         BCMOLT_GPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF
+#define bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id_number_of_detected_delimiter   BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER
+#define bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id_energy_detect_signal           BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL
+#define bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id__num_of                        BCMOLT_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_alarm_cleared_id_stat                                               BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_gpon_ni_stat_alarm_cleared_id__num_of                                            BCMOLT_GPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_ni_stat_alarm_raised_id_stat                                                BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_gpon_ni_stat_alarm_raised_id__num_of                                             BCMOLT_GPON_NI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_ni_state_change_completed_id_result                                         BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT
+#define bcmolt_gpon_ni_state_change_completed_id_previous_state                                 BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE
+#define bcmolt_gpon_ni_state_change_completed_id_new_state                                      BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE
+#define bcmolt_gpon_ni_state_change_completed_id__num_of                                        BCMOLT_GPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_tod_request_completed_id_tod_string                                      BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING
+#define bcmolt_gpon_ni_tod_request_completed_id_sfc                                             BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_SFC
+#define bcmolt_gpon_ni_tod_request_completed_id_rtc_offset_sec                                  BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC
+#define bcmolt_gpon_ni_tod_request_completed_id_rtc_offset_nsec                                 BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC
+#define bcmolt_gpon_ni_tod_request_completed_id_status                                          BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS
+#define bcmolt_gpon_ni_tod_request_completed_id__num_of                                         BCMOLT_GPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_ni_auto_cfg_id_activate_all_onus_completed                                  BCMOLT_GPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_cpu_packets_failure                                          BCMOLT_GPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE
+#define bcmolt_gpon_ni_auto_cfg_id_deactivate_all_onus_completed                                BCMOLT_GPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_disable_all_onus_completed                                   BCMOLT_GPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_enable_all_onus_completed                                    BCMOLT_GPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_los                                                          BCMOLT_GPON_NI_AUTO_CFG_ID_LOS
+#define bcmolt_gpon_ni_auto_cfg_id_onu_discovered                                               BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_DISCOVERED
+#define bcmolt_gpon_ni_auto_cfg_id_onu_upgrade_complete                                         BCMOLT_GPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_gpon_ni_auto_cfg_id_protection_switching_onus_ranged                             BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED
+#define bcmolt_gpon_ni_auto_cfg_id_protection_switching_switchover_completed                    BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_protection_switching_traffic_resume                          BCMOLT_GPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME
+#define bcmolt_gpon_ni_auto_cfg_id_rogue_detection_completed                                    BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_rogue_onu_special_map_cycle_start                            BCMOLT_GPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START
+#define bcmolt_gpon_ni_auto_cfg_id_serial_number_acquisition_cycle_start                        BCMOLT_GPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START
+#define bcmolt_gpon_ni_auto_cfg_id_standby_pon_monitoring_cycle_completed                       BCMOLT_GPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_stat_alarm_cleared                                           BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_ni_auto_cfg_id_stat_alarm_raised                                            BCMOLT_GPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_ni_auto_cfg_id_state_change_completed                                       BCMOLT_GPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id_tod_request_completed                                        BCMOLT_GPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED
+#define bcmolt_gpon_ni_auto_cfg_id__num_of                                                      BCMOLT_GPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_ni_disable_serial_number_id_control                                         BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL
+#define bcmolt_gpon_ni_disable_serial_number_id_serial_number                                   BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER
+#define bcmolt_gpon_ni_disable_serial_number_id__num_of                                         BCMOLT_GPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF
+#define bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id_onu_state          BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_STATE
+#define bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id_onu_list           BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID_ONU_LIST
+#define bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id__num_of            BCMOLT_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_reset_id__num_of                                                         BCMOLT_GPON_NI_RESET_ID__NUM_OF
+#define bcmolt_gpon_ni_rogue_detection_window_id_window_type                                    BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE
+#define bcmolt_gpon_ni_rogue_detection_window_id_alloc_id                                       BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID
+#define bcmolt_gpon_ni_rogue_detection_window_id_onu_id                                         BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID
+#define bcmolt_gpon_ni_rogue_detection_window_id_second_ranging_window                          BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW
+#define bcmolt_gpon_ni_rogue_detection_window_id__num_of                                        BCMOLT_GPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF
+#define bcmolt_gpon_ni_set_onu_state_id_onu_state                                               BCMOLT_GPON_NI_SET_ONU_STATE_ID_ONU_STATE
+#define bcmolt_gpon_ni_set_onu_state_id__num_of                                                 BCMOLT_GPON_NI_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_set_pon_state_id_pon_state                                               BCMOLT_GPON_NI_SET_PON_STATE_ID_PON_STATE
+#define bcmolt_gpon_ni_set_pon_state_id__num_of                                                 BCMOLT_GPON_NI_SET_PON_STATE_ID__NUM_OF
+#define bcmolt_gpon_ni_single_request_standby_pon_monitoring_id__num_of                         BCMOLT_GPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF
+#define bcmolt_gpon_ni_start_onu_upgrade_id_list_of_onu_ids                                     BCMOLT_GPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS
+#define bcmolt_gpon_ni_start_onu_upgrade_id__num_of                                             BCMOLT_GPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_gpon_ni_tod_request_id__num_of                                                   BCMOLT_GPON_NI_TOD_REQUEST_ID__NUM_OF
+#define bcmolt_gpon_ni_broadcast_ploam_packet_id_ploam                                          BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM
+#define bcmolt_gpon_ni_broadcast_ploam_packet_id__num_of                                        BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_gpon_ni_cpu_packets_id_packet_type                                               BCMOLT_GPON_NI_CPU_PACKETS_ID_PACKET_TYPE
+#define bcmolt_gpon_ni_cpu_packets_id_calc_crc                                                  BCMOLT_GPON_NI_CPU_PACKETS_ID_CALC_CRC
+#define bcmolt_gpon_ni_cpu_packets_id_gem_port_list                                             BCMOLT_GPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST
+#define bcmolt_gpon_ni_cpu_packets_id_buffer                                                    BCMOLT_GPON_NI_CPU_PACKETS_ID_BUFFER
+#define bcmolt_gpon_ni_cpu_packets_id__num_of                                                   BCMOLT_GPON_NI_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_gpon_onu_key_id_pon_ni                                                           BCMOLT_GPON_ONU_KEY_ID_PON_NI
+#define bcmolt_gpon_onu_key_id_onu_id                                                           BCMOLT_GPON_ONU_KEY_ID_ONU_ID
+#define bcmolt_gpon_onu_key_id__num_of                                                          BCMOLT_GPON_ONU_KEY_ID__NUM_OF
+#define bcmolt_gpon_onu_cfg_id_onu_state                                                        BCMOLT_GPON_ONU_CFG_ID_ONU_STATE
+#define bcmolt_gpon_onu_cfg_id_serial_number                                                    BCMOLT_GPON_ONU_CFG_ID_SERIAL_NUMBER
+#define bcmolt_gpon_onu_cfg_id_password                                                         BCMOLT_GPON_ONU_CFG_ID_PASSWORD
+#define bcmolt_gpon_onu_cfg_id_auto_password_learning                                           BCMOLT_GPON_ONU_CFG_ID_AUTO_PASSWORD_LEARNING
+#define bcmolt_gpon_onu_cfg_id_us_fec                                                           BCMOLT_GPON_ONU_CFG_ID_US_FEC
+#define bcmolt_gpon_onu_cfg_id_omci_port_id                                                     BCMOLT_GPON_ONU_CFG_ID_OMCI_PORT_ID
+#define bcmolt_gpon_onu_cfg_id_ds_ber_reporting_interval                                        BCMOLT_GPON_ONU_CFG_ID_DS_BER_REPORTING_INTERVAL
+#define bcmolt_gpon_onu_cfg_id_aes_encryption_key                                               BCMOLT_GPON_ONU_CFG_ID_AES_ENCRYPTION_KEY
+#define bcmolt_gpon_onu_cfg_id_alarm_state                                                      BCMOLT_GPON_ONU_CFG_ID_ALARM_STATE
+#define bcmolt_gpon_onu_cfg_id_ranging_time                                                     BCMOLT_GPON_ONU_CFG_ID_RANGING_TIME
+#define bcmolt_gpon_onu_cfg_id_disabled_after_discovery                                         BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY
+#define bcmolt_gpon_onu_cfg_id_deactivation_reason                                              BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON
+#define bcmolt_gpon_onu_cfg_id_all_gem_ports                                                    BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS
+#define bcmolt_gpon_onu_cfg_id_all_allocs                                                       BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS
+#define bcmolt_gpon_onu_cfg_id_onu_ps_type_c                                                    BCMOLT_GPON_ONU_CFG_ID_ONU_PS_TYPE_C
+#define bcmolt_gpon_onu_cfg_id_extended_guard_time                                              BCMOLT_GPON_ONU_CFG_ID_EXTENDED_GUARD_TIME
+#define bcmolt_gpon_onu_cfg_id__num_of                                                          BCMOLT_GPON_ONU_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_id_fec_codewords                                                   BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS
+#define bcmolt_gpon_onu_stat_id_fec_bytes_corrected                                             BCMOLT_GPON_ONU_STAT_ID_FEC_BYTES_CORRECTED
+#define bcmolt_gpon_onu_stat_id_fec_codewords_corrected                                         BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_CORRECTED
+#define bcmolt_gpon_onu_stat_id_fec_codewords_uncorrected                                       BCMOLT_GPON_ONU_STAT_ID_FEC_CODEWORDS_UNCORRECTED
+#define bcmolt_gpon_onu_stat_id_bip8_bytes                                                      BCMOLT_GPON_ONU_STAT_ID_BIP8_BYTES
+#define bcmolt_gpon_onu_stat_id_bip8_errors                                                     BCMOLT_GPON_ONU_STAT_ID_BIP8_ERRORS
+#define bcmolt_gpon_onu_stat_id_rx_ploams_crc_error                                             BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_CRC_ERROR
+#define bcmolt_gpon_onu_stat_id_rx_ploams_non_idle                                              BCMOLT_GPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE
+#define bcmolt_gpon_onu_stat_id_positive_drift                                                  BCMOLT_GPON_ONU_STAT_ID_POSITIVE_DRIFT
+#define bcmolt_gpon_onu_stat_id_negative_drift                                                  BCMOLT_GPON_ONU_STAT_ID_NEGATIVE_DRIFT
+#define bcmolt_gpon_onu_stat_id_rx_omci                                                         BCMOLT_GPON_ONU_STAT_ID_RX_OMCI
+#define bcmolt_gpon_onu_stat_id_rx_omci_packets_crc_error                                       BCMOLT_GPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR
+#define bcmolt_gpon_onu_stat_id_ber_reported                                                    BCMOLT_GPON_ONU_STAT_ID_BER_REPORTED
+#define bcmolt_gpon_onu_stat_id_unreceived_burst                                                BCMOLT_GPON_ONU_STAT_ID_UNRECEIVED_BURST
+#define bcmolt_gpon_onu_stat_id_lcdg_errors                                                     BCMOLT_GPON_ONU_STAT_ID_LCDG_ERRORS
+#define bcmolt_gpon_onu_stat_id_rdi_errors                                                      BCMOLT_GPON_ONU_STAT_ID_RDI_ERRORS
+#define bcmolt_gpon_onu_stat_id_rx_bytes                                                        BCMOLT_GPON_ONU_STAT_ID_RX_BYTES
+#define bcmolt_gpon_onu_stat_id_rx_packets                                                      BCMOLT_GPON_ONU_STAT_ID_RX_PACKETS
+#define bcmolt_gpon_onu_stat_id_tx_bytes                                                        BCMOLT_GPON_ONU_STAT_ID_TX_BYTES
+#define bcmolt_gpon_onu_stat_id_tx_packets                                                      BCMOLT_GPON_ONU_STAT_ID_TX_PACKETS
+#define bcmolt_gpon_onu_stat_id__num_of                                                         BCMOLT_GPON_ONU_STAT_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_cfg_id_cfg                                                         BCMOLT_GPON_ONU_STAT_CFG_ID_CFG
+#define bcmolt_gpon_onu_stat_cfg_id__num_of                                                     BCMOLT_GPON_ONU_STAT_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_ber_interval_configuration_completed_id_ber_interval                    BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_BER_INTERVAL
+#define bcmolt_gpon_onu_ber_interval_configuration_completed_id_result                          BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID_RESULT
+#define bcmolt_gpon_onu_ber_interval_configuration_completed_id__num_of                         BCMOLT_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_dfi_id_alarm_status                                                     BCMOLT_GPON_ONU_DFI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_dfi_id__num_of                                                          BCMOLT_GPON_ONU_DFI_ID__NUM_OF
+#define bcmolt_gpon_onu_dgi_id_alarm_status                                                     BCMOLT_GPON_ONU_DGI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_dgi_id__num_of                                                          BCMOLT_GPON_ONU_DGI_ID__NUM_OF
+#define bcmolt_gpon_onu_dowi_id_alarm_status                                                    BCMOLT_GPON_ONU_DOWI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_dowi_id_drift_value                                                     BCMOLT_GPON_ONU_DOWI_ID_DRIFT_VALUE
+#define bcmolt_gpon_onu_dowi_id_new_eqd                                                         BCMOLT_GPON_ONU_DOWI_ID_NEW_EQD
+#define bcmolt_gpon_onu_dowi_id__num_of                                                         BCMOLT_GPON_ONU_DOWI_ID__NUM_OF
+#define bcmolt_gpon_onu_err_id_bip8_errors                                                      BCMOLT_GPON_ONU_ERR_ID_BIP8_ERRORS
+#define bcmolt_gpon_onu_err_id__num_of                                                          BCMOLT_GPON_ONU_ERR_ID__NUM_OF
+#define bcmolt_gpon_onu_invalid_dbru_report_id_alloc_id                                         BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID
+#define bcmolt_gpon_onu_invalid_dbru_report_id__num_of                                          BCMOLT_GPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_completed_id_new_key                                       BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY
+#define bcmolt_gpon_onu_key_exchange_completed_id__num_of                                       BCMOLT_GPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_cycle_skipped_id__num_of                                   BCMOLT_GPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_decrypt_required_id_new_key                                BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID_NEW_KEY
+#define bcmolt_gpon_onu_key_exchange_decrypt_required_id__num_of                                BCMOLT_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_key_mismatch_id_expected_key                               BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY
+#define bcmolt_gpon_onu_key_exchange_key_mismatch_id_received_key                               BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY
+#define bcmolt_gpon_onu_key_exchange_key_mismatch_id__num_of                                    BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_key_request_timeout_id__num_of                             BCMOLT_GPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF
+#define bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_expected_index                      BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_EXPECTED_INDEX
+#define bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_actual_index                        BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID_ACTUAL_INDEX
+#define bcmolt_gpon_onu_key_exchange_unconsecutive_index_id__num_of                             BCMOLT_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX_ID__NUM_OF
+#define bcmolt_gpon_onu_loai_id_alarm_status                                                    BCMOLT_GPON_ONU_LOAI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_loai_id__num_of                                                         BCMOLT_GPON_ONU_LOAI_ID__NUM_OF
+#define bcmolt_gpon_onu_loki_id_alarm_status                                                    BCMOLT_GPON_ONU_LOKI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_loki_id__num_of                                                         BCMOLT_GPON_ONU_LOKI_ID__NUM_OF
+#define bcmolt_gpon_onu_memi_id_ploam_buffer                                                    BCMOLT_GPON_ONU_MEMI_ID_PLOAM_BUFFER
+#define bcmolt_gpon_onu_memi_id__num_of                                                         BCMOLT_GPON_ONU_MEMI_ID__NUM_OF
+#define bcmolt_gpon_onu_omci_port_id_configuration_completed_id_gem_port                        BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_GEM_PORT
+#define bcmolt_gpon_onu_omci_port_id_configuration_completed_id_status                          BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_omci_port_id_configuration_completed_id_operation                       BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID_OPERATION
+#define bcmolt_gpon_onu_omci_port_id_configuration_completed_id__num_of                         BCMOLT_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_activation_completed_id_status                                      BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_onu_activation_completed_id_fail_reason                                 BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON
+#define bcmolt_gpon_onu_onu_activation_completed_id__num_of                                     BCMOLT_GPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_activation_standby_completed_id_result                              BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID_RESULT
+#define bcmolt_gpon_onu_onu_activation_standby_completed_id__num_of                             BCMOLT_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_alarm_id_onu_alarm                                                  BCMOLT_GPON_ONU_ONU_ALARM_ID_ONU_ALARM
+#define bcmolt_gpon_onu_onu_alarm_id__num_of                                                    BCMOLT_GPON_ONU_ONU_ALARM_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_deactivation_completed_id_status                                    BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_onu_deactivation_completed_id__num_of                                   BCMOLT_GPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_disable_completed_id_serial_number                                  BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER
+#define bcmolt_gpon_onu_onu_disable_completed_id__num_of                                        BCMOLT_GPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_onu_enable_completed_id_serial_number                                   BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER
+#define bcmolt_gpon_onu_onu_enable_completed_id__num_of                                         BCMOLT_GPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_optical_reflection_id__num_of                                           BCMOLT_GPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF
+#define bcmolt_gpon_onu_password_authentication_completed_id_status                             BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_password_authentication_completed_id_fail_reason                        BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_FAIL_REASON
+#define bcmolt_gpon_onu_password_authentication_completed_id_password                           BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID_PASSWORD
+#define bcmolt_gpon_onu_password_authentication_completed_id__num_of                            BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_pee_id_alarm_status                                                     BCMOLT_GPON_ONU_PEE_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_pee_id__num_of                                                          BCMOLT_GPON_ONU_PEE_ID__NUM_OF
+#define bcmolt_gpon_onu_possible_drift_id_alarm_status                                          BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_possible_drift_id_estimated_drift                                       BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT
+#define bcmolt_gpon_onu_possible_drift_id__num_of                                               BCMOLT_GPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF
+#define bcmolt_gpon_onu_power_management_state_change_id_old_state                              BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE
+#define bcmolt_gpon_onu_power_management_state_change_id_new_state                              BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE
+#define bcmolt_gpon_onu_power_management_state_change_id_reason                                 BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON
+#define bcmolt_gpon_onu_power_management_state_change_id__num_of                                BCMOLT_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF
+#define bcmolt_gpon_onu_pst_id_link_number                                                      BCMOLT_GPON_ONU_PST_ID_LINK_NUMBER
+#define bcmolt_gpon_onu_pst_id_k1                                                               BCMOLT_GPON_ONU_PST_ID_K1
+#define bcmolt_gpon_onu_pst_id_k2                                                               BCMOLT_GPON_ONU_PST_ID_K2
+#define bcmolt_gpon_onu_pst_id__num_of                                                          BCMOLT_GPON_ONU_PST_ID__NUM_OF
+#define bcmolt_gpon_onu_ranging_completed_id_status                                             BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_ranging_completed_id_fail_reason                                        BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON
+#define bcmolt_gpon_onu_ranging_completed_id_number_of_ploams                                   BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS
+#define bcmolt_gpon_onu_ranging_completed_id_eqd                                                BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_EQD
+#define bcmolt_gpon_onu_ranging_completed_id_power_level                                        BCMOLT_GPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL
+#define bcmolt_gpon_onu_ranging_completed_id__num_of                                            BCMOLT_GPON_ONU_RANGING_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_rei_id_bip8_errors                                                      BCMOLT_GPON_ONU_REI_ID_BIP8_ERRORS
+#define bcmolt_gpon_onu_rei_id__num_of                                                          BCMOLT_GPON_ONU_REI_ID__NUM_OF
+#define bcmolt_gpon_onu_rssi_measurement_completed_id_status                                    BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS
+#define bcmolt_gpon_onu_rssi_measurement_completed_id_fail_reason                               BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON
+#define bcmolt_gpon_onu_rssi_measurement_completed_id__num_of                                   BCMOLT_GPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_gpon_onu_sdi_id_alarm_status                                                     BCMOLT_GPON_ONU_SDI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_sdi_id_ber                                                              BCMOLT_GPON_ONU_SDI_ID_BER
+#define bcmolt_gpon_onu_sdi_id__num_of                                                          BCMOLT_GPON_ONU_SDI_ID__NUM_OF
+#define bcmolt_gpon_onu_sfi_id_alarm_status                                                     BCMOLT_GPON_ONU_SFI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_sfi_id_ber                                                              BCMOLT_GPON_ONU_SFI_ID_BER
+#define bcmolt_gpon_onu_sfi_id__num_of                                                          BCMOLT_GPON_ONU_SFI_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_alarm_cleared_id_stat                                              BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_gpon_onu_stat_alarm_cleared_id__num_of                                           BCMOLT_GPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_gpon_onu_stat_alarm_raised_id_stat                                               BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_gpon_onu_stat_alarm_raised_id__num_of                                            BCMOLT_GPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_gpon_onu_sufi_id_alarm_status                                                    BCMOLT_GPON_ONU_SUFI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_sufi_id__num_of                                                         BCMOLT_GPON_ONU_SUFI_ID__NUM_OF
+#define bcmolt_gpon_onu_tiwi_id_alarm_status                                                    BCMOLT_GPON_ONU_TIWI_ID_ALARM_STATUS
+#define bcmolt_gpon_onu_tiwi_id_drift_value                                                     BCMOLT_GPON_ONU_TIWI_ID_DRIFT_VALUE
+#define bcmolt_gpon_onu_tiwi_id__num_of                                                         BCMOLT_GPON_ONU_TIWI_ID__NUM_OF
+#define bcmolt_gpon_onu_auto_cfg_id_ber_interval_configuration_completed                        BCMOLT_GPON_ONU_AUTO_CFG_ID_BER_INTERVAL_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_dfi                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_DFI
+#define bcmolt_gpon_onu_auto_cfg_id_dgi                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_DGI
+#define bcmolt_gpon_onu_auto_cfg_id_dowi                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_DOWI
+#define bcmolt_gpon_onu_auto_cfg_id_err                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_ERR
+#define bcmolt_gpon_onu_auto_cfg_id_invalid_dbru_report                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_completed                                      BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_cycle_skipped                                  BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_decrypt_required                               BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_DECRYPT_REQUIRED
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_key_mismatch                                   BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_key_request_timeout                            BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT
+#define bcmolt_gpon_onu_auto_cfg_id_key_exchange_unconsecutive_index                            BCMOLT_GPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_UNCONSECUTIVE_INDEX
+#define bcmolt_gpon_onu_auto_cfg_id_loai                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_LOAI
+#define bcmolt_gpon_onu_auto_cfg_id_loki                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_LOKI
+#define bcmolt_gpon_onu_auto_cfg_id_memi                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_MEMI
+#define bcmolt_gpon_onu_auto_cfg_id_omci_port_id_configuration_completed                        BCMOLT_GPON_ONU_AUTO_CFG_ID_OMCI_PORT_ID_CONFIGURATION_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_onu_activation_completed                                    BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_onu_activation_standby_completed                            BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_STANDBY_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_onu_alarm                                                   BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ALARM
+#define bcmolt_gpon_onu_auto_cfg_id_onu_deactivation_completed                                  BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_onu_disable_completed                                       BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_onu_enable_completed                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_optical_reflection                                          BCMOLT_GPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION
+#define bcmolt_gpon_onu_auto_cfg_id_password_authentication_completed                           BCMOLT_GPON_ONU_AUTO_CFG_ID_PASSWORD_AUTHENTICATION_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_pee                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_PEE
+#define bcmolt_gpon_onu_auto_cfg_id_possible_drift                                              BCMOLT_GPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT
+#define bcmolt_gpon_onu_auto_cfg_id_power_management_state_change                               BCMOLT_GPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE
+#define bcmolt_gpon_onu_auto_cfg_id_pst                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_PST
+#define bcmolt_gpon_onu_auto_cfg_id_ranging_completed                                           BCMOLT_GPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_rei                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_REI
+#define bcmolt_gpon_onu_auto_cfg_id_rssi_measurement_completed                                  BCMOLT_GPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_gpon_onu_auto_cfg_id_sdi                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_SDI
+#define bcmolt_gpon_onu_auto_cfg_id_sfi                                                         BCMOLT_GPON_ONU_AUTO_CFG_ID_SFI
+#define bcmolt_gpon_onu_auto_cfg_id_stat_alarm_cleared                                          BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_gpon_onu_auto_cfg_id_stat_alarm_raised                                           BCMOLT_GPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_gpon_onu_auto_cfg_id_sufi                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_SUFI
+#define bcmolt_gpon_onu_auto_cfg_id_tiwi                                                        BCMOLT_GPON_ONU_AUTO_CFG_ID_TIWI
+#define bcmolt_gpon_onu_auto_cfg_id__num_of                                                     BCMOLT_GPON_ONU_AUTO_CFG_ID__NUM_OF
+#define bcmolt_gpon_onu_change_power_level_id_power_level_action                                BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID_POWER_LEVEL_ACTION
+#define bcmolt_gpon_onu_change_power_level_id__num_of                                           BCMOLT_GPON_ONU_CHANGE_POWER_LEVEL_ID__NUM_OF
+#define bcmolt_gpon_onu_rssi_measurement_id__num_of                                             BCMOLT_GPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF
+#define bcmolt_gpon_onu_set_onu_state_id_onu_state                                              BCMOLT_GPON_ONU_SET_ONU_STATE_ID_ONU_STATE
+#define bcmolt_gpon_onu_set_onu_state_id__num_of                                                BCMOLT_GPON_ONU_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_gpon_onu_cpu_packets_id_packet_type                                              BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_TYPE
+#define bcmolt_gpon_onu_cpu_packets_id_calc_crc                                                 BCMOLT_GPON_ONU_CPU_PACKETS_ID_CALC_CRC
+#define bcmolt_gpon_onu_cpu_packets_id_number_of_packets                                        BCMOLT_GPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS
+#define bcmolt_gpon_onu_cpu_packets_id_packet_size                                              BCMOLT_GPON_ONU_CPU_PACKETS_ID_PACKET_SIZE
+#define bcmolt_gpon_onu_cpu_packets_id_buffer                                                   BCMOLT_GPON_ONU_CPU_PACKETS_ID_BUFFER
+#define bcmolt_gpon_onu_cpu_packets_id__num_of                                                  BCMOLT_GPON_ONU_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_gpon_onu_ploam_packet_id_ploam                                                   BCMOLT_GPON_ONU_PLOAM_PACKET_ID_PLOAM
+#define bcmolt_gpon_onu_ploam_packet_id__num_of                                                 BCMOLT_GPON_ONU_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_gpon_onu_cpu_packet_id_port_id                                                   BCMOLT_GPON_ONU_CPU_PACKET_ID_PORT_ID
+#define bcmolt_gpon_onu_cpu_packet_id_crc_ok                                                    BCMOLT_GPON_ONU_CPU_PACKET_ID_CRC_OK
+#define bcmolt_gpon_onu_cpu_packet_id_packet_size                                               BCMOLT_GPON_ONU_CPU_PACKET_ID_PACKET_SIZE
+#define bcmolt_gpon_onu_cpu_packet_id_buffer                                                    BCMOLT_GPON_ONU_CPU_PACKET_ID_BUFFER
+#define bcmolt_gpon_onu_cpu_packet_id__num_of                                                   BCMOLT_GPON_ONU_CPU_PACKET_ID__NUM_OF
+#define bcmolt_gpon_onu_omci_packet_id_port_id                                                  BCMOLT_GPON_ONU_OMCI_PACKET_ID_PORT_ID
+#define bcmolt_gpon_onu_omci_packet_id_crc_ok                                                   BCMOLT_GPON_ONU_OMCI_PACKET_ID_CRC_OK
+#define bcmolt_gpon_onu_omci_packet_id_packet_size                                              BCMOLT_GPON_ONU_OMCI_PACKET_ID_PACKET_SIZE
+#define bcmolt_gpon_onu_omci_packet_id_buffer                                                   BCMOLT_GPON_ONU_OMCI_PACKET_ID_BUFFER
+#define bcmolt_gpon_onu_omci_packet_id__num_of                                                  BCMOLT_GPON_ONU_OMCI_PACKET_ID__NUM_OF
+#define bcmolt_gpon_trx_key_id_pon_ni                                                           BCMOLT_GPON_TRX_KEY_ID_PON_NI
+#define bcmolt_gpon_trx_key_id__num_of                                                          BCMOLT_GPON_TRX_KEY_ID__NUM_OF
+#define bcmolt_gpon_trx_cfg_id_transceiver_type                                                 BCMOLT_GPON_TRX_CFG_ID_TRANSCEIVER_TYPE
+#define bcmolt_gpon_trx_cfg_id_la_configuration                                                 BCMOLT_GPON_TRX_CFG_ID_LA_CONFIGURATION
+#define bcmolt_gpon_trx_cfg_id_bcdr                                                             BCMOLT_GPON_TRX_CFG_ID_BCDR
+#define bcmolt_gpon_trx_cfg_id_la_ranging_after_no_ed_resync                                    BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_NO_ED_RESYNC
+#define bcmolt_gpon_trx_cfg_id_bcdr_ranging_after_no_ed_resync                                  BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_NO_ED_RESYNC
+#define bcmolt_gpon_trx_cfg_id_la_ranging_after_ed_resync                                       BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_AFTER_ED_RESYNC
+#define bcmolt_gpon_trx_cfg_id_bcdr_ranging_after_ed_resync                                     BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_AFTER_ED_RESYNC
+#define bcmolt_gpon_trx_cfg_id_la_resync_polarity                                               BCMOLT_GPON_TRX_CFG_ID_LA_RESYNC_POLARITY
+#define bcmolt_gpon_trx_cfg_id_bcdr_resync_polarity                                             BCMOLT_GPON_TRX_CFG_ID_BCDR_RESYNC_POLARITY
+#define bcmolt_gpon_trx_cfg_id_bcdr_ranging_resync_conditions                                   BCMOLT_GPON_TRX_CFG_ID_BCDR_RANGING_RESYNC_CONDITIONS
+#define bcmolt_gpon_trx_cfg_id_la_ranging_resync_conditions                                     BCMOLT_GPON_TRX_CFG_ID_LA_RANGING_RESYNC_CONDITIONS
+#define bcmolt_gpon_trx_cfg_id_rx_configuration                                                 BCMOLT_GPON_TRX_CFG_ID_RX_CONFIGURATION
+#define bcmolt_gpon_trx_cfg_id_ranging_control_stages_configuration                             BCMOLT_GPON_TRX_CFG_ID_RANGING_CONTROL_STAGES_CONFIGURATION
+#define bcmolt_gpon_trx_cfg_id_energy_detect                                                    BCMOLT_GPON_TRX_CFG_ID_ENERGY_DETECT
+#define bcmolt_gpon_trx_cfg_id_end_of_burst_data_pattern                                        BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_DATA_PATTERN
+#define bcmolt_gpon_trx_cfg_id_end_of_burst_ranging_pattern                                     BCMOLT_GPON_TRX_CFG_ID_END_OF_BURST_RANGING_PATTERN
+#define bcmolt_gpon_trx_cfg_id_preamble                                                         BCMOLT_GPON_TRX_CFG_ID_PREAMBLE
+#define bcmolt_gpon_trx_cfg_id_delimiter                                                        BCMOLT_GPON_TRX_CFG_ID_DELIMITER
+#define bcmolt_gpon_trx_cfg_id_guard_bits                                                       BCMOLT_GPON_TRX_CFG_ID_GUARD_BITS
+#define bcmolt_gpon_trx_cfg_id_serdes_configuration                                             BCMOLT_GPON_TRX_CFG_ID_SERDES_CONFIGURATION
+#define bcmolt_gpon_trx_cfg_id_plo_ranging                                                      BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING
+#define bcmolt_gpon_trx_cfg_id_plo_data                                                         BCMOLT_GPON_TRX_CFG_ID_PLO_DATA
+#define bcmolt_gpon_trx_cfg_id_rssi_normal_config                                               BCMOLT_GPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG
+#define bcmolt_gpon_trx_cfg_id_ranging_rssi_resync_control                                      BCMOLT_GPON_TRX_CFG_ID_RANGING_RSSI_RESYNC_CONTROL
+#define bcmolt_gpon_trx_cfg_id__num_of                                                          BCMOLT_GPON_TRX_CFG_ID__NUM_OF
+#define bcmolt_log_entry_key_id_log_id                                                          BCMOLT_LOG_ENTRY_KEY_ID_LOG_ID
+#define bcmolt_log_entry_key_id_reserved                                                        BCMOLT_LOG_ENTRY_KEY_ID_RESERVED
+#define bcmolt_log_entry_key_id_name                                                            BCMOLT_LOG_ENTRY_KEY_ID_NAME
+#define bcmolt_log_entry_key_id__num_of                                                         BCMOLT_LOG_ENTRY_KEY_ID__NUM_OF
+#define bcmolt_log_entry_cfg_id_default_log_level                                               BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL
+#define bcmolt_log_entry_cfg_id_default_log_type                                                BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE
+#define bcmolt_log_entry_cfg_id_log_level_print                                                 BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_PRINT
+#define bcmolt_log_entry_cfg_id_log_level_save                                                  BCMOLT_LOG_ENTRY_CFG_ID_LOG_LEVEL_SAVE
+#define bcmolt_log_entry_cfg_id_log_type                                                        BCMOLT_LOG_ENTRY_CFG_ID_LOG_TYPE
+#define bcmolt_log_entry_cfg_id_log_style                                                       BCMOLT_LOG_ENTRY_CFG_ID_LOG_STYLE
+#define bcmolt_log_entry_cfg_id_log_name                                                        BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME
+#define bcmolt_log_entry_cfg_id__num_of                                                         BCMOLT_LOG_ENTRY_CFG_ID__NUM_OF
+#define bcmolt_log_entry_stat_id_msg_count                                                      BCMOLT_LOG_ENTRY_STAT_ID_MSG_COUNT
+#define bcmolt_log_entry_stat_id_lost_msg_count                                                 BCMOLT_LOG_ENTRY_STAT_ID_LOST_MSG_COUNT
+#define bcmolt_log_entry_stat_id__num_of                                                        BCMOLT_LOG_ENTRY_STAT_ID__NUM_OF
+#define bcmolt_log_entry_stat_cfg_id_cfg                                                        BCMOLT_LOG_ENTRY_STAT_CFG_ID_CFG
+#define bcmolt_log_entry_stat_cfg_id__num_of                                                    BCMOLT_LOG_ENTRY_STAT_CFG_ID__NUM_OF
+#define bcmolt_log_entry_stat_alarm_cleared_id_stat                                             BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_log_entry_stat_alarm_cleared_id__num_of                                          BCMOLT_LOG_ENTRY_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_log_entry_stat_alarm_raised_id_stat                                              BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_log_entry_stat_alarm_raised_id__num_of                                           BCMOLT_LOG_ENTRY_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_log_entry_auto_cfg_id_stat_alarm_cleared                                         BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_log_entry_auto_cfg_id_stat_alarm_raised                                          BCMOLT_LOG_ENTRY_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_log_entry_auto_cfg_id__num_of                                                    BCMOLT_LOG_ENTRY_AUTO_CFG_ID__NUM_OF
+#define bcmolt_logger_key_id_reserved                                                           BCMOLT_LOGGER_KEY_ID_RESERVED
+#define bcmolt_logger_key_id_file_id                                                            BCMOLT_LOGGER_KEY_ID_FILE_ID
+#define bcmolt_logger_key_id__num_of                                                            BCMOLT_LOGGER_KEY_ID__NUM_OF
+#define bcmolt_logger_cfg_id_buffer                                                             BCMOLT_LOGGER_CFG_ID_BUFFER
+#define bcmolt_logger_cfg_id_wrap_around                                                        BCMOLT_LOGGER_CFG_ID_WRAP_AROUND
+#define bcmolt_logger_cfg_id_clear_after_read                                                   BCMOLT_LOGGER_CFG_ID_CLEAR_AFTER_READ
+#define bcmolt_logger_cfg_id_enable_log                                                         BCMOLT_LOGGER_CFG_ID_ENABLE_LOG
+#define bcmolt_logger_cfg_id_log_names                                                          BCMOLT_LOGGER_CFG_ID_LOG_NAMES
+#define bcmolt_logger_cfg_id__num_of                                                            BCMOLT_LOGGER_CFG_ID__NUM_OF
+#define bcmolt_logger_stat_id_lines_in_log                                                      BCMOLT_LOGGER_STAT_ID_LINES_IN_LOG
+#define bcmolt_logger_stat_id__num_of                                                           BCMOLT_LOGGER_STAT_ID__NUM_OF
+#define bcmolt_logger_stat_cfg_id_cfg                                                           BCMOLT_LOGGER_STAT_CFG_ID_CFG
+#define bcmolt_logger_stat_cfg_id__num_of                                                       BCMOLT_LOGGER_STAT_CFG_ID__NUM_OF
+#define bcmolt_logger_stat_alarm_cleared_id_stat                                                BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_logger_stat_alarm_cleared_id__num_of                                             BCMOLT_LOGGER_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_logger_stat_alarm_raised_id_stat                                                 BCMOLT_LOGGER_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_logger_stat_alarm_raised_id__num_of                                              BCMOLT_LOGGER_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_logger_auto_cfg_id_stat_alarm_cleared                                            BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_logger_auto_cfg_id_stat_alarm_raised                                             BCMOLT_LOGGER_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_logger_auto_cfg_id__num_of                                                       BCMOLT_LOGGER_AUTO_CFG_ID__NUM_OF
+#define bcmolt_logger_clear_log_id__num_of                                                      BCMOLT_LOGGER_CLEAR_LOG_ID__NUM_OF
+#define bcmolt_nni_key_id_pon_ni                                                                BCMOLT_NNI_KEY_ID_PON_NI
+#define bcmolt_nni_key_id__num_of                                                               BCMOLT_NNI_KEY_ID__NUM_OF
+#define bcmolt_nni_cfg_id_remote_loopback                                                       BCMOLT_NNI_CFG_ID_REMOTE_LOOPBACK
+#define bcmolt_nni_cfg_id_line_loopback                                                         BCMOLT_NNI_CFG_ID_LINE_LOOPBACK
+#define bcmolt_nni_cfg_id_mac_address                                                           BCMOLT_NNI_CFG_ID_MAC_ADDRESS
+#define bcmolt_nni_cfg_id_nni_status                                                            BCMOLT_NNI_CFG_ID_NNI_STATUS
+#define bcmolt_nni_cfg_id_nni_backup_status                                                     BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS
+#define bcmolt_nni_cfg_id_active_nni                                                            BCMOLT_NNI_CFG_ID_ACTIVE_NNI
+#define bcmolt_nni_cfg_id_nni_status_polling_interval_ms                                        BCMOLT_NNI_CFG_ID_NNI_STATUS_POLLING_INTERVAL_MS
+#define bcmolt_nni_cfg_id_autoswitch                                                            BCMOLT_NNI_CFG_ID_AUTOSWITCH
+#define bcmolt_nni_cfg_id_flow_control                                                          BCMOLT_NNI_CFG_ID_FLOW_CONTROL
+#define bcmolt_nni_cfg_id__num_of                                                               BCMOLT_NNI_CFG_ID__NUM_OF
+#define bcmolt_nni_stat_id_rx_frames_64                                                         BCMOLT_NNI_STAT_ID_RX_FRAMES_64
+#define bcmolt_nni_stat_id_rx_frames_65_127                                                     BCMOLT_NNI_STAT_ID_RX_FRAMES_65_127
+#define bcmolt_nni_stat_id_rx_frames_128_255                                                    BCMOLT_NNI_STAT_ID_RX_FRAMES_128_255
+#define bcmolt_nni_stat_id_rx_frames_256_511                                                    BCMOLT_NNI_STAT_ID_RX_FRAMES_256_511
+#define bcmolt_nni_stat_id_rx_frames_512_1023                                                   BCMOLT_NNI_STAT_ID_RX_FRAMES_512_1023
+#define bcmolt_nni_stat_id_rx_frames_1024_1518                                                  BCMOLT_NNI_STAT_ID_RX_FRAMES_1024_1518
+#define bcmolt_nni_stat_id_rx_frames_1519_2047                                                  BCMOLT_NNI_STAT_ID_RX_FRAMES_1519_2047
+#define bcmolt_nni_stat_id_rx_frames_2048_4095                                                  BCMOLT_NNI_STAT_ID_RX_FRAMES_2048_4095
+#define bcmolt_nni_stat_id_rx_frames_4096_9216                                                  BCMOLT_NNI_STAT_ID_RX_FRAMES_4096_9216
+#define bcmolt_nni_stat_id_rx_frames_9217_16383                                                 BCMOLT_NNI_STAT_ID_RX_FRAMES_9217_16383
+#define bcmolt_nni_stat_id_rx_frames                                                            BCMOLT_NNI_STAT_ID_RX_FRAMES
+#define bcmolt_nni_stat_id_rx_bytes                                                             BCMOLT_NNI_STAT_ID_RX_BYTES
+#define bcmolt_nni_stat_id_rx_good_frames                                                       BCMOLT_NNI_STAT_ID_RX_GOOD_FRAMES
+#define bcmolt_nni_stat_id_rx_unicast_frames                                                    BCMOLT_NNI_STAT_ID_RX_UNICAST_FRAMES
+#define bcmolt_nni_stat_id_rx_multicast_frames                                                  BCMOLT_NNI_STAT_ID_RX_MULTICAST_FRAMES
+#define bcmolt_nni_stat_id_rx_broadcast_frames                                                  BCMOLT_NNI_STAT_ID_RX_BROADCAST_FRAMES
+#define bcmolt_nni_stat_id_rx_fcs_errors                                                        BCMOLT_NNI_STAT_ID_RX_FCS_ERRORS
+#define bcmolt_nni_stat_id_rx_control_frames                                                    BCMOLT_NNI_STAT_ID_RX_CONTROL_FRAMES
+#define bcmolt_nni_stat_id_rx_pause_frames                                                      BCMOLT_NNI_STAT_ID_RX_PAUSE_FRAMES
+#define bcmolt_nni_stat_id_rx_pfc_frames                                                        BCMOLT_NNI_STAT_ID_RX_PFC_FRAMES
+#define bcmolt_nni_stat_id_rx_unsupported_opcode                                                BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_OPCODE
+#define bcmolt_nni_stat_id_rx_unsupported_da                                                    BCMOLT_NNI_STAT_ID_RX_UNSUPPORTED_DA
+#define bcmolt_nni_stat_id_rx_alignment_errors                                                  BCMOLT_NNI_STAT_ID_RX_ALIGNMENT_ERRORS
+#define bcmolt_nni_stat_id_rx_length_out_of_range                                               BCMOLT_NNI_STAT_ID_RX_LENGTH_OUT_OF_RANGE
+#define bcmolt_nni_stat_id_rx_code_errors                                                       BCMOLT_NNI_STAT_ID_RX_CODE_ERRORS
+#define bcmolt_nni_stat_id_rx_oversized_frames                                                  BCMOLT_NNI_STAT_ID_RX_OVERSIZED_FRAMES
+#define bcmolt_nni_stat_id_rx_jabber_frames                                                     BCMOLT_NNI_STAT_ID_RX_JABBER_FRAMES
+#define bcmolt_nni_stat_id_rx_mtu_check_errors                                                  BCMOLT_NNI_STAT_ID_RX_MTU_CHECK_ERRORS
+#define bcmolt_nni_stat_id_rx_promiscuous_frames                                                BCMOLT_NNI_STAT_ID_RX_PROMISCUOUS_FRAMES
+#define bcmolt_nni_stat_id_rx_vlan_frames                                                       BCMOLT_NNI_STAT_ID_RX_VLAN_FRAMES
+#define bcmolt_nni_stat_id_rx_double_vlan_frames                                                BCMOLT_NNI_STAT_ID_RX_DOUBLE_VLAN_FRAMES
+#define bcmolt_nni_stat_id_rx_truncated_frames                                                  BCMOLT_NNI_STAT_ID_RX_TRUNCATED_FRAMES
+#define bcmolt_nni_stat_id_rx_undersize_frames                                                  BCMOLT_NNI_STAT_ID_RX_UNDERSIZE_FRAMES
+#define bcmolt_nni_stat_id_rx_fragmented_frames                                                 BCMOLT_NNI_STAT_ID_RX_FRAGMENTED_FRAMES
+#define bcmolt_nni_stat_id_rx_runt_frames                                                       BCMOLT_NNI_STAT_ID_RX_RUNT_FRAMES
+#define bcmolt_nni_stat_id_tx_frames_64                                                         BCMOLT_NNI_STAT_ID_TX_FRAMES_64
+#define bcmolt_nni_stat_id_tx_frames_65_127                                                     BCMOLT_NNI_STAT_ID_TX_FRAMES_65_127
+#define bcmolt_nni_stat_id_tx_frames_128_255                                                    BCMOLT_NNI_STAT_ID_TX_FRAMES_128_255
+#define bcmolt_nni_stat_id_tx_frames_256_511                                                    BCMOLT_NNI_STAT_ID_TX_FRAMES_256_511
+#define bcmolt_nni_stat_id_tx_frames_512_1023                                                   BCMOLT_NNI_STAT_ID_TX_FRAMES_512_1023
+#define bcmolt_nni_stat_id_tx_frames_1024_1518                                                  BCMOLT_NNI_STAT_ID_TX_FRAMES_1024_1518
+#define bcmolt_nni_stat_id_tx_frames_1519_2047                                                  BCMOLT_NNI_STAT_ID_TX_FRAMES_1519_2047
+#define bcmolt_nni_stat_id_tx_frames_2048_4095                                                  BCMOLT_NNI_STAT_ID_TX_FRAMES_2048_4095
+#define bcmolt_nni_stat_id_tx_frames_4096_9216                                                  BCMOLT_NNI_STAT_ID_TX_FRAMES_4096_9216
+#define bcmolt_nni_stat_id_tx_frames_9217_16383                                                 BCMOLT_NNI_STAT_ID_TX_FRAMES_9217_16383
+#define bcmolt_nni_stat_id_tx_frames                                                            BCMOLT_NNI_STAT_ID_TX_FRAMES
+#define bcmolt_nni_stat_id_tx_bytes                                                             BCMOLT_NNI_STAT_ID_TX_BYTES
+#define bcmolt_nni_stat_id_tx_good_frames                                                       BCMOLT_NNI_STAT_ID_TX_GOOD_FRAMES
+#define bcmolt_nni_stat_id_tx_unicast_frames                                                    BCMOLT_NNI_STAT_ID_TX_UNICAST_FRAMES
+#define bcmolt_nni_stat_id_tx_multicast_frames                                                  BCMOLT_NNI_STAT_ID_TX_MULTICAST_FRAMES
+#define bcmolt_nni_stat_id_tx_broadcast_frames                                                  BCMOLT_NNI_STAT_ID_TX_BROADCAST_FRAMES
+#define bcmolt_nni_stat_id_tx_pause_frames                                                      BCMOLT_NNI_STAT_ID_TX_PAUSE_FRAMES
+#define bcmolt_nni_stat_id_tx_pfc_frames                                                        BCMOLT_NNI_STAT_ID_TX_PFC_FRAMES
+#define bcmolt_nni_stat_id_tx_jabber_frames                                                     BCMOLT_NNI_STAT_ID_TX_JABBER_FRAMES
+#define bcmolt_nni_stat_id_tx_fcs_errors                                                        BCMOLT_NNI_STAT_ID_TX_FCS_ERRORS
+#define bcmolt_nni_stat_id_tx_control_frames                                                    BCMOLT_NNI_STAT_ID_TX_CONTROL_FRAMES
+#define bcmolt_nni_stat_id_tx_oversize_frames                                                   BCMOLT_NNI_STAT_ID_TX_OVERSIZE_FRAMES
+#define bcmolt_nni_stat_id_tx_fragmented_frames                                                 BCMOLT_NNI_STAT_ID_TX_FRAGMENTED_FRAMES
+#define bcmolt_nni_stat_id_tx_error_frames                                                      BCMOLT_NNI_STAT_ID_TX_ERROR_FRAMES
+#define bcmolt_nni_stat_id_tx_vlan_frames                                                       BCMOLT_NNI_STAT_ID_TX_VLAN_FRAMES
+#define bcmolt_nni_stat_id_tx_double_vlan_frames                                                BCMOLT_NNI_STAT_ID_TX_DOUBLE_VLAN_FRAMES
+#define bcmolt_nni_stat_id_tx_runt_frames                                                       BCMOLT_NNI_STAT_ID_TX_RUNT_FRAMES
+#define bcmolt_nni_stat_id_tx_underrun_frames                                                   BCMOLT_NNI_STAT_ID_TX_UNDERRUN_FRAMES
+#define bcmolt_nni_stat_id__num_of                                                              BCMOLT_NNI_STAT_ID__NUM_OF
+#define bcmolt_nni_stat_cfg_id_cfg                                                              BCMOLT_NNI_STAT_CFG_ID_CFG
+#define bcmolt_nni_stat_cfg_id__num_of                                                          BCMOLT_NNI_STAT_CFG_ID__NUM_OF
+#define bcmolt_nni_stat_alarm_cleared_id_stat                                                   BCMOLT_NNI_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_nni_stat_alarm_cleared_id__num_of                                                BCMOLT_NNI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_nni_stat_alarm_raised_id_stat                                                    BCMOLT_NNI_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_nni_stat_alarm_raised_id__num_of                                                 BCMOLT_NNI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_nni_status_changed_id_new_status                                                 BCMOLT_NNI_STATUS_CHANGED_ID_NEW_STATUS
+#define bcmolt_nni_status_changed_id_link                                                       BCMOLT_NNI_STATUS_CHANGED_ID_LINK
+#define bcmolt_nni_status_changed_id_previous_active                                            BCMOLT_NNI_STATUS_CHANGED_ID_PREVIOUS_ACTIVE
+#define bcmolt_nni_status_changed_id_new_active                                                 BCMOLT_NNI_STATUS_CHANGED_ID_NEW_ACTIVE
+#define bcmolt_nni_status_changed_id__num_of                                                    BCMOLT_NNI_STATUS_CHANGED_ID__NUM_OF
+#define bcmolt_nni_auto_cfg_id_stat_alarm_cleared                                               BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_nni_auto_cfg_id_stat_alarm_raised                                                BCMOLT_NNI_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_nni_auto_cfg_id_status_changed                                                   BCMOLT_NNI_AUTO_CFG_ID_STATUS_CHANGED
+#define bcmolt_nni_auto_cfg_id__num_of                                                          BCMOLT_NNI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_nni_serdes_key_id_pon_ni                                                         BCMOLT_NNI_SERDES_KEY_ID_PON_NI
+#define bcmolt_nni_serdes_key_id_instance                                                       BCMOLT_NNI_SERDES_KEY_ID_INSTANCE
+#define bcmolt_nni_serdes_key_id__num_of                                                        BCMOLT_NNI_SERDES_KEY_ID__NUM_OF
+#define bcmolt_nni_serdes_cfg_id_rx_vga                                                         BCMOLT_NNI_SERDES_CFG_ID_RX_VGA
+#define bcmolt_nni_serdes_cfg_id_rx_pf                                                          BCMOLT_NNI_SERDES_CFG_ID_RX_PF
+#define bcmolt_nni_serdes_cfg_id_rx_lfpf                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_LFPF
+#define bcmolt_nni_serdes_cfg_id_rx_dfe1                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_DFE1
+#define bcmolt_nni_serdes_cfg_id_rx_dfe2                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_DFE2
+#define bcmolt_nni_serdes_cfg_id_rx_dfe3                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_DFE3
+#define bcmolt_nni_serdes_cfg_id_rx_dfe4                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_DFE4
+#define bcmolt_nni_serdes_cfg_id_rx_dfe5                                                        BCMOLT_NNI_SERDES_CFG_ID_RX_DFE5
+#define bcmolt_nni_serdes_cfg_id_tx_pre                                                         BCMOLT_NNI_SERDES_CFG_ID_TX_PRE
+#define bcmolt_nni_serdes_cfg_id_tx_main                                                        BCMOLT_NNI_SERDES_CFG_ID_TX_MAIN
+#define bcmolt_nni_serdes_cfg_id_tx_post1                                                       BCMOLT_NNI_SERDES_CFG_ID_TX_POST1
+#define bcmolt_nni_serdes_cfg_id_tx_post2                                                       BCMOLT_NNI_SERDES_CFG_ID_TX_POST2
+#define bcmolt_nni_serdes_cfg_id_tx_post3                                                       BCMOLT_NNI_SERDES_CFG_ID_TX_POST3
+#define bcmolt_nni_serdes_cfg_id_tx_amp                                                         BCMOLT_NNI_SERDES_CFG_ID_TX_AMP
+#define bcmolt_nni_serdes_cfg_id__num_of                                                        BCMOLT_NNI_SERDES_CFG_ID__NUM_OF
+#define bcmolt_software_error_key_id_reserved                                                   BCMOLT_SOFTWARE_ERROR_KEY_ID_RESERVED
+#define bcmolt_software_error_key_id_idx                                                        BCMOLT_SOFTWARE_ERROR_KEY_ID_IDX
+#define bcmolt_software_error_key_id__num_of                                                    BCMOLT_SOFTWARE_ERROR_KEY_ID__NUM_OF
+#define bcmolt_software_error_cfg_id_entry                                                      BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY
+#define bcmolt_software_error_cfg_id__num_of                                                    BCMOLT_SOFTWARE_ERROR_CFG_ID__NUM_OF
+#define bcmolt_trx_calibration_key_id_reserved                                                  BCMOLT_TRX_CALIBRATION_KEY_ID_RESERVED
+#define bcmolt_trx_calibration_key_id__num_of                                                   BCMOLT_TRX_CALIBRATION_KEY_ID__NUM_OF
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_data_window            BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_DATA_WINDOW
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_strobe_window          BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_STROBE_WINDOW
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_rise_min_min      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MIN
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_rise_min_max      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MIN_MAX
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_rise_max_min      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MIN
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_rise_max_max      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_RISE_MAX_MAX
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_fall_min_min      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MIN
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_fall_min_max      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MIN_MAX
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_fall_max_min      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MIN
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_edge_fall_max_max      BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_EDGE_FALL_MAX_MAX
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id_result                 BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID_RESULT
+#define bcmolt_trx_calibration_capture_window_and_statistic_completed_id__num_of                BCMOLT_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED_ID__NUM_OF
+#define bcmolt_trx_calibration_auto_cfg_id_capture_window_and_statistic_completed               BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED
+#define bcmolt_trx_calibration_auto_cfg_id__num_of                                              BCMOLT_TRX_CALIBRATION_AUTO_CFG_ID__NUM_OF
+#define bcmolt_trx_calibration_start_capture_window_id_pon_ni                                   BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_PON_NI
+#define bcmolt_trx_calibration_start_capture_window_id_trigger                                  BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER
+#define bcmolt_trx_calibration_start_capture_window_id_strobe                                   BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STROBE
+#define bcmolt_trx_calibration_start_capture_window_id_window_mode                              BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_WINDOW_MODE
+#define bcmolt_trx_calibration_start_capture_window_id_onu_id                                   BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_ONU_ID
+#define bcmolt_trx_calibration_start_capture_window_id_trigger_position                         BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_TRIGGER_POSITION
+#define bcmolt_trx_calibration_start_capture_window_id_stop_due_to_corrupt_strobe               BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_STOP_DUE_TO_CORRUPT_STROBE
+#define bcmolt_trx_calibration_start_capture_window_id_start_offset                             BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_START_OFFSET
+#define bcmolt_trx_calibration_start_capture_window_id_end_offset                               BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_END_OFFSET
+#define bcmolt_trx_calibration_start_capture_window_id_number_of_cycles                         BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID_NUMBER_OF_CYCLES
+#define bcmolt_trx_calibration_start_capture_window_id__num_of                                  BCMOLT_TRX_CALIBRATION_START_CAPTURE_WINDOW_ID__NUM_OF
+#define bcmolt_trx_calibration_stop_capture_window_id_pon_ni                                    BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID_PON_NI
+#define bcmolt_trx_calibration_stop_capture_window_id__num_of                                   BCMOLT_TRX_CALIBRATION_STOP_CAPTURE_WINDOW_ID__NUM_OF
+#define bcmolt_xgpon_alloc_key_id_pon_ni                                                        BCMOLT_XGPON_ALLOC_KEY_ID_PON_NI
+#define bcmolt_xgpon_alloc_key_id_alloc_id                                                      BCMOLT_XGPON_ALLOC_KEY_ID_ALLOC_ID
+#define bcmolt_xgpon_alloc_key_id__num_of                                                       BCMOLT_XGPON_ALLOC_KEY_ID__NUM_OF
+#define bcmolt_xgpon_alloc_cfg_id_state                                                         BCMOLT_XGPON_ALLOC_CFG_ID_STATE
+#define bcmolt_xgpon_alloc_cfg_id_sla                                                           BCMOLT_XGPON_ALLOC_CFG_ID_SLA
+#define bcmolt_xgpon_alloc_cfg_id_onu_id                                                        BCMOLT_XGPON_ALLOC_CFG_ID_ONU_ID
+#define bcmolt_xgpon_alloc_cfg_id_collect_stats                                                 BCMOLT_XGPON_ALLOC_CFG_ID_COLLECT_STATS
+#define bcmolt_xgpon_alloc_cfg_id__num_of                                                       BCMOLT_XGPON_ALLOC_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_id_rx_bytes                                                     BCMOLT_XGPON_ALLOC_STAT_ID_RX_BYTES
+#define bcmolt_xgpon_alloc_stat_id__num_of                                                      BCMOLT_XGPON_ALLOC_STAT_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_cfg_id_cfg                                                      BCMOLT_XGPON_ALLOC_STAT_CFG_ID_CFG
+#define bcmolt_xgpon_alloc_stat_cfg_id__num_of                                                  BCMOLT_XGPON_ALLOC_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_configuration_completed_id_status                                    BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_alloc_configuration_completed_id_new_state                                 BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID_NEW_STATE
+#define bcmolt_xgpon_alloc_configuration_completed_id__num_of                                   BCMOLT_XGPON_ALLOC_CONFIGURATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id_status                                  BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id_average_nsr_used                        BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_USED
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id_average_nsr_allocated                   BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_NSR_ALLOCATED
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id_average_sr_report                       BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID_AVERAGE_SR_REPORT
+#define bcmolt_xgpon_alloc_get_alloc_stats_completed_id__num_of                                 BCMOLT_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_alarm_cleared_id_stat                                           BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_xgpon_alloc_stat_alarm_cleared_id__num_of                                        BCMOLT_XGPON_ALLOC_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_stat_alarm_raised_id_stat                                            BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_xgpon_alloc_stat_alarm_raised_id__num_of                                         BCMOLT_XGPON_ALLOC_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_alloc_auto_cfg_id_configuration_completed                                  BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_CONFIGURATION_COMPLETED
+#define bcmolt_xgpon_alloc_auto_cfg_id_get_alloc_stats_completed                                BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_GET_ALLOC_STATS_COMPLETED
+#define bcmolt_xgpon_alloc_auto_cfg_id_stat_alarm_cleared                                       BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_alloc_auto_cfg_id_stat_alarm_raised                                        BCMOLT_XGPON_ALLOC_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_alloc_auto_cfg_id__num_of                                                  BCMOLT_XGPON_ALLOC_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_alloc_get_stats_id_num_of_cycles                                           BCMOLT_XGPON_ALLOC_GET_STATS_ID_NUM_OF_CYCLES
+#define bcmolt_xgpon_alloc_get_stats_id__num_of                                                 BCMOLT_XGPON_ALLOC_GET_STATS_ID__NUM_OF
+#define bcmolt_xgpon_alloc_set_state_id_state                                                   BCMOLT_XGPON_ALLOC_SET_STATE_ID_STATE
+#define bcmolt_xgpon_alloc_set_state_id__num_of                                                 BCMOLT_XGPON_ALLOC_SET_STATE_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_key_id_pon_ni                                                     BCMOLT_XGPON_GEM_PORT_KEY_ID_PON_NI
+#define bcmolt_xgpon_gem_port_key_id_gem_port_id                                                BCMOLT_XGPON_GEM_PORT_KEY_ID_GEM_PORT_ID
+#define bcmolt_xgpon_gem_port_key_id__num_of                                                    BCMOLT_XGPON_GEM_PORT_KEY_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_cfg_id_configuration                                              BCMOLT_XGPON_GEM_PORT_CFG_ID_CONFIGURATION
+#define bcmolt_xgpon_gem_port_cfg_id_onu_id                                                     BCMOLT_XGPON_GEM_PORT_CFG_ID_ONU_ID
+#define bcmolt_xgpon_gem_port_cfg_id_gem_port_state                                             BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE
+#define bcmolt_xgpon_gem_port_cfg_id_encryption_mode                                            BCMOLT_XGPON_GEM_PORT_CFG_ID_ENCRYPTION_MODE
+#define bcmolt_xgpon_gem_port_cfg_id_upstream_destination_queue                                 BCMOLT_XGPON_GEM_PORT_CFG_ID_UPSTREAM_DESTINATION_QUEUE
+#define bcmolt_xgpon_gem_port_cfg_id_control                                                    BCMOLT_XGPON_GEM_PORT_CFG_ID_CONTROL
+#define bcmolt_xgpon_gem_port_cfg_id__num_of                                                    BCMOLT_XGPON_GEM_PORT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_id_tx_bytes                                                  BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_BYTES
+#define bcmolt_xgpon_gem_port_stat_id_tx_packets                                                BCMOLT_XGPON_GEM_PORT_STAT_ID_TX_PACKETS
+#define bcmolt_xgpon_gem_port_stat_id_rx_packets                                                BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_PACKETS
+#define bcmolt_xgpon_gem_port_stat_id_rx_bytes                                                  BCMOLT_XGPON_GEM_PORT_STAT_ID_RX_BYTES
+#define bcmolt_xgpon_gem_port_stat_id__num_of                                                   BCMOLT_XGPON_GEM_PORT_STAT_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_cfg_id_cfg                                                   BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID_CFG
+#define bcmolt_xgpon_gem_port_stat_cfg_id__num_of                                               BCMOLT_XGPON_GEM_PORT_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_alarm_cleared_id_stat                                        BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_xgpon_gem_port_stat_alarm_cleared_id__num_of                                     BCMOLT_XGPON_GEM_PORT_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_stat_alarm_raised_id_stat                                         BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_xgpon_gem_port_stat_alarm_raised_id__num_of                                      BCMOLT_XGPON_GEM_PORT_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_gem_port_auto_cfg_id_stat_alarm_cleared                                    BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_gem_port_auto_cfg_id_stat_alarm_raised                                     BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_gem_port_auto_cfg_id__num_of                                               BCMOLT_XGPON_GEM_PORT_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_iwf_key_id_pon_ni                                                          BCMOLT_XGPON_IWF_KEY_ID_PON_NI
+#define bcmolt_xgpon_iwf_key_id__num_of                                                         BCMOLT_XGPON_IWF_KEY_ID__NUM_OF
+#define bcmolt_xgpon_iwf_cfg_id_us_otag_direct_tpid                                             BCMOLT_XGPON_IWF_CFG_ID_US_OTAG_DIRECT_TPID
+#define bcmolt_xgpon_iwf_cfg_id_ds_tpid                                                         BCMOLT_XGPON_IWF_CFG_ID_DS_TPID
+#define bcmolt_xgpon_iwf_cfg_id__num_of                                                         BCMOLT_XGPON_IWF_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_key_id_pon_ni                                                           BCMOLT_XGPON_NI_KEY_ID_PON_NI
+#define bcmolt_xgpon_ni_key_id__num_of                                                          BCMOLT_XGPON_NI_KEY_ID__NUM_OF
+#define bcmolt_xgpon_ni_cfg_id_hw_pon_id                                                        BCMOLT_XGPON_NI_CFG_ID_HW_PON_ID
+#define bcmolt_xgpon_ni_cfg_id_available_bandwidth                                              BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH
+#define bcmolt_xgpon_ni_cfg_id_number_of_active_onus                                            BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS
+#define bcmolt_xgpon_ni_cfg_id_pon_status                                                       BCMOLT_XGPON_NI_CFG_ID_PON_STATUS
+#define bcmolt_xgpon_ni_cfg_id_pon_distance                                                     BCMOLT_XGPON_NI_CFG_ID_PON_DISTANCE
+#define bcmolt_xgpon_ni_cfg_id_ranging_window_size                                              BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE
+#define bcmolt_xgpon_ni_cfg_id_eqd_cycles_number                                                BCMOLT_XGPON_NI_CFG_ID_EQD_CYCLES_NUMBER
+#define bcmolt_xgpon_ni_cfg_id_drift_control                                                    BCMOLT_XGPON_NI_CFG_ID_DRIFT_CONTROL
+#define bcmolt_xgpon_ni_cfg_id_los_alarm_threshold                                              BCMOLT_XGPON_NI_CFG_ID_LOS_ALARM_THRESHOLD
+#define bcmolt_xgpon_ni_cfg_id_los_initial_value                                                BCMOLT_XGPON_NI_CFG_ID_LOS_INITIAL_VALUE
+#define bcmolt_xgpon_ni_cfg_id_onu_alarms_thresholds                                            BCMOLT_XGPON_NI_CFG_ID_ONU_ALARMS_THRESHOLDS
+#define bcmolt_xgpon_ni_cfg_id_ber_monitor                                                      BCMOLT_XGPON_NI_CFG_ID_BER_MONITOR
+#define bcmolt_xgpon_ni_cfg_id_onu_activation                                                   BCMOLT_XGPON_NI_CFG_ID_ONU_ACTIVATION
+#define bcmolt_xgpon_ni_cfg_id_sn_acquisition                                                   BCMOLT_XGPON_NI_CFG_ID_SN_ACQUISITION
+#define bcmolt_xgpon_ni_cfg_id_key_exchange                                                     BCMOLT_XGPON_NI_CFG_ID_KEY_EXCHANGE
+#define bcmolt_xgpon_ni_cfg_id_protection_switching                                             BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING
+#define bcmolt_xgpon_ni_cfg_id_protection_switching_debug                                       BCMOLT_XGPON_NI_CFG_ID_PROTECTION_SWITCHING_DEBUG
+#define bcmolt_xgpon_ni_cfg_id_cbr_rt_allocation_profile                                        BCMOLT_XGPON_NI_CFG_ID_CBR_RT_ALLOCATION_PROFILE
+#define bcmolt_xgpon_ni_cfg_id_cbr_nrt_allocation_profile                                       BCMOLT_XGPON_NI_CFG_ID_CBR_NRT_ALLOCATION_PROFILE
+#define bcmolt_xgpon_ni_cfg_id_power_management                                                 BCMOLT_XGPON_NI_CFG_ID_POWER_MANAGEMENT
+#define bcmolt_xgpon_ni_cfg_id_rogue_onu_detection_process                                      BCMOLT_XGPON_NI_CFG_ID_ROGUE_ONU_DETECTION_PROCESS
+#define bcmolt_xgpon_ni_cfg_id_periodic_standby_pon_monitoring                                  BCMOLT_XGPON_NI_CFG_ID_PERIODIC_STANDBY_PON_MONITORING
+#define bcmolt_xgpon_ni_cfg_id_dba_mode                                                         BCMOLT_XGPON_NI_CFG_ID_DBA_MODE
+#define bcmolt_xgpon_ni_cfg_id_ploam_handling                                                   BCMOLT_XGPON_NI_CFG_ID_PLOAM_HANDLING
+#define bcmolt_xgpon_ni_cfg_id_min_data_alloc_id                                                BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_ALLOC_ID
+#define bcmolt_xgpon_ni_cfg_id_min_data_gem_port_id                                             BCMOLT_XGPON_NI_CFG_ID_MIN_DATA_GEM_PORT_ID
+#define bcmolt_xgpon_ni_cfg_id_multicast_key                                                    BCMOLT_XGPON_NI_CFG_ID_MULTICAST_KEY
+#define bcmolt_xgpon_ni_cfg_id_prbs_checker                                                     BCMOLT_XGPON_NI_CFG_ID_PRBS_CHECKER
+#define bcmolt_xgpon_ni_cfg_id_prbs_generator                                                   BCMOLT_XGPON_NI_CFG_ID_PRBS_GENERATOR
+#define bcmolt_xgpon_ni_cfg_id_prbs_status                                                      BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS
+#define bcmolt_xgpon_ni_cfg_id_automatic_onu_deactivation                                       BCMOLT_XGPON_NI_CFG_ID_AUTOMATIC_ONU_DEACTIVATION
+#define bcmolt_xgpon_ni_cfg_id_us_bandwidth_limit                                               BCMOLT_XGPON_NI_CFG_ID_US_BANDWIDTH_LIMIT
+#define bcmolt_xgpon_ni_cfg_id_all_onus                                                         BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS
+#define bcmolt_xgpon_ni_cfg_id_all_mcast_gem_ports                                              BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS
+#define bcmolt_xgpon_ni_cfg_id_debug                                                            BCMOLT_XGPON_NI_CFG_ID_DEBUG
+#define bcmolt_xgpon_ni_cfg_id_onu_upgrade_params                                               BCMOLT_XGPON_NI_CFG_ID_ONU_UPGRADE_PARAMS
+#define bcmolt_xgpon_ni_cfg_id_ds_fec_mode                                                      BCMOLT_XGPON_NI_CFG_ID_DS_FEC_MODE
+#define bcmolt_xgpon_ni_cfg_id_dba_type                                                         BCMOLT_XGPON_NI_CFG_ID_DBA_TYPE
+#define bcmolt_xgpon_ni_cfg_id_onu_tuning                                                       BCMOLT_XGPON_NI_CFG_ID_ONU_TUNING
+#define bcmolt_xgpon_ni_cfg_id__num_of                                                          BCMOLT_XGPON_NI_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_id_fec_codewords                                                   BCMOLT_XGPON_NI_STAT_ID_FEC_CODEWORDS
+#define bcmolt_xgpon_ni_stat_id_bip32_bytes                                                     BCMOLT_XGPON_NI_STAT_ID_BIP32_BYTES
+#define bcmolt_xgpon_ni_stat_id_bip32_errors                                                    BCMOLT_XGPON_NI_STAT_ID_BIP32_ERRORS
+#define bcmolt_xgpon_ni_stat_id_rx_xgtc_headers                                                 BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_HEADERS
+#define bcmolt_xgpon_ni_stat_id_rx_xgtc_corrected                                               BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_CORRECTED
+#define bcmolt_xgpon_ni_stat_id_rx_xgtc_uncorrected                                             BCMOLT_XGPON_NI_STAT_ID_RX_XGTC_UNCORRECTED
+#define bcmolt_xgpon_ni_stat_id_rx_xgem                                                         BCMOLT_XGPON_NI_STAT_ID_RX_XGEM
+#define bcmolt_xgpon_ni_stat_id_rx_xgem_dropped                                                 BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_DROPPED
+#define bcmolt_xgpon_ni_stat_id_rx_xgem_idle                                                    BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_IDLE
+#define bcmolt_xgpon_ni_stat_id_rx_xgem_corrected                                               BCMOLT_XGPON_NI_STAT_ID_RX_XGEM_CORRECTED
+#define bcmolt_xgpon_ni_stat_id_rx_crc_error                                                    BCMOLT_XGPON_NI_STAT_ID_RX_CRC_ERROR
+#define bcmolt_xgpon_ni_stat_id_rx_fragment_error                                               BCMOLT_XGPON_NI_STAT_ID_RX_FRAGMENT_ERROR
+#define bcmolt_xgpon_ni_stat_id_rx_packets_dropped                                              BCMOLT_XGPON_NI_STAT_ID_RX_PACKETS_DROPPED
+#define bcmolt_xgpon_ni_stat_id_rx_dropped_too_short                                            BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_SHORT
+#define bcmolt_xgpon_ni_stat_id_rx_dropped_too_long                                             BCMOLT_XGPON_NI_STAT_ID_RX_DROPPED_TOO_LONG
+#define bcmolt_xgpon_ni_stat_id_rx_key_error                                                    BCMOLT_XGPON_NI_STAT_ID_RX_KEY_ERROR
+#define bcmolt_xgpon_ni_stat_id_tx_ploams                                                       BCMOLT_XGPON_NI_STAT_ID_TX_PLOAMS
+#define bcmolt_xgpon_ni_stat_id_rx_ploams_dropped                                               BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_DROPPED
+#define bcmolt_xgpon_ni_stat_id_rx_allocations_valid                                            BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_VALID
+#define bcmolt_xgpon_ni_stat_id_rx_allocations_invalid                                          BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_INVALID
+#define bcmolt_xgpon_ni_stat_id_rx_allocations_disabled                                         BCMOLT_XGPON_NI_STAT_ID_RX_ALLOCATIONS_DISABLED
+#define bcmolt_xgpon_ni_stat_id_rx_ploams                                                       BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS
+#define bcmolt_xgpon_ni_stat_id_rx_ploams_non_idle                                              BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_NON_IDLE
+#define bcmolt_xgpon_ni_stat_id_rx_ploams_error                                                 BCMOLT_XGPON_NI_STAT_ID_RX_PLOAMS_ERROR
+#define bcmolt_xgpon_ni_stat_id_rx_cpu                                                          BCMOLT_XGPON_NI_STAT_ID_RX_CPU
+#define bcmolt_xgpon_ni_stat_id_rx_omci                                                         BCMOLT_XGPON_NI_STAT_ID_RX_OMCI
+#define bcmolt_xgpon_ni_stat_id_rx_omci_packets_crc_error                                       BCMOLT_XGPON_NI_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR
+#define bcmolt_xgpon_ni_stat_id_tx_packets                                                      BCMOLT_XGPON_NI_STAT_ID_TX_PACKETS
+#define bcmolt_xgpon_ni_stat_id_tx_xgem                                                         BCMOLT_XGPON_NI_STAT_ID_TX_XGEM
+#define bcmolt_xgpon_ni_stat_id_tx_cpu                                                          BCMOLT_XGPON_NI_STAT_ID_TX_CPU
+#define bcmolt_xgpon_ni_stat_id_tx_omci                                                         BCMOLT_XGPON_NI_STAT_ID_TX_OMCI
+#define bcmolt_xgpon_ni_stat_id_tx_cpu_omci_packets_dropped                                     BCMOLT_XGPON_NI_STAT_ID_TX_CPU_OMCI_PACKETS_DROPPED
+#define bcmolt_xgpon_ni_stat_id_tx_dropped_illegal_length                                       BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_ILLEGAL_LENGTH
+#define bcmolt_xgpon_ni_stat_id_tx_dropped_tpid_miss                                            BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_TPID_MISS
+#define bcmolt_xgpon_ni_stat_id_tx_dropped_vid_miss                                             BCMOLT_XGPON_NI_STAT_ID_TX_DROPPED_VID_MISS
+#define bcmolt_xgpon_ni_stat_id__num_of                                                         BCMOLT_XGPON_NI_STAT_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_cfg_id_cfg                                                         BCMOLT_XGPON_NI_STAT_CFG_ID_CFG
+#define bcmolt_xgpon_ni_stat_cfg_id__num_of                                                     BCMOLT_XGPON_NI_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_activate_all_onus_completed_id__num_of                                  BCMOLT_XGPON_NI_ACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_cpu_packets_failure_id_error                                            BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_ERROR
+#define bcmolt_xgpon_ni_cpu_packets_failure_id_gem_port_id                                      BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID_GEM_PORT_ID
+#define bcmolt_xgpon_ni_cpu_packets_failure_id__num_of                                          BCMOLT_XGPON_NI_CPU_PACKETS_FAILURE_ID__NUM_OF
+#define bcmolt_xgpon_ni_deactivate_all_onus_completed_id__num_of                                BCMOLT_XGPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_disable_all_onus_completed_id__num_of                                   BCMOLT_XGPON_NI_DISABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_enable_all_onus_completed_id__num_of                                    BCMOLT_XGPON_NI_ENABLE_ALL_ONUS_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_los_id_status                                                           BCMOLT_XGPON_NI_LOS_ID_STATUS
+#define bcmolt_xgpon_ni_los_id__num_of                                                          BCMOLT_XGPON_NI_LOS_ID__NUM_OF
+#define bcmolt_xgpon_ni_onu_discovered_id_serial_number                                         BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_ni_onu_discovered_id_ranging_time                                          BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_RANGING_TIME
+#define bcmolt_xgpon_ni_onu_discovered_id_onu_id                                                BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ONU_ID
+#define bcmolt_xgpon_ni_onu_discovered_id_upstream_line_rate_capabilities                       BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_UPSTREAM_LINE_RATE_CAPABILITIES
+#define bcmolt_xgpon_ni_onu_discovered_id_current_downstream_pon_id                             BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_DOWNSTREAM_PON_ID
+#define bcmolt_xgpon_ni_onu_discovered_id_current_upstream_pon_id                               BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CURRENT_UPSTREAM_PON_ID
+#define bcmolt_xgpon_ni_onu_discovered_id_calibration_record                                    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_CALIBRATION_RECORD
+#define bcmolt_xgpon_ni_onu_discovered_id_tuning_granularity                                    BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_TUNING_GRANULARITY
+#define bcmolt_xgpon_ni_onu_discovered_id_step_tuning_time                                      BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_STEP_TUNING_TIME
+#define bcmolt_xgpon_ni_onu_discovered_id_attenuation                                           BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_ATTENUATION
+#define bcmolt_xgpon_ni_onu_discovered_id_power_levelling_capabilities                          BCMOLT_XGPON_NI_ONU_DISCOVERED_ID_POWER_LEVELLING_CAPABILITIES
+#define bcmolt_xgpon_ni_onu_discovered_id__num_of                                               BCMOLT_XGPON_NI_ONU_DISCOVERED_ID__NUM_OF
+#define bcmolt_xgpon_ni_onu_upgrade_complete_id_status                                          BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_STATUS
+#define bcmolt_xgpon_ni_onu_upgrade_complete_id_list_of_failed_entities                         BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID_LIST_OF_FAILED_ENTITIES
+#define bcmolt_xgpon_ni_onu_upgrade_complete_id__num_of                                         BCMOLT_XGPON_NI_ONU_UPGRADE_COMPLETE_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_onus_ranged_id_onus                                BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID_ONUS
+#define bcmolt_xgpon_ni_protection_switching_onus_ranged_id__num_of                             BCMOLT_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_switchover_completed_id_result                     BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID_RESULT
+#define bcmolt_xgpon_ni_protection_switching_switchover_completed_id__num_of                    BCMOLT_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_protection_switching_traffic_resume_id_result                           BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID_RESULT
+#define bcmolt_xgpon_ni_protection_switching_traffic_resume_id__num_of                          BCMOLT_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_window_type                                BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_WINDOW_TYPE
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_measurement_status                         BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_MEASUREMENT_STATUS
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_alloc_id                                   BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ALLOC_ID
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_onu_id                                     BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_ONU_ID
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_is_delineation                             BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_DELINEATION
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_is_ed                                      BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_IS_ED
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_rx_data                                    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_RX_DATA
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_ploam_received_onu_id                      BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_ONU_ID
+#define bcmolt_xgpon_ni_rogue_detection_completed_id_ploam_received_mic_error                   BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID_PLOAM_RECEIVED_MIC_ERROR
+#define bcmolt_xgpon_ni_rogue_detection_completed_id__num_of                                    BCMOLT_XGPON_NI_ROGUE_DETECTION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id__num_of                            BCMOLT_XGPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START_ID__NUM_OF
+#define bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id__num_of                        BCMOLT_XGPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START_ID__NUM_OF
+#define bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id_number_of_detected_delimiter  BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_NUMBER_OF_DETECTED_DELIMITER
+#define bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id_energy_detect_signal          BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID_ENERGY_DETECT_SIGNAL
+#define bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id__num_of                       BCMOLT_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_alarm_cleared_id_stat                                              BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_xgpon_ni_stat_alarm_cleared_id__num_of                                           BCMOLT_XGPON_NI_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_ni_stat_alarm_raised_id_stat                                               BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_xgpon_ni_stat_alarm_raised_id__num_of                                            BCMOLT_XGPON_NI_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_ni_state_change_completed_id_result                                        BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_RESULT
+#define bcmolt_xgpon_ni_state_change_completed_id_previous_state                                BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_PREVIOUS_STATE
+#define bcmolt_xgpon_ni_state_change_completed_id_new_state                                     BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID_NEW_STATE
+#define bcmolt_xgpon_ni_state_change_completed_id__num_of                                       BCMOLT_XGPON_NI_STATE_CHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_tod_request_completed_id_tod_string                                     BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_TOD_STRING
+#define bcmolt_xgpon_ni_tod_request_completed_id_sfc                                            BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_SFC
+#define bcmolt_xgpon_ni_tod_request_completed_id_rtc_offset_sec                                 BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_SEC
+#define bcmolt_xgpon_ni_tod_request_completed_id_rtc_offset_nsec                                BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_RTC_OFFSET_NSEC
+#define bcmolt_xgpon_ni_tod_request_completed_id_status                                         BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_ni_tod_request_completed_id__num_of                                        BCMOLT_XGPON_NI_TOD_REQUEST_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_ni_auto_cfg_id_activate_all_onus_completed                                 BCMOLT_XGPON_NI_AUTO_CFG_ID_ACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_cpu_packets_failure                                         BCMOLT_XGPON_NI_AUTO_CFG_ID_CPU_PACKETS_FAILURE
+#define bcmolt_xgpon_ni_auto_cfg_id_deactivate_all_onus_completed                               BCMOLT_XGPON_NI_AUTO_CFG_ID_DEACTIVATE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_disable_all_onus_completed                                  BCMOLT_XGPON_NI_AUTO_CFG_ID_DISABLE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_enable_all_onus_completed                                   BCMOLT_XGPON_NI_AUTO_CFG_ID_ENABLE_ALL_ONUS_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_los                                                         BCMOLT_XGPON_NI_AUTO_CFG_ID_LOS
+#define bcmolt_xgpon_ni_auto_cfg_id_onu_discovered                                              BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_DISCOVERED
+#define bcmolt_xgpon_ni_auto_cfg_id_onu_upgrade_complete                                        BCMOLT_XGPON_NI_AUTO_CFG_ID_ONU_UPGRADE_COMPLETE
+#define bcmolt_xgpon_ni_auto_cfg_id_protection_switching_onus_ranged                            BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_ONUS_RANGED
+#define bcmolt_xgpon_ni_auto_cfg_id_protection_switching_switchover_completed                   BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_protection_switching_traffic_resume                         BCMOLT_XGPON_NI_AUTO_CFG_ID_PROTECTION_SWITCHING_TRAFFIC_RESUME
+#define bcmolt_xgpon_ni_auto_cfg_id_rogue_detection_completed                                   BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_DETECTION_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_rogue_onu_special_map_cycle_start                           BCMOLT_XGPON_NI_AUTO_CFG_ID_ROGUE_ONU_SPECIAL_MAP_CYCLE_START
+#define bcmolt_xgpon_ni_auto_cfg_id_serial_number_acquisition_cycle_start                       BCMOLT_XGPON_NI_AUTO_CFG_ID_SERIAL_NUMBER_ACQUISITION_CYCLE_START
+#define bcmolt_xgpon_ni_auto_cfg_id_standby_pon_monitoring_cycle_completed                      BCMOLT_XGPON_NI_AUTO_CFG_ID_STANDBY_PON_MONITORING_CYCLE_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_stat_alarm_cleared                                          BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_ni_auto_cfg_id_stat_alarm_raised                                           BCMOLT_XGPON_NI_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_ni_auto_cfg_id_state_change_completed                                      BCMOLT_XGPON_NI_AUTO_CFG_ID_STATE_CHANGE_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id_tod_request_completed                                       BCMOLT_XGPON_NI_AUTO_CFG_ID_TOD_REQUEST_COMPLETED
+#define bcmolt_xgpon_ni_auto_cfg_id__num_of                                                     BCMOLT_XGPON_NI_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_ni_adjust_tx_wavelength_id_serial_number                                   BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_ni_adjust_tx_wavelength_id_freqency_adjustment_direction                   BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQENCY_ADJUSTMENT_DIRECTION
+#define bcmolt_xgpon_ni_adjust_tx_wavelength_id_frequency_adjustment_size                       BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE
+#define bcmolt_xgpon_ni_adjust_tx_wavelength_id__num_of                                         BCMOLT_XGPON_NI_ADJUST_TX_WAVELENGTH_ID__NUM_OF
+#define bcmolt_xgpon_ni_disable_serial_number_id_control                                        BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_CONTROL
+#define bcmolt_xgpon_ni_disable_serial_number_id_serial_number                                  BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_ni_disable_serial_number_id__num_of                                        BCMOLT_XGPON_NI_DISABLE_SERIAL_NUMBER_ID__NUM_OF
+#define bcmolt_xgpon_ni_reset_id__num_of                                                        BCMOLT_XGPON_NI_RESET_ID__NUM_OF
+#define bcmolt_xgpon_ni_rogue_detection_window_id_window_type                                   BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_WINDOW_TYPE
+#define bcmolt_xgpon_ni_rogue_detection_window_id_alloc_id                                      BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ALLOC_ID
+#define bcmolt_xgpon_ni_rogue_detection_window_id_onu_id                                        BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_ONU_ID
+#define bcmolt_xgpon_ni_rogue_detection_window_id_second_ranging_window                         BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID_SECOND_RANGING_WINDOW
+#define bcmolt_xgpon_ni_rogue_detection_window_id__num_of                                       BCMOLT_XGPON_NI_ROGUE_DETECTION_WINDOW_ID__NUM_OF
+#define bcmolt_xgpon_ni_run_special_bw_map_id_number_of_cycle                                   BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_NUMBER_OF_CYCLE
+#define bcmolt_xgpon_ni_run_special_bw_map_id_allocation_number                                 BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_ALLOCATION_NUMBER
+#define bcmolt_xgpon_ni_run_special_bw_map_id_bw_map_array                                      BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID_BW_MAP_ARRAY
+#define bcmolt_xgpon_ni_run_special_bw_map_id__num_of                                           BCMOLT_XGPON_NI_RUN_SPECIAL_BW_MAP_ID__NUM_OF
+#define bcmolt_xgpon_ni_set_onu_state_id_onu_state                                              BCMOLT_XGPON_NI_SET_ONU_STATE_ID_ONU_STATE
+#define bcmolt_xgpon_ni_set_onu_state_id__num_of                                                BCMOLT_XGPON_NI_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_xgpon_ni_set_pon_state_id_pon_state                                              BCMOLT_XGPON_NI_SET_PON_STATE_ID_PON_STATE
+#define bcmolt_xgpon_ni_set_pon_state_id__num_of                                                BCMOLT_XGPON_NI_SET_PON_STATE_ID__NUM_OF
+#define bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id__num_of                        BCMOLT_XGPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING_ID__NUM_OF
+#define bcmolt_xgpon_ni_start_onu_upgrade_id_list_of_onu_ids                                    BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID_LIST_OF_ONU_IDS
+#define bcmolt_xgpon_ni_start_onu_upgrade_id__num_of                                            BCMOLT_XGPON_NI_START_ONU_UPGRADE_ID__NUM_OF
+#define bcmolt_xgpon_ni_tod_request_id__num_of                                                  BCMOLT_XGPON_NI_TOD_REQUEST_ID__NUM_OF
+#define bcmolt_xgpon_ni_broadcast_ploam_packet_id_ploam                                         BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID_PLOAM
+#define bcmolt_xgpon_ni_broadcast_ploam_packet_id__num_of                                       BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_ni_cpu_packets_id_packet_type                                              BCMOLT_XGPON_NI_CPU_PACKETS_ID_PACKET_TYPE
+#define bcmolt_xgpon_ni_cpu_packets_id_calc_crc                                                 BCMOLT_XGPON_NI_CPU_PACKETS_ID_CALC_CRC
+#define bcmolt_xgpon_ni_cpu_packets_id_gem_port_list                                            BCMOLT_XGPON_NI_CPU_PACKETS_ID_GEM_PORT_LIST
+#define bcmolt_xgpon_ni_cpu_packets_id_buffer                                                   BCMOLT_XGPON_NI_CPU_PACKETS_ID_BUFFER
+#define bcmolt_xgpon_ni_cpu_packets_id__num_of                                                  BCMOLT_XGPON_NI_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_id_pon_ni                                                          BCMOLT_XGPON_ONU_KEY_ID_PON_NI
+#define bcmolt_xgpon_onu_key_id_onu_id                                                          BCMOLT_XGPON_ONU_KEY_ID_ONU_ID
+#define bcmolt_xgpon_onu_key_id__num_of                                                         BCMOLT_XGPON_ONU_KEY_ID__NUM_OF
+#define bcmolt_xgpon_onu_cfg_id_onu_state                                                       BCMOLT_XGPON_ONU_CFG_ID_ONU_STATE
+#define bcmolt_xgpon_onu_cfg_id_onu_old_state                                                   BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE
+#define bcmolt_xgpon_onu_cfg_id_alarm_state                                                     BCMOLT_XGPON_ONU_CFG_ID_ALARM_STATE
+#define bcmolt_xgpon_onu_cfg_id_registration_encryption_keys                                    BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ENCRYPTION_KEYS
+#define bcmolt_xgpon_onu_cfg_id_current_encryption_key                                          BCMOLT_XGPON_ONU_CFG_ID_CURRENT_ENCRYPTION_KEY
+#define bcmolt_xgpon_onu_cfg_id_serial_number                                                   BCMOLT_XGPON_ONU_CFG_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_onu_cfg_id_registration_id                                                 BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID
+#define bcmolt_xgpon_onu_cfg_id_registration_id_auto_learning                                   BCMOLT_XGPON_ONU_CFG_ID_REGISTRATION_ID_AUTO_LEARNING
+#define bcmolt_xgpon_onu_cfg_id_ranging_burst_profile                                           BCMOLT_XGPON_ONU_CFG_ID_RANGING_BURST_PROFILE
+#define bcmolt_xgpon_onu_cfg_id_data_burst_profile                                              BCMOLT_XGPON_ONU_CFG_ID_DATA_BURST_PROFILE
+#define bcmolt_xgpon_onu_cfg_id_ranging_time                                                    BCMOLT_XGPON_ONU_CFG_ID_RANGING_TIME
+#define bcmolt_xgpon_onu_cfg_id_disabled_after_discovery                                        BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY
+#define bcmolt_xgpon_onu_cfg_id_deactivation_reason                                             BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON
+#define bcmolt_xgpon_onu_cfg_id_all_gem_ports                                                   BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS
+#define bcmolt_xgpon_onu_cfg_id_all_allocs                                                      BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS
+#define bcmolt_xgpon_onu_cfg_id_extended_guard_time                                             BCMOLT_XGPON_ONU_CFG_ID_EXTENDED_GUARD_TIME
+#define bcmolt_xgpon_onu_cfg_id_us_line_rate                                                    BCMOLT_XGPON_ONU_CFG_ID_US_LINE_RATE
+#define bcmolt_xgpon_onu_cfg_id_calibration_record                                              BCMOLT_XGPON_ONU_CFG_ID_CALIBRATION_RECORD
+#define bcmolt_xgpon_onu_cfg_id_tuning_granularity                                              BCMOLT_XGPON_ONU_CFG_ID_TUNING_GRANULARITY
+#define bcmolt_xgpon_onu_cfg_id_step_tuning_time                                                BCMOLT_XGPON_ONU_CFG_ID_STEP_TUNING_TIME
+#define bcmolt_xgpon_onu_cfg_id_power_levelling_capabilities                                    BCMOLT_XGPON_ONU_CFG_ID_POWER_LEVELLING_CAPABILITIES
+#define bcmolt_xgpon_onu_cfg_id_request_registration_status                                     BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS
+#define bcmolt_xgpon_onu_cfg_id__num_of                                                         BCMOLT_XGPON_ONU_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_id_positive_drift                                                 BCMOLT_XGPON_ONU_STAT_ID_POSITIVE_DRIFT
+#define bcmolt_xgpon_onu_stat_id_negative_drift                                                 BCMOLT_XGPON_ONU_STAT_ID_NEGATIVE_DRIFT
+#define bcmolt_xgpon_onu_stat_id_delimiter_miss_detection                                       BCMOLT_XGPON_ONU_STAT_ID_DELIMITER_MISS_DETECTION
+#define bcmolt_xgpon_onu_stat_id_bip32_errors                                                   BCMOLT_XGPON_ONU_STAT_ID_BIP32_ERRORS
+#define bcmolt_xgpon_onu_stat_id_rx_words                                                       BCMOLT_XGPON_ONU_STAT_ID_RX_WORDS
+#define bcmolt_xgpon_onu_stat_id_fec_corrected_symbols                                          BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_SYMBOLS
+#define bcmolt_xgpon_onu_stat_id_fec_corrected_codewords                                        BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_CODEWORDS
+#define bcmolt_xgpon_onu_stat_id_fec_uncorrectable_codewords                                    BCMOLT_XGPON_ONU_STAT_ID_FEC_UNCORRECTABLE_CODEWORDS
+#define bcmolt_xgpon_onu_stat_id_fec_codewords                                                  BCMOLT_XGPON_ONU_STAT_ID_FEC_CODEWORDS
+#define bcmolt_xgpon_onu_stat_id_fec_corrected_bits                                             BCMOLT_XGPON_ONU_STAT_ID_FEC_CORRECTED_BITS
+#define bcmolt_xgpon_onu_stat_id_xgem_key_errors                                                BCMOLT_XGPON_ONU_STAT_ID_XGEM_KEY_ERRORS
+#define bcmolt_xgpon_onu_stat_id_xgem_loss                                                      BCMOLT_XGPON_ONU_STAT_ID_XGEM_LOSS
+#define bcmolt_xgpon_onu_stat_id_rx_ploams_mic_error                                            BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_MIC_ERROR
+#define bcmolt_xgpon_onu_stat_id_rx_ploams_non_idle                                             BCMOLT_XGPON_ONU_STAT_ID_RX_PLOAMS_NON_IDLE
+#define bcmolt_xgpon_onu_stat_id_rx_omci                                                        BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI
+#define bcmolt_xgpon_onu_stat_id_rx_omci_packets_crc_error                                      BCMOLT_XGPON_ONU_STAT_ID_RX_OMCI_PACKETS_CRC_ERROR
+#define bcmolt_xgpon_onu_stat_id_rx_bytes                                                       BCMOLT_XGPON_ONU_STAT_ID_RX_BYTES
+#define bcmolt_xgpon_onu_stat_id_rx_packets                                                     BCMOLT_XGPON_ONU_STAT_ID_RX_PACKETS
+#define bcmolt_xgpon_onu_stat_id_tx_bytes                                                       BCMOLT_XGPON_ONU_STAT_ID_TX_BYTES
+#define bcmolt_xgpon_onu_stat_id_tx_packets                                                     BCMOLT_XGPON_ONU_STAT_ID_TX_PACKETS
+#define bcmolt_xgpon_onu_stat_id__num_of                                                        BCMOLT_XGPON_ONU_STAT_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_cfg_id_cfg                                                        BCMOLT_XGPON_ONU_STAT_CFG_ID_CFG
+#define bcmolt_xgpon_onu_stat_cfg_id__num_of                                                    BCMOLT_XGPON_ONU_STAT_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_dfi_id_alarm_status                                                    BCMOLT_XGPON_ONU_DFI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_dfi_id__num_of                                                         BCMOLT_XGPON_ONU_DFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_dgi_id_alarm_status                                                    BCMOLT_XGPON_ONU_DGI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_dgi_id__num_of                                                         BCMOLT_XGPON_ONU_DGI_ID__NUM_OF
+#define bcmolt_xgpon_onu_dowi_id_alarm_status                                                   BCMOLT_XGPON_ONU_DOWI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_dowi_id_drift_value                                                    BCMOLT_XGPON_ONU_DOWI_ID_DRIFT_VALUE
+#define bcmolt_xgpon_onu_dowi_id_new_eqd                                                        BCMOLT_XGPON_ONU_DOWI_ID_NEW_EQD
+#define bcmolt_xgpon_onu_dowi_id__num_of                                                        BCMOLT_XGPON_ONU_DOWI_ID__NUM_OF
+#define bcmolt_xgpon_onu_invalid_dbru_report_id_alloc_id                                        BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID_ALLOC_ID
+#define bcmolt_xgpon_onu_invalid_dbru_report_id__num_of                                         BCMOLT_XGPON_ONU_INVALID_DBRU_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_completed_id_new_key                                      BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID_NEW_KEY
+#define bcmolt_xgpon_onu_key_exchange_completed_id__num_of                                      BCMOLT_XGPON_ONU_KEY_EXCHANGE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_cycle_skipped_id__num_of                                  BCMOLT_XGPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_key_mismatch_id_expected_key                              BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_EXPECTED_KEY
+#define bcmolt_xgpon_onu_key_exchange_key_mismatch_id_received_key                              BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID_RECEIVED_KEY
+#define bcmolt_xgpon_onu_key_exchange_key_mismatch_id__num_of                                   BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH_ID__NUM_OF
+#define bcmolt_xgpon_onu_key_exchange_key_request_timeout_id__num_of                            BCMOLT_XGPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT_ID__NUM_OF
+#define bcmolt_xgpon_onu_looci_id_alarm_status                                                  BCMOLT_XGPON_ONU_LOOCI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_looci_id__num_of                                                       BCMOLT_XGPON_ONU_LOOCI_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_activation_completed_id_status                                     BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_onu_onu_activation_completed_id_fail_reason                                BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_onu_activation_completed_id_registration_id                            BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ID
+#define bcmolt_xgpon_onu_onu_activation_completed_id_registration_encryption_keys               BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID_REGISTRATION_ENCRYPTION_KEYS
+#define bcmolt_xgpon_onu_onu_activation_completed_id__num_of                                    BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_alarm_id_onu_alarm                                                 BCMOLT_XGPON_ONU_ONU_ALARM_ID_ONU_ALARM
+#define bcmolt_xgpon_onu_onu_alarm_id__num_of                                                   BCMOLT_XGPON_ONU_ONU_ALARM_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_deactivation_completed_id_status                                   BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_onu_onu_deactivation_completed_id__num_of                                  BCMOLT_XGPON_ONU_ONU_DEACTIVATION_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_disable_completed_id_serial_number                                 BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_onu_onu_disable_completed_id__num_of                                       BCMOLT_XGPON_ONU_ONU_DISABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_enable_completed_id_serial_number                                  BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID_SERIAL_NUMBER
+#define bcmolt_xgpon_onu_onu_enable_completed_id__num_of                                        BCMOLT_XGPON_ONU_ONU_ENABLE_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_in_completed_id_result                                      BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_RESULT
+#define bcmolt_xgpon_onu_onu_tuning_in_completed_id_fail_reason                                 BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_onu_tuning_in_completed_id__num_of                                     BCMOLT_XGPON_ONU_ONU_TUNING_IN_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_out_completed_id_result                                     BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_RESULT
+#define bcmolt_xgpon_onu_onu_tuning_out_completed_id_fail_reason                                BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_onu_tuning_out_completed_id__num_of                                    BCMOLT_XGPON_ONU_ONU_TUNING_OUT_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_optical_reflection_id__num_of                                          BCMOLT_XGPON_ONU_OPTICAL_REFLECTION_ID__NUM_OF
+#define bcmolt_xgpon_onu_possible_drift_id_alarm_status                                         BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_possible_drift_id_estimated_drift                                      BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID_ESTIMATED_DRIFT
+#define bcmolt_xgpon_onu_possible_drift_id__num_of                                              BCMOLT_XGPON_ONU_POSSIBLE_DRIFT_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_consumption_report_id_power_consumption_report                   BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID_POWER_CONSUMPTION_REPORT
+#define bcmolt_xgpon_onu_power_consumption_report_id__num_of                                    BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_level_report_id_attenuation                                      BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_ATTENUATION
+#define bcmolt_xgpon_onu_power_level_report_id_power_levelling_capability                       BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID_POWER_LEVELLING_CAPABILITY
+#define bcmolt_xgpon_onu_power_level_report_id__num_of                                          BCMOLT_XGPON_ONU_POWER_LEVEL_REPORT_ID__NUM_OF
+#define bcmolt_xgpon_onu_power_management_state_change_id_old_state                             BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_OLD_STATE
+#define bcmolt_xgpon_onu_power_management_state_change_id_new_state                             BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_NEW_STATE
+#define bcmolt_xgpon_onu_power_management_state_change_id_reason                                BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID_REASON
+#define bcmolt_xgpon_onu_power_management_state_change_id__num_of                               BCMOLT_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE_ID__NUM_OF
+#define bcmolt_xgpon_onu_pqsi_id_alarm_status                                                   BCMOLT_XGPON_ONU_PQSI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_pqsi_id__num_of                                                        BCMOLT_XGPON_ONU_PQSI_ID__NUM_OF
+#define bcmolt_xgpon_onu_ranging_completed_id_status                                            BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_onu_ranging_completed_id_fail_reason                                       BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_ranging_completed_id_eqd                                               BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_EQD
+#define bcmolt_xgpon_onu_ranging_completed_id_number_of_ploams                                  BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_NUMBER_OF_PLOAMS
+#define bcmolt_xgpon_onu_ranging_completed_id_power_level                                       BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID_POWER_LEVEL
+#define bcmolt_xgpon_onu_ranging_completed_id__num_of                                           BCMOLT_XGPON_ONU_RANGING_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_registration_id_id_registration_id                                     BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REGISTRATION_ID
+#define bcmolt_xgpon_onu_registration_id_id_request_registration_status                         BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_STATUS
+#define bcmolt_xgpon_onu_registration_id_id_request_registration_fail_reason                    BCMOLT_XGPON_ONU_REGISTRATION_ID_ID_REQUEST_REGISTRATION_FAIL_REASON
+#define bcmolt_xgpon_onu_registration_id_id__num_of                                             BCMOLT_XGPON_ONU_REGISTRATION_ID_ID__NUM_OF
+#define bcmolt_xgpon_onu_rssi_measurement_completed_id_status                                   BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_STATUS
+#define bcmolt_xgpon_onu_rssi_measurement_completed_id_fail_reason                              BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_rssi_measurement_completed_id__num_of                                  BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED_ID__NUM_OF
+#define bcmolt_xgpon_onu_sdi_id_alarm_status                                                    BCMOLT_XGPON_ONU_SDI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_sdi_id_ber                                                             BCMOLT_XGPON_ONU_SDI_ID_BER
+#define bcmolt_xgpon_onu_sdi_id__num_of                                                         BCMOLT_XGPON_ONU_SDI_ID__NUM_OF
+#define bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_status                         BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_STATUS
+#define bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_fail_reason                    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID_FAIL_REASON
+#define bcmolt_xgpon_onu_secure_mutual_authentication_failure_id__num_of                        BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE_ID__NUM_OF
+#define bcmolt_xgpon_onu_sfi_id_alarm_status                                                    BCMOLT_XGPON_ONU_SFI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_sfi_id_ber                                                             BCMOLT_XGPON_ONU_SFI_ID_BER
+#define bcmolt_xgpon_onu_sfi_id__num_of                                                         BCMOLT_XGPON_ONU_SFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_alarm_cleared_id_stat                                             BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID_STAT
+#define bcmolt_xgpon_onu_stat_alarm_cleared_id__num_of                                          BCMOLT_XGPON_ONU_STAT_ALARM_CLEARED_ID__NUM_OF
+#define bcmolt_xgpon_onu_stat_alarm_raised_id_stat                                              BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID_STAT
+#define bcmolt_xgpon_onu_stat_alarm_raised_id__num_of                                           BCMOLT_XGPON_ONU_STAT_ALARM_RAISED_ID__NUM_OF
+#define bcmolt_xgpon_onu_sufi_id_alarm_status                                                   BCMOLT_XGPON_ONU_SUFI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_sufi_id__num_of                                                        BCMOLT_XGPON_ONU_SUFI_ID__NUM_OF
+#define bcmolt_xgpon_onu_tiwi_id_alarm_status                                                   BCMOLT_XGPON_ONU_TIWI_ID_ALARM_STATUS
+#define bcmolt_xgpon_onu_tiwi_id_drift_value                                                    BCMOLT_XGPON_ONU_TIWI_ID_DRIFT_VALUE
+#define bcmolt_xgpon_onu_tiwi_id__num_of                                                        BCMOLT_XGPON_ONU_TIWI_ID__NUM_OF
+#define bcmolt_xgpon_onu_tuning_response_id_ack                                                 BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_ACK
+#define bcmolt_xgpon_onu_tuning_response_id_result                                              BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID_RESULT
+#define bcmolt_xgpon_onu_tuning_response_id__num_of                                             BCMOLT_XGPON_ONU_TUNING_RESPONSE_ID__NUM_OF
+#define bcmolt_xgpon_onu_auto_cfg_id_dfi                                                        BCMOLT_XGPON_ONU_AUTO_CFG_ID_DFI
+#define bcmolt_xgpon_onu_auto_cfg_id_dgi                                                        BCMOLT_XGPON_ONU_AUTO_CFG_ID_DGI
+#define bcmolt_xgpon_onu_auto_cfg_id_dowi                                                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_DOWI
+#define bcmolt_xgpon_onu_auto_cfg_id_invalid_dbru_report                                        BCMOLT_XGPON_ONU_AUTO_CFG_ID_INVALID_DBRU_REPORT
+#define bcmolt_xgpon_onu_auto_cfg_id_key_exchange_completed                                     BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_key_exchange_cycle_skipped                                 BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_CYCLE_SKIPPED
+#define bcmolt_xgpon_onu_auto_cfg_id_key_exchange_key_mismatch                                  BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_MISMATCH
+#define bcmolt_xgpon_onu_auto_cfg_id_key_exchange_key_request_timeout                           BCMOLT_XGPON_ONU_AUTO_CFG_ID_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT
+#define bcmolt_xgpon_onu_auto_cfg_id_looci                                                      BCMOLT_XGPON_ONU_AUTO_CFG_ID_LOOCI
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_activation_completed                                   BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ACTIVATION_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_alarm                                                  BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ALARM
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_deactivation_completed                                 BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DEACTIVATION_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_disable_completed                                      BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_DISABLE_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_enable_completed                                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_ENABLE_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_tuning_in_completed                                    BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_IN_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_onu_tuning_out_completed                                   BCMOLT_XGPON_ONU_AUTO_CFG_ID_ONU_TUNING_OUT_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_optical_reflection                                         BCMOLT_XGPON_ONU_AUTO_CFG_ID_OPTICAL_REFLECTION
+#define bcmolt_xgpon_onu_auto_cfg_id_possible_drift                                             BCMOLT_XGPON_ONU_AUTO_CFG_ID_POSSIBLE_DRIFT
+#define bcmolt_xgpon_onu_auto_cfg_id_power_consumption_report                                   BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_CONSUMPTION_REPORT
+#define bcmolt_xgpon_onu_auto_cfg_id_power_level_report                                         BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_LEVEL_REPORT
+#define bcmolt_xgpon_onu_auto_cfg_id_power_management_state_change                              BCMOLT_XGPON_ONU_AUTO_CFG_ID_POWER_MANAGEMENT_STATE_CHANGE
+#define bcmolt_xgpon_onu_auto_cfg_id_pqsi                                                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_PQSI
+#define bcmolt_xgpon_onu_auto_cfg_id_ranging_completed                                          BCMOLT_XGPON_ONU_AUTO_CFG_ID_RANGING_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_registration_id                                            BCMOLT_XGPON_ONU_AUTO_CFG_ID_REGISTRATION_ID
+#define bcmolt_xgpon_onu_auto_cfg_id_rssi_measurement_completed                                 BCMOLT_XGPON_ONU_AUTO_CFG_ID_RSSI_MEASUREMENT_COMPLETED
+#define bcmolt_xgpon_onu_auto_cfg_id_sdi                                                        BCMOLT_XGPON_ONU_AUTO_CFG_ID_SDI
+#define bcmolt_xgpon_onu_auto_cfg_id_secure_mutual_authentication_failure                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_SECURE_MUTUAL_AUTHENTICATION_FAILURE
+#define bcmolt_xgpon_onu_auto_cfg_id_sfi                                                        BCMOLT_XGPON_ONU_AUTO_CFG_ID_SFI
+#define bcmolt_xgpon_onu_auto_cfg_id_stat_alarm_cleared                                         BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_CLEARED
+#define bcmolt_xgpon_onu_auto_cfg_id_stat_alarm_raised                                          BCMOLT_XGPON_ONU_AUTO_CFG_ID_STAT_ALARM_RAISED
+#define bcmolt_xgpon_onu_auto_cfg_id_sufi                                                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_SUFI
+#define bcmolt_xgpon_onu_auto_cfg_id_tiwi                                                       BCMOLT_XGPON_ONU_AUTO_CFG_ID_TIWI
+#define bcmolt_xgpon_onu_auto_cfg_id_tuning_response                                            BCMOLT_XGPON_ONU_AUTO_CFG_ID_TUNING_RESPONSE
+#define bcmolt_xgpon_onu_auto_cfg_id__num_of                                                    BCMOLT_XGPON_ONU_AUTO_CFG_ID__NUM_OF
+#define bcmolt_xgpon_onu_adjust_tx_wavelength_id_frequency_adjustment_direction                 BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_DIRECTION
+#define bcmolt_xgpon_onu_adjust_tx_wavelength_id_frequency_adjustment_size                      BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID_FREQUENCY_ADJUSTMENT_SIZE
+#define bcmolt_xgpon_onu_adjust_tx_wavelength_id__num_of                                        BCMOLT_XGPON_ONU_ADJUST_TX_WAVELENGTH_ID__NUM_OF
+#define bcmolt_xgpon_onu_change_power_levelling_id_control                                      BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_CONTROL
+#define bcmolt_xgpon_onu_change_power_levelling_id_attenuation                                  BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID_ATTENUATION
+#define bcmolt_xgpon_onu_change_power_levelling_id__num_of                                      BCMOLT_XGPON_ONU_CHANGE_POWER_LEVELLING_ID__NUM_OF
+#define bcmolt_xgpon_onu_get_power_consumption_id__num_of                                       BCMOLT_XGPON_ONU_GET_POWER_CONSUMPTION_ID__NUM_OF
+#define bcmolt_xgpon_onu_get_power_level_id__num_of                                             BCMOLT_XGPON_ONU_GET_POWER_LEVEL_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_in_id__num_of                                               BCMOLT_XGPON_ONU_ONU_TUNING_IN_ID__NUM_OF
+#define bcmolt_xgpon_onu_onu_tuning_out_id_target_ds_pon_id                                     BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_DS_PON_ID
+#define bcmolt_xgpon_onu_onu_tuning_out_id_target_us_pon_id                                     BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TARGET_US_PON_ID
+#define bcmolt_xgpon_onu_onu_tuning_out_id_time_to_switch                                       BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_TIME_TO_SWITCH
+#define bcmolt_xgpon_onu_onu_tuning_out_id_rollback                                             BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_ROLLBACK
+#define bcmolt_xgpon_onu_onu_tuning_out_id_status                                               BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID_STATUS
+#define bcmolt_xgpon_onu_onu_tuning_out_id__num_of                                              BCMOLT_XGPON_ONU_ONU_TUNING_OUT_ID__NUM_OF
+#define bcmolt_xgpon_onu_request_registration_id_sma_flag                                       BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID_SMA_FLAG
+#define bcmolt_xgpon_onu_request_registration_id__num_of                                        BCMOLT_XGPON_ONU_REQUEST_REGISTRATION_ID__NUM_OF
+#define bcmolt_xgpon_onu_rssi_measurement_id__num_of                                            BCMOLT_XGPON_ONU_RSSI_MEASUREMENT_ID__NUM_OF
+#define bcmolt_xgpon_onu_secure_mutual_authentication_id_master_key                             BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MASTER_KEY
+#define bcmolt_xgpon_onu_secure_mutual_authentication_id_buffer                                 BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_BUFFER
+#define bcmolt_xgpon_onu_secure_mutual_authentication_id_mic                                    BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID_MIC
+#define bcmolt_xgpon_onu_secure_mutual_authentication_id__num_of                                BCMOLT_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_ID__NUM_OF
+#define bcmolt_xgpon_onu_set_onu_state_id_onu_state                                             BCMOLT_XGPON_ONU_SET_ONU_STATE_ID_ONU_STATE
+#define bcmolt_xgpon_onu_set_onu_state_id__num_of                                               BCMOLT_XGPON_ONU_SET_ONU_STATE_ID__NUM_OF
+#define bcmolt_xgpon_onu_cpu_packets_id_packet_type                                             BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_TYPE
+#define bcmolt_xgpon_onu_cpu_packets_id_calc_crc                                                BCMOLT_XGPON_ONU_CPU_PACKETS_ID_CALC_CRC
+#define bcmolt_xgpon_onu_cpu_packets_id_number_of_packets                                       BCMOLT_XGPON_ONU_CPU_PACKETS_ID_NUMBER_OF_PACKETS
+#define bcmolt_xgpon_onu_cpu_packets_id_packet_size                                             BCMOLT_XGPON_ONU_CPU_PACKETS_ID_PACKET_SIZE
+#define bcmolt_xgpon_onu_cpu_packets_id_buffer                                                  BCMOLT_XGPON_ONU_CPU_PACKETS_ID_BUFFER
+#define bcmolt_xgpon_onu_cpu_packets_id__num_of                                                 BCMOLT_XGPON_ONU_CPU_PACKETS_ID__NUM_OF
+#define bcmolt_xgpon_onu_ploam_packet_id_default_key                                            BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_DEFAULT_KEY
+#define bcmolt_xgpon_onu_ploam_packet_id_ploam                                                  BCMOLT_XGPON_ONU_PLOAM_PACKET_ID_PLOAM
+#define bcmolt_xgpon_onu_ploam_packet_id__num_of                                                BCMOLT_XGPON_ONU_PLOAM_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_onu_cpu_packet_id_port_id                                                  BCMOLT_XGPON_ONU_CPU_PACKET_ID_PORT_ID
+#define bcmolt_xgpon_onu_cpu_packet_id_crc_ok                                                   BCMOLT_XGPON_ONU_CPU_PACKET_ID_CRC_OK
+#define bcmolt_xgpon_onu_cpu_packet_id_packet_size                                              BCMOLT_XGPON_ONU_CPU_PACKET_ID_PACKET_SIZE
+#define bcmolt_xgpon_onu_cpu_packet_id_buffer                                                   BCMOLT_XGPON_ONU_CPU_PACKET_ID_BUFFER
+#define bcmolt_xgpon_onu_cpu_packet_id__num_of                                                  BCMOLT_XGPON_ONU_CPU_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_onu_omci_packet_id_port_id                                                 BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PORT_ID
+#define bcmolt_xgpon_onu_omci_packet_id_crc_ok                                                  BCMOLT_XGPON_ONU_OMCI_PACKET_ID_CRC_OK
+#define bcmolt_xgpon_onu_omci_packet_id_packet_size                                             BCMOLT_XGPON_ONU_OMCI_PACKET_ID_PACKET_SIZE
+#define bcmolt_xgpon_onu_omci_packet_id_buffer                                                  BCMOLT_XGPON_ONU_OMCI_PACKET_ID_BUFFER
+#define bcmolt_xgpon_onu_omci_packet_id__num_of                                                 BCMOLT_XGPON_ONU_OMCI_PACKET_ID__NUM_OF
+#define bcmolt_xgpon_trx_key_id_pon_ni                                                          BCMOLT_XGPON_TRX_KEY_ID_PON_NI
+#define bcmolt_xgpon_trx_key_id__num_of                                                         BCMOLT_XGPON_TRX_KEY_ID__NUM_OF
+#define bcmolt_xgpon_trx_cfg_id_burst_profile                                                   BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE
+#define bcmolt_xgpon_trx_cfg_id_transceiver_config                                              BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_CONFIG
+#define bcmolt_xgpon_trx_cfg_id_transceiver_type                                                BCMOLT_XGPON_TRX_CFG_ID_TRANSCEIVER_TYPE
+#define bcmolt_xgpon_trx_cfg_id_debug                                                           BCMOLT_XGPON_TRX_CFG_ID_DEBUG
+#define bcmolt_xgpon_trx_cfg_id_rssi_normal_config                                              BCMOLT_XGPON_TRX_CFG_ID_RSSI_NORMAL_CONFIG
+#define bcmolt_xgpon_trx_cfg_id_rssi_ranging_config                                             BCMOLT_XGPON_TRX_CFG_ID_RSSI_RANGING_CONFIG
+#define bcmolt_xgpon_trx_cfg_id_serdes_configuration                                            BCMOLT_XGPON_TRX_CFG_ID_SERDES_CONFIGURATION
+#define bcmolt_xgpon_trx_cfg_id_burst_profile_delimiter_max_errors                              BCMOLT_XGPON_TRX_CFG_ID_BURST_PROFILE_DELIMITER_MAX_ERRORS
+#define bcmolt_xgpon_trx_cfg_id_ranging_sm_patterns_at_init                                     BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_AT_INIT
+#define bcmolt_xgpon_trx_cfg_id_ranging_sm_patterns_ed_failure                                  BCMOLT_XGPON_TRX_CFG_ID_RANGING_SM_PATTERNS_ED_FAILURE
+#define bcmolt_xgpon_trx_cfg_id_reset_on_del_miss                                               BCMOLT_XGPON_TRX_CFG_ID_RESET_ON_DEL_MISS
+#define bcmolt_xgpon_trx_cfg_id_ed_state                                                        BCMOLT_XGPON_TRX_CFG_ID_ED_STATE
+#define bcmolt_xgpon_trx_cfg_id_invert_ed                                                       BCMOLT_XGPON_TRX_CFG_ID_INVERT_ED
+#define bcmolt_xgpon_trx_cfg_id_end_of_burst_reset                                              BCMOLT_XGPON_TRX_CFG_ID_END_OF_BURST_RESET
+#define bcmolt_xgpon_trx_cfg_id_trx_rst_polarity                                                BCMOLT_XGPON_TRX_CFG_ID_TRX_RST_POLARITY
+#define bcmolt_xgpon_trx_cfg_id__num_of                                                         BCMOLT_XGPON_TRX_CFG_ID__NUM_OF
+#define bcmolt_xpon_serdes_key_id_pon_ni                                                        BCMOLT_XPON_SERDES_KEY_ID_PON_NI
+#define bcmolt_xpon_serdes_key_id_instance                                                      BCMOLT_XPON_SERDES_KEY_ID_INSTANCE
+#define bcmolt_xpon_serdes_key_id__num_of                                                       BCMOLT_XPON_SERDES_KEY_ID__NUM_OF
+#define bcmolt_xpon_serdes_cfg_id_rx_vga                                                        BCMOLT_XPON_SERDES_CFG_ID_RX_VGA
+#define bcmolt_xpon_serdes_cfg_id_rx_pf                                                         BCMOLT_XPON_SERDES_CFG_ID_RX_PF
+#define bcmolt_xpon_serdes_cfg_id_rx_lfpf                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_LFPF
+#define bcmolt_xpon_serdes_cfg_id_rx_dfe1                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_DFE1
+#define bcmolt_xpon_serdes_cfg_id_rx_dfe2                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_DFE2
+#define bcmolt_xpon_serdes_cfg_id_rx_dfe3                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_DFE3
+#define bcmolt_xpon_serdes_cfg_id_rx_dfe4                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_DFE4
+#define bcmolt_xpon_serdes_cfg_id_rx_dfe5                                                       BCMOLT_XPON_SERDES_CFG_ID_RX_DFE5
+#define bcmolt_xpon_serdes_cfg_id_tx_pre                                                        BCMOLT_XPON_SERDES_CFG_ID_TX_PRE
+#define bcmolt_xpon_serdes_cfg_id_tx_main                                                       BCMOLT_XPON_SERDES_CFG_ID_TX_MAIN
+#define bcmolt_xpon_serdes_cfg_id_tx_post1                                                      BCMOLT_XPON_SERDES_CFG_ID_TX_POST1
+#define bcmolt_xpon_serdes_cfg_id_tx_post2                                                      BCMOLT_XPON_SERDES_CFG_ID_TX_POST2
+#define bcmolt_xpon_serdes_cfg_id_tx_post3                                                      BCMOLT_XPON_SERDES_CFG_ID_TX_POST3
+#define bcmolt_xpon_serdes_cfg_id_tx_amp                                                        BCMOLT_XPON_SERDES_CFG_ID_TX_AMP
+#define bcmolt_xpon_serdes_cfg_id__num_of                                                       BCMOLT_XPON_SERDES_CFG_ID__NUM_OF
+
+/** Checks whether the given object type has the given tag. 
+ *
+ * \return true if the given object has the given tag, false otherwise 
+ */
+bcmos_bool bcmolt_obj_has_tag(bcmolt_obj_id obj, bcmolt_obj_tag tag);
+
+/** @} */
+#endif /* BCMOLT_MODEL_IDS_H_ */
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_model_revision.h b/bcm68620_release/release/host_driver/model/bcmolt_model_revision.h
new file mode 100755
index 0000000..5f93880
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_model_revision.h
@@ -0,0 +1,47 @@
+/*
+<: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.
+:>
+*/
+#define BCMOLT_MODEL_REVISION 1
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_model_types.c b/bcm68620_release/release/host_driver/model/bcmolt_model_types.c
new file mode 100644
index 0000000..cce3c31
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_model_types.c
@@ -0,0 +1,105484 @@
+/*
+<: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;
+}
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_model_types.h b/bcm68620_release/release/host_driver/model/bcmolt_model_types.h
new file mode 100644
index 0000000..3785b02
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_model_types.h
@@ -0,0 +1,46987 @@
+/*
+<: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.
+:>
+*/
+#ifndef BCMOLT_MODEL_TYPES_H_
+#define BCMOLT_MODEL_TYPES_H_
+
+#include "bcmos_system.h"
+#include "bcmos_errno.h"
+#include "bcmolt_buf.h"
+#include "bcmolt_msg.h"
+#include "bcmolt_model_data.h"
+
+/** \addtogroup object_model
+ * @{
+ */
+
+/** Structure definition for the "key" group of the "ae_ni" object. 
+ */
+typedef struct bcmolt_ae_ni_key
+{
+    bcmolt_ae_ni ae_ni; /**< The index of a specific AE NI instance as seen by the host. */
+} bcmolt_ae_ni_key;
+
+/** Structure definition for the "cfg" group of the "ae_ni" object. 
+ */
+typedef struct bcmolt_ae_ni_cfg_data
+{
+    bcmos_mac_address mac_address;  /**< The MAC address used for all frames generated by the OLT on the network.  This value must be set before AE_NI is first enabled, and cannot be changed while the AE_NI is enabled. */
+    bcmolt_ae_ni_en_state ae_ni_en; /**< Indicates the enable state of the AE NI. */
+    uint16_t mtu_10g;               /**< Maximum frame size (including FCS) on the 10G path. This attribute cannot be changed on an enabled AE_NI. */
+    bcmolt_prbs_generator_config prbs_generator;    /**< DS PRBS generator configuration */
+    bcmolt_prbs_checker_config prbs_checker;        /**< US PRBS checker configuration */
+    bcmolt_prbs_status prbs_status;                 /**< Result of US PRBS checker */
+} bcmolt_ae_ni_cfg_data;
+
+/** Transport message definition for "cfg" group of "ae_ni" object. 
+ */
+typedef struct bcmolt_ae_ni_cfg
+{
+    bcmolt_cfg hdr;             /**< Transport header. */
+    bcmolt_ae_ni_key key;       /**< Object key. */
+    bcmolt_ae_ni_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_ae_ni_cfg;
+
+/** Structure definition for the "set_ae_ni_en_state" group of the "ae_ni" 
+ * object. 
+ *
+ * Set the AE NI enable state. 
+ */
+typedef struct bcmolt_ae_ni_set_ae_ni_en_state_data
+{
+    bcmolt_ae_ni_en_state new_state;    /**< New EPON NI enable state. */
+} bcmolt_ae_ni_set_ae_ni_en_state_data;
+
+/** Transport message definition for "set_ae_ni_en_state" group of "ae_ni" 
+ * object. 
+ */
+typedef struct bcmolt_ae_ni_set_ae_ni_en_state
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_ae_ni_key key;   /**< Object key. */
+    bcmolt_ae_ni_set_ae_ni_en_state_data data;  /**< All properties that must be set by the user. */
+} bcmolt_ae_ni_set_ae_ni_en_state;
+
+/** Structure definition for the "key" group of the "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_key
+{
+    bcmolt_ae_ni ae_ni; /**< AE NI associated with this 10G downstream path. */
+} bcmolt_ae_path_ds_key;
+
+/** Structure definition for the "stat" group of the "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes transmitted on this 10g downstream path. */
+    uint64_t frames;            /**< The number of frames transmitted on this 10g downstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames transmitted on this 10g downstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames transmitted on this 10g downstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes transmitted on this 10g downstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames transmitted on this 10g downstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames transmitted on this 10g downstream path. */
+    uint64_t abort_frames;      /**< Number of abort frames transmitted on this 10g downstream path. */
+} bcmolt_ae_path_ds_stat_data;
+
+/** Transport message definition for "stat" group of "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_ae_path_ds_key key;          /**< Object key. */
+    bcmolt_ae_path_ds_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_ds_stat;
+
+/** Structure definition for the "stat_cfg" group of the "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_ae_path_ds_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_ae_path_ds_key key;  /**< Object key. */
+    bcmolt_ae_path_ds_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_ds_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "ae_path_ds" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_alarm_cleared_data
+{
+    bcmolt_ae_path_ds_stat_id stat; /**< Statistic identifier. */
+} bcmolt_ae_path_ds_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "ae_path_ds" 
+ * object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_ae_path_ds_key key;  /**< Object key. */
+    bcmolt_ae_path_ds_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_ae_path_ds_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "ae_path_ds" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_alarm_raised_data
+{
+    bcmolt_ae_path_ds_stat_id stat; /**< Statistic identifier. */
+} bcmolt_ae_path_ds_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "ae_path_ds" 
+ * object. 
+ */
+typedef struct bcmolt_ae_path_ds_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_ae_path_ds_key key;  /**< Object key. */
+    bcmolt_ae_path_ds_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_ae_path_ds_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_ae_path_ds_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "ae_path_ds" object. 
+ */
+typedef struct bcmolt_ae_path_ds_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_ae_path_ds_key key;              /**< Object key. */
+    bcmolt_ae_path_ds_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_ds_auto_cfg;
+
+/** Structure definition for the "key" group of the "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_key
+{
+    bcmolt_ae_ni ae_ni; /**< AE NI associated with this 10G upstream path. */
+} bcmolt_ae_path_us_key;
+
+/** Structure definition for the "stat" group of the "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes received on this 10g upstream path. */
+    uint64_t frames;            /**< The number of frames received on this 10g upstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames received on this 10g upstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames received on this 10g upstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames received on this 10g upstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames received on this 10g upstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames received on this 10g upstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames received on this 10g upstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames received on this 10g upstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames received on this 10g upstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames received on this 10g upstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames received on this 10g upstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames received on this 10g upstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes received on this 10g upstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames received on this 10g upstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames received on this 10g upstream path. */
+    uint64_t abort_frames;      /**< The number of abort frames received on this 10g upstream path. */
+    uint64_t fcs_error;         /**< The number of bad FCS errors received on this 10g upstream path. */
+    uint64_t oversize_error;    /**< The number of oversize errors received on this 10g upstream path. */
+    uint64_t runt_error;        /**< The number of runt errors received on this 10g upstream path. */
+} bcmolt_ae_path_us_stat_data;
+
+/** Transport message definition for "stat" group of "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_ae_path_us_key key;          /**< Object key. */
+    bcmolt_ae_path_us_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_us_stat;
+
+/** Structure definition for the "stat_cfg" group of the "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_ae_path_us_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_ae_path_us_key key;  /**< Object key. */
+    bcmolt_ae_path_us_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_us_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "ae_path_us" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_ae_path_us_stat_alarm_cleared_data
+{
+    bcmolt_ae_path_us_stat_id stat; /**< Statistic identifier. */
+} bcmolt_ae_path_us_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "ae_path_us" 
+ * object. 
+ */
+typedef struct bcmolt_ae_path_us_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_ae_path_us_key key;  /**< Object key. */
+    bcmolt_ae_path_us_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_ae_path_us_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "ae_path_us" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_ae_path_us_stat_alarm_raised_data
+{
+    bcmolt_ae_path_us_stat_id stat; /**< Statistic identifier. */
+} bcmolt_ae_path_us_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "ae_path_us" 
+ * object. 
+ */
+typedef struct bcmolt_ae_path_us_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_ae_path_us_key key;  /**< Object key. */
+    bcmolt_ae_path_us_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_ae_path_us_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_ae_path_us_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "ae_path_us" object. 
+ */
+typedef struct bcmolt_ae_path_us_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_ae_path_us_key key;              /**< Object key. */
+    bcmolt_ae_path_us_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_ae_path_us_auto_cfg;
+
+/** Structure definition for the "key" group of the "channel" object. 
+ */
+typedef struct bcmolt_channel_key
+{
+    bcmolt_pon_ni pon_ni;   /**< PON network interface. */
+} bcmolt_channel_key;
+
+/** Structure definition for the "cfg" group of the "channel" object. 
+ */
+typedef struct bcmolt_channel_cfg_data
+{
+    bcmolt_operation_control operation_control; /**< Operation control. */
+    uint16_t tol;   /**< Transmit Optical Level. An indication of the current OLT CT transceiver channel launch power into the ODN */
+    bcmolt_system_profile system_profile;           /**< System profile. */
+#define BCMOLT_CHANNEL_CFG_DATA_CHANNEL_PROFILE_LEN 8
+    bcmolt_arr_channel_profile_8 channel_profile;   /**< Channel profile. */
+} bcmolt_channel_cfg_data;
+
+/** Transport message definition for "cfg" group of "channel" object. 
+ */
+typedef struct bcmolt_channel_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_channel_key key;         /**< Object key. */
+    bcmolt_channel_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_channel_cfg;
+
+/** Structure definition for the "key" group of the "debug" object. 
+ */
+typedef struct bcmolt_debug_key
+{
+    uint32_t reserved;  /**< Reserved (set to 0) */
+} bcmolt_debug_key;
+
+/** Structure definition for the "cfg" group of the "debug" object. 
+ */
+typedef struct bcmolt_debug_cfg_data
+{
+    bcmolt_console_redirection console_redirection;             /**< Log output redirection */
+    uint32_t indications_dropped;                               /**< Number of indications dropped due to congestion / shaping. */
+    uint8_t file_used_percent;                                  /**< DDR log file used percent */
+    bcmolt_api_capture_config api_capture_cfg;                  /**< Configuration for API capture. */
+    bcmolt_api_capture_stats api_capture_stats;                 /**< Statistics on the most recent API capture. */
+    bcmolt_api_capture_buffer_reader api_capture_buffer_read;   /**< Controls what portion of the capture buffer is returned when performing a cfg_get. */
+    bcmolt_u8_list_u32 api_capture_buffer;                      /**< The portion of the capture buffer currently specified by api_capture_buffer_read. */
+} bcmolt_debug_cfg_data;
+
+/** Transport message definition for "cfg" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_cfg
+{
+    bcmolt_cfg hdr;             /**< Transport header. */
+    bcmolt_debug_key key;       /**< Object key. */
+    bcmolt_debug_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_debug_cfg;
+
+/** Structure definition for the "cli_output" group of the "debug" object. 
+ *
+ * CLI Output String 
+ */
+typedef struct bcmolt_debug_cli_output_data
+{
+    bcmolt_u8_list_u32 data;    /**< output data */
+} bcmolt_debug_cli_output_data;
+
+/** Transport message definition for "cli_output" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_cli_output
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_debug_key key;               /**< Object key. */
+    bcmolt_debug_cli_output_data data;  /**< All properties that must be set by the user. */
+} bcmolt_debug_cli_output;
+
+/** Transport message definition for "file_almost_full" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_file_almost_full
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_debug_key key;   /**< Object key. */
+} bcmolt_debug_file_almost_full;
+
+/** Structure definition for the "auto_cfg" group of the "debug" object. 
+ */
+typedef struct bcmolt_debug_auto_cfg_data
+{
+    bcmos_bool cli_output;          /**< If true, indications of type "cli_output" will be generated. */
+    bcmos_bool file_almost_full;    /**< If true, indications of type "file_almost_full" will be generated. */
+} bcmolt_debug_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_debug_key key;               /**< Object key. */
+    bcmolt_debug_auto_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_debug_auto_cfg;
+
+/** Structure definition for the "cli_input" group of the "debug" object. 
+ *
+ * CLI Input String 
+ */
+typedef struct bcmolt_debug_cli_input_data
+{
+    bcmolt_u8_list_u32 data;    /**< Input String */
+} bcmolt_debug_cli_input_data;
+
+/** Transport message definition for "cli_input" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_cli_input
+{
+    bcmolt_oper hdr;                    /**< Transport header. */
+    bcmolt_debug_key key;               /**< Object key. */
+    bcmolt_debug_cli_input_data data;   /**< All properties that must be set by the user. */
+} bcmolt_debug_cli_input;
+
+/** Transport message definition for "reset_api_capture" group of "debug" 
+ * object. 
+ */
+typedef struct bcmolt_debug_reset_api_capture
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_debug_key key;   /**< Object key. */
+} bcmolt_debug_reset_api_capture;
+
+/** Transport message definition for "start_api_capture" group of "debug" 
+ * object. 
+ */
+typedef struct bcmolt_debug_start_api_capture
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_debug_key key;   /**< Object key. */
+} bcmolt_debug_start_api_capture;
+
+/** Transport message definition for "stop_api_capture" group of "debug" object. 
+ */
+typedef struct bcmolt_debug_stop_api_capture
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_debug_key key;   /**< Object key. */
+} bcmolt_debug_stop_api_capture;
+
+/** Structure definition for the "key" group of the "device" object. 
+ */
+typedef struct bcmolt_device_key
+{
+    uint32_t reserved;  /**< Reserved (set to 0). */
+} bcmolt_device_key;
+
+/** Structure definition for the "cfg" group of the "device" object. 
+ */
+typedef struct bcmolt_device_cfg_data
+{
+    bcmolt_system_mode system_mode; /**< System mode - this must be set by the host when initially provisioning the system.  Setting this also sets the "nni_speed" property, unless it is overridden. */
+    uint32_t keepalive_interval;    /**< Keepalive Interval in Seconds  (0 = Disable) */
+    uint32_t keepalive_tolerance;   /**< How many keepalive messages can be lost before triggering a disconnect sequence  */
+    bcmolt_firmware_sw_version firmware_sw_version;             /**< Firmware SW Version */
+    bcmolt_host_sw_version host_sw_version;                     /**< Host SW Version */
+    bcmolt_device_chip_revision chip_revision;                  /**< Revision of the BCM68620 device. */
+    bcmolt_device_state state;                                  /**< Device state */
+    bcmolt_debug_device_cfg debug;                              /**< Device configuration debug parameters */
+    bcmolt_device_nni_speed nni_speed;                          /**< Speed of the NNI interface.  This is calculated automatically when the "system_mode" property is set, but can be overridden by the host. */
+    bcmolt_ext_irq protection_switching_ext_irq;                /**< The selected external IRQ for protection switching */
+    uint32_t epon_clock_transport_sample_delay;                 /**< The time (in TQ) that it takes from when a pulse is generated at the external source to when we sample it. */
+    bcmolt_indication_shaping indication_shaping;               /**< Shaping / rate limiting for the indication channel. */
+    uint32_t chip_temperature;                                  /**< Current die temperature. */
+    bcmolt_control_state gpon_xgpon_tod_enable;                 /**< GPON/XGPON ToD control state */
+    bcmolt_gpio_pin gpon_xgpon_tod_gpio_pin;                    /**< GPON/XGPON ToD GIO pin */
+    bcmos_bool gpon_xgpon_tod_connected_internally;             /**< GPON/XGPON is ToD internally */
+    bcmolt_str_256 epon_8021_as_tod_format;                     /**< The format of the 802.1AS ToD string. */
+    bcmolt_shaper_mode epon_shaper_mode;                        /**< Controls EPON shaper behavior. */
+    bcmolt_embedded_image_entry_list_u8 embedded_image_list;    /**< List of all file images stored in the OLT. */
+    uint32_t chip_voltage;                      /**< Chip voltage in mV */
+    bcmolt_str_256 epon_tod_string;             /**< The current ToD string to be used for clock transport (EPON only). */
+    bcmolt_xgpon_num_of_onus xgpon_num_of_onus; /**< xgpon num of onus. */
+    bcmos_ipv4_address device_ip_address;       /**< The IP Address of the device */
+    uint16_t device_udp_port;                   /**< The UDP port of the Device */
+    bcmolt_uart_baudrate tod_uart_baudrate;     /**< UART baud rate */
+    uint8_t gpon_xgpon_tod_string_length;       /**< GPON/XGPON ToD string length */
+} bcmolt_device_cfg_data;
+
+/** Transport message definition for "cfg" group of "device" object. 
+ */
+typedef struct bcmolt_device_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_device_key key;          /**< Object key. */
+    bcmolt_device_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_cfg;
+
+/** Structure definition for the "connection_complete" group of the "device" 
+ * object. 
+ *
+ * The host successfully connected to the device.  The device has either been 
+ * reprogrammed with new firmware, or a connection was established with an 
+ * existing device (see the "standalone" field). 
+ */
+typedef struct bcmolt_device_connection_complete_data
+{
+    bcmos_bool standalone;  /**< If true, the device was previously running in standalone mode before this connection was established.  If false, the device was booted from reset with new firmware, etc. */
+} bcmolt_device_connection_complete_data;
+
+/** Transport message definition for "connection_complete" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_connection_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_connection_complete_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_connection_complete;
+
+/** Transport message definition for "connection_established" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_connection_established
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+} bcmolt_device_connection_established;
+
+/** Structure definition for the "connection_failure" group of the "device" 
+ * object. 
+ *
+ * The host failed to connect to the device. 
+ */
+typedef struct bcmolt_device_connection_failure_data
+{
+    bcmolt_host_connection_fail_reason reason;  /**< Connection fail reason. */
+} bcmolt_device_connection_failure_data;
+
+/** Transport message definition for "connection_failure" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_connection_failure
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_connection_failure_data data; /**< All properties that must be set by the user. */
+} bcmolt_device_connection_failure;
+
+/** Structure definition for the "ddr_test_complete" group of the "device" 
+ * object. 
+ *
+ * The DDR Test has completed 
+ */
+typedef struct bcmolt_device_ddr_test_complete_data
+{
+    bcmolt_ddr_test_completed ddr_test; /**< Results of the DDR Test */
+} bcmolt_device_ddr_test_complete_data;
+
+/** Transport message definition for "ddr_test_complete" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_ddr_test_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_ddr_test_complete_data data;  /**< All properties that must be set by the user. */
+} bcmolt_device_ddr_test_complete;
+
+/** Structure definition for the "device_keep_alive" group of the "device" 
+ * object. 
+ *
+ * Keep alive message from the device to the host - used by the device control 
+ * library (not sent to the host application). 
+ */
+typedef struct bcmolt_device_device_keep_alive_data
+{
+    uint32_t sequence_number;   /**< sequence number */
+    uint32_t time_stamp;        /**< time stamp */
+} bcmolt_device_device_keep_alive_data;
+
+/** Transport message definition for "device_keep_alive" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_device_keep_alive
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_device_keep_alive_data data;  /**< All properties that must be set by the user. */
+} bcmolt_device_device_keep_alive;
+
+/** Structure definition for the "device_ready" group of the "device" object. 
+ *
+ * Device ready indication used by the device control library (not sent to the 
+ * host application). 
+ */
+typedef struct bcmolt_device_device_ready_data
+{
+    bcmolt_firmware_sw_version firmware_sw_version; /**< Software Version. */
+    bcmolt_system_mode system_mode;                 /**< System Mode. */
+    bcmolt_device_nni_speed nni_speed;              /**< NNI Speed. */
+    bcmolt_device_chip_revision chip_revision;      /**< Chip Revision. */
+    bcmolt_control_state tod_enable;                /**< ToD control. */
+    bcmolt_gpio_pin tod_gpio_pin;                   /**< GPIO pin is used when ToD UART is not connected to the embedded, and TOD value is obtained by the host. */
+} bcmolt_device_device_ready_data;
+
+/** Transport message definition for "device_ready" group of "device" object. 
+ */
+typedef struct bcmolt_device_device_ready
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_device_key key;                  /**< Object key. */
+    bcmolt_device_device_ready_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_device_ready;
+
+/** Transport message definition for "disconnection_complete" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_disconnection_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+} bcmolt_device_disconnection_complete;
+
+/** Structure definition for the "image_transfer_complete" group of the "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_image_transfer_complete_data
+{
+    bcmolt_device_image_type image_type;    /**< Image type. */
+    uint32_t block_number;                  /**< Block number. */
+    bcmolt_image_transfer_status status;    /**< Image transfer status. */
+} bcmolt_device_image_transfer_complete_data;
+
+/** Transport message definition for "image_transfer_complete" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_image_transfer_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_image_transfer_complete_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_image_transfer_complete;
+
+/** Structure definition for the "indications_dropped" group of the "device" 
+ * object. 
+ *
+ * Sent when indications are dropped due to congestion / shaping. 
+ */
+typedef struct bcmolt_device_indications_dropped_data
+{
+    uint32_t total_count;   /**< Total number of indications dropped since the system was started. */
+} bcmolt_device_indications_dropped_data;
+
+/** Transport message definition for "indications_dropped" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_indications_dropped
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_indications_dropped_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_indications_dropped;
+
+/** Structure definition for the "sw_error" group of the "device" object. 
+ */
+typedef struct bcmolt_device_sw_error_data
+{
+    bcmolt_str_100 task_name;   /**< task name. */
+    bcmolt_str_100 file_name;   /**< file name. */
+    uint32_t line_number;       /**< line number. */
+    uint8_t pon_ni;             /**< pon_ni. */
+} bcmolt_device_sw_error_data;
+
+/** Transport message definition for "sw_error" group of "device" object. 
+ */
+typedef struct bcmolt_device_sw_error
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_device_key key;              /**< Object key. */
+    bcmolt_device_sw_error_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_sw_error;
+
+/** Structure definition for the "sw_exception" group of the "device" object. 
+ */
+typedef struct bcmolt_device_sw_exception_data
+{
+    uint8_t cpu_id;         /**< CPU ID. */
+    bcmolt_str_2000 text;   /**< text. */
+} bcmolt_device_sw_exception_data;
+
+/** Transport message definition for "sw_exception" group of "device" object. 
+ */
+typedef struct bcmolt_device_sw_exception
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_sw_exception_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_sw_exception;
+
+/** Structure definition for the "auto_cfg" group of the "device" object. 
+ */
+typedef struct bcmolt_device_auto_cfg_data
+{
+    bcmos_bool connection_complete;     /**< If true, indications of type "connection_complete" will be generated. */
+    bcmos_bool connection_established;  /**< If true, indications of type "connection_established" will be generated. */
+    bcmos_bool connection_failure;      /**< If true, indications of type "connection_failure" will be generated. */
+    bcmos_bool ddr_test_complete;       /**< If true, indications of type "ddr_test_complete" will be generated. */
+    bcmos_bool device_keep_alive;       /**< If true, indications of type "device_keep_alive" will be generated. */
+    bcmos_bool device_ready;            /**< If true, indications of type "device_ready" will be generated. */
+    bcmos_bool disconnection_complete;  /**< If true, indications of type "disconnection_complete" will be generated. */
+    bcmos_bool image_transfer_complete; /**< If true, indications of type "image_transfer_complete" will be generated. */
+    bcmos_bool indications_dropped;     /**< If true, indications of type "indications_dropped" will be generated. */
+    bcmos_bool sw_error;                /**< If true, indications of type "sw_error" will be generated. */
+    bcmos_bool sw_exception;            /**< If true, indications of type "sw_exception" will be generated. */
+} bcmolt_device_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "device" object. 
+ */
+typedef struct bcmolt_device_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_device_key key;              /**< Object key. */
+    bcmolt_device_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_auto_cfg;
+
+/** Transport message definition for "connect" group of "device" object. 
+ */
+typedef struct bcmolt_device_connect
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+} bcmolt_device_connect;
+
+/** Transport message definition for "disconnect" group of "device" object. 
+ */
+typedef struct bcmolt_device_disconnect
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+} bcmolt_device_disconnect;
+
+/** Structure definition for the "host_keep_alive" group of the "device" object. 
+ *
+ * Keep alive message from the host to the device - used by the device control 
+ * library (should not be sent by the host application). 
+ */
+typedef struct bcmolt_device_host_keep_alive_data
+{
+    uint32_t sequence_number;   /**< sequence number */
+    uint32_t time_stamp;        /**< time stamp */
+} bcmolt_device_host_keep_alive_data;
+
+/** Transport message definition for "host_keep_alive" group of "device" object. 
+ */
+typedef struct bcmolt_device_host_keep_alive
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_host_keep_alive_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_host_keep_alive;
+
+/** Structure definition for the "image_transfer_data" group of the "device" 
+ * object. 
+ *
+ * used for transferring the actual data from/to the OLT.   not to be directly 
+ * called by the user. 
+ */
+typedef struct bcmolt_device_image_transfer_data_data
+{
+    uint32_t block_number;          /**< Block number. */
+    bcmos_bool more_data;           /**< Specifies that there are more data to come. */
+    bcmolt_u8_list_u16_hex data;    /**< Data. */
+} bcmolt_device_image_transfer_data_data;
+
+/** Transport message definition for "image_transfer_data" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_image_transfer_data
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_image_transfer_data_data data;    /**< All properties that must be set by the user. */
+} bcmolt_device_image_transfer_data;
+
+/** Structure definition for the "image_transfer_start" group of the "device" 
+ * object. 
+ *
+ * This API message informs the OLT of the start of image transfer, and 
+ * provides the information of the file image. 
+ */
+typedef struct bcmolt_device_image_transfer_start_data
+{
+    bcmolt_device_image_type image_type;    /**< File type. */
+    uint32_t image_size;                    /**< Size of the file image.  Ignored for RRQ operation. */
+    uint32_t crc32;             /**< CRC32 checksum of the entire file image. */
+    bcmolt_str_64 image_name;   /**< Name of the file image.  Null-terminated string.  This is required for the DPoE ONU only.  DPoE requires the write request OAM contains the name of the file. */
+} bcmolt_device_image_transfer_start_data;
+
+/** Transport message definition for "image_transfer_start" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_image_transfer_start
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_image_transfer_start_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_image_transfer_start;
+
+/** Structure definition for the "reset" group of the "device" object. 
+ *
+ * Resets the host/device. 
+ */
+typedef struct bcmolt_device_reset_data
+{
+    bcmolt_device_reset_mode mode;  /**< Options to control what should be reset. */
+} bcmolt_device_reset_data;
+
+/** Transport message definition for "reset" group of "device" object. 
+ */
+typedef struct bcmolt_device_reset
+{
+    bcmolt_oper hdr;                /**< Transport header. */
+    bcmolt_device_key key;          /**< Object key. */
+    bcmolt_device_reset_data data;  /**< All properties that must be set by the user. */
+} bcmolt_device_reset;
+
+/** Structure definition for the "run_ddr_test" group of the "device" object. 
+ *
+ * Run a test on one or more of the DDR components. 
+ */
+typedef struct bcmolt_device_run_ddr_test_data
+{
+    bcmos_bool cpu;     /**< Whether or not to test the CPU DDR */
+    bcmos_bool ras_0;   /**< Whether or not to test RAS 0 DDR */
+    bcmos_bool ras_1;   /**< Whether or not to test RAS 1 DDR */
+} bcmolt_device_run_ddr_test_data;
+
+/** Transport message definition for "run_ddr_test" group of "device" object. 
+ */
+typedef struct bcmolt_device_run_ddr_test
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+    bcmolt_device_run_ddr_test_data data;   /**< All properties that must be set by the user. */
+} bcmolt_device_run_ddr_test;
+
+/** Transport message definition for "sw_upgrade_activate" group of "device" 
+ * object. 
+ */
+typedef struct bcmolt_device_sw_upgrade_activate
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_device_key key;  /**< Object key. */
+} bcmolt_device_sw_upgrade_activate;
+
+/** Structure definition for the "key" group of the "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_key
+{
+    bcmolt_epon_ni epon_ni;         /**< Uniquely identifies the EPON NI containing the link. */
+    bcmos_mac_address mac_address;  /**< The MAC address associated with the EPON link. */
+} bcmolt_epon_denied_link_key;
+
+/** Structure definition for the "cfg" group of the "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_cfg_data
+{
+    bcmolt_epon_denied_link_alarm_state alarm_state;    /**< The state of the alarms on this link. */
+} bcmolt_epon_denied_link_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_cfg;
+
+/** Structure definition for the "laser_on_off_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * This is when a link tries to reigster with an impossible laser on or off 
+ * time. 
+ */
+typedef struct bcmolt_epon_denied_link_laser_on_off_violation_data
+{
+    bcmolt_laser_on_off_status alarm_status;    /**< Alarm Status. */
+} bcmolt_epon_denied_link_laser_on_off_violation_data;
+
+/** Transport message definition for "laser_on_off_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_laser_on_off_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_laser_on_off_violation_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_laser_on_off_violation;
+
+/** Structure definition for the "llid_pool_empty_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A link tried to register and it there are no LLIDs available. If this 
+ * occurs, it is possible there is an issue with your 'max links' and/or 'Base 
+ * LLID' fields on your RP. 
+ */
+typedef struct bcmolt_epon_denied_link_llid_pool_empty_violation_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_denied_link_llid_pool_empty_violation_data;
+
+/** Transport message definition for "llid_pool_empty_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_llid_pool_empty_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_llid_pool_empty_violation_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_llid_pool_empty_violation;
+
+/** Structure definition for the "max_link_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A link tried to register and it would have put us over the provisioned max 
+ * links for the corresponding EPON NI. 
+ */
+typedef struct bcmolt_epon_denied_link_max_link_violation_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_denied_link_max_link_violation_data;
+
+/** Transport message definition for "max_link_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_max_link_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_max_link_violation_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_max_link_violation;
+
+/** Structure definition for the "overhead_profile_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * This is when link tries to register and there are already too many existing 
+ * laser on/off combinations. 
+ */
+typedef struct bcmolt_epon_denied_link_overhead_profile_violation_data
+{
+    bcmolt_status alarm_status; /**< Alarm status. */
+} bcmolt_epon_denied_link_overhead_profile_violation_data;
+
+/** Transport message definition for "overhead_profile_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_overhead_profile_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_overhead_profile_violation_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_overhead_profile_violation;
+
+/** Structure definition for the "range_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A link tried to register with a range value that was outside of the min/max 
+ * fiber length. 
+ */
+typedef struct bcmolt_epon_denied_link_range_violation_data
+{
+    bcmolt_range_status alarm_status;   /**< Alarm Status. */
+} bcmolt_epon_denied_link_range_violation_data;
+
+/** Transport message definition for "range_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_range_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_range_violation_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_range_violation;
+
+/** Structure definition for the "rogue_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A Rogue ONU was detected on this link/LLID.  
+ */
+typedef struct bcmolt_epon_denied_link_rogue_violation_data
+{
+    bcmolt_rogue_status alarm_status;   /**< Alarm Status. */
+} bcmolt_epon_denied_link_rogue_violation_data;
+
+/** Transport message definition for "rogue_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_rogue_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_rogue_violation_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_rogue_violation;
+
+/** Structure definition for the "system_resource_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A link tried to register and we were unable to allocate system resources for 
+ * it. 
+ */
+typedef struct bcmolt_epon_denied_link_system_resource_violation_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_denied_link_system_resource_violation_data;
+
+/** Transport message definition for "system_resource_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_system_resource_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_system_resource_violation_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_system_resource_violation;
+
+/** Structure definition for the "tdm_channels_exhausted" group of the 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_tdm_channels_exhausted_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_denied_link_tdm_channels_exhausted_data;
+
+/** Transport message definition for "tdm_channels_exhausted" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_tdm_channels_exhausted
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_tdm_channels_exhausted_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_tdm_channels_exhausted;
+
+/** Structure definition for the "unknown_link_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * A link tried to register while the PON was set to "notify unknown" 
+ * registration behavior and this link was not pre-provisioned. 
+ */
+typedef struct bcmolt_epon_denied_link_unknown_link_violation_data
+{
+    bcmolt_unknown_link_status alarm_status;    /**< Alarm Status. */
+} bcmolt_epon_denied_link_unknown_link_violation_data;
+
+/** Transport message definition for "unknown_link_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_unknown_link_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_unknown_link_violation_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_unknown_link_violation;
+
+/** Structure definition for the "upstream_bandwidth_violation" group of the 
+ * "epon_denied_link" object. 
+ *
+ * This link failed to register because there was insufficient upstream 
+ * bandwidth available to provide the default UBD. 
+ */
+typedef struct bcmolt_epon_denied_link_upstream_bandwidth_violation_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_denied_link_upstream_bandwidth_violation_data;
+
+/** Transport message definition for "upstream_bandwidth_violation" group of 
+ * "epon_denied_link" object. 
+ */
+typedef struct bcmolt_epon_denied_link_upstream_bandwidth_violation
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_denied_link_key key;    /**< Object key. */
+    bcmolt_epon_denied_link_upstream_bandwidth_violation_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_upstream_bandwidth_violation;
+
+/** Structure definition for the "auto_cfg" group of the "epon_denied_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_denied_link_auto_cfg_data
+{
+    bcmos_bool laser_on_off_violation;          /**< If true, indications of type "laser_on_off_violation" will be generated. */
+    bcmos_bool llid_pool_empty_violation;       /**< If true, indications of type "llid_pool_empty_violation" will be generated. */
+    bcmos_bool max_link_violation;              /**< If true, indications of type "max_link_violation" will be generated. */
+    bcmos_bool overhead_profile_violation;      /**< If true, indications of type "overhead_profile_violation" will be generated. */
+    bcmos_bool range_violation;                 /**< If true, indications of type "range_violation" will be generated. */
+    bcmos_bool rogue_violation;                 /**< If true, indications of type "rogue_violation" will be generated. */
+    bcmos_bool system_resource_violation;       /**< If true, indications of type "system_resource_violation" will be generated. */
+    bcmos_bool tdm_channels_exhausted;          /**< If true, indications of type "tdm_channels_exhausted" will be generated. */
+    bcmos_bool unknown_link_violation;          /**< If true, indications of type "unknown_link_violation" will be generated. */
+    bcmos_bool upstream_bandwidth_violation;    /**< If true, indications of type "upstream_bandwidth_violation" will be generated. */
+} bcmolt_epon_denied_link_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_denied_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_denied_link_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_denied_link_key key;            /**< Object key. */
+    bcmolt_epon_denied_link_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_denied_link_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_key
+{
+    bcmolt_epon_ni epon_ni;         /**< Uniquely identifies the EPON NI containing the link. */
+    bcmos_mac_address mac_address;  /**< The MAC address associated with the EPON link. */
+} bcmolt_epon_link_key;
+
+/** Structure definition for the "cfg" group of the "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_cfg_data
+{
+    bcmolt_epon_link_rate link_rate;            /**< This link's downstream and upstream rate. */
+    bcmolt_epon_link_state_flags state_flags;   /**< EPON link state flags reflect the current status of the link.   Registered state flag is controled by the static registration operation for links on a protected-standby PON. */
+    bcmolt_epon_llid llid;                      /**< LLID associated with this link. */
+    bcmolt_time_quanta laser_on_time_tq;        /**< Laser-on time in time quanta. */
+    bcmolt_time_quanta laser_off_time_tq;       /**< Laser-off time in time quanta. */
+    bcmolt_time_quanta range_value_tq;          /**< Range value used for this link - in time quanta. */
+    bcmolt_meters distance;                     /**< Distance to the ONU (Differs from range value in that this ignores internal delays) */
+    bcmolt_epon_link_alarm_state alarm_state;   /**< The state of the alarms on this link. */
+    bcmolt_epon_tunnel_id tunnel_id;            /**< Upstream and downstream tunnel ID for this link. */
+    bcmolt_epon_onu_id onu_id;                  /**< ONU associated with this EPON link.  A value of 0xFF indicates that the link has not been associated with an ONU. */
+    bcmolt_epon_laser_overhead_parameters min_laser_overhead;   /**< For 1G ONUs ,these values will override the standard values of 32. */
+    bcmolt_epon_key_exchange_config key_exchange_config;        /**< Encryption key exchange configuration for this link. */
+    bcmolt_epon_encryption_config epon_encryption;              /**< Encryption configuration for this link. */
+    bcmolt_epon_link_fec_en fec_enable;                 /**< FEC enable state for this link. */
+    bcmolt_oam_heartbeat_config oam_heartbeat_config;   /**< OAM heartbeat configuration.  This includes the frame to transmit to the link, and the expected frame/mask from the ONU.   */
+    bcmolt_upstream_bandwidth_distribution upstream_bandwidth;  /**< Upstream Bandwidth. */
+    bcmolt_ubd_info ubd_info;           /**< Returns the actual values from the UBD. Useful if you want to see what value the firmware chose for a field set to 'automatic'. */
+    bcmos_bool clock_transport_enable;  /**< Whether or not to enable clock transport on this link. */
+    uint8_t pending_grants;             /**< The number of pending grants. */
+    bcmolt_epon_link_type link_type;    /**< Link Type. */
+} bcmolt_epon_link_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_link_key key;       /**< Object key. */
+    bcmolt_epon_link_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_cfg;
+
+/** Structure definition for the "stat" group of the "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_stat_data
+{
+    uint64_t rx_data_bytes;             /**< The number of data bytes received on this EPON link. */
+    uint64_t rx_data_frames;            /**< The number of data frames received on this EPON link. */
+    uint64_t rx_frames_64;              /**< The number of 64 byte frames received on this EPON Link */
+    uint64_t rx_frames_65_127;          /**< The number of 65 to 127 byte frames received on this EPON Link */
+    uint64_t rx_frames_128_255;         /**< The number of 128 to 255 byte frames received on this EPON Link */
+    uint64_t rx_frames_256_511;         /**< The number of 256 to 511 byte frames received on this EPON Link */
+    uint64_t rx_frames_512_1023;        /**< The number of 512 to 1023 byte frames received on this EPON Link */
+    uint64_t rx_frames_1024_1518;       /**< The number of 1024 to 1518 byte frames received on this EPON Link */
+    uint64_t rx_frames_1519_2047;       /**< The number of 1519 to 2047 byte frames received on this EPON Link */
+    uint64_t rx_frames_2048_4095;       /**< The number of 2048 to 4095 byte frames received on this EPON Link */
+    uint64_t rx_frames_4096_9216;       /**< The number of 4096 to 9216 byte frames received on this EPON Link */
+    uint64_t rx_frames_9217_16383;      /**< The number of 9217 to 16383 byte frames received on this EPON Link */
+    uint64_t rx_oam_bytes;              /**< The number of OAM bytes received on this EPON link. */
+    uint64_t rx_oam_frames;             /**< The number of OAM frames received on this EPON link. */
+    uint64_t rx_mpcp_frames;            /**< The number of MPCP frames received on this EPON link. */
+    uint64_t rx_broadcast_frames;       /**< The number of broadcast frames received on this EPON link. */
+    uint64_t rx_unicast_frames;         /**< The number of unicast frames received on this EPON link. */
+    uint64_t rx_multicast_frames;       /**< The number of multicast frames received on this EPON link. */
+    uint64_t rx_report_frames;          /**< The number of report frames received on this EPON link. */
+    uint64_t rx_fcs_error;              /**< The number of bad FCS errors received on this EPON Link */
+    uint64_t rx_oversize_error;         /**< The number of oversize errors received on this EPON Link */
+    uint64_t rx_runt_error;             /**< The number of runt errors received on this EPON Link */
+    uint64_t rx_line_code_error;        /**< The number of line code errors received on this EPON Link */
+    uint64_t rx_line_code_error_max;    /**< The number of line code errors max received on this EPON Link */
+    uint64_t tx_data_bytes;             /**< The number of data bytes transmitted on this EPON link. */
+    uint64_t tx_data_frames;            /**< The number of data frames transmitted on this EPON link. */
+    uint64_t tx_frames_64;              /**< The number of 64 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_65_127;          /**< The number of 65 to 127 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_128_255;         /**< The number of 128 to 255 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_256_511;         /**< The number of 256 to 511 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_512_1023;        /**< The number of 512 to 1023 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_1024_1518;       /**< The number of 1024 to 1518 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_1519_2047;       /**< The number of 1519 to 2047 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_2048_4095;       /**< The number of 2048 to 4095 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_4096_9216;       /**< The number of 4096 to 9216 byte frames transmitted on this EPON Link */
+    uint64_t tx_frames_9217_16383;      /**< The number of 9217 to 16383 byte frames transmitted on this EPON Link */
+    uint64_t tx_oam_bytes;              /**< The number of OAM bytes transmitted on this EPON link. */
+    uint64_t tx_oam_frames;             /**< The number of OAM frames transmitted on this EPON link. */
+    uint64_t tx_mpcp_frames;            /**< The number of MPCP frames transmitted on this EPON link. */
+    uint64_t tx_broadcast_frames;       /**< The number of broadcast frames transmitted on this EPON link. */
+    uint64_t tx_unicast_frames;         /**< The number of unicast frames transmitted on this EPON link. */
+    uint64_t tx_multicast_frames;       /**< The number of multicast frames transmitted on this EPON link. */
+    uint64_t tx_gates;                  /**< The number of gates transmitted on this EPON link. */
+} bcmolt_epon_link_stat_data;
+
+/** Transport message definition for "stat" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_epon_link_key key;           /**< Object key. */
+    bcmolt_epon_link_stat_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_link_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_link_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_stat_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_link_stat_cfg;
+
+/** Structure definition for the "duplicate_mpcp_registration_request" group of 
+ * the "epon_link" object. 
+ *
+ * A register requested was received for a link with the same MAC address as a 
+ * link that has already registered. 
+ */
+typedef struct bcmolt_epon_link_duplicate_mpcp_registration_request_data
+{
+    bcmolt_time_quanta initial_range_tq;    /**< Range as calculated from the first frame received. */
+    bcmolt_time_quanta current_range_tq;    /**< Range as calculated from the current frame. */
+} bcmolt_epon_link_duplicate_mpcp_registration_request_data;
+
+/** Transport message definition for "duplicate_mpcp_registration_request" group 
+ * of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_duplicate_mpcp_registration_request
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_duplicate_mpcp_registration_request_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_duplicate_mpcp_registration_request;
+
+/** Transport message definition for "encryption_enabled" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_encryption_enabled
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_encryption_enabled;
+
+/** Structure definition for the "key_exchange_failure" group of the "epon_link" 
+ * object. 
+ *
+ * The OLT failed to receive an updated encryption key within the expected time 
+ * period after encryption key exchange has been initiated. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_failure_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_epon_link_key_exchange_failure_data;
+
+/** Transport message definition for "key_exchange_failure" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_failure
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_key_exchange_failure_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_link_key_exchange_failure;
+
+/** Transport message definition for "key_exchange_started" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_started
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_key_exchange_started;
+
+/** Transport message definition for "key_exchange_stopped" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_stopped
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_key_exchange_stopped;
+
+/** Transport message definition for "link_deleted" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_link_deleted
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_link_deleted;
+
+/** Structure definition for the "link_speed_mismatch" group of the "epon_link" 
+ * object. 
+ *
+ * Host will receive this indication if a link registers then attempts to 
+ * register later at a different speed, or if the link registers at a different 
+ * speed than the speed with which it was pre-provisioned. 
+ */
+typedef struct bcmolt_epon_link_link_speed_mismatch_data
+{
+    bcmolt_epon_link_rate previous_rate;    /**< PON rate link initially registered */
+    bcmolt_epon_link_rate current_rate;     /**< PON rate link is currently attempting to register at */
+} bcmolt_epon_link_link_speed_mismatch_data;
+
+/** Transport message definition for "link_speed_mismatch" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_link_speed_mismatch
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_link_speed_mismatch_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_link_speed_mismatch;
+
+/** Transport message definition for "mpcp_deregistered" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_mpcp_deregistered
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_mpcp_deregistered;
+
+/** Structure definition for the "mpcp_discovered" group of the "epon_link" 
+ * object. 
+ *
+ * A link has completed MPCP link registration. 
+ */
+typedef struct bcmolt_epon_link_mpcp_discovered_data
+{
+    bcmolt_epon_link_info link_info;    /**< Information associated with the discovered link. */
+} bcmolt_epon_link_mpcp_discovered_data;
+
+/** Transport message definition for "mpcp_discovered" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_mpcp_discovered
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_mpcp_discovered_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_mpcp_discovered;
+
+/** Transport message definition for "mpcp_reg_ack_timeout" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_mpcp_reg_ack_timeout
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_mpcp_reg_ack_timeout;
+
+/** Structure definition for the "mpcp_report_timeout" group of the "epon_link" 
+ * object. 
+ *
+ * The provisioned limit between reports for the specified link has been 
+ * exceeded.  This link will be de-registered, and the alarm_status set when 
+ * this occurs.  The alarm_status will be cleared when the link attempts to 
+ * register again. 
+ */
+typedef struct bcmolt_epon_link_mpcp_report_timeout_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_link_mpcp_report_timeout_data;
+
+/** Transport message definition for "mpcp_report_timeout" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_mpcp_report_timeout
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_mpcp_report_timeout_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_mpcp_report_timeout;
+
+/** Structure definition for the "oam_keepalive_timeout" group of the 
+ * "epon_link" object. 
+ *
+ * The provisioned time limit between receiving upstream info frames has been 
+ * exceeded.  Normally an ONU will reset its OAM state machine when this 
+ * occurrs and the host must re-negotiate OAM and reprovision the link. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timeout_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_link_oam_keepalive_timeout_data;
+
+/** Transport message definition for "oam_keepalive_timeout" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timeout
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_oam_keepalive_timeout_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_link_oam_keepalive_timeout;
+
+/** Transport message definition for "oam_keepalive_timer_started" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timer_started
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_oam_keepalive_timer_started;
+
+/** Transport message definition for "oam_keepalive_timer_stopped" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timer_stopped
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_oam_keepalive_timer_stopped;
+
+/** Structure definition for the "preprovisioned_link_created" group of the 
+ * "epon_link" object. 
+ *
+ * Raised after an 'add_link' operation on an EPON NI completes successfully 
+ */
+typedef struct bcmolt_epon_link_preprovisioned_link_created_data
+{
+    bcmolt_epon_link_info link_info;    /**< Information associated with the link. */
+} bcmolt_epon_link_preprovisioned_link_created_data;
+
+/** Transport message definition for "preprovisioned_link_created" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_preprovisioned_link_created
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_preprovisioned_link_created_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_preprovisioned_link_created;
+
+/** Structure definition for the "protection_switch_occurred" group of the 
+ * "epon_link" object. 
+ *
+ * The link has undergone a protection switch event. 
+ */
+typedef struct bcmolt_epon_link_protection_switch_occurred_data
+{
+    bcmolt_epon_protection_state protection_status; /**< The link's post-switch role (working or standby). */
+    bcmolt_time_quanta range_value_tq;              /**< Current range value in time quanta. */
+} bcmolt_epon_link_protection_switch_occurred_data;
+
+/** Transport message definition for "protection_switch_occurred" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_protection_switch_occurred
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_protection_switch_occurred_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_link_protection_switch_occurred;
+
+/** Structure definition for the "range_value_changed" group of the "epon_link" 
+ * object. 
+ *
+ * Indication sent when a range value has been changed. 
+ */
+typedef struct bcmolt_epon_link_range_value_changed_data
+{
+    bcmolt_time_quanta range_value_tq;  /**< New range value. */
+} bcmolt_epon_link_range_value_changed_data;
+
+/** Transport message definition for "range_value_changed" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_range_value_changed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_range_value_changed_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_range_value_changed;
+
+/** Transport message definition for "rerange_failure" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_rerange_failure
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_rerange_failure;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "epon_link" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_link_stat_alarm_cleared_data
+{
+    bcmolt_epon_link_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_epon_link_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_stat_alarm_cleared_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_link_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "epon_link" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_link_stat_alarm_raised_data
+{
+    bcmolt_epon_link_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_epon_link_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_stat_alarm_raised_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_link_stat_alarm_raised;
+
+/** Transport message definition for "static_registration_done" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_static_registration_done
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_static_registration_done;
+
+/** Structure definition for the "auto_cfg" group of the "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_auto_cfg_data
+{
+    bcmos_bool duplicate_mpcp_registration_request; /**< If true, indications of type "duplicate_mpcp_registration_request" will be generated. */
+    bcmos_bool encryption_enabled;                  /**< If true, indications of type "encryption_enabled" will be generated. */
+    bcmos_bool key_exchange_failure;                /**< If true, indications of type "key_exchange_failure" will be generated. */
+    bcmos_bool key_exchange_started;                /**< If true, indications of type "key_exchange_started" will be generated. */
+    bcmos_bool key_exchange_stopped;                /**< If true, indications of type "key_exchange_stopped" will be generated. */
+    bcmos_bool link_deleted;                        /**< If true, indications of type "link_deleted" will be generated. */
+    bcmos_bool link_speed_mismatch;                 /**< If true, indications of type "link_speed_mismatch" will be generated. */
+    bcmos_bool mpcp_deregistered;                   /**< If true, indications of type "mpcp_deregistered" will be generated. */
+    bcmos_bool mpcp_discovered;                     /**< If true, indications of type "mpcp_discovered" will be generated. */
+    bcmos_bool mpcp_reg_ack_timeout;                /**< If true, indications of type "mpcp_reg_ack_timeout" will be generated. */
+    bcmos_bool mpcp_report_timeout;                 /**< If true, indications of type "mpcp_report_timeout" will be generated. */
+    bcmos_bool oam_keepalive_timeout;               /**< If true, indications of type "oam_keepalive_timeout" will be generated. */
+    bcmos_bool oam_keepalive_timer_started;         /**< If true, indications of type "oam_keepalive_timer_started" will be generated. */
+    bcmos_bool oam_keepalive_timer_stopped;         /**< If true, indications of type "oam_keepalive_timer_stopped" will be generated. */
+    bcmos_bool preprovisioned_link_created;         /**< If true, indications of type "preprovisioned_link_created" will be generated. */
+    bcmos_bool protection_switch_occurred;          /**< If true, indications of type "protection_switch_occurred" will be generated. */
+    bcmos_bool range_value_changed;                 /**< If true, indications of type "range_value_changed" will be generated. */
+    bcmos_bool rerange_failure;                     /**< If true, indications of type "rerange_failure" will be generated. */
+    bcmos_bool stat_alarm_cleared;                  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;                   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool static_registration_done;            /**< If true, indications of type "static_registration_done" will be generated. */
+} bcmolt_epon_link_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_epon_link_key key;               /**< Object key. */
+    bcmolt_epon_link_auto_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_link_auto_cfg;
+
+/** Transport message definition for "delete_link" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_delete_link
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_delete_link;
+
+/** Transport message definition for "force_rediscovery" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_force_rediscovery
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_force_rediscovery;
+
+/** Structure definition for the "key_exchange_start" group of the "epon_link" 
+ * object. 
+ *
+ * Apply the corresponding provisioning for 'epon_link.key_exchange_config' 
+ * against this link and then start key exchange timer with the given period. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_start_data
+{
+    uint16_t period;    /**< Key exchange period in seconds. */
+} bcmolt_epon_link_key_exchange_start_data;
+
+/** Transport message definition for "key_exchange_start" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_start
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_key_exchange_start_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_link_key_exchange_start;
+
+/** Transport message definition for "key_exchange_stop" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_key_exchange_stop
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_key_exchange_stop;
+
+/** Structure definition for the "oam_keepalive_timer_start" group of the 
+ * "epon_link" object. 
+ *
+ * Start the OAM keepalive timer against this link. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timer_start_data
+{
+    uint16_t send_period;   /**< The period at which to send OAM info frames (in seconds). */
+} bcmolt_epon_link_oam_keepalive_timer_start_data;
+
+/** Transport message definition for "oam_keepalive_timer_start" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timer_start
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_oam_keepalive_timer_start_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_link_oam_keepalive_timer_start;
+
+/** Transport message definition for "oam_keepalive_timer_stop" group of 
+ * "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_oam_keepalive_timer_stop
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+} bcmolt_epon_link_oam_keepalive_timer_stop;
+
+/** Structure definition for the "static_registration" group of the "epon_link" 
+ * object. 
+ *
+ * Statically registers the logical link 
+ */
+typedef struct bcmolt_epon_link_static_registration_data
+{
+    bcmolt_time_quanta laseron_time_tq;     /**< Laser-on time in time quanta.\ */
+    bcmolt_time_quanta laseroff_time_tq;    /**< Laser-off time in time quanta. */
+    bcmolt_time_quanta range_value_tq;      /**< Range value used for this link - in time quanta. */
+    uint8_t pending_grants;                 /**< The number of pending grants. */
+} bcmolt_epon_link_static_registration_data;
+
+/** Transport message definition for "static_registration" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_static_registration
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_static_registration_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_link_static_registration;
+
+/** Structure definition for the "inject_frame" group of the "epon_link" object. 
+ *
+ * Send an arbitrary frame across the specified link. 
+ */
+typedef struct bcmolt_epon_link_inject_frame_data
+{
+    bcmolt_ethernet_frame_unmasked frame;   /**< Complete contents of the frame beginning with the DA up through but not including the CRC. */
+} bcmolt_epon_link_inject_frame_data;
+
+/** Transport message definition for "inject_frame" group of "epon_link" object. 
+ */
+typedef struct bcmolt_epon_link_inject_frame
+{
+    bcmolt_proxy hdr;           /**< Transport header. */
+    bcmolt_epon_link_key key;   /**< Object key. */
+    bcmolt_epon_link_inject_frame_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_link_inject_frame;
+
+/** Structure definition for the "frame_captured" group of the "epon_link" 
+ * object. 
+ *
+ * A frame matching host-specified criteria was received. 
+ */
+typedef struct bcmolt_epon_link_frame_captured_data
+{
+    bcmolt_u8_list_u32 frame;   /**< Contents of the frame. */
+} bcmolt_epon_link_frame_captured_data;
+
+/** Transport message definition for "frame_captured" group of "epon_link" 
+ * object. 
+ */
+typedef struct bcmolt_epon_link_frame_captured
+{
+    bcmolt_proxy_rx hdr;                        /**< Transport header. */
+    bcmolt_epon_link_key key;                   /**< Object key. */
+    bcmolt_epon_link_frame_captured_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_link_frame_captured;
+
+/** Structure definition for the "key" group of the "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_key
+{
+    bcmolt_epon_ni epon_ni; /**< The index of a specific EPON NI instance as seen by the host. */
+} bcmolt_epon_ni_key;
+
+/** Structure definition for the "cfg" group of the "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_cfg_data
+{
+    bcmos_mac_address mac_address;      /**< The MAC address used for all frames generated by the OLT on the PON.  This value must be set before EPON_NI is first enabled, and cannot be changed while the EPON_NI is enabled. */
+    bcmolt_epon_ni_en_state epon_ni_en; /**< Indicates the enable state of the EPON NI. */
+    bcmolt_registration_behavior registration_behavior; /**< Determines how registration requests from unknown links are handled.  Set to 'Notify Unknown' to force all links to be pre-provisioned.  If in 'Notify Unknown' mode, MPCP Registration of an unknown link will be denied, and a 'White List Violation" will be sent to the host. If set to 'Automatic', the link registers fully without host interaction.  */
+    uint16_t mtu_1g;                        /**< Maximum frame size (including FCS) on the 1G path. This attribute cannot be changed on an enabled EPON_NI. This attribute cannot be an odd value. */
+    uint16_t mtu_10g;                       /**< Maximum frame size (including FCS) on the 10G path. This attribute cannot be changed on an enabled EPON_NI. This attribute cannot be an odd value. */
+    bcmolt_meters minimum_fiber_length;     /**< The minimum fiber length, in meters, at which we expect to find an ONU. Notes: The difference between the minimum and maximum fiber length cannot exceed 100 km. This attribute cannot be changed on an enabled EPON_NI. Some ONUs can register at distances that are less than the provisioned minimum. */
+    bcmolt_meters maximum_fiber_length;     /**< The maximum fiber length, in meters, at which we expect to find an ONU. Notes: The difference between the minimum and maximum fiber length cannot exceed 100 km. This attribute cannot be changed on an enabled EPON_NI. Some ONUs can register at distances that are greater than the provisioned maximum. */
+    bcmolt_time_quanta grant_spacing_tq;    /**< The dead time on the PON between upstream bursts.  This attribute cannot be changed on an enabled EPON_NI. */
+    bcmolt_epon_logical_link_options epon_logical_link_options; /**< Configuration related to EPON links registration and reporting. This value cannot be changed on an enabled EPON_NI. */
+    uint32_t mpcp_discovery_period_ms;              /**< Period of MPCP discovery windows.  In this time period, one discovery gate will be sent for every enabled RP.  The discovery gates will be spaced equally across the time period. */
+    bcmolt_epon_ni_alarm_state alarm_state;         /**< The state of the alarms on this EPON NI. */
+    bcmolt_macaddress_list_u32_max_2048 all_links;  /**< List of all links on the EPON NI. */
+    bcmolt_epon_ni_encryption_cfg encryption_cfg;   /**< Encryption configuration that applies to the EPON NI as a whole. */
+    bcmolt_epon_protection_switching_configuration protection_switching_cfg;    /**< Protection switching configuration. */
+    bcmolt_epon_clock_transport_configuration clock_transport_cfg;              /**< Clock transport configuration. */
+#define BCMOLT_EPON_NI_CFG_DATA_DROPDOWN_WEIGHTS_LEN    7
+    bcmolt_arr_u16_7 dropdown_weights;                  /**< The solicited scheduling drop down weights for priorities 0-6 (percentages relative to that priority). Priority 7 has no drop-down, as it is the lowest priority. The drop-down weights are how much bandwidth to allocate to solicited schedulers at the next lower priority level (even when elements at this level are still active).  This is NOT the percentage allocated to the drop down, it is the ratio between a priority and its dropdown */
+#define BCMOLT_EPON_NI_CFG_DATA_APPROXIMATE_SOLICITED_USAGE_LEN 8
+    bcmolt_arr_bounds_8 approximate_solicited_usage;    /**< The approximate percentage of the PON time necessary to schedule all elements at or above each priority. */
+    uint32_t approximate_tdm_usage;                     /**< The approximate percentage of the PON time necessary to accomodate all TDM grants. */
+    uint16_t no_reports_soak_time;                      /**< Period of time after last report received to send no reports alarm (in ms). */
+    bcmolt_pon_aggregate_shaper pon_aggregate_shaper;   /**< PON Aggregate Shaper. */
+#define BCMOLT_EPON_NI_CFG_DATA_ESTIMATED_PON_LATENCY_TQ_LEN    8
+    bcmolt_arr_bounds_8 estimated_pon_latency_tq;       /**< The estimated time between when the OLT receives a non-zero report from an ONU and when the OLT will generate a grant to that ONU for each priority level. */
+    bcmolt_epon_onu_upgrade_params onu_upgrade_params;  /**< ONU upgrade params. */
+    bcmos_bool auto_rogue_detect_10g_en;                /**< Enable 10G Autonomous Rogue Dection during discovery window */
+    bcmos_bool auto_rogue_detect_1g_en;                 /**< Enable 1G Autonomous Rogue Dection during discovery window */
+    uint8_t auto_rogue_detect_10g_threshold;            /**< Set threshold for number of SyncPatterns received without a Burst Delimiter to trigger the fault. */
+} bcmolt_epon_ni_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_ni_key key;         /**< Object key. */
+    bcmolt_epon_ni_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_cfg;
+
+/** Transport message definition for "auto_rogue_scan_10g_failure" group of 
+ * "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_auto_rogue_scan_10g_failure
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+} bcmolt_epon_ni_auto_rogue_scan_10g_failure;
+
+/** Transport message definition for "auto_rogue_scan_1g_failure" group of 
+ * "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_auto_rogue_scan_1g_failure
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+} bcmolt_epon_ni_auto_rogue_scan_1g_failure;
+
+/** Structure definition for the "llid_quarantined" group of the "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_llid_quarantined_data
+{
+    bcmolt_epon_llid llid;              /**< LLID. */
+    bcmolt_epon_link_rate link_rate;    /**< Link Rate. */
+    bcmos_mac_address link_mac;         /**< Link MAC. */
+    bcmolt_time_quanta range_value_tq;  /**< Range value in time quanta. */
+} bcmolt_epon_ni_llid_quarantined_data;
+
+/** Transport message definition for "llid_quarantined" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_llid_quarantined
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_llid_quarantined_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_llid_quarantined;
+
+/** Structure definition for the "mpcp_timestamp_changed" group of the "epon_ni" 
+ * object. 
+ *
+ * A clock transport pulse was received at the given MPCP timestamp. 
+ */
+typedef struct bcmolt_epon_ni_mpcp_timestamp_changed_data
+{
+    uint32_t mpcp_timestamp;    /**< The MPCP time at which the pulse was received. */
+} bcmolt_epon_ni_mpcp_timestamp_changed_data;
+
+/** Transport message definition for "mpcp_timestamp_changed" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_mpcp_timestamp_changed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_mpcp_timestamp_changed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_mpcp_timestamp_changed;
+
+/** Structure definition for the "no_reports" group of the "epon_ni" object. 
+ *
+ * Loss of all reports on all links on the EPON NI 
+ */
+typedef struct bcmolt_epon_ni_no_reports_data
+{
+    bcmolt_status alarm_status; /**< Alarm Status. */
+} bcmolt_epon_ni_no_reports_data;
+
+/** Transport message definition for "no_reports" group of "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_no_reports
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_epon_ni_key key;                 /**< Object key. */
+    bcmolt_epon_ni_no_reports_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_no_reports;
+
+/** Structure definition for the "onu_upgrade_complete" group of the "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_onu_upgrade_complete_data
+{
+    bcmos_bool status;  /**< Success or failure.  Against entire upgrade process. */
+    bcmolt_epon_onu_upgrade_status_list_u32 list_of_failed_entities;    /**< List of ONU-IDs the upgrade failed for. */
+} bcmolt_epon_ni_onu_upgrade_complete_data;
+
+/** Transport message definition for "onu_upgrade_complete" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_onu_upgrade_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_onu_upgrade_complete_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_onu_upgrade_complete;
+
+/** Transport message definition for "rerange_failure" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_rerange_failure
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+} bcmolt_epon_ni_rerange_failure;
+
+/** Structure definition for the "rogue_scan_complete" group of the "epon_ni" 
+ * object. 
+ *
+ * Indciation that a scan is complete, any error is also returned.  
+ */
+typedef struct bcmolt_epon_ni_rogue_scan_complete_data
+{
+    bcmolt_rogue_scan_status return_ind_status; /**< Status of completed scan. */
+} bcmolt_epon_ni_rogue_scan_complete_data;
+
+/** Transport message definition for "rogue_scan_complete" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_rogue_scan_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_rogue_scan_complete_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_rogue_scan_complete;
+
+/** Structure definition for the "rssi_measurement_completed" group of the 
+ * "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_rssi_measurement_completed_data
+{
+    bcmolt_result status;       /**< status. */
+    bcmolt_epon_llid llid;      /**< LLID. */
+    bcmos_mac_address link_mac; /**< Link MAC . */
+} bcmolt_epon_ni_rssi_measurement_completed_data;
+
+/** Transport message definition for "rssi_measurement_completed" group of 
+ * "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_rssi_measurement_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_rssi_measurement_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_rssi_measurement_completed;
+
+/** Structure definition for the "state_change_completed" group of the "epon_ni" 
+ * object. 
+ *
+ * Sent after a 'set_epon_ni_en_state' operation has completed. 
+ */
+typedef struct bcmolt_epon_ni_state_change_completed_data
+{
+    bcmolt_epon_ni_en_state new_state;  /**< New EPON NI enable state. */
+} bcmolt_epon_ni_state_change_completed_data;
+
+/** Transport message definition for "state_change_completed" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_state_change_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_state_change_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_state_change_completed;
+
+/** Structure definition for the "auto_cfg" group of the "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_auto_cfg_data
+{
+    bcmos_bool auto_rogue_scan_10g_failure; /**< If true, indications of type "auto_rogue_scan_10g_failure" will be generated. */
+    bcmos_bool auto_rogue_scan_1g_failure;  /**< If true, indications of type "auto_rogue_scan_1g_failure" will be generated. */
+    bcmos_bool llid_quarantined;            /**< If true, indications of type "llid_quarantined" will be generated. */
+    bcmos_bool mpcp_timestamp_changed;      /**< If true, indications of type "mpcp_timestamp_changed" will be generated. */
+    bcmos_bool no_reports;                  /**< If true, indications of type "no_reports" will be generated. */
+    bcmos_bool onu_upgrade_complete;        /**< If true, indications of type "onu_upgrade_complete" will be generated. */
+    bcmos_bool rerange_failure;             /**< If true, indications of type "rerange_failure" will be generated. */
+    bcmos_bool rogue_scan_complete;         /**< If true, indications of type "rogue_scan_complete" will be generated. */
+    bcmos_bool rssi_measurement_completed;  /**< If true, indications of type "rssi_measurement_completed" will be generated. */
+    bcmos_bool state_change_completed;      /**< If true, indications of type "state_change_completed" will be generated. */
+} bcmolt_epon_ni_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_epon_ni_key key;             /**< Object key. */
+    bcmolt_epon_ni_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_auto_cfg;
+
+/** Structure definition for the "add_link" group of the "epon_ni" object. 
+ *
+ * Pre-provision an EPON link. 
+ */
+typedef struct bcmolt_epon_ni_add_link_data
+{
+    bcmos_mac_address mac_address;  /**< The MAC address of the EPON link. */
+    bcmolt_epon_link_rate rate;     /**< Rate of link to pre-provision. */
+} bcmolt_epon_ni_add_link_data;
+
+/** Transport message definition for "add_link" group of "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_add_link
+{
+    bcmolt_oper hdr;                    /**< Transport header. */
+    bcmolt_epon_ni_key key;             /**< Object key. */
+    bcmolt_epon_ni_add_link_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_add_link;
+
+/** Structure definition for the "add_multicast_link" group of the "epon_ni" 
+ * object. 
+ *
+ * Pre-provision an EPON multicast link. 
+ */
+typedef struct bcmolt_epon_ni_add_multicast_link_data
+{
+    bcmos_mac_address mac_address;  /**< The MAC address of the EPON link. */
+    bcmolt_epon_link_rate rate;     /**< Rate of link to pre-provision. */
+} bcmolt_epon_ni_add_multicast_link_data;
+
+/** Transport message definition for "add_multicast_link" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_add_multicast_link
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_add_multicast_link_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_add_multicast_link;
+
+/** Structure definition for the "add_protected_standby_link" group of the 
+ * "epon_ni" object. 
+ *
+ * Adds a protected standby link.  Once it has been created, the link is 
+ * considered "standby" for the puposes of protection switching. 
+ */
+typedef struct bcmolt_epon_ni_add_protected_standby_link_data
+{
+    bcmos_mac_address mac_address;              /**< The MAC address of the EPON link. */
+    bcmolt_epon_link_info working_link_info;    /**< Link info for the associated working link. */
+} bcmolt_epon_ni_add_protected_standby_link_data;
+
+/** Transport message definition for "add_protected_standby_link" group of 
+ * "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_add_protected_standby_link
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_add_protected_standby_link_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_add_protected_standby_link;
+
+/** Structure definition for the "issue_rssi_grant" group of the "epon_ni" 
+ * object. 
+ *
+ * Issues an RSSI grant to read RX Power 
+ */
+typedef struct bcmolt_epon_ni_issue_rssi_grant_data
+{
+    bcmos_mac_address granted_link; /**< Logical link to grant, which should either be associated with a particular unicast link of interest on the PON or, 0 for idle power measurement. 0 will use a link that will not result in upstream transmission by any device on the PON. */
+    uint16_t trigger_width;         /**< RSSI Trigger Width (Tw) in ns, Desired width of RSSI Trigger based on the Optical Module Specifications. */
+    uint16_t trigger_delay;         /**< RSSI Trigger Delay(Td), in ns, for this link to meet the (Td) delay timing requirement of the Optical Module Specifications. */
+    uint16_t sample_period;         /**< Sample period in us, internal I2C hold/prohibit time where access to device is not allowed. */
+} bcmolt_epon_ni_issue_rssi_grant_data;
+
+/** Transport message definition for "issue_rssi_grant" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_issue_rssi_grant
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_issue_rssi_grant_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_issue_rssi_grant;
+
+/** Structure definition for the "protection_switching_apply_rerange_delta" 
+ * group of the "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_protection_switching_apply_rerange_delta_data
+{
+    uint32_t rerange_delta; /**< Re-range delta. */
+} bcmolt_epon_ni_protection_switching_apply_rerange_delta_data;
+
+/** Transport message definition for "protection_switching_apply_rerange_delta" 
+ * group of "epon_ni" object. 
+ */
+typedef struct bcmolt_epon_ni_protection_switching_apply_rerange_delta
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_protection_switching_apply_rerange_delta_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_protection_switching_apply_rerange_delta;
+
+/** Structure definition for the "rogue_llid_scan" group of the "epon_ni" 
+ * object. 
+ *
+ * Issue a request to scan all LLIDs or a specific LLID on a PON 
+ */
+typedef struct bcmolt_epon_ni_rogue_llid_scan_data
+{
+    bcmos_bool mode;        /**< True = Scan all LLIDS on the PON */
+    bcmolt_epon_llid llid;  /**< Specific LLID to scan or 0 to scan all when mode is ALL */
+} bcmolt_epon_ni_rogue_llid_scan_data;
+
+/** Transport message definition for "rogue_llid_scan" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_rogue_llid_scan
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_rogue_llid_scan_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_rogue_llid_scan;
+
+/** Structure definition for the "set_epon_ni_en_state" group of the "epon_ni" 
+ * object. 
+ *
+ * Set the EPON NI enable state. 
+ */
+typedef struct bcmolt_epon_ni_set_epon_ni_en_state_data
+{
+    bcmolt_epon_ni_en_state new_state;  /**< New EPON NI enable state. */
+} bcmolt_epon_ni_set_epon_ni_en_state_data;
+
+/** Transport message definition for "set_epon_ni_en_state" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_set_epon_ni_en_state
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_set_epon_ni_en_state_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_set_epon_ni_en_state;
+
+/** Structure definition for the "start_onu_upgrade" group of the "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_start_onu_upgrade_data
+{
+    bcmolt_macaddress_list_u32 list_of_onu_ids; /**< List of ONUs to upgrade the firmware. */
+} bcmolt_epon_ni_start_onu_upgrade_data;
+
+/** Transport message definition for "start_onu_upgrade" group of "epon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_epon_ni_start_onu_upgrade
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_epon_ni_key key; /**< Object key. */
+    bcmolt_epon_ni_start_onu_upgrade_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_ni_start_onu_upgrade;
+
+/** Structure definition for the "key" group of the "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_key
+{
+    bcmolt_epon_ni epon_ni;     /**< EPON NI with which this ONU interface is associated. */
+    bcmolt_epon_onu_id onu_id;  /**< Unique identifier of the ONU interface within its EPON NI. */
+} bcmolt_epon_onu_10g_us_key;
+
+/** Structure definition for the "cfg" group of the "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_cfg_data
+{
+    bcmolt_macaddress_list_u32_max_2048 all_links;  /**< List of MAC Addresses for all links on the ONU Id. */
+} bcmolt_epon_onu_10g_us_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key; /**< Object key. */
+    bcmolt_epon_onu_10g_us_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_cfg;
+
+/** Structure definition for the "stat" group of the "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_data
+{
+    uint64_t fec_code_words_total;          /**< FEC stats code words total */
+    uint64_t fec_code_words_decode_fails;   /**< FEC stats code words decode fails */
+    uint64_t fec_zeroes_corrected;          /**< FEC stats zeros corrected */
+    uint64_t fec_ones_corrected;            /**< FEC stats ones corected */
+} bcmolt_epon_onu_10g_us_stat_data;
+
+/** Transport message definition for "stat" group of "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat
+{
+    bcmolt_stat hdr;                        /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key;         /**< Object key. */
+    bcmolt_epon_onu_10g_us_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_onu_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_onu_10g_us_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_onu_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_cfg
+{
+    bcmolt_stat_cfg hdr;            /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key; /**< Object key. */
+    bcmolt_epon_onu_10g_us_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_onu_10g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_alarm_cleared_data
+{
+    bcmolt_epon_onu_10g_us_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_onu_10g_us_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key; /**< Object key. */
+    bcmolt_epon_onu_10g_us_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_onu_10g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_alarm_raised_data
+{
+    bcmolt_epon_onu_10g_us_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_onu_10g_us_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_onu_10g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key; /**< Object key. */
+    bcmolt_epon_onu_10g_us_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_onu_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_onu_10g_us_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_onu_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_10g_us_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_onu_10g_us_key key;             /**< Object key. */
+    bcmolt_epon_onu_10g_us_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_10g_us_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_key
+{
+    bcmolt_epon_ni epon_ni;     /**< EPON NI with which this ONU interface is associated. */
+    bcmolt_epon_onu_id onu_id;  /**< Unique identifier of the ONU interface within its EPON NI. */
+} bcmolt_epon_onu_1g_us_key;
+
+/** Structure definition for the "cfg" group of the "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_cfg_data
+{
+    bcmolt_macaddress_list_u32 all_links;   /**< List of MAC Addresses for all links on the ONU Id. */
+} bcmolt_epon_onu_1g_us_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;  /**< Object key. */
+    bcmolt_epon_onu_1g_us_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_cfg;
+
+/** Structure definition for the "stat" group of the "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_data
+{
+    uint64_t good_frames;           /**< Good Frame Count, including nonFEC and FEC */
+    uint64_t good_bytes;            /**< Good Byte Count, including nonFEC and FEC */
+    uint64_t oversz_frames;         /**< Oversized frame count (frames larger than 2000 bytes) */
+    uint64_t non_fec_good_frames;   /**< Non FEC Good Frame Count */
+    uint64_t non_fec_good_bytes;    /**< Non FEC Good Byte Count */
+    uint64_t fec_good_frames;       /**< FEC Good Frame Count */
+    uint64_t fec_good_bytes;        /**< FEC Good Byte Count */
+    uint64_t fec_frames_exc_errs;   /**< FEC Frames which exceeded 8 symbol errors */
+    uint64_t fec_blks_no_errs;      /**< FEC Blocks with no errors */
+    uint64_t fec_blks_corr_errs;    /**< FEC Blocks with correctable errors */
+    uint64_t fec_blks_uncorr_errs;  /**< FEC Blocks with uncorrectable errors */
+    uint64_t fec_corr_bytes;        /**< FEC Corrected Bytes/Symbols */
+    uint64_t fec_corr_zeroes;       /**< FEC Corrected Zeroes, 8b domain */
+    uint64_t fec_corr_ones;         /**< FEC Corrected Ones, 8b domain */
+    uint64_t undersz_frames;        /**< Undersize frame count (frames less than 64 bytes) */
+    uint64_t errorsz_frames;        /**< Errored frame  */
+} bcmolt_epon_onu_1g_us_stat_data;
+
+/** Transport message definition for "stat" group of "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat
+{
+    bcmolt_stat hdr;                        /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;          /**< Object key. */
+    bcmolt_epon_onu_1g_us_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_onu_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_onu_1g_us_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_onu_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_cfg
+{
+    bcmolt_stat_cfg hdr;            /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;  /**< Object key. */
+    bcmolt_epon_onu_1g_us_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_onu_1g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_alarm_cleared_data
+{
+    bcmolt_epon_onu_1g_us_stat_id stat; /**< Statistic identifier. */
+} bcmolt_epon_onu_1g_us_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;  /**< Object key. */
+    bcmolt_epon_onu_1g_us_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_onu_1g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_alarm_raised_data
+{
+    bcmolt_epon_onu_1g_us_stat_id stat; /**< Statistic identifier. */
+} bcmolt_epon_onu_1g_us_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_onu_1g_us" object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;  /**< Object key. */
+    bcmolt_epon_onu_1g_us_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_onu_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_onu_1g_us_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_onu_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_onu_1g_us_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_onu_1g_us_key key;              /**< Object key. */
+    bcmolt_epon_onu_1g_us_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_onu_1g_us_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_key
+{
+    bcmolt_epon_ni epon_ni; /**< EPON NI associated with this 10G downstream path. */
+} bcmolt_epon_path_10g_ds_key;
+
+/** Structure definition for the "cfg" group of the "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_cfg_data
+{
+    bcmolt_epon_fec_en_state fec_state; /**< FEC enable state for the 10G downstream path on this EPON NI.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_prbs_generator_config prbs_generator;    /**< DS PRBS generator configuration */
+} bcmolt_epon_path_10g_ds_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_ds_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_cfg;
+
+/** Structure definition for the "stat" group of the "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes transmitted on this 10g downstream path. */
+    uint64_t frames;            /**< The number of frames transmitted on this 10g downstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames transmitted on this 10g downstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames transmitted on this 10g downstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames transmitted on this 10g downstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes transmitted on this 10g downstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames transmitted on this 10g downstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames transmitted on this 10g downstream path. */
+    uint64_t oam_bytes;         /**< Number of OAM bytes transmitted on this 10g downstream path. */
+    uint64_t oam_frames;        /**< Number of OAM frames transmitted on this 10g downstream path. */
+    uint64_t gate_frames;       /**< Number of gate frames transmitted on this 10g downstream path. */
+    uint64_t mpcp_frames;       /**< Number of MPCP frames transmitted on this 10g downstream path. */
+    uint64_t abort_frames;      /**< Number of abort frames transmitted on this 10g downstream path. */
+} bcmolt_epon_path_10g_ds_stat_data;
+
+/** Transport message definition for "stat" group of "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_ds_stat_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_path_10g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_path_10g_ds_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_path_10g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;            /**< Object key. */
+    bcmolt_epon_path_10g_ds_stat_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_path_10g_ds" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_alarm_cleared_data
+{
+    bcmolt_epon_path_10g_ds_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_epon_path_10g_ds_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_ds_stat_alarm_cleared_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_path_10g_ds" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_alarm_raised_data
+{
+    bcmolt_epon_path_10g_ds_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_epon_path_10g_ds_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_path_10g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_stat_alarm_raised
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_ds_stat_alarm_raised_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_path_10g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_path_10g_ds_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_path_10g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_ds_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_10g_ds_key key;            /**< Object key. */
+    bcmolt_epon_path_10g_ds_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_ds_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_key
+{
+    bcmolt_epon_ni epon_ni; /**< EPON NI associated with this 10G upstream path. */
+} bcmolt_epon_path_10g_us_key;
+
+/** Structure definition for the "cfg" group of the "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_cfg_data
+{
+    bcmolt_epon_fec_en_state fec_state;         /**< FEC enable state for the 10G upstream path on this EPON NI.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_time_quanta sync_time_tq;            /**< Time quanta of sync at start of US burst.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_prbs_checker_config prbs_checker;    /**< US PRBS checker configuration */
+    bcmolt_prbs_status prbs_status;             /**< Result of US PRBS checker */
+} bcmolt_epon_path_10g_us_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_us_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_cfg;
+
+/** Structure definition for the "stat" group of the "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes received on this 10g upstream path. */
+    uint64_t frames;            /**< The number of frames received on this 10g upstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames received on this 10g upstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames received on this 10g upstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames received on this 10g upstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames received on this 10g upstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames received on this 10g upstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames received on this 10g upstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames received on this 10g upstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames received on this 10g upstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames received on this 10g upstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames received on this 10g upstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames received on this 10g upstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes received on this 10g upstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames received on this 10g upstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames received on this 10g upstream path. */
+    uint64_t mpcp_frames;       /**< The number of MPCP frames received on this 10g upstream path. */
+    uint64_t oam_bytes;         /**< The number of OAM bytes received on this 10g upstream path. */
+    uint64_t oam_frames;        /**< The number of OAM frames received on this 10g upstream path. */
+    uint64_t report_frames;     /**< The number of report frames received on this 10g upstream path. */
+    uint64_t abort_frames;      /**< The number of abort frames received on this 10g upstream path. */
+    uint64_t fcs_error;         /**< The number of bad FCS errors received on this 10g upstream path. */
+    uint64_t crc_8_error;       /**< The number of CRC8 errors received on this 10g upstream path. */
+    uint64_t out_of_slot;       /**< The number of out of slot errors received on this 10g upstream path. */
+    uint64_t oversize_error;    /**< The number of oversize errors received on this 10g upstream path. */
+    uint64_t runt_error;        /**< The number of runt errors received on this 10g upstream path. */
+} bcmolt_epon_path_10g_us_stat_data;
+
+/** Transport message definition for "stat" group of "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_us_stat_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_path_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_path_10g_us_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_path_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;            /**< Object key. */
+    bcmolt_epon_path_10g_us_stat_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_path_10g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_alarm_cleared_data
+{
+    bcmolt_epon_path_10g_us_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_epon_path_10g_us_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_us_stat_alarm_cleared_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_path_10g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_alarm_raised_data
+{
+    bcmolt_epon_path_10g_us_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_epon_path_10g_us_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_path_10g_us" object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_stat_alarm_raised
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;    /**< Object key. */
+    bcmolt_epon_path_10g_us_stat_alarm_raised_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_path_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_path_10g_us_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_path_10g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_10g_us_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_10g_us_key key;            /**< Object key. */
+    bcmolt_epon_path_10g_us_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_10g_us_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_key
+{
+    bcmolt_epon_ni epon_ni; /**< EPON NI associated with this 1G downstream path. */
+} bcmolt_epon_path_1g_ds_key;
+
+/** Structure definition for the "cfg" group of the "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_cfg_data
+{
+    bcmolt_epon_fec_en_state default_fec_state; /**< Default FEC enable state for the 1G downstream path on this EPON NI.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_raman_mitigation_mode raman_mode;    /**< Raman mitigation mode for the 1G downstream path on this EPON NI.  Raman mitigation cannot coexist with turbo mode.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_epon_1g_turbo_mode turbo_2g_mode;    /**< Operate the 1G downstream path at the turbo 2G data rate on this EPON NI.  Raman mitigation cannot coexist with turbo mode.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_prbs_generator_config prbs_generator;    /**< DS PRBS generator configuration */
+} bcmolt_epon_path_1g_ds_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key; /**< Object key. */
+    bcmolt_epon_path_1g_ds_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_cfg;
+
+/** Structure definition for the "stat" group of the "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes transmitted on this 1g downstream path. */
+    uint64_t frames;            /**< The number of frames transmitted on this 1g downstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames transmitted on this 1g downstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames transmitted on this 1g downstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames transmitted on this 1g downstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes transmitted on this 1g downstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames transmitted on this 1g downstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames transmitted on this 1g downstream path. */
+    uint64_t oam_bytes;         /**< Number of OAM bytes transmitted on this 1g downstream path. */
+    uint64_t oam_frames;        /**< Number of OAM frames transmitted on this 1g downstream path. */
+    uint64_t gate_frames;       /**< Number of gate frames transmitted on this 1g downstream path. */
+    uint64_t mpcp_frames;       /**< Number of MPCP frames transmitted on this 1g downstream path. */
+    uint64_t abort_frames;      /**< Number of abort frames transmitted on this 1g downstream path. */
+} bcmolt_epon_path_1g_ds_stat_data;
+
+/** Transport message definition for "stat" group of "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key; /**< Object key. */
+    bcmolt_epon_path_1g_ds_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_path_1g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_path_1g_ds_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_path_1g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key;             /**< Object key. */
+    bcmolt_epon_path_1g_ds_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_path_1g_ds" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_alarm_cleared_data
+{
+    bcmolt_epon_path_1g_ds_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_path_1g_ds_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key; /**< Object key. */
+    bcmolt_epon_path_1g_ds_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_path_1g_ds" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_alarm_raised_data
+{
+    bcmolt_epon_path_1g_ds_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_path_1g_ds_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_path_1g_ds" object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key; /**< Object key. */
+    bcmolt_epon_path_1g_ds_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_path_1g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_path_1g_ds_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_path_1g_ds" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_ds_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_1g_ds_key key;             /**< Object key. */
+    bcmolt_epon_path_1g_ds_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_ds_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_key
+{
+    bcmolt_epon_ni epon_ni; /**< EPON NI associated with this 1G upstream path. */
+} bcmolt_epon_path_1g_us_key;
+
+/** Structure definition for the "cfg" group of the "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_cfg_data
+{
+    bcmolt_epon_fec_en_state default_fec_state; /**< Default FEC enable state for the 1G upstream path on this EPON NI.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_time_quanta sync_time_tq;            /**< Time quanta of sync at start of US burst.  This attribute cannot be changed while the EPON_NI is enabled. */
+    bcmolt_prbs_checker_config prbs_checker;    /**< US PRBS checker configuration */
+    bcmolt_prbs_status prbs_status;             /**< Result of US PRBS checker */
+} bcmolt_epon_path_1g_us_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key; /**< Object key. */
+    bcmolt_epon_path_1g_us_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_cfg;
+
+/** Structure definition for the "stat" group of the "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_data
+{
+    uint64_t bytes;             /**< The number of bytes received on this 1g upstream path. */
+    uint64_t frames;            /**< The number of frames received on this 1g upstream path. */
+    uint64_t frames_64;         /**< The number of 64 byte frames received on this 1g upstream path. */
+    uint64_t frames_65_127;     /**< The number of 65 to 127 byte frames received on this 1g upstream path. */
+    uint64_t frames_128_255;    /**< The number of 128 to 255 byte frames received on this 1g upstream path. */
+    uint64_t frames_256_511;    /**< The number of 256 to 511 byte frames received on this 1g upstream path. */
+    uint64_t frames_512_1023;   /**< The number of 512 to 1023 byte frames received on this 1g upstream path. */
+    uint64_t frames_1024_1518;  /**< The number of 1024 to 1518 byte frames received on this 1g upstream path. */
+    uint64_t frames_1519_2047;  /**< The number of 1519 to 2047 byte frames received on this 1g upstream path. */
+    uint64_t frames_2048_4095;  /**< The number of 2048 to 4095 byte frames received on this 1g upstream path. */
+    uint64_t frames_4096_9216;  /**< The number of 4096 to 9216 byte frames received on this 1g upstream path. */
+    uint64_t frames_9217_16383; /**< The number of 9217 to 16383 byte frames received on this 1g upstream path. */
+    uint64_t broadcast_frames;  /**< The number of broadcast frames received on this 1g upstream path. */
+    uint64_t data_bytes;        /**< The number of data bytes received on this 1g upstream path. */
+    uint64_t multicast_frames;  /**< The number of multicast frames received on this 1g upstream path. */
+    uint64_t unicast_frames;    /**< The number of unicast frames received on this 1g upstream path. */
+    uint64_t mpcp_frames;       /**< The number of MPCP frames received on this 1g upstream path. */
+    uint64_t oam_bytes;         /**< The number of OAM bytes received on this 1g upstream path. */
+    uint64_t oam_frames;        /**< The number of OAM frames received on this 1g upstream path. */
+    uint64_t report_frames;     /**< The number of report frames received on this 1g upstream path. */
+    uint64_t abort_frames;      /**< The number of abort frames received on this 1g upstream path. */
+    uint64_t fcs_error;         /**< The number of bad FCS errors received on this 1g upstream path. */
+    uint64_t crc_8_error;       /**< The number of CRC8 errors received on this 1g upstream path. */
+    uint64_t out_of_slot;       /**< The number of out of slot errors received on this 1g upstream path. */
+    uint64_t oversize_error;    /**< The number of oversize errors received on this 1g upstream path. */
+    uint64_t runt_error;        /**< The number of runt errors received on this 1g upstream path. */
+} bcmolt_epon_path_1g_us_stat_data;
+
+/** Transport message definition for "stat" group of "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key; /**< Object key. */
+    bcmolt_epon_path_1g_us_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_stat;
+
+/** Structure definition for the "stat_cfg" group of the "epon_path_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_epon_path_1g_us_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "epon_path_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key;             /**< Object key. */
+    bcmolt_epon_path_1g_us_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "epon_path_1g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_alarm_cleared_data
+{
+    bcmolt_epon_path_1g_us_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_path_1g_us_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key; /**< Object key. */
+    bcmolt_epon_path_1g_us_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "epon_path_1g_us" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_alarm_raised_data
+{
+    bcmolt_epon_path_1g_us_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_epon_path_1g_us_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "epon_path_1g_us" object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key; /**< Object key. */
+    bcmolt_epon_path_1g_us_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "epon_path_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_epon_path_1g_us_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "epon_path_1g_us" 
+ * object. 
+ */
+typedef struct bcmolt_epon_path_1g_us_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_epon_path_1g_us_key key;             /**< Object key. */
+    bcmolt_epon_path_1g_us_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_epon_path_1g_us_auto_cfg;
+
+/** Structure definition for the "key" group of the "epon_rp" object. 
+ */
+typedef struct bcmolt_epon_rp_key
+{
+    bcmolt_epon_ni epon_ni;             /**< EPON NI containing this RP. */
+    bcmolt_epon_link_rate link_rate;    /**< Link rate associated with this RP.  Must be one of 10/10, 10/1, or 1/1. */
+} bcmolt_epon_rp_key;
+
+/** Structure definition for the "cfg" group of the "epon_rp" object. 
+ */
+typedef struct bcmolt_epon_rp_cfg_data
+{
+    bcmolt_epon_llid base_llid;                 /**< Base (lowest) logical link identifier for this RP.  This attribute cannot be changed while the EPON_NI is enabled, nor while any non-system links exist.  The sum of this value and max_links for this RP must be 0x7eff or smaller. */
+    bcmos_bool mpcp_disc_en;                    /**< Governs whether discovery gates for this RP are issued  */
+    bcmolt_time_quanta mpcp_disc_gnt_len_tq;    /**< Length of discovery grants in time quanta for this RP. */
+    uint16_t mpcp_report_timeout;               /**< Number of ms before links are deregistered due to no report received. */
+    uint16_t max_mpcp_reg_per_disc_window;      /**< Maximum number of MPCP registrations per discovery window on this RP (0 indicates unlimited). */
+    uint16_t max_links; /**< Maximum number of links to register on this EPON_RP.  This attribute cannot be changed while the EPON_NI is enabled, nor while any non-system links exist.  The actual limit is dependent on the system mode. */
+    bcmolt_upstream_bandwidth_distribution default_upstream_bandwidth;  /**< Default upstream bandwidth for newly created links. */
+    double rate_of_refraction;  /**< These are magic numbers derived using the process defined in ITU-T G.984.3 Appendix VII (http://www.itu.int/rec/T-REC-G.984.3-200911-S!Amd2/en) and ITU-T G.987.3 Appendix II (http://www.itu.int/rec/T-REC-G.987.3-201010-S/en) */
+} bcmolt_epon_rp_cfg_data;
+
+/** Transport message definition for "cfg" group of "epon_rp" object. 
+ */
+typedef struct bcmolt_epon_rp_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_epon_rp_key key;         /**< Object key. */
+    bcmolt_epon_rp_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_epon_rp_cfg;
+
+/** Structure definition for the "key" group of the "gpio" object. 
+ */
+typedef struct bcmolt_gpio_key
+{
+    uint32_t reserved;          /**< Reserved (set to 0). */
+    bcmolt_gpio_pin gpio_id;    /**< GPIO ID. */
+} bcmolt_gpio_key;
+
+/** Structure definition for the "cfg" group of the "gpio" object. 
+ */
+typedef struct bcmolt_gpio_cfg_data
+{
+    bcmolt_gpio_pin_dir direction;  /**< GPIO PIN direction (input or output) */
+    bcmolt_gpio_value value;        /**< Value to write. */
+} bcmolt_gpio_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpio" object. 
+ */
+typedef struct bcmolt_gpio_cfg
+{
+    bcmolt_cfg hdr;             /**< Transport header. */
+    bcmolt_gpio_key key;        /**< Object key. */
+    bcmolt_gpio_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpio_cfg;
+
+/** Structure definition for the "key" group of the "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_key
+{
+    bcmolt_gpon_ni pon_ni;          /**< PON network interface. */
+    bcmolt_gpon_alloc_id alloc_id;  /**< Alloc ID. */
+} bcmolt_gpon_alloc_key;
+
+/** Structure definition for the "cfg" group of the "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_cfg_data
+{
+    bcmolt_alloc_state state;   /**< Current Alloc ID state */
+    bcmolt_pon_alloc_sla sla;   /**< Alloc ID SLA */
+    bcmolt_gpon_onu_id onu_id;  /**< ONU ID the alloc ID is assigned to */
+    bcmos_bool collect_stats;   /**< Enable statistics collection for this alloc ID */
+} bcmolt_gpon_alloc_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_gpon_alloc_key key;          /**< Object key. */
+    bcmolt_gpon_alloc_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_cfg;
+
+/** Structure definition for the "stat" group of the "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_data
+{
+    uint64_t rx_bytes;  /**< Number of alloc ID received bytes. */
+} bcmolt_gpon_alloc_stat_data;
+
+/** Transport message definition for "stat" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_gpon_alloc_key key;          /**< Object key. */
+    bcmolt_gpon_alloc_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_stat;
+
+/** Structure definition for the "stat_cfg" group of the "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_gpon_alloc_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_gpon_alloc_key key;  /**< Object key. */
+    bcmolt_gpon_alloc_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_stat_cfg;
+
+/** Structure definition for the "configuration_completed" group of the 
+ * "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_configuration_completed_data
+{
+    bcmolt_result status;           /**< Status. */
+    bcmolt_alloc_state new_state;   /**< new state. */
+} bcmolt_gpon_alloc_configuration_completed_data;
+
+/** Transport message definition for "configuration_completed" group of 
+ * "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_configuration_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_alloc_key key;  /**< Object key. */
+    bcmolt_gpon_alloc_configuration_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_configuration_completed;
+
+/** Structure definition for the "get_alloc_stats_completed" group of the 
+ * "gpon_alloc" object. 
+ *
+ * Collected alloc ID statistics from get_stats operation 
+ */
+typedef struct bcmolt_gpon_alloc_get_alloc_stats_completed_data
+{
+    bcmolt_result status;           /**< status. */
+    uint32_t average_nsr_used;      /**< Average NSR used bytes. */
+    uint32_t average_nsr_allocated; /**< Average NSR allocated bytes. */
+    uint32_t average_sr_report;     /**< Average SR report. */
+} bcmolt_gpon_alloc_get_alloc_stats_completed_data;
+
+/** Transport message definition for "get_alloc_stats_completed" group of 
+ * "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_get_alloc_stats_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_alloc_key key;  /**< Object key. */
+    bcmolt_gpon_alloc_get_alloc_stats_completed_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_get_alloc_stats_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "gpon_alloc" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_alarm_cleared_data
+{
+    bcmolt_gpon_alloc_stat_id stat; /**< Statistic identifier. */
+} bcmolt_gpon_alloc_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "gpon_alloc" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_alloc_key key;  /**< Object key. */
+    bcmolt_gpon_alloc_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "gpon_alloc" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_alarm_raised_data
+{
+    bcmolt_gpon_alloc_stat_id stat; /**< Statistic identifier. */
+} bcmolt_gpon_alloc_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "gpon_alloc" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_alloc_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_alloc_key key;  /**< Object key. */
+    bcmolt_gpon_alloc_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_auto_cfg_data
+{
+    bcmos_bool configuration_completed;     /**< If true, indications of type "configuration_completed" will be generated. */
+    bcmos_bool get_alloc_stats_completed;   /**< If true, indications of type "get_alloc_stats_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;          /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;           /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_gpon_alloc_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_gpon_alloc_key key;              /**< Object key. */
+    bcmolt_gpon_alloc_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_auto_cfg;
+
+/** Structure definition for the "get_stats" group of the "gpon_alloc" object. 
+ *
+ * Run statistics collection for a given period of time 
+ */
+typedef struct bcmolt_gpon_alloc_get_stats_data
+{
+    uint32_t num_of_cycles; /**< The number of cycles to run statistics collection */
+} bcmolt_gpon_alloc_get_stats_data;
+
+/** Transport message definition for "get_stats" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_get_stats
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_gpon_alloc_key key;              /**< Object key. */
+    bcmolt_gpon_alloc_get_stats_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_get_stats;
+
+/** Structure definition for the "set_state" group of the "gpon_alloc" object. 
+ *
+ * Sets the alloc's activation state.  This is only used for protection 
+ * switching on an active-standby PON.  In normal operation, this isn't 
+ * necessary since allocs are activated/deactivated automatically along with 
+ * the ONU. 
+ */
+typedef struct bcmolt_gpon_alloc_set_state_data
+{
+    bcmolt_alloc_operation state;   /**< State. */
+} bcmolt_gpon_alloc_set_state_data;
+
+/** Transport message definition for "set_state" group of "gpon_alloc" object. 
+ */
+typedef struct bcmolt_gpon_alloc_set_state
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_gpon_alloc_key key;              /**< Object key. */
+    bcmolt_gpon_alloc_set_state_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_alloc_set_state;
+
+/** Structure definition for the "key" group of the "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_key
+{
+    bcmolt_gpon_ni pon_ni;          /**< PON network interface. */
+    bcmolt_gpon_gem_id gem_port_id; /**< GEM Port ID. */
+} bcmolt_gpon_gem_port_key;
+
+/** Structure definition for the "cfg" group of the "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_cfg_data
+{
+    bcmolt_gem_port_configuration configuration;                /**< GEM port configuration parameters */
+    bcmolt_gpon_onu_id onu_id;                                  /**< ONU ID this GEM port is assigned to */
+    bcmolt_gpon_gem_port_state gem_port_state;                  /**< Current GEM port state */
+    bcmolt_control_state downstream_encryption_mode;            /**< Enable/Disable the downstream encryption mode of the GEM Port */
+    bcmolt_us_gem_port_destination upstream_destination_queue;  /**< The destination queue of the packets arriving on this GEM Port on the upstream direction */
+    bcmolt_control_state control;                       /**< Enable/Disable the GEM Port ID in the OLT */
+    bcmolt_gpon_debug_flow_config debug_flow_config;    /**< Traffic flow debug options */
+    uint16_t mac_table_entry_limit;                     /**< The maximum number of MAC table entries allowed for this GEM port (0 = no limit). */
+} bcmolt_gpon_gem_port_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;       /**< Object key. */
+    bcmolt_gpon_gem_port_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_cfg;
+
+/** Structure definition for the "stat" group of the "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_data
+{
+    uint64_t rx_packets;    /**< Received GEM frames. */
+    uint64_t rx_bytes;      /**< Received bytes. */
+    uint64_t tx_packets;    /**< Transmitted GEM frames. */
+    uint64_t tx_bytes;      /**< Transmitted bytes. */
+} bcmolt_gpon_gem_port_stat_data;
+
+/** Transport message definition for "stat" group of "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;   /**< Object key. */
+    bcmolt_gpon_gem_port_stat_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_stat;
+
+/** Structure definition for the "stat_cfg" group of the "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_gpon_gem_port_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                        /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;               /**< Object key. */
+    bcmolt_gpon_gem_port_stat_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_stat_cfg;
+
+/** Structure definition for the "configuration_completed" group of the 
+ * "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_configuration_completed_data
+{
+    bcmolt_result status;                   /**< status. */
+    bcmolt_gpon_gem_port_state new_state;   /**< new state. */
+} bcmolt_gpon_gem_port_configuration_completed_data;
+
+/** Transport message definition for "configuration_completed" group of 
+ * "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_configuration_completed
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;   /**< Object key. */
+    bcmolt_gpon_gem_port_configuration_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_configuration_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "gpon_gem_port" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_alarm_cleared_data
+{
+    bcmolt_gpon_gem_port_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_gpon_gem_port_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;   /**< Object key. */
+    bcmolt_gpon_gem_port_stat_alarm_cleared_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "gpon_gem_port" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_alarm_raised_data
+{
+    bcmolt_gpon_gem_port_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_gpon_gem_port_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;   /**< Object key. */
+    bcmolt_gpon_gem_port_stat_alarm_raised_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_auto_cfg_data
+{
+    bcmos_bool configuration_completed; /**< If true, indications of type "configuration_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;      /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;       /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_gpon_gem_port_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_gem_port" object. 
+ */
+typedef struct bcmolt_gpon_gem_port_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;               /**< Object key. */
+    bcmolt_gpon_gem_port_auto_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_auto_cfg;
+
+/** Structure definition for the "set_state" group of the "gpon_gem_port" 
+ * object. 
+ *
+ * Sets the GEM port's activation state.  This is only used for protection 
+ * switching on an active-standby PON.  In normal operation, this isn't 
+ * necessary since GEM ports are activated/deactivated automatically along with 
+ * the ONU. 
+ */
+typedef struct bcmolt_gpon_gem_port_set_state_data
+{
+    bcmolt_gem_port_operation state;    /**< State. */
+} bcmolt_gpon_gem_port_set_state_data;
+
+/** Transport message definition for "set_state" group of "gpon_gem_port" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_gem_port_set_state
+{
+    bcmolt_oper hdr;                /**< Transport header. */
+    bcmolt_gpon_gem_port_key key;   /**< Object key. */
+    bcmolt_gpon_gem_port_set_state_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_gem_port_set_state;
+
+/** Structure definition for the "key" group of the "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_key
+{
+    bcmolt_gpon_ni pon_ni;  /**< PON network interface. */
+} bcmolt_gpon_iwf_key;
+
+/** Structure definition for the "cfg" group of the "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_cfg_data
+{
+    bcmolt_iwf_mode iwf_mode;               /**< IWF mapping mode */
+#define BCMOLT_GPON_IWF_CFG_DATA_US_TPID_PER_FLOW_LEN   2
+    bcmolt_arr_u16_2_hex us_tpid_per_flow;  /**< TPID value of the VLAN tag added to upstream packet when IWF mode is set to per flow */
+    uint16_t us_otag_direct_tpid;           /**< TPID value of the VLAN tag added to upstream packet when IWF mode is set to direct mode */
+    uint8_t us_otag_direct_pbit;            /**< P-bit value of the VLAN tag added to upstream packet when IWF mode is set to direct mode */
+#define BCMOLT_GPON_IWF_CFG_DATA_DS_TPID_LEN    5
+    bcmolt_arr_u16_5_hex ds_tpid;           /**< Packets marked with one of the five configured DS TPID options will be forwarded, all the rest will be dropped */
+    bcmolt_mac_table_configuration mac_table_configuration;     /**< MAC table configuration */
+    bcmolt_gpon_iwf_debug_flow_config debug_flow_configuration; /**< MAC table configuration */
+    uint16_t mac_table_count;                       /**< Number of MAC table entries configured in the MAC table */
+    uint16_t forbidden_vlan_flow_gem_range_start;   /**< Forbidden range for Vlans, Flows and Gems start value */
+} bcmolt_gpon_iwf_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_gpon_iwf_key key;        /**< Object key. */
+    bcmolt_gpon_iwf_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_cfg;
+
+/** Structure definition for the "stat" group of the "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_data
+{
+    uint64_t ds_hit_event;              /**< DS hit event. */
+    uint64_t ds_miss_event;             /**< DS miss event. */
+    uint64_t ds_drop_due_to_miss_event; /**< DS drop due to miss event. */
+    uint64_t ds_drop_due_to_hit_event;  /**< DS drop due to hit event. */
+    uint64_t ds_drop_to_disabled_gem;   /**< DS drop to disabled GEM. */
+    uint64_t new_mac_discovered;        /**< New MAC discovered. */
+    uint64_t move_event;                /**< Move event. */
+    uint64_t new_mac_drop_due_to_fifo_full; /**< New MAC drop due to fifo full. */
+} bcmolt_gpon_iwf_stat_data;
+
+/** Transport message definition for "stat" group of "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_gpon_iwf_key key;        /**< Object key. */
+    bcmolt_gpon_iwf_stat_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_stat;
+
+/** Structure definition for the "stat_cfg" group of the "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_gpon_iwf_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_iwf_key key;            /**< Object key. */
+    bcmolt_gpon_iwf_stat_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_stat_cfg;
+
+/** Transport message definition for "flush_mac_table_completed" group of 
+ * "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_flush_mac_table_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+} bcmolt_gpon_iwf_flush_mac_table_completed;
+
+/** Structure definition for the "scan_mac_table_completed" group of the 
+ * "gpon_iwf" object. 
+ *
+ * A MAC table scan initiated using the "scan_mac_table" operation is complete. 
+ */
+typedef struct bcmolt_gpon_iwf_scan_mac_table_completed_data
+{
+    bcmos_mac_address mac_address;  /**< Entry MAC address. */
+    bcmolt_gpon_mac_table_scan_result_list_u16 entries; /**< Scan results for this entry.  If this list is empty, the MAC address was not found in the table. */
+} bcmolt_gpon_iwf_scan_mac_table_completed_data;
+
+/** Transport message definition for "scan_mac_table_completed" group of 
+ * "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_scan_mac_table_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_scan_mac_table_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_scan_mac_table_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "gpon_iwf" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_alarm_cleared_data
+{
+    bcmolt_gpon_iwf_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_gpon_iwf_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "gpon_iwf" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_stat_alarm_cleared_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "gpon_iwf" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_alarm_raised_data
+{
+    bcmolt_gpon_iwf_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_gpon_iwf_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "gpon_iwf" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_stat_alarm_raised_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_auto_cfg_data
+{
+    bcmos_bool flush_mac_table_completed;   /**< If true, indications of type "flush_mac_table_completed" will be generated. */
+    bcmos_bool scan_mac_table_completed;    /**< If true, indications of type "scan_mac_table_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;          /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;           /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_gpon_iwf_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_iwf" object. 
+ */
+typedef struct bcmolt_gpon_iwf_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_iwf_key key;            /**< Object key. */
+    bcmolt_gpon_iwf_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_auto_cfg;
+
+/** Structure definition for the "flush_mac_table" group of the "gpon_iwf" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_flush_mac_table_data
+{
+    bcmolt_flush_mac_table_option control;  /**< control. */
+    bcmolt_vlan_id vid;                     /**< VID. */
+    bcmolt_flow_id flow_id;                 /**< FLOW ID. */
+} bcmolt_gpon_iwf_flush_mac_table_data;
+
+/** Transport message definition for "flush_mac_table" group of "gpon_iwf" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_flush_mac_table
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_flush_mac_table_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_flush_mac_table;
+
+/** Structure definition for the "scan_mac_table" group of the "gpon_iwf" 
+ * object. 
+ *
+ * Scans MAC table for a given MAC address then returns the associated 
+ * information 
+ */
+typedef struct bcmolt_gpon_iwf_scan_mac_table_data
+{
+    bcmos_mac_address mac_address;  /**< Entry MAC address. */
+} bcmolt_gpon_iwf_scan_mac_table_data;
+
+/** Transport message definition for "scan_mac_table" group of "gpon_iwf" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_scan_mac_table
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_gpon_iwf_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_scan_mac_table_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_scan_mac_table;
+
+/** Structure definition for the "key" group of the "gpon_iwf_ds_egress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_egress_flow_key
+{
+    bcmolt_gpon_ni pon_ni;  /**< PON network interface. */
+    bcmolt_flow_id flow_id; /**< Flow ID. */
+} bcmolt_gpon_iwf_ds_egress_flow_key;
+
+/** Structure definition for the "cfg" group of the "gpon_iwf_ds_egress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_egress_flow_cfg_data
+{
+    bcmolt_gpon_gem_id gem_port;    /**< GEM port ID */
+    bcmos_bool pbit_control;        /**< If enabled, the Pbits value is taken from the mapping VLAN tag (Inner/Outer) VLAN Pbits location and added to the configured GEM port ID value to create the Final GEM ID */
+} bcmolt_gpon_iwf_ds_egress_flow_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_iwf_ds_egress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_egress_flow_cfg
+{
+    bcmolt_cfg hdr; /**< Transport header. */
+    bcmolt_gpon_iwf_ds_egress_flow_key key;         /**< Object key. */
+    bcmolt_gpon_iwf_ds_egress_flow_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_ds_egress_flow_cfg;
+
+/** Structure definition for the "key" group of the "gpon_iwf_ds_ingress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_ingress_flow_key
+{
+    bcmolt_gpon_ni pon_ni;  /**< PON network interface. */
+    bcmolt_vlan_id vlan_id; /**< vlan ID. */
+} bcmolt_gpon_iwf_ds_ingress_flow_key;
+
+/** Structure definition for the "cfg" group of the "gpon_iwf_ds_ingress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_ingress_flow_cfg_data
+{
+    bcmolt_vlan_to_flow_mapping_method mapping_method;  /**< The Mapping method defines how the flow ID will be determined */
+    bcmolt_mapping_tag_method mapping_tag;              /**< Define if the outer or the inner VLAN tag of the packet will determine the flow ID */
+    bcmolt_ds_vlan_action vlan_action;                  /**< Define the outer VLAN tag manipulation on the packet: transparent or remove */
+} bcmolt_gpon_iwf_ds_ingress_flow_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_iwf_ds_ingress_flow" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_ds_ingress_flow_cfg
+{
+    bcmolt_cfg hdr; /**< Transport header. */
+    bcmolt_gpon_iwf_ds_ingress_flow_key key;        /**< Object key. */
+    bcmolt_gpon_iwf_ds_ingress_flow_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_ds_ingress_flow_cfg;
+
+/** Structure definition for the "key" group of the "gpon_iwf_mac_table" object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_key
+{
+    bcmolt_gpon_ni pon_ni;          /**< PON network interface. */
+    bcmos_mac_address mac_address;  /**< MAC address. */
+    bcmolt_vlan_id vlan;            /**< VLAN. */
+} bcmolt_gpon_iwf_mac_table_key;
+
+/** Structure definition for the "cfg" group of the "gpon_iwf_mac_table" object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_cfg_data
+{
+    bcmolt_flow_id flow_id;         /**< The flow ID assigned to traffic that matches this MAC table entry. */
+    bcmos_bool stat;                /**< Whether or not the MAC entry is static.  Static entries don't age. */
+    bcmolt_gpon_gem_id gem_port_id; /**< The GEM port ID of the traffic that created this table entry.  This only applies to automatically-learned entries.  Manually-added entries will have the value BCMOLT_PON_GEM_PORT_ID_INVALID. */
+    bcmolt_gpon_onu_id onu_id;      /**< The ONU ID for the traffic that created this table entry.  This only valid if gem_port_id is valid.  Otherwise this will be set to BCMOLT_GPON_ONU_ID_INVALID. */
+} bcmolt_gpon_iwf_mac_table_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_iwf_mac_table" object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+    bcmolt_gpon_iwf_mac_table_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_mac_table_cfg;
+
+/** Transport message definition for "mac_aged" group of "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_mac_aged
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+} bcmolt_gpon_iwf_mac_table_mac_aged;
+
+/** Structure definition for the "mac_dropped" group of the "gpon_iwf_mac_table" 
+ * object. 
+ *
+ * Sent when an entry cannot be learned since the MAC table is full. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_mac_dropped_data
+{
+    bcmolt_flow_id flow_id; /**< The flow ID of the entry that was dropped. */
+} bcmolt_gpon_iwf_mac_table_mac_dropped_data;
+
+/** Transport message definition for "mac_dropped" group of "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_mac_dropped
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+    bcmolt_gpon_iwf_mac_table_mac_dropped_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_mac_table_mac_dropped;
+
+/** Structure definition for the "mac_move" group of the "gpon_iwf_mac_table" 
+ * object. 
+ *
+ * Sent when the MAC table is in move mode and a packet is seen that matches on 
+ * MAC address / VID but doesn't match on flow ID. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_mac_move_data
+{
+    bcmolt_flow_id old_flow_id; /**< The flow ID in the current MAC table entry. */
+    bcmolt_flow_id new_flow_id; /**< The flow ID seen in the traffic stream. */
+} bcmolt_gpon_iwf_mac_table_mac_move_data;
+
+/** Transport message definition for "mac_move" group of "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_mac_move
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+    bcmolt_gpon_iwf_mac_table_mac_move_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_mac_table_mac_move;
+
+/** Structure definition for the "new_mac" group of the "gpon_iwf_mac_table" 
+ * object. 
+ *
+ * Sent when a new MAC address / VID combination is seen in the upstream 
+ * traffic stream. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_new_mac_data
+{
+    bcmolt_flow_id flow_id; /**< The flow ID associated with the new entry. */
+} bcmolt_gpon_iwf_mac_table_new_mac_data;
+
+/** Transport message definition for "new_mac" group of "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_new_mac
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+    bcmolt_gpon_iwf_mac_table_new_mac_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_mac_table_new_mac;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_auto_cfg_data
+{
+    bcmos_bool mac_aged;    /**< If true, indications of type "mac_aged" will be generated. */
+    bcmos_bool mac_dropped; /**< If true, indications of type "mac_dropped" will be generated. */
+    bcmos_bool mac_move;    /**< If true, indications of type "mac_move" will be generated. */
+    bcmos_bool new_mac;     /**< If true, indications of type "new_mac" will be generated. */
+} bcmolt_gpon_iwf_mac_table_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_iwf_mac_table" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_iwf_mac_table_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_iwf_mac_table_key key;  /**< Object key. */
+    bcmolt_gpon_iwf_mac_table_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_mac_table_auto_cfg;
+
+/** Structure definition for the "key" group of the "gpon_iwf_us_flow" object. 
+ */
+typedef struct bcmolt_gpon_iwf_us_flow_key
+{
+    bcmolt_gpon_ni pon_ni;          /**< PON network interface. */
+    bcmolt_gpon_gem_id gem_port_id; /**< GEM Port  ID. */
+} bcmolt_gpon_iwf_us_flow_key;
+
+/** Structure definition for the "cfg" group of the "gpon_iwf_us_flow" object. 
+ */
+typedef struct bcmolt_gpon_iwf_us_flow_cfg_data
+{
+    bcmolt_flow_id flow_id;             /**< Flow ID. */
+    bcmos_bool mac_learning;            /**< MAC learning. */
+    bcmolt_us_vlan_action vlan_action;  /**< VLAN action. */
+    bcmolt_vlan_tag vlan_tag;           /**< Vlan tag. */
+    uint8_t tpid_index;                 /**< TPID index. */
+} bcmolt_gpon_iwf_us_flow_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_iwf_us_flow" object. 
+ */
+typedef struct bcmolt_gpon_iwf_us_flow_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_gpon_iwf_us_flow_key key;    /**< Object key. */
+    bcmolt_gpon_iwf_us_flow_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_iwf_us_flow_cfg;
+
+/** Structure definition for the "key" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_key
+{
+    bcmolt_gpon_ni pon_ni;  /**< PON network interface. */
+} bcmolt_gpon_ni_key;
+
+/** Structure definition for the "cfg" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_cfg_data
+{
+    bcmolt_pon_status pon_status;   /**< PON status parameters */
+    bcmolt_pon_available_bandwidth available_bandwidth; /**< PON available bandwidth parameters */
+    uint16_t number_of_active_onus;                     /**< Number of active ONUs on the PON */
+    uint16_t number_of_active_standby_onus;             /**< number of active standby onus. */
+    bcmolt_prbs_status prbs_status;                     /**< Result of US PRBS checker */
+    bcmolt_pon_distance pon_distance;                   /**< PON distance */
+    uint32_t ranging_window_size;                       /**< Ranging window size */
+    uint32_t preassigned_equalization_delay;            /**< ONU pre-assigned equalization delay */
+    uint32_t eqd_cycles_number;                     /**< How many ranging windows are opened during a single ONU activation process */
+    bcmolt_pon_power_level power_level;             /**< ONU power level configuration */
+    bcmolt_control_state ds_fec_mode;               /**< DS FEC mode */
+    bcmolt_pon_drift_control drift_control;         /**< Drift control process configuration */
+    bcmolt_ber_interval ds_ber_reporting_interval;  /**< DS BER reporting interval */
+    uint8_t los_alarm_threshold;                    /**< LOS alarm threshold */
+    bcmolt_status los_initial_value;                /**< LOS initial value following PON activation */
+    bcmolt_gpon_onu_alarms_thresholds onu_alarms_thresholds;    /**< ONU alarms thresholds configuration */
+    bcmolt_ber_monitor_params ber_monitor;                      /**< BER monitor process configuration */
+    uint16_t ploam_ack_timeout;                 /**< Timeout for receiving ACK ploam */
+    bcmolt_gpon_onu_activation onu_activation;  /**< ONU activation control parameters */
+    bcmolt_gpon_sn_acquisition sn_acquisition;  /**< Serial Number process configuration */
+    bcmolt_gpon_key_exchange key_exchange;      /**< Key Exchange process configuration */
+    bcmolt_pon_protection_switching protection_switching;       /**< Protection switching control */
+    bcmolt_cbr_rt_allocation_profile cbr_rt_allocation_profile; /**< CBR Real Time allocation profile */
+#define BCMOLT_GPON_NI_CFG_DATA_CBR_NRT_ALLOCATION_PROFILE_LEN  2
+    bcmolt_arr_u16_2 cbr_nrt_allocation_profile;                /**< CBR non Real Time allocation profile */
+    bcmolt_pon_dba dba; /**< DBA configuration */
+    bcmolt_onu_power_management_configuration power_management;             /**< ONU power management control */
+    bcmolt_rogue_onu_detection_process rogue_onu_detection_process;         /**< Rogue ONU detection process configuration */
+    bcmolt_periodic_standby_pon_monitoring periodic_standby_pon_monitoring; /**< Periodic Standby PON monitoring */
+    bcmolt_prbs_checker_config prbs_checker;                        /**< US PRBS checker configuration */
+    bcmolt_prbs_generator_config prbs_generator;                    /**< DS PRBS generator configuration */
+    bcmolt_gpon_alloc_id min_data_alloc_id;                         /**< Min data Alloc ID value */
+    bcmolt_automatic_onu_deactivation automatic_onu_deactivation;   /**< Option to disable the automatic deactivation of ONUs due to alarms */
+    uint32_t us_bandwidth_limit;    /**< Total PON upstream bandwidth limit in bytes per second. */
+    bcmolt_gpon_onu_with_state_list_u16_max_128 all_onus;                   /**< All ONUs currently provisioned on this PON. */
+    bcmolt_gpon_gem_port_with_state_list_u16_max_128 all_mcast_gem_ports;   /**< All multicast GEM ports currently provisioned on this PON. */
+    bcmolt_gpon_ni_debug debug; /**< PON NI debug parameters */
+    bcmolt_gpon_onu_upgrade_params onu_upgrade_params;  /**< ONU upgrade params. */
+    uint16_t ps_c_wait_before_deactivation_timeout;     /**< PS type C timeout in milliseconds */
+    bcmolt_control_state bip32_indication_control;      /**< Option to disable the bip32 indication when the value is zero */
+} bcmolt_gpon_ni_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_gpon_ni_key key;         /**< Object key. */
+    bcmolt_gpon_ni_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_cfg;
+
+/** Structure definition for the "stat" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_stat_data
+{
+    uint64_t fec_codewords;             /**< Received FEC codewords. */
+    uint64_t fec_codewords_uncorrected; /**< Received uncorrected FEC codewords. */
+    uint64_t bip8_bytes;                /**< Received bytes protected by bip8. */
+    uint64_t bip8_errors;               /**< Received bip8 errors. */
+    uint64_t rx_gem_packets;            /**< Received GEM frames. */
+    uint64_t rx_gem_dropped;            /**< Received dropped GEM ID packets. */
+    uint64_t rx_gem_idle;               /**< Received idle GEM frames. */
+    uint64_t rx_gem_corrected;          /**< Received corrected GEM frames. */
+    uint64_t rx_gem_illegal;            /**< Received illegal GEM frames. */
+    uint64_t rx_allocations_valid;      /**< Received valid allocations. */
+    uint64_t rx_allocations_invalid;    /**< Received invalid allocations. */
+    uint64_t rx_allocations_disabled;   /**< Received disabled allocations. */
+    uint64_t rx_ploams;                 /**< Received Ploams. */
+    uint64_t rx_ploams_non_idle;        /**< Received non idle Ploams. */
+    uint64_t rx_ploams_error;           /**< Received error Ploams. */
+    uint64_t rx_ploams_dropped;         /**< Received dropped Ploams. */
+    uint64_t rx_cpu;                    /**< Received CPU packets. */
+    uint64_t rx_omci;                   /**< Received OMCI packets. */
+    uint64_t rx_omci_packets_crc_error; /**< Received OMCI packets with CRC errors. */
+    uint64_t rx_dropped_too_short;      /**< Received packets dropped due to length too short. */
+    uint64_t rx_dropped_too_long;       /**< Received packet dropped due to length too long. */
+    uint64_t rx_crc_errors;             /**< Received packet dropped due to crc error. */
+    uint64_t rx_key_errors;             /**< Received packet dropped due to key error. */
+    uint64_t rx_fragments_errors;       /**< Received packet dropped due to fragmentation error. */
+    uint64_t rx_packets_dropped;        /**< Global dropped packets. */
+    uint64_t tx_gem;                    /**< Transmitted GEM frames. */
+    uint64_t tx_ploams;                 /**< Transmitted Ploams. */
+    uint64_t tx_gem_fragments;          /**< Transmitted GEM fragments. */
+    uint64_t tx_cpu;                    /**< Transmitted CPU packets. */
+    uint64_t tx_omci;                   /**< Transmitted OMCI packets. */
+    uint8_t tx_cpu_omci_packets_dropped;    /**< Transmit packets dropped due to illegal length. */
+    uint64_t tx_dropped_illegal_length;     /**< Transmitted packet dropped due to illegal length. */
+    uint64_t tx_dropped_tpid_miss;          /**< Dropped because of TPID miss. */
+    uint64_t tx_dropped_vid_miss;           /**< Dropped because of VID miss. */
+} bcmolt_gpon_ni_stat_data;
+
+/** Transport message definition for "stat" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_gpon_ni_key key;         /**< Object key. */
+    bcmolt_gpon_ni_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_stat;
+
+/** Structure definition for the "stat_cfg" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_gpon_ni_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_ni_key key;             /**< Object key. */
+    bcmolt_gpon_ni_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_stat_cfg;
+
+/** Transport message definition for "activate_all_onus_completed" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_activate_all_onus_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_activate_all_onus_completed;
+
+/** Structure definition for the "cpu_packets_failure" group of the "gpon_ni" 
+ * object. 
+ *
+ * A failure was encountered during the "cpu_packets" proxy operation. 
+ */
+typedef struct bcmolt_gpon_ni_cpu_packets_failure_data
+{
+    bcmolt_packet_injection_error error;    /**< The error that was encountered. */
+    bcmolt_gpon_gem_id gem_port_id;         /**< The GEM port that caused the error. */
+} bcmolt_gpon_ni_cpu_packets_failure_data;
+
+/** Transport message definition for "cpu_packets_failure" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_cpu_packets_failure
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_cpu_packets_failure_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_cpu_packets_failure;
+
+/** Transport message definition for "deactivate_all_onus_completed" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_deactivate_all_onus_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_deactivate_all_onus_completed;
+
+/** Transport message definition for "disable_all_onus_completed" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_disable_all_onus_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_disable_all_onus_completed;
+
+/** Transport message definition for "enable_all_onus_completed" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_enable_all_onus_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_enable_all_onus_completed;
+
+/** Structure definition for the "los" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_los_data
+{
+    bcmolt_status status;   /**< status. */
+} bcmolt_gpon_ni_los_data;
+
+/** Transport message definition for "los" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_los
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_ni_key key;         /**< Object key. */
+    bcmolt_gpon_ni_los_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_los;
+
+/** Structure definition for the "onu_discovered" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_onu_discovered_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+    uint32_t ranging_time;              /**< ranging time. */
+    bcmolt_gpon_onu_id onu_id;          /**< onu_id. */
+} bcmolt_gpon_ni_onu_discovered_data;
+
+/** Transport message definition for "onu_discovered" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_onu_discovered
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_onu_discovered_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_onu_discovered;
+
+/** Structure definition for the "onu_upgrade_complete" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_onu_upgrade_complete_data
+{
+    bcmos_bool status;  /**< Success or failure.  Against entire upgrade process. */
+    bcmolt_gpon_onu_upgrade_status_list_u32 list_of_failed_entities;    /**< List of ONU-IDs the upgrade failed for. */
+} bcmolt_gpon_ni_onu_upgrade_complete_data;
+
+/** Transport message definition for "onu_upgrade_complete" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_onu_upgrade_complete
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_onu_upgrade_complete_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_onu_upgrade_complete;
+
+/** Structure definition for the "protection_switching_onus_ranged" group of the 
+ * "gpon_ni" object. 
+ *
+ * After a switchover is complete and all ONU ranging times have stabilized, 
+ * this indication is sent to inform the host of all new ONU EQDs. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_onus_ranged_data
+{
+    bcmolt_gpon_onu_eqd_list_u32 onus;  /**< ONUs. */
+} bcmolt_gpon_ni_protection_switching_onus_ranged_data;
+
+/** Transport message definition for "protection_switching_onus_ranged" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_onus_ranged
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_protection_switching_onus_ranged_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_protection_switching_onus_ranged;
+
+/** Structure definition for the "protection_switching_switchover_completed" 
+ * group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_switchover_completed_data
+{
+    bcmolt_result result;   /**< Result. */
+} bcmolt_gpon_ni_protection_switching_switchover_completed_data;
+
+/** Transport message definition for "protection_switching_switchover_completed" 
+ * group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_switchover_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_protection_switching_switchover_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_protection_switching_switchover_completed;
+
+/** Structure definition for the "protection_switching_traffic_resume" group of 
+ * the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_traffic_resume_data
+{
+    bcmolt_traffic_resume_result result;    /**< Result. */
+} bcmolt_gpon_ni_protection_switching_traffic_resume_data;
+
+/** Transport message definition for "protection_switching_traffic_resume" group 
+ * of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_traffic_resume
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_protection_switching_traffic_resume_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_protection_switching_traffic_resume;
+
+/** Structure definition for the "rogue_detection_completed" group of the 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_rogue_detection_completed_data
+{
+    bcmolt_rogue_detection_window window_type;          /**< Silent Window or Cut off Window */
+    bcmolt_rogue_measurement_result measurement_status; /**< Status of the rogue ONU detection result. */
+    bcmolt_gpon_alloc_id alloc_id;                      /**< Alloc-ID */
+    bcmolt_gpon_onu_id onu_id;                  /**< ONU-ID */
+    bcmos_bool is_delineation;                  /**< Burst Delineation detected during the rogue ONU detection. */
+    bcmos_bool is_ed;                           /**< Is ED. */
+    bcmolt_u8_list_u32 rx_data;                 /**< Captured PLOAMu message if the burst delinieation was detected. */
+    bcmolt_gpon_onu_id ploam_received_onu_id;   /**< ONU ID received in the ploam */
+    bcmos_bool ploam_received_crc_error;        /**< Crc error in the received ploam */
+} bcmolt_gpon_ni_rogue_detection_completed_data;
+
+/** Transport message definition for "rogue_detection_completed" group of 
+ * "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_rogue_detection_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_rogue_detection_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_rogue_detection_completed;
+
+/** Transport message definition for "rogue_onu_special_map_cycle_start" group 
+ * of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_rogue_onu_special_map_cycle_start
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_rogue_onu_special_map_cycle_start;
+
+/** Transport message definition for "serial_number_acquisition_cycle_start" 
+ * group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_serial_number_acquisition_cycle_start
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_serial_number_acquisition_cycle_start;
+
+/** Structure definition for the "standby_pon_monitoring_cycle_completed" group 
+ * of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data
+{
+    uint32_t number_of_detected_delimiter;  /**< number of detected delimiter. */
+    bcmolt_status energy_detect_signal;     /**< energy detect signal. */
+} bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data;
+
+/** Transport message definition for "standby_pon_monitoring_cycle_completed" 
+ * group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "gpon_ni" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_gpon_ni_stat_alarm_cleared_data
+{
+    bcmolt_gpon_ni_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_gpon_ni_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_stat_alarm_cleared
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "gpon_ni" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_gpon_ni_stat_alarm_raised_data
+{
+    bcmolt_gpon_ni_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_gpon_ni_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_stat_alarm_raised
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_stat_alarm_raised;
+
+/** Structure definition for the "state_change_completed" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_state_change_completed_data
+{
+    bcmolt_result result;               /**< Result. */
+    bcmolt_pon_state previous_state;    /**< Previous state. */
+    bcmolt_pon_state new_state;         /**< New state. */
+} bcmolt_gpon_ni_state_change_completed_data;
+
+/** Transport message definition for "state_change_completed" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_state_change_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_state_change_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_state_change_completed;
+
+/** Structure definition for the "tod_request_completed" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_tod_request_completed_data
+{
+    bcmolt_str_64 tod_string;   /**< tod_string. */
+    uint32_t sfc;               /**< sfc. */
+    uint64_t rtc_offset_sec;    /**< rtc_offset_sec. */
+    uint32_t rtc_offset_nsec;   /**< rtc_offset_nsec. */
+    bcmolt_result status;       /**< status. */
+} bcmolt_gpon_ni_tod_request_completed_data;
+
+/** Transport message definition for "tod_request_completed" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_tod_request_completed
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_tod_request_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_tod_request_completed;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_auto_cfg_data
+{
+    bcmos_bool activate_all_onus_completed;     /**< If true, indications of type "activate_all_onus_completed" will be generated. */
+    bcmos_bool cpu_packets_failure;             /**< If true, indications of type "cpu_packets_failure" will be generated. */
+    bcmos_bool deactivate_all_onus_completed;   /**< If true, indications of type "deactivate_all_onus_completed" will be generated. */
+    bcmos_bool disable_all_onus_completed;      /**< If true, indications of type "disable_all_onus_completed" will be generated. */
+    bcmos_bool enable_all_onus_completed;       /**< If true, indications of type "enable_all_onus_completed" will be generated. */
+    bcmos_bool los;                     /**< If true, indications of type "los" will be generated. */
+    bcmos_bool onu_discovered;          /**< If true, indications of type "onu_discovered" will be generated. */
+    bcmos_bool onu_upgrade_complete;    /**< If true, indications of type "onu_upgrade_complete" will be generated. */
+    bcmos_bool protection_switching_onus_ranged;            /**< If true, indications of type "protection_switching_onus_ranged" will be generated. */
+    bcmos_bool protection_switching_switchover_completed;   /**< If true, indications of type "protection_switching_switchover_completed" will be generated. */
+    bcmos_bool protection_switching_traffic_resume;         /**< If true, indications of type "protection_switching_traffic_resume" will be generated. */
+    bcmos_bool rogue_detection_completed;                   /**< If true, indications of type "rogue_detection_completed" will be generated. */
+    bcmos_bool rogue_onu_special_map_cycle_start;           /**< If true, indications of type "rogue_onu_special_map_cycle_start" will be generated. */
+    bcmos_bool serial_number_acquisition_cycle_start;       /**< If true, indications of type "serial_number_acquisition_cycle_start" will be generated. */
+    bcmos_bool standby_pon_monitoring_cycle_completed;      /**< If true, indications of type "standby_pon_monitoring_cycle_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;      /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;       /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool state_change_completed;  /**< If true, indications of type "state_change_completed" will be generated. */
+    bcmos_bool tod_request_completed;   /**< If true, indications of type "tod_request_completed" will be generated. */
+} bcmolt_gpon_ni_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_ni_key key;             /**< Object key. */
+    bcmolt_gpon_ni_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_auto_cfg;
+
+/** Structure definition for the "disable_serial_number" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_disable_serial_number_data
+{
+    bcmolt_disable_serial_number_control control;   /**< control. */
+    bcmolt_serial_number serial_number;             /**< serial number. */
+} bcmolt_gpon_ni_disable_serial_number_data;
+
+/** Transport message definition for "disable_serial_number" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_disable_serial_number
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_disable_serial_number_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_disable_serial_number;
+
+/** Structure definition for the 
+ * "protection_switching_type_c_set_multiple_onu_state" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data
+{
+    bcmolt_switch_over_type_c_onu_state onu_state;  /**< onu state. */
+    bcmolt_gpon_onu_id_list_u32_max_256 onu_list;   /**< onu list. */
+} bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data;
+
+/** Transport message definition for 
+ * "protection_switching_type_c_set_multiple_onu_state" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state;
+
+/** Transport message definition for "reset" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_reset
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_reset;
+
+/** Structure definition for the "rogue_detection_window" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_rogue_detection_window_data
+{
+    bcmolt_rogue_detection_window window_type;  /**< Type of silent measurement to execute */
+    bcmolt_gpon_alloc_id alloc_id;              /**< ALLOC ID to scan */
+    bcmolt_gpon_onu_id onu_id;                  /**< ONU ID to scan */
+    bcmos_bool second_ranging_window;           /**< Not currently supported */
+} bcmolt_gpon_ni_rogue_detection_window_data;
+
+/** Transport message definition for "rogue_detection_window" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_rogue_detection_window
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_rogue_detection_window_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_rogue_detection_window;
+
+/** Structure definition for the "set_onu_state" group of the "gpon_ni" object. 
+ *
+ * Set the operation state of all ONUs. 
+ */
+typedef struct bcmolt_gpon_ni_set_onu_state_data
+{
+    bcmolt_onu_operation onu_state; /**< New operation state of all ONUs.  The default operation may be configured by the GPON NI configuration object : gpon_ni.cfg.sn_acquisition. */
+} bcmolt_gpon_ni_set_onu_state_data;
+
+/** Transport message definition for "set_onu_state" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_set_onu_state
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_gpon_ni_key key;                 /**< Object key. */
+    bcmolt_gpon_ni_set_onu_state_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_set_onu_state;
+
+/** Structure definition for the "set_pon_state" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_set_pon_state_data
+{
+    bcmolt_pon_operation pon_state; /**< PON state. */
+} bcmolt_gpon_ni_set_pon_state_data;
+
+/** Transport message definition for "set_pon_state" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_set_pon_state
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_gpon_ni_key key;                 /**< Object key. */
+    bcmolt_gpon_ni_set_pon_state_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_set_pon_state;
+
+/** Transport message definition for "single_request_standby_pon_monitoring" 
+ * group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_single_request_standby_pon_monitoring
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_single_request_standby_pon_monitoring;
+
+/** Structure definition for the "start_onu_upgrade" group of the "gpon_ni" 
+ * object. 
+ *
+ * OLT to ONU firmware transfer 
+ */
+typedef struct bcmolt_gpon_ni_start_onu_upgrade_data
+{
+    bcmolt_pon_onu_id_list_u32 list_of_onu_ids; /**< List of ONU IDs to upgrade the firmware. */
+} bcmolt_gpon_ni_start_onu_upgrade_data;
+
+/** Transport message definition for "start_onu_upgrade" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_start_onu_upgrade
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_start_onu_upgrade_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_start_onu_upgrade;
+
+/** Transport message definition for "tod_request" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_tod_request
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+} bcmolt_gpon_ni_tod_request;
+
+/** Structure definition for the "broadcast_ploam_packet" group of the "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_broadcast_ploam_packet_data
+{
+#define BCMOLT_GPON_NI_BROADCAST_PLOAM_PACKET_DATA_PLOAM_LEN    12
+    bcmolt_arr_u8_12 ploam; /**< ploam. */
+} bcmolt_gpon_ni_broadcast_ploam_packet_data;
+
+/** Transport message definition for "broadcast_ploam_packet" group of "gpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_ni_broadcast_ploam_packet
+{
+    bcmolt_proxy hdr;       /**< Transport header. */
+    bcmolt_gpon_ni_key key; /**< Object key. */
+    bcmolt_gpon_ni_broadcast_ploam_packet_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_broadcast_ploam_packet;
+
+/** Structure definition for the "cpu_packets" group of the "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_cpu_packets_data
+{
+    bcmolt_packet_type packet_type;                     /**< packet type. */
+    bcmos_bool calc_crc;                                /**< calc crc. */
+    bcmolt_gpon_gem_id_list_u8_max_16 gem_port_list;    /**< gem port list. */
+    bcmolt_u8_list_u32_max_2048 buffer;                 /**< buffer. */
+} bcmolt_gpon_ni_cpu_packets_data;
+
+/** Transport message definition for "cpu_packets" group of "gpon_ni" object. 
+ */
+typedef struct bcmolt_gpon_ni_cpu_packets
+{
+    bcmolt_proxy hdr;                       /**< Transport header. */
+    bcmolt_gpon_ni_key key;                 /**< Object key. */
+    bcmolt_gpon_ni_cpu_packets_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_ni_cpu_packets;
+
+/** Structure definition for the "key" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key
+{
+    bcmolt_gpon_ni pon_ni;      /**< PON network interface. */
+    bcmolt_gpon_onu_id onu_id;  /**< ONU ID. */
+} bcmolt_gpon_onu_key;
+
+/** Structure definition for the "cfg" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_cfg_data
+{
+    bcmolt_onu_state onu_state;         /**< Current ONU state */
+    bcmolt_serial_number serial_number; /**< ONU serial number */
+#define BCMOLT_GPON_ONU_CFG_DATA_PASSWORD_LEN   10
+    bcmolt_arr_u8_10 password;          /**< ONU password */
+    bcmos_bool auto_password_learning;  /**< Enable\Disable automatic password learning */
+    bcmos_bool us_fec;                  /**< Enable\Disable US FEC for ONU */
+    bcmolt_gpon_gem_id omci_port_id;    /**< OMCI port ID  */
+    bcmolt_ber_interval ds_ber_reporting_interval;  /**< DS BER reporting interval */
+    bcmolt_aes_key aes_encryption_key;              /**< AES encryption key.  */
+    bcmolt_gpon_onu_alarm_state alarm_state;        /**< State of all ONU alarms.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    uint32_t ranging_time;                  /**< ONU ranging time.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    bcmolt_status disabled_after_discovery; /**< This ONU was disabled after SN discovery */
+    bcmolt_deactivation_reason deactivation_reason;                 /**< Reason for the last ONU deactivation */
+    bcmolt_gpon_gem_port_with_state_list_u16_max_256 all_gem_ports; /**< All unicast GEM ports currently provisioned on this ONU. */
+    bcmolt_gpon_alloc_with_state_list_u16_max_32 all_allocs;        /**< All alloc IDs currently provisioned on this ONU. */
+    bcmos_bool onu_ps_type_c;                       /**< onu protection switching type c. */
+    bcmolt_extended_guard_time extended_guard_time; /**< Additional guard time (in bytes) for this ONU. */
+} bcmolt_gpon_onu_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_cfg;
+
+/** Structure definition for the "stat" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_stat_data
+{
+    uint64_t fec_codewords;             /**< Total received FEC codewords. */
+    uint64_t fec_bytes_corrected;       /**< FEC codewords corrected bytes. */
+    uint64_t fec_codewords_corrected;   /**< FEC corrected codewords error . */
+    uint64_t fec_codewords_uncorrected; /**< FEC not corrected codewords error. */
+    uint64_t bip8_bytes;                /**< Received bytes for BIP8. */
+    uint64_t bip8_errors;               /**< Bit error according to BIP8. */
+    uint64_t rx_ploams_crc_error;       /**< Received PLOAMs with CRC error. */
+    uint64_t rx_ploams_non_idle;        /**< Received non idle PLOAMs. */
+    uint64_t positive_drift;            /**< Positive drift. */
+    uint64_t negative_drift;            /**< Negative drift. */
+    uint64_t rx_omci;                   /**< Received OMCI packets. */
+    uint64_t rx_omci_packets_crc_error; /**< Received OMCI packets with CRC errors. */
+    uint64_t ber_reported;              /**< BER reported. */
+    uint64_t unreceived_burst;          /**< Unreceived burst. */
+    uint64_t lcdg_errors;               /**< LCDG errors. */
+    uint64_t rdi_errors;                /**< RDI errors. */
+    uint64_t rx_bytes;                  /**< rx bytes. */
+    uint64_t rx_packets;                /**< rx packets. */
+    uint64_t tx_bytes;                  /**< tx bytes. */
+    uint64_t tx_packets;                /**< tx packets. */
+} bcmolt_gpon_onu_stat_data;
+
+/** Transport message definition for "stat" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_stat_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_stat;
+
+/** Structure definition for the "stat_cfg" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_gpon_onu_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;            /**< Object key. */
+    bcmolt_gpon_onu_stat_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_stat_cfg;
+
+/** Structure definition for the "ber_interval_configuration_completed" group of 
+ * the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_ber_interval_configuration_completed_data
+{
+    bcmolt_ber_interval ber_interval;   /**< BER interval in ms. */
+    bcmolt_result result;               /**< Result. */
+} bcmolt_gpon_onu_ber_interval_configuration_completed_data;
+
+/** Transport message definition for "ber_interval_configuration_completed" 
+ * group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_ber_interval_configuration_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_ber_interval_configuration_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_ber_interval_configuration_completed;
+
+/** Structure definition for the "dfi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dfi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_dfi_data;
+
+/** Transport message definition for "dfi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dfi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_dfi_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_dfi;
+
+/** Structure definition for the "dgi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dgi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_dgi_data;
+
+/** Transport message definition for "dgi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dgi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_dgi_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_dgi;
+
+/** Structure definition for the "dowi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dowi_data
+{
+    bcmolt_status alarm_status; /**< Alarm status. */
+    int32_t drift_value;        /**< Calculated amount of drift (positive + negative as a signed value). */
+    uint32_t new_eqd;           /**< New EQD after drift is corrected (only valid if status is 'on'). */
+} bcmolt_gpon_onu_dowi_data;
+
+/** Transport message definition for "dowi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_dowi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_dowi_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_dowi;
+
+/** Structure definition for the "err" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_err_data
+{
+    uint8_t bip8_errors;    /**< BIP8 errors. */
+} bcmolt_gpon_onu_err_data;
+
+/** Transport message definition for "err" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_err
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_err_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_err;
+
+/** Structure definition for the "invalid_dbru_report" group of the "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_invalid_dbru_report_data
+{
+    bcmolt_gpon_alloc_id alloc_id;  /**< Alloc-ID. */
+} bcmolt_gpon_onu_invalid_dbru_report_data;
+
+/** Transport message definition for "invalid_dbru_report" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_invalid_dbru_report
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_invalid_dbru_report_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_invalid_dbru_report;
+
+/** Structure definition for the "key_exchange_completed" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_completed_data
+{
+    bcmolt_aes_key new_key; /**< new key. */
+} bcmolt_gpon_onu_key_exchange_completed_data;
+
+/** Transport message definition for "key_exchange_completed" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_key_exchange_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_key_exchange_completed;
+
+/** Transport message definition for "key_exchange_cycle_skipped" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_cycle_skipped
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+} bcmolt_gpon_onu_key_exchange_cycle_skipped;
+
+/** Structure definition for the "key_exchange_decrypt_required" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_decrypt_required_data
+{
+    bcmolt_aes_key new_key; /**< new key. */
+} bcmolt_gpon_onu_key_exchange_decrypt_required_data;
+
+/** Transport message definition for "key_exchange_decrypt_required" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_decrypt_required
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_key_exchange_decrypt_required_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_key_exchange_decrypt_required;
+
+/** Structure definition for the "key_exchange_key_mismatch" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_key_mismatch_data
+{
+    bcmolt_aes_key expected_key;    /**< expected key. */
+    bcmolt_aes_key received_key;    /**< received key. */
+} bcmolt_gpon_onu_key_exchange_key_mismatch_data;
+
+/** Transport message definition for "key_exchange_key_mismatch" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_key_mismatch
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_key_exchange_key_mismatch_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_key_exchange_key_mismatch;
+
+/** Transport message definition for "key_exchange_key_request_timeout" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_key_request_timeout
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+} bcmolt_gpon_onu_key_exchange_key_request_timeout;
+
+/** Structure definition for the "key_exchange_unconsecutive_index" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_unconsecutive_index_data
+{
+    uint32_t expected_index;    /**< expected index. */
+    uint32_t actual_index;      /**< actual index. */
+} bcmolt_gpon_onu_key_exchange_unconsecutive_index_data;
+
+/** Transport message definition for "key_exchange_unconsecutive_index" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_key_exchange_unconsecutive_index
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_key_exchange_unconsecutive_index_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_key_exchange_unconsecutive_index;
+
+/** Structure definition for the "loai" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_loai_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_loai_data;
+
+/** Transport message definition for "loai" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_loai
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_loai_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_loai;
+
+/** Structure definition for the "loki" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_loki_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_loki_data;
+
+/** Transport message definition for "loki" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_loki
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_loki_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_loki;
+
+/** Structure definition for the "memi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_memi_data
+{
+#define BCMOLT_GPON_ONU_MEMI_DATA_PLOAM_BUFFER_LEN  13
+    bcmolt_arr_u8_13 ploam_buffer;  /**< PLOAM buffer. */
+} bcmolt_gpon_onu_memi_data;
+
+/** Transport message definition for "memi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_memi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_memi_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_memi;
+
+/** Structure definition for the "omci_port_id_configuration_completed" group of 
+ * the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_omci_port_id_configuration_completed_data
+{
+    bcmolt_gpon_gem_id gem_port;    /**< GEM Port ID. */
+    bcmolt_result status;           /**< status. */
+    bcmolt_omci_port_id_operation operation;    /**< Operation. */
+} bcmolt_gpon_onu_omci_port_id_configuration_completed_data;
+
+/** Transport message definition for "omci_port_id_configuration_completed" 
+ * group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_omci_port_id_configuration_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_omci_port_id_configuration_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_omci_port_id_configuration_completed;
+
+/** Structure definition for the "onu_activation_completed" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_activation_completed_data
+{
+    bcmolt_result status;                       /**< status. */
+    bcmolt_activation_fail_reason fail_reason;  /**< fail reason. */
+} bcmolt_gpon_onu_onu_activation_completed_data;
+
+/** Transport message definition for "onu_activation_completed" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_activation_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_onu_activation_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_activation_completed;
+
+/** Structure definition for the "onu_activation_standby_completed" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_activation_standby_completed_data
+{
+    bcmolt_result result;   /**< result. */
+} bcmolt_gpon_onu_onu_activation_standby_completed_data;
+
+/** Transport message definition for "onu_activation_standby_completed" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_activation_standby_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_onu_activation_standby_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_activation_standby_completed;
+
+/** Structure definition for the "onu_alarm" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_alarm_data
+{
+    bcmolt_gpon_onu_alarms onu_alarm;   /**< onu alarm. */
+} bcmolt_gpon_onu_onu_alarm_data;
+
+/** Transport message definition for "onu_alarm" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_alarm
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_gpon_onu_key key;                /**< Object key. */
+    bcmolt_gpon_onu_onu_alarm_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_alarm;
+
+/** Structure definition for the "onu_deactivation_completed" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_deactivation_completed_data
+{
+    bcmolt_result status;   /**< status. */
+} bcmolt_gpon_onu_onu_deactivation_completed_data;
+
+/** Transport message definition for "onu_deactivation_completed" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_deactivation_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_onu_deactivation_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_deactivation_completed;
+
+/** Structure definition for the "onu_disable_completed" group of the "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_disable_completed_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+} bcmolt_gpon_onu_onu_disable_completed_data;
+
+/** Transport message definition for "onu_disable_completed" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_disable_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_onu_disable_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_disable_completed;
+
+/** Structure definition for the "onu_enable_completed" group of the "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_enable_completed_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+} bcmolt_gpon_onu_onu_enable_completed_data;
+
+/** Transport message definition for "onu_enable_completed" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_onu_enable_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_onu_enable_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_onu_enable_completed;
+
+/** Transport message definition for "optical_reflection" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_optical_reflection
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+} bcmolt_gpon_onu_optical_reflection;
+
+/** Structure definition for the "password_authentication_completed" group of 
+ * the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_password_authentication_completed_data
+{
+    bcmolt_result status;   /**< status. */
+    bcmolt_password_authentication_fail_reason fail_reason; /**< fail reason. */
+#define BCMOLT_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED_DATA_PASSWORD_LEN 10
+    bcmolt_arr_u8_10 password;  /**< password. */
+} bcmolt_gpon_onu_password_authentication_completed_data;
+
+/** Transport message definition for "password_authentication_completed" group 
+ * of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_password_authentication_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_password_authentication_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_password_authentication_completed;
+
+/** Structure definition for the "pee" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_pee_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_pee_data;
+
+/** Transport message definition for "pee" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_pee
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_pee_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_pee;
+
+/** Structure definition for the "possible_drift" group of the "gpon_onu" 
+ * object. 
+ *
+ * An ONU in a low power state may be experiencing drift beyond the configured 
+ * threshold. The estimate may be inaccurate depending on ONU behavior. Actual 
+ * drift may be less than estimated. 
+ */
+typedef struct bcmolt_gpon_onu_possible_drift_data
+{
+    bcmolt_status alarm_status; /**< On: estimated drift has exceeded the configured threshold. */
+    int32_t estimated_drift;    /**< If status is on, the estimated drift value, otherwise zero (0). */
+} bcmolt_gpon_onu_possible_drift_data;
+
+/** Transport message definition for "possible_drift" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_possible_drift
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_possible_drift_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_possible_drift;
+
+/** Structure definition for the "power_management_state_change" group of the 
+ * "gpon_onu" object. 
+ *
+ * Notification that an ONUs power management state has changed. 
+ */
+typedef struct bcmolt_gpon_onu_power_management_state_change_data
+{
+    bcmolt_onu_state old_state; /**< The state the ONU was previously in. */
+    bcmolt_onu_state new_state; /**< The state the ONU is currently in. */
+    bcmolt_power_management_transition_reason reason;   /**< The reason for the state change. */
+} bcmolt_gpon_onu_power_management_state_change_data;
+
+/** Transport message definition for "power_management_state_change" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_power_management_state_change
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_power_management_state_change_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_power_management_state_change;
+
+/** Structure definition for the "pst" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_pst_data
+{
+    uint32_t link_number;   /**< link number. */
+    uint8_t k1;             /**< K1. */
+    uint8_t k2;             /**< K2. */
+} bcmolt_gpon_onu_pst_data;
+
+/** Transport message definition for "pst" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_pst
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_pst_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_pst;
+
+/** Structure definition for the "ranging_completed" group of the "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_ranging_completed_data
+{
+    bcmolt_result status;                   /**< status. */
+    bcmolt_ranging_fail_reason fail_reason; /**< fail reason. */
+    uint8_t number_of_ploams;               /**< number of PLOAMs. */
+    uint32_t eqd;           /**< EQD. */
+    uint8_t power_level;    /**< Power Level. */
+} bcmolt_gpon_onu_ranging_completed_data;
+
+/** Transport message definition for "ranging_completed" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_ranging_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_ranging_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_ranging_completed;
+
+/** Structure definition for the "rei" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_rei_data
+{
+    uint32_t bip8_errors;   /**< BIP8 errors. */
+} bcmolt_gpon_onu_rei_data;
+
+/** Transport message definition for "rei" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_rei
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_rei_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_rei;
+
+/** Structure definition for the "rssi_measurement_completed" group of the 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_rssi_measurement_completed_data
+{
+    bcmolt_result status;   /**< status. */
+    bcmolt_rssi_measurement_fail_reason fail_reason;    /**< fail reason. */
+} bcmolt_gpon_onu_rssi_measurement_completed_data;
+
+/** Transport message definition for "rssi_measurement_completed" group of 
+ * "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_rssi_measurement_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_rssi_measurement_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_rssi_measurement_completed;
+
+/** Structure definition for the "sdi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sdi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+    uint32_t ber;               /**< Inverse bit error rate (e.g. if this number is 1000, the BER is 1/1000). */
+} bcmolt_gpon_onu_sdi_data;
+
+/** Transport message definition for "sdi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sdi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_sdi_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_sdi;
+
+/** Structure definition for the "sfi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sfi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+    uint32_t ber;               /**< Inverse bit error rate (e.g. if this number is 1000, the BER is 1/1000). */
+} bcmolt_gpon_onu_sfi_data;
+
+/** Transport message definition for "sfi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sfi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_sfi_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_sfi;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "gpon_onu" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_gpon_onu_stat_alarm_cleared_data
+{
+    bcmolt_gpon_onu_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_gpon_onu_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_stat_alarm_cleared_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "gpon_onu" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_gpon_onu_stat_alarm_raised_data
+{
+    bcmolt_gpon_onu_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_gpon_onu_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_stat_alarm_raised_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_stat_alarm_raised;
+
+/** Structure definition for the "sufi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sufi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_gpon_onu_sufi_data;
+
+/** Transport message definition for "sufi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_sufi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_sufi_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_sufi;
+
+/** Structure definition for the "tiwi" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_tiwi_data
+{
+    bcmolt_status alarm_status; /**< Alarm status. */
+    int32_t drift_value;        /**< Calculated amount of drift (positive + negative as a signed value). */
+} bcmolt_gpon_onu_tiwi_data;
+
+/** Transport message definition for "tiwi" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_tiwi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;        /**< Object key. */
+    bcmolt_gpon_onu_tiwi_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_tiwi;
+
+/** Structure definition for the "auto_cfg" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_auto_cfg_data
+{
+    bcmos_bool ber_interval_configuration_completed;    /**< If true, indications of type "ber_interval_configuration_completed" will be generated. */
+    bcmos_bool dfi;                     /**< If true, indications of type "dfi" will be generated. */
+    bcmos_bool dgi;                     /**< If true, indications of type "dgi" will be generated. */
+    bcmos_bool dowi;                    /**< If true, indications of type "dowi" will be generated. */
+    bcmos_bool err;                     /**< If true, indications of type "err" will be generated. */
+    bcmos_bool invalid_dbru_report;     /**< If true, indications of type "invalid_dbru_report" will be generated. */
+    bcmos_bool key_exchange_completed;  /**< If true, indications of type "key_exchange_completed" will be generated. */
+    bcmos_bool key_exchange_cycle_skipped;          /**< If true, indications of type "key_exchange_cycle_skipped" will be generated. */
+    bcmos_bool key_exchange_decrypt_required;       /**< If true, indications of type "key_exchange_decrypt_required" will be generated. */
+    bcmos_bool key_exchange_key_mismatch;           /**< If true, indications of type "key_exchange_key_mismatch" will be generated. */
+    bcmos_bool key_exchange_key_request_timeout;    /**< If true, indications of type "key_exchange_key_request_timeout" will be generated. */
+    bcmos_bool key_exchange_unconsecutive_index;    /**< If true, indications of type "key_exchange_unconsecutive_index" will be generated. */
+    bcmos_bool loai;    /**< If true, indications of type "loai" will be generated. */
+    bcmos_bool loki;    /**< If true, indications of type "loki" will be generated. */
+    bcmos_bool memi;    /**< If true, indications of type "memi" will be generated. */
+    bcmos_bool omci_port_id_configuration_completed;    /**< If true, indications of type "omci_port_id_configuration_completed" will be generated. */
+    bcmos_bool onu_activation_completed;                /**< If true, indications of type "onu_activation_completed" will be generated. */
+    bcmos_bool onu_activation_standby_completed;        /**< If true, indications of type "onu_activation_standby_completed" will be generated. */
+    bcmos_bool onu_alarm;                   /**< If true, indications of type "onu_alarm" will be generated. */
+    bcmos_bool onu_deactivation_completed;  /**< If true, indications of type "onu_deactivation_completed" will be generated. */
+    bcmos_bool onu_disable_completed;       /**< If true, indications of type "onu_disable_completed" will be generated. */
+    bcmos_bool onu_enable_completed;        /**< If true, indications of type "onu_enable_completed" will be generated. */
+    bcmos_bool optical_reflection;          /**< If true, indications of type "optical_reflection" will be generated. */
+    bcmos_bool password_authentication_completed;   /**< If true, indications of type "password_authentication_completed" will be generated. */
+    bcmos_bool pee;             /**< If true, indications of type "pee" will be generated. */
+    bcmos_bool possible_drift;  /**< If true, indications of type "possible_drift" will be generated. */
+    bcmos_bool power_management_state_change;   /**< If true, indications of type "power_management_state_change" will be generated. */
+    bcmos_bool pst;                 /**< If true, indications of type "pst" will be generated. */
+    bcmos_bool ranging_completed;   /**< If true, indications of type "ranging_completed" will be generated. */
+    bcmos_bool rei;                 /**< If true, indications of type "rei" will be generated. */
+    bcmos_bool rssi_measurement_completed;  /**< If true, indications of type "rssi_measurement_completed" will be generated. */
+    bcmos_bool sdi;                 /**< If true, indications of type "sdi" will be generated. */
+    bcmos_bool sfi;                 /**< If true, indications of type "sfi" will be generated. */
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool sufi;                /**< If true, indications of type "sufi" will be generated. */
+    bcmos_bool tiwi;                /**< If true, indications of type "tiwi" will be generated. */
+} bcmolt_gpon_onu_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_gpon_onu_key key;            /**< Object key. */
+    bcmolt_gpon_onu_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_auto_cfg;
+
+/** Structure definition for the "change_power_level" group of the "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_change_power_level_data
+{
+    bcmolt_onu_power_level power_level_action;  /**< power level action. */
+} bcmolt_gpon_onu_change_power_level_data;
+
+/** Transport message definition for "change_power_level" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_change_power_level
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_change_power_level_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_change_power_level;
+
+/** Transport message definition for "rssi_measurement" group of "gpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_gpon_onu_rssi_measurement
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+} bcmolt_gpon_onu_rssi_measurement;
+
+/** Structure definition for the "set_onu_state" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_set_onu_state_data
+{
+    bcmolt_onu_operation onu_state; /**< ONU state. */
+} bcmolt_gpon_onu_set_onu_state_data;
+
+/** Transport message definition for "set_onu_state" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_set_onu_state
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_gpon_onu_key key;    /**< Object key. */
+    bcmolt_gpon_onu_set_onu_state_data data;    /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_set_onu_state;
+
+/** Structure definition for the "cpu_packets" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_cpu_packets_data
+{
+    bcmolt_packet_type packet_type;     /**< packet type. */
+    bcmos_bool calc_crc;                /**< calc crc. */
+    uint8_t number_of_packets;          /**< number of packets. */
+    uint16_t packet_size;               /**< Single packet size. */
+    bcmolt_u8_list_u32_max_2048 buffer; /**< buffer. */
+} bcmolt_gpon_onu_cpu_packets_data;
+
+/** Transport message definition for "cpu_packets" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_cpu_packets
+{
+    bcmolt_proxy hdr;                       /**< Transport header. */
+    bcmolt_gpon_onu_key key;                /**< Object key. */
+    bcmolt_gpon_onu_cpu_packets_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_cpu_packets;
+
+/** Structure definition for the "ploam_packet" group of the "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_ploam_packet_data
+{
+#define BCMOLT_GPON_ONU_PLOAM_PACKET_DATA_PLOAM_LEN 12
+    bcmolt_arr_u8_12 ploam; /**< ploam. */
+} bcmolt_gpon_onu_ploam_packet_data;
+
+/** Transport message definition for "ploam_packet" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_ploam_packet
+{
+    bcmolt_proxy hdr;                       /**< Transport header. */
+    bcmolt_gpon_onu_key key;                /**< Object key. */
+    bcmolt_gpon_onu_ploam_packet_data data; /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_ploam_packet;
+
+/** Structure definition for the "cpu_packet" group of the "gpon_onu" object. 
+ *
+ * Indicates CPU packet was received on the US from this ONU id 
+ */
+typedef struct bcmolt_gpon_onu_cpu_packet_data
+{
+    uint16_t port_id;           /**< port_id. */
+    bcmos_bool crc_ok;          /**< crc_ok. */
+    uint32_t packet_size;       /**< packet_size. */
+    bcmolt_u8_list_u32 buffer;  /**< buffer. */
+} bcmolt_gpon_onu_cpu_packet_data;
+
+/** Transport message definition for "cpu_packet" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_cpu_packet
+{
+    bcmolt_proxy_rx hdr;                    /**< Transport header. */
+    bcmolt_gpon_onu_key key;                /**< Object key. */
+    bcmolt_gpon_onu_cpu_packet_data data;   /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_cpu_packet;
+
+/** Structure definition for the "omci_packet" group of the "gpon_onu" object. 
+ *
+ * Indicates OMCI packet was received on the US from this ONU id 
+ */
+typedef struct bcmolt_gpon_onu_omci_packet_data
+{
+    uint16_t port_id;           /**< port_id. */
+    bcmos_bool crc_ok;          /**< crc_ok. */
+    uint32_t packet_size;       /**< packet_size. */
+    bcmolt_u8_list_u32 buffer;  /**< buffer. */
+} bcmolt_gpon_onu_omci_packet_data;
+
+/** Transport message definition for "omci_packet" group of "gpon_onu" object. 
+ */
+typedef struct bcmolt_gpon_onu_omci_packet
+{
+    bcmolt_proxy_rx hdr;                    /**< Transport header. */
+    bcmolt_gpon_onu_key key;                /**< Object key. */
+    bcmolt_gpon_onu_omci_packet_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_onu_omci_packet;
+
+/** Structure definition for the "key" group of the "gpon_trx" object. 
+ */
+typedef struct bcmolt_gpon_trx_key
+{
+    bcmolt_gpon_ni pon_ni;  /**< PON network interface. */
+} bcmolt_gpon_trx_key;
+
+/** Structure definition for the "cfg" group of the "gpon_trx" object. 
+ */
+typedef struct bcmolt_gpon_trx_cfg_data
+{
+    bcmolt_trx_type transceiver_type;   /**< transceiver type. */
+    bcmolt_la_resync_pattern_configuration la_configuration;    /**< LA configuration. */
+    bcmolt_bcdr_resync_pattern_configuration bcdr;              /**< BCDR. */
+    bcmolt_resync_control la_ranging_after_no_ed_resync;        /**< LA ranging after no ed resync . */
+    bcmolt_resync_control bcdr_ranging_after_no_ed_resync;      /**< used in ranging mode after no ed found */
+    bcmolt_resync_control la_ranging_after_ed_resync;           /**< LA ranging after ed resync . */
+    bcmolt_resync_control bcdr_ranging_after_ed_resync;         /**< BCDR ranging after ed resync. */
+    bcmolt_polarity la_resync_polarity;     /**< la resync polarity. */
+    bcmolt_polarity bcdr_resync_polarity;   /**< BCDR resync polarity. */
+    bcmolt_ranging_resync_conditions bcdr_ranging_resync_conditions;            /**< bcdr ranging resync conditions. */
+    bcmolt_ranging_resync_conditions la_ranging_resync_conditions;              /**< la ranging resync conditions. */
+    bcmolt_trx_rx_configuration rx_configuration;                               /**< RX configuration. */
+    bcmolt_ranging_control_configuration ranging_control_stages_configuration;  /**< ranging control stages configuration. */
+    bcmolt_trx_energy_detect energy_detect;             /**< Energy Detect. */
+    bcmolt_resync_control end_of_burst_data_pattern;    /**< end of burst data pattern . */
+    bcmolt_resync_control end_of_burst_ranging_pattern; /**< end of burst ranging pattern. */
+    bcmolt_trx_preamble preamble;                       /**< Preamble. */
+    bcmolt_trx_delimiter delimiter;                     /**< Delimiter. */
+    uint32_t guard_bits;    /**< Guard bits. */
+    bcmolt_serdes_configuration serdes_configuration;   /**< serdes configuration. */
+    uint32_t plo_ranging;   /**< PLO for ranging. */
+    uint32_t plo_data;      /**< PLO for data. */
+    bcmolt_gpon_rssi_general_configuration rssi_normal_config;  /**< rssi normal config. */
+    bcmolt_ranging_rssi_control ranging_rssi_resync_control;    /**< ranging rssi resync control. */
+} bcmolt_gpon_trx_cfg_data;
+
+/** Transport message definition for "cfg" group of "gpon_trx" object. 
+ */
+typedef struct bcmolt_gpon_trx_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_gpon_trx_key key;        /**< Object key. */
+    bcmolt_gpon_trx_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_gpon_trx_cfg;
+
+/** Structure definition for the "key" group of the "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_key
+{
+    uint32_t log_id;        /**< log id. */
+    uint8_t reserved;       /**< reserved. */
+    bcmolt_str_100 name;    /**< name. */
+} bcmolt_log_entry_key;
+
+/** Structure definition for the "cfg" group of the "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_cfg_data
+{
+    bcmolt_log_level default_log_level; /**< default log level. */
+    bcmolt_log_type default_log_type;   /**< default log type. */
+    bcmolt_log_level log_level_print;   /**< log level print. */
+    bcmolt_log_level log_level_save;    /**< log level save. */
+    bcmolt_log_type log_type;           /**< log type. */
+    bcmolt_log_style log_style;         /**< log_style. */
+    bcmolt_str_100 log_name;            /**< log name. */
+} bcmolt_log_entry_cfg_data;
+
+/** Transport message definition for "cfg" group of "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_log_entry_key key;       /**< Object key. */
+    bcmolt_log_entry_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_log_entry_cfg;
+
+/** Structure definition for the "stat" group of the "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_stat_data
+{
+#define BCMOLT_LOG_ENTRY_STAT_DATA_MSG_COUNT_LEN    6
+    bcmolt_arr_u32_6 msg_count; /**< msg count. */
+    uint32_t lost_msg_count;    /**< lost msg count. */
+} bcmolt_log_entry_stat_data;
+
+/** Transport message definition for "stat" group of "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_log_entry_key key;           /**< Object key. */
+    bcmolt_log_entry_stat_data data;    /**< All properties that must be set by the user. */
+} bcmolt_log_entry_stat;
+
+/** Structure definition for the "stat_cfg" group of the "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_log_entry_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_log_entry_key key;   /**< Object key. */
+    bcmolt_log_entry_stat_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_log_entry_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "log_entry" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_log_entry_stat_alarm_cleared_data
+{
+    bcmolt_log_entry_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_log_entry_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "log_entry" 
+ * object. 
+ */
+typedef struct bcmolt_log_entry_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_log_entry_key key;   /**< Object key. */
+    bcmolt_log_entry_stat_alarm_cleared_data data;  /**< All properties that must be set by the user. */
+} bcmolt_log_entry_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "log_entry" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_log_entry_stat_alarm_raised_data
+{
+    bcmolt_log_entry_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_log_entry_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "log_entry" 
+ * object. 
+ */
+typedef struct bcmolt_log_entry_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_log_entry_key key;   /**< Object key. */
+    bcmolt_log_entry_stat_alarm_raised_data data;   /**< All properties that must be set by the user. */
+} bcmolt_log_entry_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_log_entry_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "log_entry" object. 
+ */
+typedef struct bcmolt_log_entry_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_log_entry_key key;               /**< Object key. */
+    bcmolt_log_entry_auto_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_log_entry_auto_cfg;
+
+/** Structure definition for the "key" group of the "logger" object. 
+ */
+typedef struct bcmolt_logger_key
+{
+    uint32_t reserved;          /**< reserved. */
+    bcmolt_log_file_id file_id; /**< should be 0 */
+} bcmolt_logger_key;
+
+/** Structure definition for the "cfg" group of the "logger" object. 
+ */
+typedef struct bcmolt_logger_cfg_data
+{
+    bcmolt_log_buffer buffer;       /**< Contains "next" log records read by "bcmolt_cfg_get() API */
+    bcmos_bool wrap_around;         /**< Log file wrap-around option. TRUE=wrap around when full. FALSE=stop when full */
+    bcmos_bool clear_after_read;    /**< Clear log after last record has been read */
+    bcmos_bool enable_log;          /**< Enable logger */
+    bcmolt_str_1000 log_names;      /**< log_names. */
+} bcmolt_logger_cfg_data;
+
+/** Transport message definition for "cfg" group of "logger" object. 
+ */
+typedef struct bcmolt_logger_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_logger_key key;          /**< Object key. */
+    bcmolt_logger_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_logger_cfg;
+
+/** Structure definition for the "stat" group of the "logger" object. 
+ */
+typedef struct bcmolt_logger_stat_data
+{
+    uint32_t lines_in_log;  /**< lines in log. */
+} bcmolt_logger_stat_data;
+
+/** Transport message definition for "stat" group of "logger" object. 
+ */
+typedef struct bcmolt_logger_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_logger_key key;          /**< Object key. */
+    bcmolt_logger_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_logger_stat;
+
+/** Structure definition for the "stat_cfg" group of the "logger" object. 
+ */
+typedef struct bcmolt_logger_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_logger_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "logger" object. 
+ */
+typedef struct bcmolt_logger_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                /**< Transport header. */
+    bcmolt_logger_key key;              /**< Object key. */
+    bcmolt_logger_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_logger_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "logger" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_logger_stat_alarm_cleared_data
+{
+    bcmolt_logger_stat_id stat; /**< Statistic identifier. */
+} bcmolt_logger_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "logger" 
+ * object. 
+ */
+typedef struct bcmolt_logger_stat_alarm_cleared
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_logger_key key;  /**< Object key. */
+    bcmolt_logger_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_logger_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "logger" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_logger_stat_alarm_raised_data
+{
+    bcmolt_logger_stat_id stat; /**< Statistic identifier. */
+} bcmolt_logger_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "logger" 
+ * object. 
+ */
+typedef struct bcmolt_logger_stat_alarm_raised
+{
+    bcmolt_auto hdr;        /**< Transport header. */
+    bcmolt_logger_key key;  /**< Object key. */
+    bcmolt_logger_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_logger_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "logger" object. 
+ */
+typedef struct bcmolt_logger_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_logger_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "logger" object. 
+ */
+typedef struct bcmolt_logger_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_logger_key key;              /**< Object key. */
+    bcmolt_logger_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_logger_auto_cfg;
+
+/** Transport message definition for "clear_log" group of "logger" object. 
+ */
+typedef struct bcmolt_logger_clear_log
+{
+    bcmolt_oper hdr;        /**< Transport header. */
+    bcmolt_logger_key key;  /**< Object key. */
+} bcmolt_logger_clear_log;
+
+/** Structure definition for the "key" group of the "nni" object. 
+ */
+typedef struct bcmolt_nni_key
+{
+    bcmolt_pon_ni pon_ni;   /**< PON NI. */
+} bcmolt_nni_key;
+
+/** Structure definition for the "cfg" group of the "nni" object. 
+ */
+typedef struct bcmolt_nni_cfg_data
+{
+    bcmolt_control_state remote_loopback;   /**< Incoming packets coming from the PON (upstream) and going back to the PON (Downstream)  */
+    bcmolt_control_state line_loopback;     /**< Incoming packets coming from the NNI interface to the PM and going back towards the NNI interface */
+    bcmos_mac_address mac_address;          /**< Mac address to be used for this NNI. */
+    bcmolt_nni_link_status nni_status;      /**< NNI status */
+    bcmolt_nni_link_status nni_backup_status;   /**< Status of the backup NNI. */
+    bcmolt_nni_connection active_nni;           /**< Which NNI is currently active. */
+    uint32_t nni_status_polling_interval_ms;    /**< How often to check the status of the primary and backup NNIs (units: ms). Zero (0) disables status polling. */
+    bcmos_bool autoswitch;                      /**< Should firmware automatically switch between primary/backup NNIs when Loss of Link is detected? */
+    bcmolt_control_state flow_control;          /**< NNI Flow control. */
+} bcmolt_nni_cfg_data;
+
+/** Transport message definition for "cfg" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_cfg
+{
+    bcmolt_cfg hdr;             /**< Transport header. */
+    bcmolt_nni_key key;         /**< Object key. */
+    bcmolt_nni_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_nni_cfg;
+
+/** Structure definition for the "stat" group of the "nni" object. 
+ */
+typedef struct bcmolt_nni_stat_data
+{
+    uint64_t rx_frames_64;              /**< The count of RX 64 byte frames on this NNI. */
+    uint64_t rx_frames_65_127;          /**< The count of RX 65 to 127 byte frames on this NNI. */
+    uint64_t rx_frames_128_255;         /**< The count of RX 128 to 255 byte frames on this NNI. */
+    uint64_t rx_frames_256_511;         /**< The count of RX 256 to 511 byte frames on this NNI. */
+    uint64_t rx_frames_512_1023;        /**< The count of RX 512 to 1023 byte frames on this NNI. */
+    uint64_t rx_frames_1024_1518;       /**< The count of RX 1024 to 1518 byte frames on this NNI. */
+    uint64_t rx_frames_1519_2047;       /**< The count of RX 1519 to 2047 byte frames on this NNI. */
+    uint64_t rx_frames_2048_4095;       /**< The count of RX 2048 to 4095 byte frames on this NNI. */
+    uint64_t rx_frames_4096_9216;       /**< The count of RX 4096 to 9216 byte frames on this NNI. */
+    uint64_t rx_frames_9217_16383;      /**< The count of RX 9217 to 16383 byte frames on this NNI. */
+    uint64_t rx_frames;                 /**< The number of received frames on this NNI. This includes all errored frames as well. */
+    uint64_t rx_bytes;                  /**< The number of received bytes on this NNI. This includes all errored frames as well. */
+    uint64_t rx_good_frames;            /**< The number of received good frames on this NNI. */
+    uint64_t rx_unicast_frames;         /**< The number of received unicast frames on this NNI. */
+    uint64_t rx_multicast_frames;       /**< The number of received multicast frames on this NNI. */
+    uint64_t rx_broadcast_frames;       /**< The number of received broadcast frames on this NNI. */
+    uint64_t rx_fcs_errors;             /**< The number of received FCS errors on this NNI. */
+    uint64_t rx_control_frames;         /**< The number of received control frames on this NNI. */
+    uint64_t rx_pause_frames;           /**< The number of received pause frames on this NNI. */
+    uint64_t rx_pfc_frames;             /**< The number of received PFC frames on this NNI. */
+    uint64_t rx_unsupported_opcode;     /**< The number of received Unsupported Opcode frames on this NNI. */
+    uint64_t rx_unsupported_da;         /**< The number of received unsupported DA frames on this NNI. */
+    uint64_t rx_alignment_errors;       /**< The number of received alignment errors on this NNI. */
+    uint64_t rx_length_out_of_range;    /**< The number of received length out of range errors on this NNI. */
+    uint64_t rx_code_errors;            /**< The number of received code errors on this NNI. */
+    uint64_t rx_oversized_frames;       /**< The number of received oversized frames on this NNI. */
+    uint64_t rx_jabber_frames;          /**< The number of received jabber frames on this NNI. these are oversized frames that also contain an invalid CRC, code error, or IEEE length check error. */
+    uint64_t rx_mtu_check_errors;       /**< The number of received MTU Check Errors on this NNI. */
+    uint64_t rx_promiscuous_frames;     /**< The number of received frames on this NNI that are not control packets and have a DA that is not matching with the RX SA. */
+    uint64_t rx_vlan_frames;            /**< The number of received VLAN tagged frames on this NNI (with TPID 8100). This counts both single and double tagged frames. */
+    uint64_t rx_double_vlan_frames;     /**< The number of received double VLAN tagged frames on this NNI (with TPID 8100).  */
+    uint64_t rx_truncated_frames;       /**< The number of received truncated frames on this NNI. This is likely due to RX FIFO Full.  */
+    uint64_t rx_undersize_frames;       /**< The number of received undersized frames on this NNI. */
+    uint64_t rx_fragmented_frames;      /**< The number of received fragmented frames on this NNI. */
+    uint64_t rx_runt_frames;            /**< The number of received runt frames on this NNI. */
+    uint64_t tx_frames_64;              /**< The count of TX 64 byte frames on this NNI. */
+    uint64_t tx_frames_65_127;          /**< The count of TX 65 to 127 byte frames on this NNI. */
+    uint64_t tx_frames_128_255;         /**< The count of TX 128 to 255 byte frames on this NNI. */
+    uint64_t tx_frames_256_511;         /**< The count of TX 256 to 511 byte frames on this NNI. */
+    uint64_t tx_frames_512_1023;        /**< The count of TX 512 to 1023 byte frames on this NNI. */
+    uint64_t tx_frames_1024_1518;       /**< The count of TX 1024 to 1518 byte frames on this NNI. */
+    uint64_t tx_frames_1519_2047;       /**< The count of TX 1519 to 2047 byte frames on this NNI. */
+    uint64_t tx_frames_2048_4095;       /**< The count of TX 2048 to 4095 byte frames on this NNI. */
+    uint64_t tx_frames_4096_9216;       /**< The count of TX 4096 to 9216 byte frames on this NNI. */
+    uint64_t tx_frames_9217_16383;      /**< The count of TX 9217 to 16383 byte frames on this NNI. */
+    uint64_t tx_frames;                 /**< The number of transmitted frames on this NNI. This includes all errored frames as well. */
+    uint64_t tx_bytes;                  /**< The number of transmitted bytes on this NNI. This includes all errored frames as well. */
+    uint64_t tx_good_frames;            /**< The number of transmitted good frames on this NNI. */
+    uint64_t tx_unicast_frames;         /**< The number of transmitted unicast frames on this NNI. */
+    uint64_t tx_multicast_frames;       /**< The number of transmitted multicast frames on this NNI. */
+    uint64_t tx_broadcast_frames;       /**< The number of transmitted broadcast frames on this NNI. */
+    uint64_t tx_pause_frames;           /**< The number of transmitted pause frames on this NNI. */
+    uint64_t tx_pfc_frames;             /**< The number of transmitted PFC frames on this NNI. */
+    uint64_t tx_jabber_frames;          /**< The number of transmitted jabber frames on this NNI. These are oversized frames that also contain an invalid FCS. */
+    uint64_t tx_fcs_errors;             /**< The number of transmitted FCS errors on this NNI.  */
+    uint64_t tx_control_frames;         /**< The number of transmitted control frames on this NNI.  */
+    uint64_t tx_oversize_frames;        /**< The number of transmitted oversized frames on this NNI.  */
+    uint64_t tx_fragmented_frames;      /**< The number of transmitted fragmented frames on this NNI.  */
+    uint64_t tx_error_frames;           /**< The number of transmitted errored frames on this NNI.  */
+    uint64_t tx_vlan_frames;            /**< The number of transmitted VLAN tagged frames on this NNI (with TPID 8100). This counts both single and double tagged frames. */
+    uint64_t tx_double_vlan_frames;     /**< The number of transmitted double VLAN tagged frames on this NNI (with TPID 8100).  */
+    uint64_t tx_runt_frames;            /**< The number of transmitted runt frames on this NNI.  */
+    uint64_t tx_underrun_frames;        /**< The number of transmitted underrun frames on this NNI. Thus happens when a frame encounters a MAC underrun (Tx Sync FIFO runs out of data before the end of packet). */
+} bcmolt_nni_stat_data;
+
+/** Transport message definition for "stat" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_stat
+{
+    bcmolt_stat hdr;            /**< Transport header. */
+    bcmolt_nni_key key;         /**< Object key. */
+    bcmolt_nni_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_nni_stat;
+
+/** Structure definition for the "stat_cfg" group of the "nni" object. 
+ */
+typedef struct bcmolt_nni_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_nni_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_stat_cfg
+{
+    bcmolt_stat_cfg hdr;            /**< Transport header. */
+    bcmolt_nni_key key;             /**< Object key. */
+    bcmolt_nni_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_nni_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "nni" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_nni_stat_alarm_cleared_data
+{
+    bcmolt_nni_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_nni_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_stat_alarm_cleared
+{
+    bcmolt_auto hdr;    /**< Transport header. */
+    bcmolt_nni_key key; /**< Object key. */
+    bcmolt_nni_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_nni_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "nni" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_nni_stat_alarm_raised_data
+{
+    bcmolt_nni_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_nni_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_stat_alarm_raised
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_nni_key key;                     /**< Object key. */
+    bcmolt_nni_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_nni_stat_alarm_raised;
+
+/** Structure definition for the "status_changed" group of the "nni" object. 
+ *
+ * NNI Link status changed 
+ */
+typedef struct bcmolt_nni_status_changed_data
+{
+    bcmolt_status new_status;               /**< New NNI Link Status */
+    bcmolt_nni_connection link;             /**< Which NNI this indication pertains to. */
+    bcmolt_nni_connection previous_active;  /**< Which NNI was active before this status change. */
+    bcmolt_nni_connection new_active;       /**< Which NNI is now active after this status change. */
+} bcmolt_nni_status_changed_data;
+
+/** Transport message definition for "status_changed" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_status_changed
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_nni_key key;                     /**< Object key. */
+    bcmolt_nni_status_changed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_nni_status_changed;
+
+/** Structure definition for the "auto_cfg" group of the "nni" object. 
+ */
+typedef struct bcmolt_nni_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool status_changed;      /**< If true, indications of type "status_changed" will be generated. */
+} bcmolt_nni_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "nni" object. 
+ */
+typedef struct bcmolt_nni_auto_cfg
+{
+    bcmolt_auto_cfg hdr;            /**< Transport header. */
+    bcmolt_nni_key key;             /**< Object key. */
+    bcmolt_nni_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_nni_auto_cfg;
+
+/** Structure definition for the "key" group of the "nni_serdes" object. 
+ */
+typedef struct bcmolt_nni_serdes_key
+{
+    bcmolt_pon_ni pon_ni;               /**< PON NI. */
+    bcmolt_serdes_instance instance;    /**< SerDes instance.: 0 = Primary, 1 = Secondary. */
+} bcmolt_nni_serdes_key;
+
+/** Structure definition for the "cfg" group of the "nni_serdes" object. 
+ */
+typedef struct bcmolt_nni_serdes_cfg_data
+{
+    uint8_t rx_vga;     /**< Rx Vga. */
+    uint8_t rx_pf;      /**< Peaking Filter */
+    uint8_t rx_lfpf;    /**< Low Frequency Peaking Filter */
+    uint8_t rx_dfe1;    /**< Rx DFE1. */
+    int8_t rx_dfe2;     /**< Rx DFE2. */
+    int8_t rx_dfe3;     /**< Rx DFE3. */
+    int8_t rx_dfe4;     /**< Rx DFE4. */
+    int8_t rx_dfe5;     /**< Rx DFE5. */
+    uint8_t tx_pre;     /**< Tx Pre. */
+    uint8_t tx_main;    /**< Tx Main. */
+    uint8_t tx_post1;   /**< Tx Post1. */
+    int8_t tx_post2;    /**< Tx Post2. */
+    int8_t tx_post3;    /**< Tx Post3. */
+    uint8_t tx_amp;     /**< Tx Amp. */
+} bcmolt_nni_serdes_cfg_data;
+
+/** Transport message definition for "cfg" group of "nni_serdes" object. 
+ */
+typedef struct bcmolt_nni_serdes_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_nni_serdes_key key;          /**< Object key. */
+    bcmolt_nni_serdes_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_nni_serdes_cfg;
+
+/** Structure definition for the "key" group of the "software_error" object. 
+ */
+typedef struct bcmolt_software_error_key
+{
+    uint32_t reserved;  /**< Reserved (set to 0). */
+    uint32_t idx;       /**< Index. */
+} bcmolt_software_error_key;
+
+/** Structure definition for the "cfg" group of the "software_error" object. 
+ */
+typedef struct bcmolt_software_error_cfg_data
+{
+    bcmolt_sw_error entry;  /**< Entry. */
+} bcmolt_software_error_cfg_data;
+
+/** Transport message definition for "cfg" group of "software_error" object. 
+ */
+typedef struct bcmolt_software_error_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_software_error_key key;  /**< Object key. */
+    bcmolt_software_error_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_software_error_cfg;
+
+/** Structure definition for the "key" group of the "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_key
+{
+    uint32_t reserved;  /**< Reserved (set to 0) */
+} bcmolt_trx_calibration_key;
+
+/** Structure definition for the "capture_window_and_statistic_completed" group 
+ * of the "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_capture_window_and_statistic_completed_data
+{
+    bcmolt_u32_list_u32_max_500_hex data_window;    /**< data window. */
+    bcmolt_u32_list_u32_max_500_hex strobe_window;  /**< strobe window. */
+    uint64_t edge_rise_min_min;                     /**< edge rise min min. */
+    uint64_t edge_rise_min_max;                     /**< edge rise min max. */
+    uint64_t edge_rise_max_min;                     /**< edge rise max min. */
+    uint64_t edge_rise_max_max;                     /**< edge rise max max. */
+    uint64_t edge_fall_min_min;                     /**< edge fall min min . */
+    uint64_t edge_fall_min_max;                     /**< edge fall min max. */
+    uint64_t edge_fall_max_min;                     /**< edge fall max min. */
+    uint64_t edge_fall_max_max;                     /**< edge fall max max. */
+    bcmolt_result result;   /**< result. */
+} bcmolt_trx_calibration_capture_window_and_statistic_completed_data;
+
+/** Transport message definition for "capture_window_and_statistic_completed" 
+ * group of "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_capture_window_and_statistic_completed
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_trx_calibration_key key; /**< Object key. */
+    bcmolt_trx_calibration_capture_window_and_statistic_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_trx_calibration_capture_window_and_statistic_completed;
+
+/** Structure definition for the "auto_cfg" group of the "trx_calibration" 
+ * object. 
+ */
+typedef struct bcmolt_trx_calibration_auto_cfg_data
+{
+    bcmos_bool capture_window_and_statistic_completed;  /**< If true, indications of type "capture_window_and_statistic_completed" will be generated. */
+} bcmolt_trx_calibration_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "trx_calibration" 
+ * object. 
+ */
+typedef struct bcmolt_trx_calibration_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_trx_calibration_key key;             /**< Object key. */
+    bcmolt_trx_calibration_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_trx_calibration_auto_cfg;
+
+/** Structure definition for the "start_capture_window" group of the 
+ * "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_start_capture_window_data
+{
+    uint8_t pon_ni; /**< pon_ni. */
+    bcmolt_trx_calibration_trigger trigger;         /**< trigger. */
+    bcmolt_capture_strobe_signal strobe;            /**< strobe. */
+    bcmolt_trx_calibration_window_mode window_mode; /**< window mode. */
+    uint16_t onu_id;    /**< onu id. */
+    bcmolt_trx_calibration_trigger_position trigger_position;   /**< trigger position. */
+    bcmos_bool stop_due_to_corrupt_strobe;                      /**< enable/disable corrupt strobe from MAC to terminate stat window */
+    uint16_t start_offset;      /**< start offset. */
+    uint16_t end_offset;        /**< end offset. */
+    uint8_t number_of_cycles;   /**< number of cycles. */
+} bcmolt_trx_calibration_start_capture_window_data;
+
+/** Transport message definition for "start_capture_window" group of 
+ * "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_start_capture_window
+{
+    bcmolt_oper hdr;                /**< Transport header. */
+    bcmolt_trx_calibration_key key; /**< Object key. */
+    bcmolt_trx_calibration_start_capture_window_data data;  /**< All properties that must be set by the user. */
+} bcmolt_trx_calibration_start_capture_window;
+
+/** Structure definition for the "stop_capture_window" group of the 
+ * "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_stop_capture_window_data
+{
+    uint8_t pon_ni; /**< pon_ni. */
+} bcmolt_trx_calibration_stop_capture_window_data;
+
+/** Transport message definition for "stop_capture_window" group of 
+ * "trx_calibration" object. 
+ */
+typedef struct bcmolt_trx_calibration_stop_capture_window
+{
+    bcmolt_oper hdr;                /**< Transport header. */
+    bcmolt_trx_calibration_key key; /**< Object key. */
+    bcmolt_trx_calibration_stop_capture_window_data data;   /**< All properties that must be set by the user. */
+} bcmolt_trx_calibration_stop_capture_window;
+
+/** Structure definition for the "key" group of the "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_key
+{
+    bcmolt_xgpon_ni pon_ni;         /**< PON network interface. */
+    bcmolt_xgpon_alloc_id alloc_id; /**< Alloc ID. */
+} bcmolt_xgpon_alloc_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_cfg_data
+{
+    bcmolt_alloc_state state;   /**< Current Alloc ID state */
+    bcmolt_pon_alloc_sla sla;   /**< Alloc ID SLA */
+    bcmolt_xgpon_onu_id onu_id; /**< ONU ID the alloc ID is assigned to */
+    bcmos_bool collect_stats;   /**< Enable statistics collection for this alloc ID */
+} bcmolt_xgpon_alloc_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_xgpon_alloc_key key;         /**< Object key. */
+    bcmolt_xgpon_alloc_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_cfg;
+
+/** Structure definition for the "stat" group of the "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_data
+{
+    uint64_t rx_bytes;  /**< Number of alloc ID received bytes. */
+} bcmolt_xgpon_alloc_stat_data;
+
+/** Transport message definition for "stat" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_xgpon_alloc_key key;         /**< Object key. */
+    bcmolt_xgpon_alloc_stat_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_stat;
+
+/** Structure definition for the "stat_cfg" group of the "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_xgpon_alloc_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_cfg
+{
+    bcmolt_stat_cfg hdr;        /**< Transport header. */
+    bcmolt_xgpon_alloc_key key; /**< Object key. */
+    bcmolt_xgpon_alloc_stat_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_stat_cfg;
+
+/** Structure definition for the "configuration_completed" group of the 
+ * "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_configuration_completed_data
+{
+    bcmolt_result status;           /**< status. */
+    bcmolt_alloc_state new_state;   /**< new state. */
+} bcmolt_xgpon_alloc_configuration_completed_data;
+
+/** Transport message definition for "configuration_completed" group of 
+ * "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_configuration_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_alloc_key key; /**< Object key. */
+    bcmolt_xgpon_alloc_configuration_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_configuration_completed;
+
+/** Structure definition for the "get_alloc_stats_completed" group of the 
+ * "xgpon_alloc" object. 
+ *
+ * Collected alloc ID statistics from get_stats operation 
+ */
+typedef struct bcmolt_xgpon_alloc_get_alloc_stats_completed_data
+{
+    bcmolt_result status;           /**< status. */
+    uint32_t average_nsr_used;      /**< Average NSR used words. */
+    uint32_t average_nsr_allocated; /**< Average NSR allocated words. */
+    uint32_t average_sr_report;     /**< Average SR report. */
+} bcmolt_xgpon_alloc_get_alloc_stats_completed_data;
+
+/** Transport message definition for "get_alloc_stats_completed" group of 
+ * "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_get_alloc_stats_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_alloc_key key; /**< Object key. */
+    bcmolt_xgpon_alloc_get_alloc_stats_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_get_alloc_stats_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "xgpon_alloc" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_alarm_cleared_data
+{
+    bcmolt_xgpon_alloc_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_xgpon_alloc_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "xgpon_alloc" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_alloc_key key; /**< Object key. */
+    bcmolt_xgpon_alloc_stat_alarm_cleared_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "xgpon_alloc" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_alarm_raised_data
+{
+    bcmolt_xgpon_alloc_stat_id stat;    /**< Statistic identifier. */
+} bcmolt_xgpon_alloc_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "xgpon_alloc" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_alloc_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_alloc_key key; /**< Object key. */
+    bcmolt_xgpon_alloc_stat_alarm_raised_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_auto_cfg_data
+{
+    bcmos_bool configuration_completed;     /**< If true, indications of type "configuration_completed" will be generated. */
+    bcmos_bool get_alloc_stats_completed;   /**< If true, indications of type "get_alloc_stats_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;          /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;           /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_xgpon_alloc_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                    /**< Transport header. */
+    bcmolt_xgpon_alloc_key key;             /**< Object key. */
+    bcmolt_xgpon_alloc_auto_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_auto_cfg;
+
+/** Structure definition for the "get_stats" group of the "xgpon_alloc" object. 
+ *
+ * Run statistics collection for a given period of time 
+ */
+typedef struct bcmolt_xgpon_alloc_get_stats_data
+{
+    uint32_t num_of_cycles; /**< The number of cycles to run statistics collection */
+} bcmolt_xgpon_alloc_get_stats_data;
+
+/** Transport message definition for "get_stats" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_get_stats
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_xgpon_alloc_key key;             /**< Object key. */
+    bcmolt_xgpon_alloc_get_stats_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_get_stats;
+
+/** Structure definition for the "set_state" group of the "xgpon_alloc" object. 
+ *
+ * Sets the alloc's activation state.  This is only used for protection 
+ * switching on an active-standby PON.  In normal operation, this isn't 
+ * necessary since allocs are activated/deactivated automatically along with 
+ * the ONU. 
+ */
+typedef struct bcmolt_xgpon_alloc_set_state_data
+{
+    bcmolt_alloc_operation state;   /**< State. */
+} bcmolt_xgpon_alloc_set_state_data;
+
+/** Transport message definition for "set_state" group of "xgpon_alloc" object. 
+ */
+typedef struct bcmolt_xgpon_alloc_set_state
+{
+    bcmolt_oper hdr;                        /**< Transport header. */
+    bcmolt_xgpon_alloc_key key;             /**< Object key. */
+    bcmolt_xgpon_alloc_set_state_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_alloc_set_state;
+
+/** Structure definition for the "key" group of the "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_key
+{
+    bcmolt_xgpon_ni pon_ni;             /**< PON network interface. */
+    bcmolt_xgpon_gem_id gem_port_id;    /**< GEM PORT ID. */
+} bcmolt_xgpon_gem_port_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_cfg_data
+{
+    bcmolt_gem_port_configuration configuration;                /**< GEM port configuration parameters */
+    bcmolt_xgpon_onu_id onu_id;                                 /**< ONU ID this GEM port is assigned to */
+    bcmolt_xgpon_gem_port_state gem_port_state;                 /**< Current GEM port state */
+    bcmolt_control_state encryption_mode;                       /**< Enable/Disable the downstream encryption mode of the GEM Port */
+    bcmolt_us_gem_port_destination upstream_destination_queue;  /**< The destination queue of the packets arriving on this GEM Port on the upstream direction */
+    bcmolt_control_state control;   /**< Enable/Disable the GEM Port ID in the OLT */
+} bcmolt_xgpon_gem_port_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;  /**< Object key. */
+    bcmolt_xgpon_gem_port_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_cfg;
+
+/** Structure definition for the "stat" group of the "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_data
+{
+    uint64_t tx_bytes;      /**< TX bytes. */
+    uint64_t tx_packets;    /**< TX packets. */
+    uint64_t rx_packets;    /**< RX packets. */
+    uint64_t rx_bytes;      /**< RX bytes. */
+} bcmolt_xgpon_gem_port_stat_data;
+
+/** Transport message definition for "stat" group of "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat
+{
+    bcmolt_stat hdr;                        /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;          /**< Object key. */
+    bcmolt_xgpon_gem_port_stat_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_stat;
+
+/** Structure definition for the "stat_cfg" group of the "xgpon_gem_port" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_xgpon_gem_port_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "xgpon_gem_port" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_cfg
+{
+    bcmolt_stat_cfg hdr;            /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;  /**< Object key. */
+    bcmolt_xgpon_gem_port_stat_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_stat_cfg;
+
+/** Structure definition for the "stat_alarm_cleared" group of the 
+ * "xgpon_gem_port" object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_alarm_cleared_data
+{
+    bcmolt_xgpon_gem_port_stat_id stat; /**< Statistic identifier. */
+} bcmolt_xgpon_gem_port_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of 
+ * "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_alarm_cleared
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;  /**< Object key. */
+    bcmolt_xgpon_gem_port_stat_alarm_cleared_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the 
+ * "xgpon_gem_port" object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_alarm_raised_data
+{
+    bcmolt_xgpon_gem_port_stat_id stat; /**< Statistic identifier. */
+} bcmolt_xgpon_gem_port_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of 
+ * "xgpon_gem_port" object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_stat_alarm_raised
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;  /**< Object key. */
+    bcmolt_xgpon_gem_port_stat_alarm_raised_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_stat_alarm_raised;
+
+/** Structure definition for the "auto_cfg" group of the "xgpon_gem_port" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_auto_cfg_data
+{
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+} bcmolt_xgpon_gem_port_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "xgpon_gem_port" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_gem_port_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                        /**< Transport header. */
+    bcmolt_xgpon_gem_port_key key;              /**< Object key. */
+    bcmolt_xgpon_gem_port_auto_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_gem_port_auto_cfg;
+
+/** Structure definition for the "key" group of the "xgpon_iwf" object. 
+ */
+typedef struct bcmolt_xgpon_iwf_key
+{
+    bcmolt_xgpon_ni pon_ni; /**< PON network interface. */
+} bcmolt_xgpon_iwf_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_iwf" object. 
+ */
+typedef struct bcmolt_xgpon_iwf_cfg_data
+{
+    uint16_t us_otag_direct_tpid;   /**< TPID value of the VLAN tag added to upstream packet */
+#define BCMOLT_XGPON_IWF_CFG_DATA_DS_TPID_LEN   5
+    bcmolt_arr_u16_5_hex ds_tpid;   /**< Packets marked with one of the five configured DS TPID options will be forwarded, all the rest will be dropped */
+} bcmolt_xgpon_iwf_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_iwf" object. 
+ */
+typedef struct bcmolt_xgpon_iwf_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_xgpon_iwf_key key;       /**< Object key. */
+    bcmolt_xgpon_iwf_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_iwf_cfg;
+
+/** Structure definition for the "key" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_key
+{
+    bcmolt_xgpon_ni pon_ni; /**< PON network interface. */
+} bcmolt_xgpon_ni_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_cfg_data
+{
+    bcmolt_hw_pon_id hw_pon_id; /**< 51 bit PON identifier. This attribute is part of the downstream physical synchronization block (PSBd) */
+    bcmolt_pon_available_bandwidth available_bandwidth; /**< PON available bandwidth parameters */
+    uint16_t number_of_active_onus;                     /**< Number of active ONUs on the PON */
+    bcmolt_pon_status pon_status;                       /**< PON status parameters */
+    bcmolt_pon_distance pon_distance;                   /**< PON distance */
+    uint32_t ranging_window_size;                       /**< Ranging window size in BW units (4-byte words for 2.5G upstream, 16-byte blocks for 10G upstream) */
+    uint32_t eqd_cycles_number;             /**< How many ranging windows are opened during a single ONU activation process */
+    bcmolt_pon_drift_control drift_control; /**< Drift control process configuration */
+    uint8_t los_alarm_threshold;            /**< LOS alarm threshold */
+    bcmolt_status los_initial_value;        /**< LOS initial value following PON activation */
+    bcmolt_xgpon_onu_alarms_thresholds onu_alarms_thresholds;               /**< ONU alarms thresholds configuration */
+    bcmolt_ber_monitor_params ber_monitor;                                  /**< BER monitor process configuration */
+    bcmolt_xgpon_onu_activation onu_activation;                             /**< ONU activation control parameters */
+    bcmolt_xgpon_sn_acquisition sn_acquisition;                             /**< Serial Number process configuration */
+    bcmolt_xgpon_key_exchange key_exchange;                                 /**< Key Exchange process configuration */
+    bcmolt_xgpon_protection_switching protection_switching;                 /**< Protection switching control */
+    bcmolt_xgpon_protection_switching_debug protection_switching_debug;     /**< protection switching debug . */
+    bcmolt_cbr_rt_allocation_profile cbr_rt_allocation_profile;             /**< CBR Real Time allocation profile */
+#define BCMOLT_XGPON_NI_CFG_DATA_CBR_NRT_ALLOCATION_PROFILE_LEN 2
+    bcmolt_arr_u16_2 cbr_nrt_allocation_profile;                            /**< CBR non Real Time allocation profile */
+    bcmolt_onu_power_management_configuration power_management;             /**< ONU power management control */
+    bcmolt_rogue_onu_detection_process rogue_onu_detection_process;         /**< TBD */
+    bcmolt_periodic_standby_pon_monitoring periodic_standby_pon_monitoring; /**< Periodic Standby PON monitoring */
+    bcmolt_dba_mode dba_mode;                       /**< DBA mode */
+    bcmolt_xgpon_ploam_handling ploam_handling;     /**< Ploam handling configuration */
+    bcmolt_xgpon_alloc_id min_data_alloc_id;        /**< Min data Alloc ID value */
+    bcmolt_xgpon_gem_id min_data_gem_port_id;       /**< Min data XGEM port ID value */
+    bcmolt_xgpon_multicast_key multicast_key;       /**< Multicast XGEM ports encryption control */
+    bcmolt_prbs_checker_config prbs_checker;        /**< US PRBS checker configuration */
+    bcmolt_prbs_generator_config prbs_generator;    /**< DS PRBS generator configuration */
+    bcmolt_prbs_status prbs_status;                 /**< Result of US PRBS checker */
+    bcmolt_automatic_onu_deactivation automatic_onu_deactivation;   /**< Option to disable the automatic deactivation of ONUs due to alarms */
+    uint32_t us_bandwidth_limit;    /**< Total PON upstream bandwidth limit in bytes per second. */
+    bcmolt_xgpon_onu_with_state_list_u16_max_510 all_onus;                  /**< All ONUs currently provisioned on this PON. */
+    bcmolt_xgpon_gem_port_with_state_list_u16_max_128 all_mcast_gem_ports;  /**< All multicast GEM ports currently provisioned on this PON. */
+    bcmolt_xgpon_ni_debug debug;                        /**< PON NI debug parameters */
+    bcmolt_gpon_onu_upgrade_params onu_upgrade_params;  /**< ONU upgrade params. */
+    bcmolt_control_state ds_fec_mode;                   /**< DS FEC mode. */
+    bcmolt_dba_type dba_type;                   /**< DBA implementation type */
+    bcmolt_onu_tuning_configuration onu_tuning; /**< onu tuning. */
+} bcmolt_xgpon_ni_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_xgpon_ni_key key;        /**< Object key. */
+    bcmolt_xgpon_ni_cfg_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_cfg;
+
+/** Structure definition for the "stat" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_data
+{
+    uint64_t fec_codewords;             /**< Receive FEC codewords. */
+    uint64_t bip32_bytes;               /**< Received bytes protected by bip32. */
+    uint64_t bip32_errors;              /**< Received bip32 errors. */
+    uint64_t rx_xgtc_headers;           /**< Received valid XGTC headers. */
+    uint64_t rx_xgtc_corrected;         /**< Received corrected XGTC headers. */
+    uint64_t rx_xgtc_uncorrected;       /**< Received uncorrected XGTC headers. */
+    uint64_t rx_xgem;                   /**< Received valid XGEM frames. */
+    uint64_t rx_xgem_dropped;           /**< Received dropped XGEM ID frames. */
+    uint64_t rx_xgem_idle;              /**< Received idle XGEM frames. */
+    uint64_t rx_xgem_corrected;         /**< Received corrected XGEM frames. */
+    uint64_t rx_crc_error;              /**< Received packets with CRC error. */
+    uint64_t rx_fragment_error;         /**< Received fragment errors. */
+    uint64_t rx_packets_dropped;        /**< Global dropped packets. */
+    uint64_t rx_dropped_too_short;      /**< Received packets dropped due to length too short. */
+    uint64_t rx_dropped_too_long;       /**< Received packet dropped due to length too long. */
+    uint64_t rx_key_error;              /**< Received key errors. */
+    uint64_t tx_ploams;                 /**< Transmitted Ploams. */
+    uint64_t rx_ploams_dropped;         /**< Received dropped Ploams. */
+    uint64_t rx_allocations_valid;      /**< Received valid allocations. */
+    uint64_t rx_allocations_invalid;    /**< Received invalid allocations. */
+    uint64_t rx_allocations_disabled;   /**< Received disabled allocations. */
+    uint64_t rx_ploams;                 /**< Received Ploams. */
+    uint64_t rx_ploams_non_idle;        /**< Received non idle Ploams. */
+    uint64_t rx_ploams_error;           /**< Received error Ploams. */
+    uint64_t rx_cpu;                    /**< Received CPU packets. */
+    uint64_t rx_omci;                   /**< Received OMCI packets. */
+    uint64_t rx_omci_packets_crc_error; /**< Received OMCI packets with CRC errors. */
+    uint64_t tx_packets;                /**< Transmitted packets. */
+    uint64_t tx_xgem;                   /**< Transmitted XGEM fragments. */
+    uint64_t tx_cpu;                    /**< Transmitted CPU packets. */
+    uint64_t tx_omci;                   /**< Transmitted OMCI packets. */
+    uint8_t tx_cpu_omci_packets_dropped;    /**< Transmit packets dropped due to illegal length. */
+    uint64_t tx_dropped_illegal_length;     /**< Transmit packets dropped due to illegal length. */
+    uint64_t tx_dropped_tpid_miss;          /**< Transmit packets dropped due to TPID miss. */
+    uint64_t tx_dropped_vid_miss;           /**< Transmit packets droped due to VID miss. */
+} bcmolt_xgpon_ni_stat_data;
+
+/** Transport message definition for "stat" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat
+{
+    bcmolt_stat hdr;                /**< Transport header. */
+    bcmolt_xgpon_ni_key key;        /**< Object key. */
+    bcmolt_xgpon_ni_stat_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_stat;
+
+/** Structure definition for the "stat_cfg" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_xgpon_ni_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                /**< Transport header. */
+    bcmolt_xgpon_ni_key key;            /**< Object key. */
+    bcmolt_xgpon_ni_stat_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_stat_cfg;
+
+/** Transport message definition for "activate_all_onus_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_activate_all_onus_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_activate_all_onus_completed;
+
+/** Structure definition for the "cpu_packets_failure" group of the "xgpon_ni" 
+ * object. 
+ *
+ * A failure was encountered during the "cpu_packets" proxy operation. 
+ */
+typedef struct bcmolt_xgpon_ni_cpu_packets_failure_data
+{
+    bcmolt_packet_injection_error error;    /**< The error that was encountered. */
+    bcmolt_xgpon_gem_id gem_port_id;        /**< The GEM port that caused the error. */
+} bcmolt_xgpon_ni_cpu_packets_failure_data;
+
+/** Transport message definition for "cpu_packets_failure" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_cpu_packets_failure
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_cpu_packets_failure_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_cpu_packets_failure;
+
+/** Transport message definition for "deactivate_all_onus_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_deactivate_all_onus_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_deactivate_all_onus_completed;
+
+/** Transport message definition for "disable_all_onus_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_disable_all_onus_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_disable_all_onus_completed;
+
+/** Transport message definition for "enable_all_onus_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_enable_all_onus_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_enable_all_onus_completed;
+
+/** Structure definition for the "los" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_los_data
+{
+    bcmolt_status status;   /**< status. */
+} bcmolt_xgpon_ni_los_data;
+
+/** Transport message definition for "los" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_los
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_ni_key key;        /**< Object key. */
+    bcmolt_xgpon_ni_los_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_los;
+
+/** Structure definition for the "onu_discovered" group of the "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_onu_discovered_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+    uint32_t ranging_time;              /**< ranging time. */
+    bcmolt_xgpon_onu_id onu_id;         /**< onu_id. */
+    bcmolt_upstream_line_rate_capabilities upstream_line_rate_capabilities; /**< Upstream line rate capabilities */
+    uint8_t current_downstream_pon_id;                  /**< The PON-ID received by the ONU in its current downstream wavelength channel */
+    uint8_t current_upstream_pon_id;                    /**< The PON-ID of the Channel Profile containing the descriptor of the upstream wavelength channel in which the ONU is transmitting */
+#define BCMOLT_XGPON_NI_ONU_DISCOVERED_DATA_CALIBRATION_RECORD_LEN  8
+    bcmolt_arr_calibration_record_8 calibration_record; /**< Calibration record */
+    uint8_t tuning_granularity;             /**< The tuning granularity of the ONU transmitted expressed in units of 1Ghz. Value of 0 indicates that the ONU does not support fine tuning / dithering */
+    uint8_t step_tuning_time;               /**< The value of the tuning time for a single granularity step, expressed in unit of PHY frames. The value 0 indicates that the ONU does not support fine tuning / dithering */
+    uint8_t attenuation;                    /**< The ONU attenuation in steps of 3dB at the time of the message transmission as part of the power levelling report. Value of 0 represents un-attenuated transmission */
+    uint8_t power_levelling_capabilities;   /**< The ONU supports attenuation level in step of 3dB */
+} bcmolt_xgpon_ni_onu_discovered_data;
+
+/** Transport message definition for "onu_discovered" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_onu_discovered
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_onu_discovered_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_onu_discovered;
+
+/** Structure definition for the "onu_upgrade_complete" group of the "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_onu_upgrade_complete_data
+{
+    bcmos_bool status;  /**< Success or failure.  Against entire upgrade process.  This is added per Anat's request. */
+    bcmolt_gpon_onu_upgrade_status_list_u32 list_of_failed_entities;    /**< List of ONU-IDs the upgrade failed for. */
+} bcmolt_xgpon_ni_onu_upgrade_complete_data;
+
+/** Transport message definition for "onu_upgrade_complete" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_onu_upgrade_complete
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_onu_upgrade_complete_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_onu_upgrade_complete;
+
+/** Structure definition for the "protection_switching_onus_ranged" group of the 
+ * "xgpon_ni" object. 
+ *
+ * After a switchover is complete and all ONU ranging times have stabilized, 
+ * this indication is sent to inform the host of all new ONU EQDs. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_onus_ranged_data
+{
+    bcmolt_xgpon_onu_eqd_list_u32 onus; /**< ONUs. */
+} bcmolt_xgpon_ni_protection_switching_onus_ranged_data;
+
+/** Transport message definition for "protection_switching_onus_ranged" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_onus_ranged
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_protection_switching_onus_ranged_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_protection_switching_onus_ranged;
+
+/** Structure definition for the "protection_switching_switchover_completed" 
+ * group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_switchover_completed_data
+{
+    bcmolt_result result;   /**< Result. */
+} bcmolt_xgpon_ni_protection_switching_switchover_completed_data;
+
+/** Transport message definition for "protection_switching_switchover_completed" 
+ * group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_switchover_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_protection_switching_switchover_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_protection_switching_switchover_completed;
+
+/** Structure definition for the "protection_switching_traffic_resume" group of 
+ * the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_traffic_resume_data
+{
+    bcmolt_traffic_resume_result result;    /**< Result. */
+} bcmolt_xgpon_ni_protection_switching_traffic_resume_data;
+
+/** Transport message definition for "protection_switching_traffic_resume" group 
+ * of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_protection_switching_traffic_resume
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_protection_switching_traffic_resume_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_protection_switching_traffic_resume;
+
+/** Structure definition for the "rogue_detection_completed" group of the 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_rogue_detection_completed_data
+{
+    bcmolt_rogue_detection_window window_type;          /**< Silent Window or Cut off Window */
+    bcmolt_rogue_measurement_result measurement_status; /**< Status of the rogue ONU detection result. */
+    bcmolt_xgpon_alloc_id alloc_id;                     /**< Alloc-ID */
+    bcmolt_xgpon_onu_id onu_id;                 /**< ONU-ID */
+    bcmos_bool is_delineation;                  /**< Burst Delineation detected during the rogue ONU detection. */
+    bcmos_bool is_ed;                           /**< Is ED. */
+    bcmolt_u8_list_u32 rx_data;                 /**< Captured PLOAMu message if the burst delinieation was detected. */
+    bcmolt_xgpon_onu_id ploam_received_onu_id;  /**< ONU ID received in the ploam */
+    bcmos_bool ploam_received_mic_error;        /**< Mic error in the received ploam */
+} bcmolt_xgpon_ni_rogue_detection_completed_data;
+
+/** Transport message definition for "rogue_detection_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_rogue_detection_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_rogue_detection_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_rogue_detection_completed;
+
+/** Transport message definition for "rogue_onu_special_map_cycle_start" group 
+ * of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start;
+
+/** Transport message definition for "serial_number_acquisition_cycle_start" 
+ * group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_serial_number_acquisition_cycle_start
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_serial_number_acquisition_cycle_start;
+
+/** Structure definition for the "standby_pon_monitoring_cycle_completed" group 
+ * of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data
+{
+    uint32_t number_of_detected_delimiter;  /**< number of detected delimiter. */
+    bcmolt_status energy_detect_signal;     /**< energy detect signal. */
+} bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data;
+
+/** Transport message definition for "standby_pon_monitoring_cycle_completed" 
+ * group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "xgpon_ni" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_alarm_cleared_data
+{
+    bcmolt_xgpon_ni_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_xgpon_ni_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_stat_alarm_cleared_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "xgpon_ni" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_alarm_raised_data
+{
+    bcmolt_xgpon_ni_stat_id stat;   /**< Statistic identifier. */
+} bcmolt_xgpon_ni_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_stat_alarm_raised_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_stat_alarm_raised;
+
+/** Structure definition for the "state_change_completed" group of the 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_state_change_completed_data
+{
+    bcmolt_result result;               /**< Result. */
+    bcmolt_pon_state previous_state;    /**< Previous state. */
+    bcmolt_pon_state new_state;         /**< new state. */
+} bcmolt_xgpon_ni_state_change_completed_data;
+
+/** Transport message definition for "state_change_completed" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_state_change_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_state_change_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_state_change_completed;
+
+/** Structure definition for the "tod_request_completed" group of the "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_tod_request_completed_data
+{
+    bcmolt_str_64 tod_string;   /**< tod_string. */
+    uint64_t sfc;               /**< sfc. */
+    uint64_t rtc_offset_sec;    /**< rtc_offset_sec. */
+    uint32_t rtc_offset_nsec;   /**< rtc_offset_nsec. */
+    bcmolt_result status;       /**< status. */
+} bcmolt_xgpon_ni_tod_request_completed_data;
+
+/** Transport message definition for "tod_request_completed" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_tod_request_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_tod_request_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_tod_request_completed;
+
+/** Structure definition for the "auto_cfg" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_auto_cfg_data
+{
+    bcmos_bool activate_all_onus_completed;     /**< If true, indications of type "activate_all_onus_completed" will be generated. */
+    bcmos_bool cpu_packets_failure;             /**< If true, indications of type "cpu_packets_failure" will be generated. */
+    bcmos_bool deactivate_all_onus_completed;   /**< If true, indications of type "deactivate_all_onus_completed" will be generated. */
+    bcmos_bool disable_all_onus_completed;      /**< If true, indications of type "disable_all_onus_completed" will be generated. */
+    bcmos_bool enable_all_onus_completed;       /**< If true, indications of type "enable_all_onus_completed" will be generated. */
+    bcmos_bool los;                     /**< If true, indications of type "los" will be generated. */
+    bcmos_bool onu_discovered;          /**< If true, indications of type "onu_discovered" will be generated. */
+    bcmos_bool onu_upgrade_complete;    /**< If true, indications of type "onu_upgrade_complete" will be generated. */
+    bcmos_bool protection_switching_onus_ranged;            /**< If true, indications of type "protection_switching_onus_ranged" will be generated. */
+    bcmos_bool protection_switching_switchover_completed;   /**< If true, indications of type "protection_switching_switchover_completed" will be generated. */
+    bcmos_bool protection_switching_traffic_resume;         /**< If true, indications of type "protection_switching_traffic_resume" will be generated. */
+    bcmos_bool rogue_detection_completed;                   /**< If true, indications of type "rogue_detection_completed" will be generated. */
+    bcmos_bool rogue_onu_special_map_cycle_start;           /**< If true, indications of type "rogue_onu_special_map_cycle_start" will be generated. */
+    bcmos_bool serial_number_acquisition_cycle_start;       /**< If true, indications of type "serial_number_acquisition_cycle_start" will be generated. */
+    bcmos_bool standby_pon_monitoring_cycle_completed;      /**< If true, indications of type "standby_pon_monitoring_cycle_completed" will be generated. */
+    bcmos_bool stat_alarm_cleared;      /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;       /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool state_change_completed;  /**< If true, indications of type "state_change_completed" will be generated. */
+    bcmos_bool tod_request_completed;   /**< If true, indications of type "tod_request_completed" will be generated. */
+} bcmolt_xgpon_ni_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_auto_cfg
+{
+    bcmolt_auto_cfg hdr;                /**< Transport header. */
+    bcmolt_xgpon_ni_key key;            /**< Object key. */
+    bcmolt_xgpon_ni_auto_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_auto_cfg;
+
+/** Structure definition for the "adjust_tx_wavelength" group of the "xgpon_ni" 
+ * object. 
+ *
+ * Instruct an unassigned ONU to adjust its upstream transmitter wavelength 
+ */
+typedef struct bcmolt_xgpon_ni_adjust_tx_wavelength_data
+{
+    bcmolt_serial_number serial_number; /**< Serial number */
+    bcmolt_frequency_adjustment_direction freqency_adjustment_direction;    /**< Frequency adjustment direction */
+    uint8_t frequency_adjustment_size;  /**< The size of the frequncy adjustment in units of 0.1 Ghz */
+} bcmolt_xgpon_ni_adjust_tx_wavelength_data;
+
+/** Transport message definition for "adjust_tx_wavelength" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_adjust_tx_wavelength
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_adjust_tx_wavelength_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_adjust_tx_wavelength;
+
+/** Structure definition for the "disable_serial_number" group of the "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_disable_serial_number_data
+{
+    bcmolt_disable_serial_number_control control;   /**< control. */
+    bcmolt_serial_number serial_number;             /**< serial number. */
+} bcmolt_xgpon_ni_disable_serial_number_data;
+
+/** Transport message definition for "disable_serial_number" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_disable_serial_number
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_disable_serial_number_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_disable_serial_number;
+
+/** Transport message definition for "reset" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_reset
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_reset;
+
+/** Structure definition for the "rogue_detection_window" group of the 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_rogue_detection_window_data
+{
+    bcmolt_rogue_detection_window window_type;  /**< Type of silent measurement to execute */
+    bcmolt_xgpon_alloc_id alloc_id;             /**< ALLOC ID to scan */
+    bcmolt_xgpon_onu_id onu_id;                 /**< ONU ID to scan */
+    bcmos_bool second_ranging_window;           /**< Not currently supported */
+} bcmolt_xgpon_ni_rogue_detection_window_data;
+
+/** Transport message definition for "rogue_detection_window" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_rogue_detection_window
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_rogue_detection_window_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_rogue_detection_window;
+
+/** Structure definition for the "run_special_bw_map" group of the "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_run_special_bw_map_data
+{
+    uint8_t number_of_cycle;    /**< number of cycle. */
+    uint8_t allocation_number;  /**< allocation number. */
+    uint8_t bw_map_array;       /**< bw map array. */
+} bcmolt_xgpon_ni_run_special_bw_map_data;
+
+/** Transport message definition for "run_special_bw_map" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_run_special_bw_map
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_run_special_bw_map_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_run_special_bw_map;
+
+/** Structure definition for the "set_onu_state" group of the "xgpon_ni" object. 
+ *
+ * Set the operation state of all ONUs. 
+ */
+typedef struct bcmolt_xgpon_ni_set_onu_state_data
+{
+    bcmolt_onu_operation onu_state; /**< New operation state of all ONUs.  The default operation may be configured by the XGPON NI configuration object : xgpon_ni.cfg.sn_acquisition. */
+} bcmolt_xgpon_ni_set_onu_state_data;
+
+/** Transport message definition for "set_onu_state" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_set_onu_state
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_set_onu_state_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_set_onu_state;
+
+/** Structure definition for the "set_pon_state" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_set_pon_state_data
+{
+    bcmolt_pon_operation pon_state; /**< PON state. */
+} bcmolt_xgpon_ni_set_pon_state_data;
+
+/** Transport message definition for "set_pon_state" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_set_pon_state
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_set_pon_state_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_set_pon_state;
+
+/** Transport message definition for "single_request_standby_pon_monitoring" 
+ * group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_single_request_standby_pon_monitoring
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_single_request_standby_pon_monitoring;
+
+/** Structure definition for the "start_onu_upgrade" group of the "xgpon_ni" 
+ * object. 
+ *
+ * OLT to ONU firmware transfer 
+ */
+typedef struct bcmolt_xgpon_ni_start_onu_upgrade_data
+{
+    bcmolt_pon_onu_id_list_u32 list_of_onu_ids; /**< List of ONU IDs to upgrade the firmware. */
+} bcmolt_xgpon_ni_start_onu_upgrade_data;
+
+/** Transport message definition for "start_onu_upgrade" group of "xgpon_ni" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_ni_start_onu_upgrade
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_start_onu_upgrade_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_start_onu_upgrade;
+
+/** Transport message definition for "tod_request" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_tod_request
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+} bcmolt_xgpon_ni_tod_request;
+
+/** Structure definition for the "broadcast_ploam_packet" group of the 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_broadcast_ploam_packet_data
+{
+#define BCMOLT_XGPON_NI_BROADCAST_PLOAM_PACKET_DATA_PLOAM_LEN   40
+    bcmolt_arr_u8_40 ploam; /**< ploam. */
+} bcmolt_xgpon_ni_broadcast_ploam_packet_data;
+
+/** Transport message definition for "broadcast_ploam_packet" group of 
+ * "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_broadcast_ploam_packet
+{
+    bcmolt_proxy hdr;           /**< Transport header. */
+    bcmolt_xgpon_ni_key key;    /**< Object key. */
+    bcmolt_xgpon_ni_broadcast_ploam_packet_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_broadcast_ploam_packet;
+
+/** Structure definition for the "cpu_packets" group of the "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_cpu_packets_data
+{
+    bcmolt_packet_type packet_type;                     /**< packet type. */
+    bcmos_bool calc_crc;                                /**< calc crc. */
+    bcmolt_xgpon_gem_id_list_u8_max_16 gem_port_list;   /**< gem port list. */
+    bcmolt_u8_list_u32_max_2048 buffer;                 /**< buffer. */
+} bcmolt_xgpon_ni_cpu_packets_data;
+
+/** Transport message definition for "cpu_packets" group of "xgpon_ni" object. 
+ */
+typedef struct bcmolt_xgpon_ni_cpu_packets
+{
+    bcmolt_proxy hdr;                       /**< Transport header. */
+    bcmolt_xgpon_ni_key key;                /**< Object key. */
+    bcmolt_xgpon_ni_cpu_packets_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_ni_cpu_packets;
+
+/** Structure definition for the "key" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key
+{
+    bcmolt_xgpon_ni pon_ni;     /**< PON network interface. */
+    bcmolt_xgpon_onu_id onu_id; /**< onu id. */
+} bcmolt_xgpon_onu_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_cfg_data
+{
+    bcmolt_onu_state onu_state;     /**< Current ONU state */
+    bcmolt_onu_state onu_old_state; /**< onu old state. */
+    bcmolt_xgpon_onu_alarm_state alarm_state;   /**< State of all ONU alarms.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    bcmolt_xgpon_onu_registration_keys registration_encryption_keys;    /**< AES encryption keys learned during ONU registration.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    bcmolt_xgpon_onu_aes_key current_encryption_key;                    /**< Current AES encryption key.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    bcmolt_serial_number serial_number;                 /**< ONU serial number */
+#define BCMOLT_XGPON_ONU_CFG_DATA_REGISTRATION_ID_LEN   36
+    bcmolt_arr_u8_36 registration_id;                   /**< ONU registration ID */
+    bcmos_bool registration_id_auto_learning;           /**< Enable\Disable automatic registration learning */
+    bcmolt_burst_profile_index ranging_burst_profile;   /**< Burst profile index for ranging allocations */
+    bcmolt_burst_profile_index data_burst_profile;      /**< Burst profile index for data allocations */
+    uint32_t ranging_time;                  /**< ONU ranging time.  This is normally read-only and can only be written when the PON is in active-standby mode to keep the ONU in sync. */
+    bcmolt_status disabled_after_discovery; /**< This ONU was disabled after SN discovery */
+    bcmolt_deactivation_reason deactivation_reason;                     /**< deactivation reason. */
+    bcmolt_xgpon_gem_port_with_state_list_u16_max_256 all_gem_ports;    /**< All unicast GEM ports currently provisioned on this ONU. */
+    bcmolt_xgpon_alloc_with_state_list_u16_max_32 all_allocs;           /**< All alloc IDs currently provisioned on this ONU. */
+    bcmolt_extended_guard_time extended_guard_time;                     /**< Additional guard time (in bytes) for this ONU. */
+    bcmolt_upstream_line_rate_capabilities us_line_rate;                /**< US line rate. */
+#define BCMOLT_XGPON_ONU_CFG_DATA_CALIBRATION_RECORD_LEN    8
+    bcmolt_arr_calibration_record_8 calibration_record;                 /**< Calibration record. */
+    uint8_t tuning_granularity;             /**< The tuning granularity of the ONU transmitted expressed in units of 1GHz. Value of 0 indicates that the ONU does not support fine tuning/dithering */
+    uint8_t step_tuning_time;               /**< The value of the tuning time for a single granularity step, expressed in units of PHY frames. */
+    uint8_t power_levelling_capabilities;   /**< Power levelling capabilities. */
+    bcmolt_request_registration_status request_registration_status; /**< This value indicate that the onu is in the middle of request registration process */
+} bcmolt_xgpon_onu_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_xgpon_onu_key key;       /**< Object key. */
+    bcmolt_xgpon_onu_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_cfg;
+
+/** Structure definition for the "stat" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_data
+{
+    uint64_t positive_drift;            /**< positive drift. */
+    uint64_t negative_drift;            /**< negative drift. */
+    uint64_t delimiter_miss_detection;  /**< delimiter miss detection. */
+    uint64_t bip32_errors;              /**< bip32 errors. */
+    uint64_t rx_words;                  /**< Number of 4-byte words received (word size is 4 bytes regardless of upstream data rate). */
+    uint64_t fec_corrected_symbols;     /**< fec corrected symbols. */
+    uint64_t fec_corrected_codewords;   /**< fec corrected codewords. */
+    uint64_t fec_uncorrectable_codewords;   /**< fec uncorrectable codewords. */
+    uint64_t fec_codewords;                 /**< fec total codewords. */
+    uint64_t fec_corrected_bits;            /**< fec corrected bits. */
+    uint64_t xgem_key_errors;               /**< xgem key error. */
+    uint64_t xgem_loss;                     /**< xgem loss . */
+    uint64_t rx_ploams_mic_error;           /**< mic error ploam. */
+    uint64_t rx_ploams_non_idle;            /**< non idle ploam. */
+    uint64_t rx_omci;                       /**< Received OMCI packets. */
+    uint64_t rx_omci_packets_crc_error;     /**< Received OMCI packets with CRC errors. */
+    uint64_t rx_bytes;                      /**< rx bytes. */
+    uint64_t rx_packets;                    /**< rx packets. */
+    uint64_t tx_bytes;                      /**< tx bytes. */
+    uint64_t tx_packets;                    /**< tx packets. */
+} bcmolt_xgpon_onu_stat_data;
+
+/** Transport message definition for "stat" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat
+{
+    bcmolt_stat hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_stat_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_stat;
+
+/** Structure definition for the "stat_cfg" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_cfg_data
+{
+    bcmolt_stat_alarm_config cfg;   /**< Statistic alarm configuration. */
+} bcmolt_xgpon_onu_stat_cfg_data;
+
+/** Transport message definition for "stat_cfg" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_cfg
+{
+    bcmolt_stat_cfg hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;               /**< Object key. */
+    bcmolt_xgpon_onu_stat_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_stat_cfg;
+
+/** Structure definition for the "dfi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dfi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_xgpon_onu_dfi_data;
+
+/** Transport message definition for "dfi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dfi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_onu_key key;       /**< Object key. */
+    bcmolt_xgpon_onu_dfi_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_dfi;
+
+/** Structure definition for the "dgi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dgi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_xgpon_onu_dgi_data;
+
+/** Transport message definition for "dgi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dgi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_onu_key key;       /**< Object key. */
+    bcmolt_xgpon_onu_dgi_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_dgi;
+
+/** Structure definition for the "dowi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dowi_data
+{
+    bcmolt_status alarm_status; /**< Alarm status. */
+    int32_t drift_value;        /**< Calculated amount of drift (positive + negative as a signed value). */
+    uint32_t new_eqd;           /**< New EQD after drift is corrected (only valid if status is 'on'). */
+} bcmolt_xgpon_onu_dowi_data;
+
+/** Transport message definition for "dowi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_dowi
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_dowi_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_dowi;
+
+/** Structure definition for the "invalid_dbru_report" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_invalid_dbru_report_data
+{
+    bcmolt_xgpon_alloc_id alloc_id; /**< Alloc-ID. */
+} bcmolt_xgpon_onu_invalid_dbru_report_data;
+
+/** Transport message definition for "invalid_dbru_report" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_invalid_dbru_report
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_invalid_dbru_report_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_invalid_dbru_report;
+
+/** Structure definition for the "key_exchange_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_completed_data
+{
+    bcmolt_xgpon_onu_aes_key new_key;   /**< new key. */
+} bcmolt_xgpon_onu_key_exchange_completed_data;
+
+/** Transport message definition for "key_exchange_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_key_exchange_completed_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_key_exchange_completed;
+
+/** Transport message definition for "key_exchange_cycle_skipped" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_cycle_skipped
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_key_exchange_cycle_skipped;
+
+/** Structure definition for the "key_exchange_key_mismatch" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_key_mismatch_data
+{
+    bcmolt_aes_key expected_key;    /**< expected key. */
+    bcmolt_aes_key received_key;    /**< received key. */
+} bcmolt_xgpon_onu_key_exchange_key_mismatch_data;
+
+/** Transport message definition for "key_exchange_key_mismatch" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_key_mismatch
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_key_exchange_key_mismatch_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_key_exchange_key_mismatch;
+
+/** Transport message definition for "key_exchange_key_request_timeout" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_key_exchange_key_request_timeout
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_key_exchange_key_request_timeout;
+
+/** Structure definition for the "looci" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_looci_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_xgpon_onu_looci_data;
+
+/** Transport message definition for "looci" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_looci
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_looci_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_looci;
+
+/** Structure definition for the "onu_activation_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_activation_completed_data
+{
+    bcmolt_result status;   /**< status. */
+    bcmolt_activation_fail_reason fail_reason;  /**< fail reason. */
+#define BCMOLT_XGPON_ONU_ONU_ACTIVATION_COMPLETED_DATA_REGISTRATION_ID_LEN  36
+    bcmolt_arr_u8_36 registration_id;           /**< registration id. */
+    bcmolt_xgpon_onu_registration_keys registration_encryption_keys;    /**< registration encryption keys. */
+} bcmolt_xgpon_onu_onu_activation_completed_data;
+
+/** Transport message definition for "onu_activation_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_activation_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_activation_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_activation_completed;
+
+/** Structure definition for the "onu_alarm" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_alarm_data
+{
+    bcmolt_xgpon_onu_alarms onu_alarm;  /**< onu alarm. */
+} bcmolt_xgpon_onu_onu_alarm_data;
+
+/** Transport message definition for "onu_alarm" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_alarm
+{
+    bcmolt_auto hdr;                        /**< Transport header. */
+    bcmolt_xgpon_onu_key key;               /**< Object key. */
+    bcmolt_xgpon_onu_onu_alarm_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_alarm;
+
+/** Structure definition for the "onu_deactivation_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_deactivation_completed_data
+{
+    bcmolt_result status;   /**< Status. */
+} bcmolt_xgpon_onu_onu_deactivation_completed_data;
+
+/** Transport message definition for "onu_deactivation_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_deactivation_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_deactivation_completed_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_deactivation_completed;
+
+/** Structure definition for the "onu_disable_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_disable_completed_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+} bcmolt_xgpon_onu_onu_disable_completed_data;
+
+/** Transport message definition for "onu_disable_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_disable_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_disable_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_disable_completed;
+
+/** Structure definition for the "onu_enable_completed" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_enable_completed_data
+{
+    bcmolt_serial_number serial_number; /**< serial number. */
+} bcmolt_xgpon_onu_onu_enable_completed_data;
+
+/** Transport message definition for "onu_enable_completed" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_enable_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_enable_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_enable_completed;
+
+/** Structure definition for the "onu_tuning_in_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_in_completed_data
+{
+    bcmolt_result result;                   /**< result. */
+    bcmolt_tune_in_fail_reason fail_reason; /**< fail reason. */
+} bcmolt_xgpon_onu_onu_tuning_in_completed_data;
+
+/** Transport message definition for "onu_tuning_in_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_in_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_tuning_in_completed_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_tuning_in_completed;
+
+/** Structure definition for the "onu_tuning_out_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_out_completed_data
+{
+    bcmolt_result result;                       /**< result. */
+    bcmolt_tune_out_fail_reason fail_reason;    /**< fail reason. */
+} bcmolt_xgpon_onu_onu_tuning_out_completed_data;
+
+/** Transport message definition for "onu_tuning_out_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_out_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_tuning_out_completed_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_tuning_out_completed;
+
+/** Transport message definition for "optical_reflection" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_optical_reflection
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_optical_reflection;
+
+/** Structure definition for the "possible_drift" group of the "xgpon_onu" 
+ * object. 
+ *
+ * An ONU in a low power state may be experiencing drift beyond the configured 
+ * threshold. The estimate may be inaccurate depending on ONU behavior. Actual 
+ * drift may be less than estimated. 
+ */
+typedef struct bcmolt_xgpon_onu_possible_drift_data
+{
+    bcmolt_status alarm_status; /**< On: estimated drift has exceeded the configured threshold. */
+    int32_t estimated_drift;    /**< If status is on, the estimated drift value, otherwise zero (0). */
+} bcmolt_xgpon_onu_possible_drift_data;
+
+/** Transport message definition for "possible_drift" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_possible_drift
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_possible_drift_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_possible_drift;
+
+/** Structure definition for the "power_consumption_report" group of the 
+ * "xgpon_onu" object. 
+ *
+ * Power consumption report 
+ */
+typedef struct bcmolt_xgpon_onu_power_consumption_report_data
+{
+#define BCMOLT_XGPON_ONU_POWER_CONSUMPTION_REPORT_DATA_POWER_CONSUMPTION_REPORT_LEN 8
+    bcmolt_arr_power_consumption_channel_report_8 power_consumption_report; /**< power consumption report. */
+} bcmolt_xgpon_onu_power_consumption_report_data;
+
+/** Transport message definition for "power_consumption_report" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_power_consumption_report
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_power_consumption_report_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_power_consumption_report;
+
+/** Structure definition for the "power_level_report" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Power level report 
+ */
+typedef struct bcmolt_xgpon_onu_power_level_report_data
+{
+    uint8_t attenuation;                /**< Attenuation. */
+    uint8_t power_levelling_capability; /**< Power levelling capability. */
+} bcmolt_xgpon_onu_power_level_report_data;
+
+/** Transport message definition for "power_level_report" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_power_level_report
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_power_level_report_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_power_level_report;
+
+/** Structure definition for the "power_management_state_change" group of the 
+ * "xgpon_onu" object. 
+ *
+ * Notification that an ONUs power management state has changed. 
+ */
+typedef struct bcmolt_xgpon_onu_power_management_state_change_data
+{
+    bcmolt_onu_state old_state; /**< The state the ONU was previously in. */
+    bcmolt_onu_state new_state; /**< The state the ONU is currently in. */
+    bcmolt_power_management_transition_reason reason;   /**< The reason for the state change. */
+} bcmolt_xgpon_onu_power_management_state_change_data;
+
+/** Transport message definition for "power_management_state_change" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_power_management_state_change
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_power_management_state_change_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_power_management_state_change;
+
+/** Structure definition for the "pqsi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_pqsi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_xgpon_onu_pqsi_data;
+
+/** Transport message definition for "pqsi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_pqsi
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_pqsi_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_pqsi;
+
+/** Structure definition for the "ranging_completed" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_ranging_completed_data
+{
+    bcmolt_result status;                   /**< status. */
+    bcmolt_ranging_fail_reason fail_reason; /**< fail reason. */
+    uint32_t eqd;               /**< EQD. */
+    uint8_t number_of_ploams;   /**< number of ploams. */
+    uint8_t power_level;        /**< power level. */
+} bcmolt_xgpon_onu_ranging_completed_data;
+
+/** Transport message definition for "ranging_completed" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_ranging_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_ranging_completed_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_ranging_completed;
+
+/** Structure definition for the "registration_id" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Registration ID 
+ */
+typedef struct bcmolt_xgpon_onu_registration_id_data
+{
+#define BCMOLT_XGPON_ONU_REGISTRATION_ID_DATA_REGISTRATION_ID_LEN   36
+    bcmolt_arr_u8_36 registration_id;           /**< Registration ID. */
+    bcmolt_result request_registration_status;  /**< request registration status. */
+    bcmolt_request_registration_fail_reason request_registration_fail_reason;   /**< request registration fail reason. */
+} bcmolt_xgpon_onu_registration_id_data;
+
+/** Transport message definition for "registration_id" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_registration_id
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_registration_id_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_registration_id;
+
+/** Structure definition for the "rssi_measurement_completed" group of the 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_rssi_measurement_completed_data
+{
+    bcmolt_result status;   /**< status. */
+    bcmolt_rssi_measurement_fail_reason fail_reason;    /**< fail reason. */
+} bcmolt_xgpon_onu_rssi_measurement_completed_data;
+
+/** Transport message definition for "rssi_measurement_completed" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_rssi_measurement_completed
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_rssi_measurement_completed_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_rssi_measurement_completed;
+
+/** Structure definition for the "sdi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sdi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+    uint32_t ber;               /**< Inverse bit error rate (e.g. if this number is 1000, the BER is 1/1000). */
+} bcmolt_xgpon_onu_sdi_data;
+
+/** Transport message definition for "sdi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sdi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_onu_key key;       /**< Object key. */
+    bcmolt_xgpon_onu_sdi_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_sdi;
+
+/** Structure definition for the "secure_mutual_authentication_failure" group of 
+ * the "xgpon_onu" object. 
+ *
+ * Failure of secure mutual authentication due to MIC error 
+ */
+typedef struct bcmolt_xgpon_onu_secure_mutual_authentication_failure_data
+{
+    bcmolt_result status;   /**< status. */
+    bcmolt_secure_mutual_authentication_fail_reason fail_reason;    /**< secure mutual authentication fail reason. */
+} bcmolt_xgpon_onu_secure_mutual_authentication_failure_data;
+
+/** Transport message definition for "secure_mutual_authentication_failure" 
+ * group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_secure_mutual_authentication_failure
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_secure_mutual_authentication_failure_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_secure_mutual_authentication_failure;
+
+/** Structure definition for the "sfi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sfi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+    uint32_t ber;               /**< Inverse bit error rate (e.g. if this number is 1000, the BER is 1/1000). */
+} bcmolt_xgpon_onu_sfi_data;
+
+/** Transport message definition for "sfi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sfi
+{
+    bcmolt_auto hdr;                /**< Transport header. */
+    bcmolt_xgpon_onu_key key;       /**< Object key. */
+    bcmolt_xgpon_onu_sfi_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_sfi;
+
+/** Structure definition for the "stat_alarm_cleared" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition is no longer met. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_alarm_cleared_data
+{
+    bcmolt_xgpon_onu_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_xgpon_onu_stat_alarm_cleared_data;
+
+/** Transport message definition for "stat_alarm_cleared" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_alarm_cleared
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_stat_alarm_cleared_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_stat_alarm_cleared;
+
+/** Structure definition for the "stat_alarm_raised" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Sent when a configured statistic alarm condition has been met. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_alarm_raised_data
+{
+    bcmolt_xgpon_onu_stat_id stat;  /**< Statistic identifier. */
+} bcmolt_xgpon_onu_stat_alarm_raised_data;
+
+/** Transport message definition for "stat_alarm_raised" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_stat_alarm_raised
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_stat_alarm_raised_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_stat_alarm_raised;
+
+/** Structure definition for the "sufi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sufi_data
+{
+    bcmolt_status alarm_status; /**< alarm status. */
+} bcmolt_xgpon_onu_sufi_data;
+
+/** Transport message definition for "sufi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_sufi
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_sufi_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_sufi;
+
+/** Structure definition for the "tiwi" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_tiwi_data
+{
+    bcmolt_status alarm_status; /**< Alarm status. */
+    int32_t drift_value;        /**< Calculated amount of drift (positive + negative as a signed value). */
+} bcmolt_xgpon_onu_tiwi_data;
+
+/** Transport message definition for "tiwi" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_tiwi
+{
+    bcmolt_auto hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;           /**< Object key. */
+    bcmolt_xgpon_onu_tiwi_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_tiwi;
+
+/** Structure definition for the "tuning_response" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_tuning_response_data
+{
+    bcmos_bool ack;         /**< is tuning response received with ack or nack */
+    bcmolt_result result;   /**< result. */
+} bcmolt_xgpon_onu_tuning_response_data;
+
+/** Transport message definition for "tuning_response" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_tuning_response
+{
+    bcmolt_auto hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_tuning_response_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_tuning_response;
+
+/** Structure definition for the "auto_cfg" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_auto_cfg_data
+{
+    bcmos_bool dfi;                     /**< If true, indications of type "dfi" will be generated. */
+    bcmos_bool dgi;                     /**< If true, indications of type "dgi" will be generated. */
+    bcmos_bool dowi;                    /**< If true, indications of type "dowi" will be generated. */
+    bcmos_bool invalid_dbru_report;     /**< If true, indications of type "invalid_dbru_report" will be generated. */
+    bcmos_bool key_exchange_completed;  /**< If true, indications of type "key_exchange_completed" will be generated. */
+    bcmos_bool key_exchange_cycle_skipped;          /**< If true, indications of type "key_exchange_cycle_skipped" will be generated. */
+    bcmos_bool key_exchange_key_mismatch;           /**< If true, indications of type "key_exchange_key_mismatch" will be generated. */
+    bcmos_bool key_exchange_key_request_timeout;    /**< If true, indications of type "key_exchange_key_request_timeout" will be generated. */
+    bcmos_bool looci;                       /**< If true, indications of type "looci" will be generated. */
+    bcmos_bool onu_activation_completed;    /**< If true, indications of type "onu_activation_completed" will be generated. */
+    bcmos_bool onu_alarm;                   /**< If true, indications of type "onu_alarm" will be generated. */
+    bcmos_bool onu_deactivation_completed;  /**< If true, indications of type "onu_deactivation_completed" will be generated. */
+    bcmos_bool onu_disable_completed;       /**< If true, indications of type "onu_disable_completed" will be generated. */
+    bcmos_bool onu_enable_completed;        /**< If true, indications of type "onu_enable_completed" will be generated. */
+    bcmos_bool onu_tuning_in_completed;     /**< If true, indications of type "onu_tuning_in_completed" will be generated. */
+    bcmos_bool onu_tuning_out_completed;    /**< If true, indications of type "onu_tuning_out_completed" will be generated. */
+    bcmos_bool optical_reflection;          /**< If true, indications of type "optical_reflection" will be generated. */
+    bcmos_bool possible_drift;              /**< If true, indications of type "possible_drift" will be generated. */
+    bcmos_bool power_consumption_report;    /**< If true, indications of type "power_consumption_report" will be generated. */
+    bcmos_bool power_level_report;          /**< If true, indications of type "power_level_report" will be generated. */
+    bcmos_bool power_management_state_change;   /**< If true, indications of type "power_management_state_change" will be generated. */
+    bcmos_bool pqsi;                        /**< If true, indications of type "pqsi" will be generated. */
+    bcmos_bool ranging_completed;           /**< If true, indications of type "ranging_completed" will be generated. */
+    bcmos_bool registration_id;             /**< If true, indications of type "registration_id" will be generated. */
+    bcmos_bool rssi_measurement_completed;  /**< If true, indications of type "rssi_measurement_completed" will be generated. */
+    bcmos_bool sdi; /**< If true, indications of type "sdi" will be generated. */
+    bcmos_bool secure_mutual_authentication_failure;    /**< If true, indications of type "secure_mutual_authentication_failure" will be generated. */
+    bcmos_bool sfi;                 /**< If true, indications of type "sfi" will be generated. */
+    bcmos_bool stat_alarm_cleared;  /**< If true, indications of type "stat_alarm_cleared" will be generated. */
+    bcmos_bool stat_alarm_raised;   /**< If true, indications of type "stat_alarm_raised" will be generated. */
+    bcmos_bool sufi;                /**< If true, indications of type "sufi" will be generated. */
+    bcmos_bool tiwi;                /**< If true, indications of type "tiwi" will be generated. */
+    bcmos_bool tuning_response;     /**< If true, indications of type "tuning_response" will be generated. */
+} bcmolt_xgpon_onu_auto_cfg_data;
+
+/** Transport message definition for "auto_cfg" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_auto_cfg
+{
+    bcmolt_auto_cfg hdr;        /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_auto_cfg_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_auto_cfg;
+
+/** Structure definition for the "adjust_tx_wavelength" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Instruct the ONU to adjust its upstream transmitter wavelength 
+ */
+typedef struct bcmolt_xgpon_onu_adjust_tx_wavelength_data
+{
+    bcmolt_frequency_adjustment_direction frequency_adjustment_direction;   /**< Frequency adjustment direction. */
+    uint8_t frequency_adjustment_size;  /**< The size of the frequency adjustment in units of 0.1GHz */
+} bcmolt_xgpon_onu_adjust_tx_wavelength_data;
+
+/** Transport message definition for "adjust_tx_wavelength" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_adjust_tx_wavelength
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_adjust_tx_wavelength_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_adjust_tx_wavelength;
+
+/** Structure definition for the "change_power_levelling" group of the 
+ * "xgpon_onu" object. 
+ *
+ * Change power levelling 
+ */
+typedef struct bcmolt_xgpon_onu_change_power_levelling_data
+{
+    bcmolt_power_levelling_control control; /**< control. */
+    uint8_t attenuation;                    /**< The requested attenuation in steps of 3dB as part of power levelling instruction */
+} bcmolt_xgpon_onu_change_power_levelling_data;
+
+/** Transport message definition for "change_power_levelling" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_change_power_levelling
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_change_power_levelling_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_change_power_levelling;
+
+/** Transport message definition for "get_power_consumption" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_get_power_consumption
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_get_power_consumption;
+
+/** Transport message definition for "get_power_level" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_get_power_level
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_get_power_level;
+
+/** Transport message definition for "onu_tuning_in" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_in
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_onu_tuning_in;
+
+/** Structure definition for the "onu_tuning_out" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_out_data
+{
+    bcmolt_pon_id target_ds_pon_id; /**< target ds pon id. */
+    bcmolt_pon_id target_us_pon_id; /**< target us pon id. */
+    uint32_t time_to_switch;        /**< Time to switch in ms */
+    bcmos_bool rollback;            /**< rollback. */
+    bcmolt_status status;           /**< on- to start tuning out off- to stop tuning out */
+} bcmolt_xgpon_onu_onu_tuning_out_data;
+
+/** Transport message definition for "onu_tuning_out" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_onu_tuning_out
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_onu_tuning_out_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_onu_tuning_out;
+
+/** Structure definition for the "request_registration" group of the "xgpon_onu" 
+ * object. 
+ *
+ * Request the ONU to send its Registration ID 
+ */
+typedef struct bcmolt_xgpon_onu_request_registration_data
+{
+    bcmos_bool sma_flag;    /**< Is the request registration process is part of the SMA process */
+} bcmolt_xgpon_onu_request_registration_data;
+
+/** Transport message definition for "request_registration" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_request_registration
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_request_registration_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_request_registration;
+
+/** Transport message definition for "rssi_measurement" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_rssi_measurement
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+} bcmolt_xgpon_onu_rssi_measurement;
+
+/** Structure definition for the "secure_mutual_authentication" group of the 
+ * "xgpon_onu" object. 
+ *
+ * OMCI base secure mutual authentication 
+ */
+typedef struct bcmolt_xgpon_onu_secure_mutual_authentication_data
+{
+    bcmolt_aes_key master_key;          /**< master key. */
+    bcmolt_u8_list_u32_max_2048 buffer; /**< OMCI data buffer. */
+    uint32_t mic;                       /**< mic. */
+} bcmolt_xgpon_onu_secure_mutual_authentication_data;
+
+/** Transport message definition for "secure_mutual_authentication" group of 
+ * "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_secure_mutual_authentication
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_secure_mutual_authentication_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_secure_mutual_authentication;
+
+/** Structure definition for the "set_onu_state" group of the "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_set_onu_state_data
+{
+    bcmolt_onu_operation onu_state; /**< ONU state. */
+} bcmolt_xgpon_onu_set_onu_state_data;
+
+/** Transport message definition for "set_onu_state" group of "xgpon_onu" 
+ * object. 
+ */
+typedef struct bcmolt_xgpon_onu_set_onu_state
+{
+    bcmolt_oper hdr;            /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_set_onu_state_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_set_onu_state;
+
+/** Structure definition for the "cpu_packets" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_cpu_packets_data
+{
+    bcmolt_packet_type packet_type;     /**< packet type. */
+    bcmos_bool calc_crc;                /**< calc crc. */
+    uint8_t number_of_packets;          /**< number of packets. */
+    uint16_t packet_size;               /**< Single packet size. */
+    bcmolt_u8_list_u32_max_2048 buffer; /**< buffer. */
+} bcmolt_xgpon_onu_cpu_packets_data;
+
+/** Transport message definition for "cpu_packets" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_cpu_packets
+{
+    bcmolt_proxy hdr;                       /**< Transport header. */
+    bcmolt_xgpon_onu_key key;               /**< Object key. */
+    bcmolt_xgpon_onu_cpu_packets_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_cpu_packets;
+
+/** Structure definition for the "ploam_packet" group of the "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_ploam_packet_data
+{
+    bcmos_bool default_key; /**< default key. */
+#define BCMOLT_XGPON_ONU_PLOAM_PACKET_DATA_PLOAM_LEN    40
+    bcmolt_arr_u8_40 ploam; /**< ploam. */
+} bcmolt_xgpon_onu_ploam_packet_data;
+
+/** Transport message definition for "ploam_packet" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_ploam_packet
+{
+    bcmolt_proxy hdr;           /**< Transport header. */
+    bcmolt_xgpon_onu_key key;   /**< Object key. */
+    bcmolt_xgpon_onu_ploam_packet_data data;    /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_ploam_packet;
+
+/** Structure definition for the "cpu_packet" group of the "xgpon_onu" object. 
+ *
+ * Indicates CPU packet was received on the US from this ONU id 
+ */
+typedef struct bcmolt_xgpon_onu_cpu_packet_data
+{
+    uint16_t port_id;           /**< port id. */
+    bcmos_bool crc_ok;          /**< crc ok. */
+    uint32_t packet_size;       /**< packet size. */
+    bcmolt_u8_list_u32 buffer;  /**< buffer. */
+} bcmolt_xgpon_onu_cpu_packet_data;
+
+/** Transport message definition for "cpu_packet" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_cpu_packet
+{
+    bcmolt_proxy_rx hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;               /**< Object key. */
+    bcmolt_xgpon_onu_cpu_packet_data data;  /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_cpu_packet;
+
+/** Structure definition for the "omci_packet" group of the "xgpon_onu" object. 
+ *
+ * Indicates OMCI packet was received on the US from this ONU id 
+ */
+typedef struct bcmolt_xgpon_onu_omci_packet_data
+{
+    uint16_t port_id;           /**< port id. */
+    bcmos_bool crc_ok;          /**< crc ok. */
+    uint32_t packet_size;       /**< packet size. */
+    bcmolt_u8_list_u32 buffer;  /**< buffer. */
+} bcmolt_xgpon_onu_omci_packet_data;
+
+/** Transport message definition for "omci_packet" group of "xgpon_onu" object. 
+ */
+typedef struct bcmolt_xgpon_onu_omci_packet
+{
+    bcmolt_proxy_rx hdr;                    /**< Transport header. */
+    bcmolt_xgpon_onu_key key;               /**< Object key. */
+    bcmolt_xgpon_onu_omci_packet_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_onu_omci_packet;
+
+/** Structure definition for the "key" group of the "xgpon_trx" object. 
+ */
+typedef struct bcmolt_xgpon_trx_key
+{
+    bcmolt_xgpon_ni pon_ni; /**< PON network interface. */
+} bcmolt_xgpon_trx_key;
+
+/** Structure definition for the "cfg" group of the "xgpon_trx" object. 
+ */
+typedef struct bcmolt_xgpon_trx_cfg_data
+{
+#define BCMOLT_XGPON_TRX_CFG_DATA_BURST_PROFILE_LEN 4
+    bcmolt_arr_xgpon_burst_profile_4 burst_profile;             /**< burst profile. */
+#define BCMOLT_XGPON_TRX_CFG_DATA_TRANSCEIVER_CONFIG_LEN    4
+    bcmolt_arr_xgpon_trx_configuration_4 transceiver_config;    /**< transceiver config. */
+    bcmolt_xgpon_trx_type transceiver_type;                     /**< trx type. */
+    bcmolt_xgpon_trx_debug debug;                       /**< debug. */
+    bcmolt_xgpon_rssi_normal_config rssi_normal_config; /**< rssi normal config. */
+    bcmolt_xgpon_rssi_ranging_config rssi_ranging_config;               /**< rssi ranging config. */
+    bcmolt_xgpon_serdes_configuration serdes_configuration;             /**< serdes configuration. */
+#define BCMOLT_XGPON_TRX_CFG_DATA_BURST_PROFILE_DELIMITER_MAX_ERRORS_LEN    4
+    bcmolt_arr_u8_4 burst_profile_delimiter_max_errors;                 /**< burst profile delimiter max errors. */
+    bcmolt_xgpon_rx_ranging_sm_pattern ranging_sm_patterns_at_init;     /**< Reset patterns used at Init of Ranging-Window and after Access */
+    bcmolt_xgpon_rx_ranging_sm_pattern ranging_sm_patterns_ed_failure;  /**< ranging sm patterns ED failure. */
+    bcmos_bool reset_on_del_miss;   /**< reset on del miss. */
+    bcmolt_xgpon_ed_state ed_state; /**< ed state. */
+    bcmos_bool invert_ed;           /**< invert ED. */
+    bcmos_bool end_of_burst_reset;  /**< end of burst reset. */
+    bcmos_bool trx_rst_polarity;    /**< TRX reset polarity. */
+} bcmolt_xgpon_trx_cfg_data;
+
+/** Transport message definition for "cfg" group of "xgpon_trx" object. 
+ */
+typedef struct bcmolt_xgpon_trx_cfg
+{
+    bcmolt_cfg hdr;                 /**< Transport header. */
+    bcmolt_xgpon_trx_key key;       /**< Object key. */
+    bcmolt_xgpon_trx_cfg_data data; /**< All properties that must be set by the user. */
+} bcmolt_xgpon_trx_cfg;
+
+/** Structure definition for the "key" group of the "xpon_serdes" object. 
+ */
+typedef struct bcmolt_xpon_serdes_key
+{
+    bcmolt_pon_ni pon_ni;               /**< PON NI. */
+    bcmolt_serdes_instance instance;    /**< SerDes instance: */
+} bcmolt_xpon_serdes_key;
+
+/** Structure definition for the "cfg" group of the "xpon_serdes" object. 
+ */
+typedef struct bcmolt_xpon_serdes_cfg_data
+{
+    uint8_t rx_vga;     /**< Rx Vga. */
+    uint8_t rx_pf;      /**< Peaking Filter */
+    uint8_t rx_lfpf;    /**< Low Frequency Peaking Filter */
+    uint8_t rx_dfe1;    /**< Rx DFE1. */
+    int8_t rx_dfe2;     /**< Rx DFE2. */
+    int8_t rx_dfe3;     /**< Rx DFE3. */
+    int8_t rx_dfe4;     /**< Rx DFE4. */
+    int8_t rx_dfe5;     /**< Rx DFE5. */
+    uint8_t tx_pre;     /**< Tx Pre. */
+    uint8_t tx_main;    /**< Tx Main. */
+    uint8_t tx_post1;   /**< Tx Post1. */
+    int8_t tx_post2;    /**< Tx Post2. */
+    int8_t tx_post3;    /**< Tx Post3. */
+    uint8_t tx_amp;     /**< Tx Amp. */
+} bcmolt_xpon_serdes_cfg_data;
+
+/** Transport message definition for "cfg" group of "xpon_serdes" object. 
+ */
+typedef struct bcmolt_xpon_serdes_cfg
+{
+    bcmolt_cfg hdr;                     /**< Transport header. */
+    bcmolt_xpon_serdes_key key;         /**< Object key. */
+    bcmolt_xpon_serdes_cfg_data data;   /**< All properties that must be set by the user. */
+} bcmolt_xpon_serdes_cfg;
+
+/** @} */
+
+/** Packs a bcmolt_activation_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_activation_fail_reason_pack(bcmolt_activation_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_activation_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_activation_fail_reason_unpack(bcmolt_activation_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_additional_bw_eligibility to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_additional_bw_eligibility_pack(bcmolt_additional_bw_eligibility this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_additional_bw_eligibility from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_additional_bw_eligibility_unpack(bcmolt_additional_bw_eligibility *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_ni_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_cfg_id_pack(bcmolt_ae_ni_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_ni_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_cfg_id_unpack(bcmolt_ae_ni_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_ni_en_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_en_state_pack(bcmolt_ae_ni_en_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_ni_en_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_en_state_unpack(bcmolt_ae_ni_en_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_ni_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_key_id_pack(bcmolt_ae_ni_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_ni_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_ni_key_id_unpack(bcmolt_ae_ni_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_ni_set_ae_ni_en_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_ni_set_ae_ni_en_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_ae_path_ds_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_auto_cfg_id_pack(bcmolt_ae_path_ds_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_auto_cfg_id_unpack(bcmolt_ae_path_ds_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_ds_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_key_id_pack(bcmolt_ae_path_ds_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_key_id_unpack(bcmolt_ae_path_ds_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_ds_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_id_pack(bcmolt_ae_path_ds_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_id_unpack(bcmolt_ae_path_ds_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_ds_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_id_pack(bcmolt_ae_path_ds_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_id_unpack(bcmolt_ae_path_ds_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_ds_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_cfg_id_pack(bcmolt_ae_path_ds_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_cfg_id_unpack(bcmolt_ae_path_ds_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_ds_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_id_pack(bcmolt_ae_path_ds_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_id_unpack(bcmolt_ae_path_ds_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_auto_cfg_id_pack(bcmolt_ae_path_us_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_auto_cfg_id_unpack(bcmolt_ae_path_us_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_key_id_pack(bcmolt_ae_path_us_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_key_id_unpack(bcmolt_ae_path_us_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_id_pack(bcmolt_ae_path_us_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_id_unpack(bcmolt_ae_path_us_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_id_pack(bcmolt_ae_path_us_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_id_unpack(bcmolt_ae_path_us_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_cfg_id_pack(bcmolt_ae_path_us_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_cfg_id_unpack(bcmolt_ae_path_us_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ae_path_us_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_id_pack(bcmolt_ae_path_us_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ae_path_us_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_id_unpack(bcmolt_ae_path_us_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_alloc_operation to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_alloc_operation_pack(bcmolt_alloc_operation this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_alloc_operation from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_alloc_operation_unpack(bcmolt_alloc_operation *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_alloc_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_alloc_state_pack(bcmolt_alloc_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_alloc_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_alloc_state_unpack(bcmolt_alloc_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_alloc_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_alloc_type_pack(bcmolt_alloc_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_alloc_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_alloc_type_unpack(bcmolt_alloc_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_alloc_type_to_scan to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_alloc_type_to_scan_pack(bcmolt_alloc_type_to_scan this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_alloc_type_to_scan from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_alloc_type_to_scan_unpack(bcmolt_alloc_type_to_scan *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_api_capture_buffer_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_api_capture_buffer_mode_pack(bcmolt_api_capture_buffer_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_api_capture_buffer_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_api_capture_buffer_mode_unpack(bcmolt_api_capture_buffer_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_api_capture_location to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_api_capture_location_pack(bcmolt_api_capture_location this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_api_capture_location from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_api_capture_location_unpack(bcmolt_api_capture_location *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_calibration_record to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_calibration_record_pack(bcmolt_calibration_record this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_calibration_record from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_calibration_record_unpack(bcmolt_calibration_record *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_sign to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_sign_pack(bcmolt_sign this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_sign from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_sign_unpack(bcmolt_sign *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_upstream_line_rate_capabilities to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_upstream_line_rate_capabilities_pack(bcmolt_upstream_line_rate_capabilities this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_upstream_line_rate_capabilities from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_upstream_line_rate_capabilities_unpack(bcmolt_upstream_line_rate_capabilities *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_link_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_link_type_pack(bcmolt_link_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_link_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_link_type_unpack(bcmolt_link_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_capture_strobe_signal to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_capture_strobe_signal_pack(bcmolt_capture_strobe_signal this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_capture_strobe_signal from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_capture_strobe_signal_unpack(bcmolt_capture_strobe_signal *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_channel_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_channel_cfg_id_pack(bcmolt_channel_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_channel_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_channel_cfg_id_unpack(bcmolt_channel_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_channel_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_channel_key_id_pack(bcmolt_channel_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_channel_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_channel_key_id_unpack(bcmolt_channel_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_console_redirection to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_console_redirection_pack(bcmolt_console_redirection this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_console_redirection from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_console_redirection_unpack(bcmolt_console_redirection *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_control_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_control_state_pack(bcmolt_control_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_control_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_control_state_unpack(bcmolt_control_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_dba_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_dba_mode_pack(bcmolt_dba_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_dba_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_dba_mode_unpack(bcmolt_dba_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_dba_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_dba_ram_pack(bcmolt_dba_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_dba_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_dba_ram_unpack(bcmolt_dba_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_dba_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_dba_type_pack(bcmolt_dba_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_dba_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_dba_type_unpack(bcmolt_dba_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ddr_test_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ddr_test_status_pack(bcmolt_ddr_test_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ddr_test_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ddr_test_status_unpack(bcmolt_ddr_test_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ddr_test_result to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ddr_test_result_pack(bcmolt_ddr_test_result this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ddr_test_result from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ddr_test_result_unpack(bcmolt_ddr_test_result *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_host_connection_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_host_connection_fail_reason_pack(bcmolt_host_connection_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_host_connection_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_host_connection_fail_reason_unpack(bcmolt_host_connection_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_deactivation_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_deactivation_reason_pack(bcmolt_deactivation_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_deactivation_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_deactivation_reason_unpack(bcmolt_deactivation_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_auto_cfg_id_pack(bcmolt_debug_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_auto_cfg_id_unpack(bcmolt_debug_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_cfg_id_pack(bcmolt_debug_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_cfg_id_unpack(bcmolt_debug_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_cli_input_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_cli_input_id_pack(bcmolt_debug_cli_input_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_cli_input_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_cli_input_id_unpack(bcmolt_debug_cli_input_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_cli_output_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_cli_output_id_pack(bcmolt_debug_cli_output_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_cli_output_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_cli_output_id_unpack(bcmolt_debug_cli_output_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_file_almost_full_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_file_almost_full_id_pack(bcmolt_debug_file_almost_full_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_file_almost_full_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_file_almost_full_id_unpack(bcmolt_debug_file_almost_full_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_key_id_pack(bcmolt_debug_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_key_id_unpack(bcmolt_debug_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_reset_api_capture_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_reset_api_capture_id_pack(bcmolt_debug_reset_api_capture_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_reset_api_capture_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_reset_api_capture_id_unpack(bcmolt_debug_reset_api_capture_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_start_api_capture_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_start_api_capture_id_pack(bcmolt_debug_start_api_capture_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_start_api_capture_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_start_api_capture_id_unpack(bcmolt_debug_start_api_capture_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_debug_stop_api_capture_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_debug_stop_api_capture_id_pack(bcmolt_debug_stop_api_capture_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_stop_api_capture_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_debug_stop_api_capture_id_unpack(bcmolt_debug_stop_api_capture_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_auto_cfg_id_pack(bcmolt_device_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_auto_cfg_id_unpack(bcmolt_device_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_cfg_id_pack(bcmolt_device_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_cfg_id_unpack(bcmolt_device_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_chip_revision to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_chip_revision_pack(bcmolt_device_chip_revision this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_chip_revision from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_chip_revision_unpack(bcmolt_device_chip_revision *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_connect_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_connect_id_pack(bcmolt_device_connect_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_connect_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_connect_id_unpack(bcmolt_device_connect_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_connection_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_connection_complete_id_pack(bcmolt_device_connection_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_connection_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_connection_complete_id_unpack(bcmolt_device_connection_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_connection_established_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_connection_established_id_pack(bcmolt_device_connection_established_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_connection_established_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_connection_established_id_unpack(bcmolt_device_connection_established_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_connection_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_connection_failure_id_pack(bcmolt_device_connection_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_connection_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_connection_failure_id_unpack(bcmolt_device_connection_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_ddr_test_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_ddr_test_complete_id_pack(bcmolt_device_ddr_test_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_ddr_test_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_ddr_test_complete_id_unpack(bcmolt_device_ddr_test_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_device_keep_alive_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_device_keep_alive_id_pack(bcmolt_device_device_keep_alive_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_device_keep_alive_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_device_keep_alive_id_unpack(bcmolt_device_device_keep_alive_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_device_ready_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_device_ready_id_pack(bcmolt_device_device_ready_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_device_ready_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_device_ready_id_unpack(bcmolt_device_device_ready_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_disconnect_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_disconnect_id_pack(bcmolt_device_disconnect_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_disconnect_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_disconnect_id_unpack(bcmolt_device_disconnect_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_disconnection_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_disconnection_complete_id_pack(bcmolt_device_disconnection_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_disconnection_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_disconnection_complete_id_unpack(bcmolt_device_disconnection_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_host_keep_alive_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_host_keep_alive_id_pack(bcmolt_device_host_keep_alive_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_host_keep_alive_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_host_keep_alive_id_unpack(bcmolt_device_host_keep_alive_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_image_transfer_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_complete_id_pack(bcmolt_device_image_transfer_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_image_transfer_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_complete_id_unpack(bcmolt_device_image_transfer_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_image_transfer_data_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_data_id_pack(bcmolt_device_image_transfer_data_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_image_transfer_data_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_data_id_unpack(bcmolt_device_image_transfer_data_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_image_transfer_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_start_id_pack(bcmolt_device_image_transfer_start_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_image_transfer_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_image_transfer_start_id_unpack(bcmolt_device_image_transfer_start_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_image_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_image_type_pack(bcmolt_device_image_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_image_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_image_type_unpack(bcmolt_device_image_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_indications_dropped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_indications_dropped_id_pack(bcmolt_device_indications_dropped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_indications_dropped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_indications_dropped_id_unpack(bcmolt_device_indications_dropped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_key_id_pack(bcmolt_device_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_key_id_unpack(bcmolt_device_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_speed to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_speed_pack(bcmolt_nni_speed this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_speed from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_speed_unpack(bcmolt_nni_speed *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_reset_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_reset_id_pack(bcmolt_device_reset_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_reset_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_reset_id_unpack(bcmolt_device_reset_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_reset_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_reset_mode_pack(bcmolt_device_reset_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_reset_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_reset_mode_unpack(bcmolt_device_reset_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_run_ddr_test_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_run_ddr_test_id_pack(bcmolt_device_run_ddr_test_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_run_ddr_test_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_run_ddr_test_id_unpack(bcmolt_device_run_ddr_test_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_state_pack(bcmolt_device_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_state_unpack(bcmolt_device_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_sw_error_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_sw_error_id_pack(bcmolt_device_sw_error_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_sw_error_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_sw_error_id_unpack(bcmolt_device_sw_error_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_sw_exception_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_sw_exception_id_pack(bcmolt_device_sw_exception_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_sw_exception_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_sw_exception_id_unpack(bcmolt_device_sw_exception_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_device_sw_upgrade_activate_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_device_sw_upgrade_activate_id_pack(bcmolt_device_sw_upgrade_activate_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_sw_upgrade_activate_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_device_sw_upgrade_activate_id_unpack(bcmolt_device_sw_upgrade_activate_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_disable_serial_number_control to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_disable_serial_number_control_pack(bcmolt_disable_serial_number_control this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_disable_serial_number_control from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_disable_serial_number_control_unpack(bcmolt_disable_serial_number_control *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_drv_icf_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_drv_icf_id_pack(bcmolt_drv_icf_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_drv_icf_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_drv_icf_id_unpack(bcmolt_drv_icf_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_drv_sgb_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_drv_sgb_id_pack(bcmolt_drv_sgb_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_drv_sgb_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_drv_sgb_id_unpack(bcmolt_drv_sgb_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ds_vlan_action to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ds_vlan_action_pack(bcmolt_ds_vlan_action this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ds_vlan_action from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ds_vlan_action_unpack(bcmolt_ds_vlan_action *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_tfb_trap_behavior to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_tfb_trap_behavior_pack(bcmolt_tfb_trap_behavior this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_tfb_trap_behavior from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_tfb_trap_behavior_unpack(bcmolt_tfb_trap_behavior *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_tfb_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_tfb_mode_pack(bcmolt_tfb_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_tfb_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_tfb_mode_unpack(bcmolt_tfb_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_lim_sec_mode_up to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_lim_sec_mode_up_pack(bcmolt_lim_sec_mode_up this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_lim_sec_mode_up from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_lim_sec_mode_up_unpack(bcmolt_lim_sec_mode_up *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_lim_sec_mode_dn to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_lim_sec_mode_dn_pack(bcmolt_lim_sec_mode_dn this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_lim_sec_mode_dn from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_lim_sec_mode_dn_unpack(bcmolt_lim_sec_mode_dn *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xim_sec_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xim_sec_mode_pack(bcmolt_xim_sec_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xim_sec_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xim_sec_mode_unpack(bcmolt_xim_sec_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_hsc_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_hsc_ram_pack(bcmolt_hsc_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_hsc_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_hsc_ram_unpack(bcmolt_hsc_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_lim_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_lim_ram_pack(bcmolt_lim_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_lim_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_lim_ram_unpack(bcmolt_lim_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_lky_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_lky_ram_pack(bcmolt_lky_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_lky_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_lky_ram_unpack(bcmolt_lky_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mic_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mic_ram_pack(bcmolt_mic_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mic_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mic_ram_unpack(bcmolt_mic_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xpcsrm_ram to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xpcsrm_ram_pack(bcmolt_xpcsrm_ram this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xpcsrm_ram from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xpcsrm_ram_unpack(bcmolt_xpcsrm_ram *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_embedded_image_transfer_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_embedded_image_transfer_status_pack(bcmolt_embedded_image_transfer_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_embedded_image_transfer_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_embedded_image_transfer_status_unpack(bcmolt_embedded_image_transfer_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_encryption_information_format to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_information_format_pack(bcmolt_epon_encryption_information_format this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_encryption_information_format from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_information_format_unpack(bcmolt_epon_encryption_information_format *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_energy_detect_source to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_energy_detect_source_pack(bcmolt_energy_detect_source this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_energy_detect_source from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_energy_detect_source_unpack(bcmolt_energy_detect_source *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_1g_turbo_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_1g_turbo_mode_pack(bcmolt_epon_1g_turbo_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_1g_turbo_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_1g_turbo_mode_unpack(bcmolt_epon_1g_turbo_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_clock_transport_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_clock_transport_mode_pack(bcmolt_epon_clock_transport_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_clock_transport_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_clock_transport_mode_unpack(bcmolt_epon_clock_transport_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_dba_reporting_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_dba_reporting_mode_pack(bcmolt_epon_dba_reporting_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_dba_reporting_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_dba_reporting_mode_unpack(bcmolt_epon_dba_reporting_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_rate to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_rate_pack(bcmolt_epon_link_rate this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_rate from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_rate_unpack(bcmolt_epon_link_rate *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_status_pack(bcmolt_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_status_unpack(bcmolt_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_auto_cfg_id_pack(bcmolt_epon_denied_link_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_auto_cfg_id_unpack(bcmolt_epon_denied_link_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_cfg_id_pack(bcmolt_epon_denied_link_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_cfg_id_unpack(bcmolt_epon_denied_link_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_key_id_pack(bcmolt_epon_denied_link_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_key_id_unpack(bcmolt_epon_denied_link_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_laser_on_off_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_laser_on_off_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_llid_pool_empty_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_llid_pool_empty_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_max_link_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_max_link_violation_id_pack(bcmolt_epon_denied_link_max_link_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_max_link_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_max_link_violation_id_unpack(bcmolt_epon_denied_link_max_link_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_overhead_profile_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_id_pack(bcmolt_epon_denied_link_overhead_profile_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_overhead_profile_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_id_unpack(bcmolt_epon_denied_link_overhead_profile_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_range_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_range_violation_id_pack(bcmolt_epon_denied_link_range_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_range_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_range_violation_id_unpack(bcmolt_epon_denied_link_range_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_rogue_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_rogue_violation_id_pack(bcmolt_epon_denied_link_rogue_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_rogue_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_rogue_violation_id_unpack(bcmolt_epon_denied_link_rogue_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_system_resource_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_system_resource_violation_id_pack(bcmolt_epon_denied_link_system_resource_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_system_resource_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_system_resource_violation_id_unpack(bcmolt_epon_denied_link_system_resource_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_tdm_channels_exhausted_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_id_pack(bcmolt_epon_denied_link_tdm_channels_exhausted_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_tdm_channels_exhausted_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_id_unpack(bcmolt_epon_denied_link_tdm_channels_exhausted_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_unknown_link_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_id_pack(bcmolt_epon_denied_link_unknown_link_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_unknown_link_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_id_unpack(bcmolt_epon_denied_link_unknown_link_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_denied_link_upstream_bandwidth_violation_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_id_pack(bcmolt_epon_denied_link_upstream_bandwidth_violation_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_upstream_bandwidth_violation_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_id_unpack(bcmolt_epon_denied_link_upstream_bandwidth_violation_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_encryption_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_mode_pack(bcmolt_epon_encryption_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_encryption_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_mode_unpack(bcmolt_epon_encryption_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_key_choice to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_key_choice_pack(bcmolt_epon_key_choice this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_key_choice from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_key_choice_unpack(bcmolt_epon_key_choice *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_encryption_direction to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_direction_pack(bcmolt_epon_encryption_direction this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_encryption_direction from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_encryption_direction_unpack(bcmolt_epon_encryption_direction *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_fec_en_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_fec_en_state_pack(bcmolt_epon_fec_en_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_fec_en_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_fec_en_state_unpack(bcmolt_epon_fec_en_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_oam_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_oam_type_pack(bcmolt_epon_oam_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_oam_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_oam_type_unpack(bcmolt_epon_oam_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_auto_cfg_id_pack(bcmolt_epon_link_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_auto_cfg_id_unpack(bcmolt_epon_link_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_cfg_id_pack(bcmolt_epon_link_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_cfg_id_unpack(bcmolt_epon_link_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_delete_link_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_delete_link_id_pack(bcmolt_epon_link_delete_link_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_delete_link_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_delete_link_id_unpack(bcmolt_epon_link_delete_link_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_duplicate_mpcp_registration_request_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_id_pack(bcmolt_epon_link_duplicate_mpcp_registration_request_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_duplicate_mpcp_registration_request_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_id_unpack(bcmolt_epon_link_duplicate_mpcp_registration_request_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_encryption_enabled_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_encryption_enabled_id_pack(bcmolt_epon_link_encryption_enabled_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_encryption_enabled_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_encryption_enabled_id_unpack(bcmolt_epon_link_encryption_enabled_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_fec_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_fec_state_pack(bcmolt_epon_link_fec_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_fec_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_fec_state_unpack(bcmolt_epon_link_fec_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_force_rediscovery_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_force_rediscovery_id_pack(bcmolt_epon_link_force_rediscovery_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_force_rediscovery_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_force_rediscovery_id_unpack(bcmolt_epon_link_force_rediscovery_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_frame_captured_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_frame_captured_id_pack(bcmolt_epon_link_frame_captured_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_frame_captured_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_frame_captured_id_unpack(bcmolt_epon_link_frame_captured_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_status_pack(bcmolt_epon_link_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_status_unpack(bcmolt_epon_link_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mpcp_discovery_info to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mpcp_discovery_info_pack(bcmolt_mpcp_discovery_info this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mpcp_discovery_info from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mpcp_discovery_info_unpack(bcmolt_mpcp_discovery_info *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_inject_frame_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_inject_frame_id_pack(bcmolt_epon_link_inject_frame_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_inject_frame_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_inject_frame_id_unpack(bcmolt_epon_link_inject_frame_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_exchange_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_failure_id_pack(bcmolt_epon_link_key_exchange_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_failure_id_unpack(bcmolt_epon_link_key_exchange_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_exchange_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_start_id_pack(bcmolt_epon_link_key_exchange_start_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_start_id_unpack(bcmolt_epon_link_key_exchange_start_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_exchange_started_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_started_id_pack(bcmolt_epon_link_key_exchange_started_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_started_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_started_id_unpack(bcmolt_epon_link_key_exchange_started_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_exchange_stop_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_stop_id_pack(bcmolt_epon_link_key_exchange_stop_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_stop_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_stop_id_unpack(bcmolt_epon_link_key_exchange_stop_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_exchange_stopped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_stopped_id_pack(bcmolt_epon_link_key_exchange_stopped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_stopped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_stopped_id_unpack(bcmolt_epon_link_key_exchange_stopped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_id_pack(bcmolt_epon_link_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_key_id_unpack(bcmolt_epon_link_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_link_deleted_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_link_deleted_id_pack(bcmolt_epon_link_link_deleted_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_link_deleted_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_link_deleted_id_unpack(bcmolt_epon_link_link_deleted_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_link_speed_mismatch_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_link_speed_mismatch_id_pack(bcmolt_epon_link_link_speed_mismatch_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_link_speed_mismatch_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_link_speed_mismatch_id_unpack(bcmolt_epon_link_link_speed_mismatch_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_mpcp_deregistered_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_deregistered_id_pack(bcmolt_epon_link_mpcp_deregistered_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_mpcp_deregistered_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_deregistered_id_unpack(bcmolt_epon_link_mpcp_deregistered_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_mpcp_discovered_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_discovered_id_pack(bcmolt_epon_link_mpcp_discovered_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_mpcp_discovered_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_discovered_id_unpack(bcmolt_epon_link_mpcp_discovered_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_mpcp_reg_ack_timeout_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_reg_ack_timeout_id_pack(bcmolt_epon_link_mpcp_reg_ack_timeout_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_mpcp_reg_ack_timeout_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_reg_ack_timeout_id_unpack(bcmolt_epon_link_mpcp_reg_ack_timeout_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_mpcp_report_timeout_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_report_timeout_id_pack(bcmolt_epon_link_mpcp_report_timeout_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_mpcp_report_timeout_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_report_timeout_id_unpack(bcmolt_epon_link_mpcp_report_timeout_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timeout_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_id_pack(bcmolt_epon_link_oam_keepalive_timeout_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timeout_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_id_unpack(bcmolt_epon_link_oam_keepalive_timeout_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timer_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_id_pack(bcmolt_epon_link_oam_keepalive_timer_start_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timer_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_id_unpack(bcmolt_epon_link_oam_keepalive_timer_start_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timer_started_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_started_id_pack(bcmolt_epon_link_oam_keepalive_timer_started_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timer_started_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_started_id_unpack(bcmolt_epon_link_oam_keepalive_timer_started_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timer_stop_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stop_id_pack(bcmolt_epon_link_oam_keepalive_timer_stop_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timer_stop_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stop_id_unpack(bcmolt_epon_link_oam_keepalive_timer_stop_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timer_stopped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stopped_id_pack(bcmolt_epon_link_oam_keepalive_timer_stopped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timer_stopped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_stopped_id_unpack(bcmolt_epon_link_oam_keepalive_timer_stopped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_preprovisioned_link_created_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_preprovisioned_link_created_id_pack(bcmolt_epon_link_preprovisioned_link_created_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_preprovisioned_link_created_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_preprovisioned_link_created_id_unpack(bcmolt_epon_link_preprovisioned_link_created_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_protection_switch_occurred_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_protection_switch_occurred_id_pack(bcmolt_epon_link_protection_switch_occurred_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_protection_switch_occurred_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_protection_switch_occurred_id_unpack(bcmolt_epon_link_protection_switch_occurred_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_range_value_changed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_range_value_changed_id_pack(bcmolt_epon_link_range_value_changed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_range_value_changed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_range_value_changed_id_unpack(bcmolt_epon_link_range_value_changed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_rerange_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_rerange_failure_id_pack(bcmolt_epon_link_rerange_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_rerange_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_rerange_failure_id_unpack(bcmolt_epon_link_rerange_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_cleared_id_pack(bcmolt_epon_link_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_cleared_id_unpack(bcmolt_epon_link_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_raised_id_pack(bcmolt_epon_link_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_raised_id_unpack(bcmolt_epon_link_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_cfg_id_pack(bcmolt_epon_link_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_cfg_id_unpack(bcmolt_epon_link_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_id_pack(bcmolt_epon_link_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_stat_id_unpack(bcmolt_epon_link_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_state_flags to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_state_flags_pack(bcmolt_epon_link_state_flags this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_state_flags from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_state_flags_unpack(bcmolt_epon_link_state_flags *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_static_registration_done_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_static_registration_done_id_pack(bcmolt_epon_link_static_registration_done_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_static_registration_done_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_static_registration_done_id_unpack(bcmolt_epon_link_static_registration_done_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_static_registration_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_static_registration_id_pack(bcmolt_epon_link_static_registration_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_static_registration_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_static_registration_id_unpack(bcmolt_epon_link_static_registration_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_link_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_link_type_pack(bcmolt_epon_link_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_link_type_unpack(bcmolt_epon_link_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mpcp_gate_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mpcp_gate_mode_pack(bcmolt_mpcp_gate_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mpcp_gate_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mpcp_gate_mode_unpack(bcmolt_mpcp_gate_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mpcp_registration_gate_flags to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mpcp_registration_gate_flags_pack(bcmolt_mpcp_registration_gate_flags this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mpcp_registration_gate_flags from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mpcp_registration_gate_flags_unpack(bcmolt_mpcp_registration_gate_flags *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_add_link_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_link_id_pack(bcmolt_epon_ni_add_link_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_add_link_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_link_id_unpack(bcmolt_epon_ni_add_link_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_add_multicast_link_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_multicast_link_id_pack(bcmolt_epon_ni_add_multicast_link_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_add_multicast_link_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_multicast_link_id_unpack(bcmolt_epon_ni_add_multicast_link_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_add_protected_standby_link_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_protected_standby_link_id_pack(bcmolt_epon_ni_add_protected_standby_link_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_add_protected_standby_link_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_add_protected_standby_link_id_unpack(bcmolt_epon_ni_add_protected_standby_link_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_auto_cfg_id_pack(bcmolt_epon_ni_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_auto_cfg_id_unpack(bcmolt_epon_ni_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_auto_rogue_scan_10g_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_auto_rogue_scan_10g_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_auto_rogue_scan_1g_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_auto_rogue_scan_1g_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_cfg_id_pack(bcmolt_epon_ni_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_cfg_id_unpack(bcmolt_epon_ni_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_en_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_en_state_pack(bcmolt_epon_ni_en_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_en_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_en_state_unpack(bcmolt_epon_ni_en_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_issue_rssi_grant_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_issue_rssi_grant_id_pack(bcmolt_epon_ni_issue_rssi_grant_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_issue_rssi_grant_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_issue_rssi_grant_id_unpack(bcmolt_epon_ni_issue_rssi_grant_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_key_id_pack(bcmolt_epon_ni_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_key_id_unpack(bcmolt_epon_ni_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_llid_quarantined_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_llid_quarantined_id_pack(bcmolt_epon_ni_llid_quarantined_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_llid_quarantined_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_llid_quarantined_id_unpack(bcmolt_epon_ni_llid_quarantined_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_mpcp_timestamp_changed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_id_pack(bcmolt_epon_ni_mpcp_timestamp_changed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_mpcp_timestamp_changed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_id_unpack(bcmolt_epon_ni_mpcp_timestamp_changed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_no_reports_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_no_reports_id_pack(bcmolt_epon_ni_no_reports_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_no_reports_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_no_reports_id_unpack(bcmolt_epon_ni_no_reports_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_onu_upgrade_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_id_pack(bcmolt_epon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_onu_upgrade_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_id_unpack(bcmolt_epon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_protection_switching_apply_rerange_delta_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_protection_switching_apply_rerange_delta_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_rerange_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rerange_failure_id_pack(bcmolt_epon_ni_rerange_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_rerange_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rerange_failure_id_unpack(bcmolt_epon_ni_rerange_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_rogue_llid_scan_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_llid_scan_id_pack(bcmolt_epon_ni_rogue_llid_scan_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_rogue_llid_scan_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_llid_scan_id_unpack(bcmolt_epon_ni_rogue_llid_scan_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_rogue_scan_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_scan_complete_id_pack(bcmolt_epon_ni_rogue_scan_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_rogue_scan_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_scan_complete_id_unpack(bcmolt_epon_ni_rogue_scan_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_rssi_measurement_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_id_pack(bcmolt_epon_ni_rssi_measurement_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_rssi_measurement_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_id_unpack(bcmolt_epon_ni_rssi_measurement_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_set_epon_ni_en_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_set_epon_ni_en_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_start_onu_upgrade_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_start_onu_upgrade_id_pack(bcmolt_epon_ni_start_onu_upgrade_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_start_onu_upgrade_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_start_onu_upgrade_id_unpack(bcmolt_epon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_ni_state_change_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_state_change_completed_id_pack(bcmolt_epon_ni_state_change_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_state_change_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_ni_state_change_completed_id_unpack(bcmolt_epon_ni_state_change_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_oam_extension_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_oam_extension_type_pack(bcmolt_epon_oam_extension_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_oam_extension_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_oam_extension_type_unpack(bcmolt_epon_oam_extension_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_10g_us_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_id_pack(bcmolt_epon_onu_10g_us_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_id_unpack(bcmolt_epon_onu_10g_us_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_10g_us_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_cfg_id_pack(bcmolt_epon_onu_10g_us_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_cfg_id_unpack(bcmolt_epon_onu_10g_us_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_10g_us_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_key_id_pack(bcmolt_epon_onu_10g_us_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_key_id_unpack(bcmolt_epon_onu_10g_us_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_id_pack(bcmolt_epon_onu_10g_us_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_id_unpack(bcmolt_epon_onu_10g_us_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_id_pack(bcmolt_epon_onu_10g_us_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_id_unpack(bcmolt_epon_onu_10g_us_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_1g_us_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_id_pack(bcmolt_epon_onu_1g_us_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_id_unpack(bcmolt_epon_onu_1g_us_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_1g_us_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_cfg_id_pack(bcmolt_epon_onu_1g_us_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_cfg_id_unpack(bcmolt_epon_onu_1g_us_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_1g_us_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_key_id_pack(bcmolt_epon_onu_1g_us_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_key_id_unpack(bcmolt_epon_onu_1g_us_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_id_pack(bcmolt_epon_onu_1g_us_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_id_unpack(bcmolt_epon_onu_1g_us_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_id_pack(bcmolt_epon_onu_1g_us_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_id_unpack(bcmolt_epon_onu_1g_us_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_upgrade_onu_response_code to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_onu_response_code_pack(bcmolt_epon_onu_upgrade_onu_response_code this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_upgrade_onu_response_code from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_onu_response_code_unpack(bcmolt_epon_onu_upgrade_onu_response_code *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_onu_upgrade_return_code to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_return_code_pack(bcmolt_epon_onu_upgrade_return_code this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_upgrade_return_code from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_return_code_unpack(bcmolt_epon_onu_upgrade_return_code *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_ds_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_id_pack(bcmolt_epon_path_10g_ds_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_id_unpack(bcmolt_epon_path_10g_ds_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_ds_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_cfg_id_pack(bcmolt_epon_path_10g_ds_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_cfg_id_unpack(bcmolt_epon_path_10g_ds_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_ds_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_key_id_pack(bcmolt_epon_path_10g_ds_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_key_id_unpack(bcmolt_epon_path_10g_ds_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_id_pack(bcmolt_epon_path_10g_ds_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_id_unpack(bcmolt_epon_path_10g_ds_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_id_pack(bcmolt_epon_path_10g_ds_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_id_unpack(bcmolt_epon_path_10g_ds_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_us_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_id_pack(bcmolt_epon_path_10g_us_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_us_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_id_unpack(bcmolt_epon_path_10g_us_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_us_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_cfg_id_pack(bcmolt_epon_path_10g_us_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_us_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_cfg_id_unpack(bcmolt_epon_path_10g_us_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_us_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_key_id_pack(bcmolt_epon_path_10g_us_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_us_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_key_id_unpack(bcmolt_epon_path_10g_us_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_id_pack(bcmolt_epon_path_10g_us_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_id_unpack(bcmolt_epon_path_10g_us_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_id_pack(bcmolt_epon_path_10g_us_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_id_unpack(bcmolt_epon_path_10g_us_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_ds_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_id_pack(bcmolt_epon_path_1g_ds_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_id_unpack(bcmolt_epon_path_1g_ds_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_ds_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_cfg_id_pack(bcmolt_epon_path_1g_ds_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_cfg_id_unpack(bcmolt_epon_path_1g_ds_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_ds_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_key_id_pack(bcmolt_epon_path_1g_ds_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_key_id_unpack(bcmolt_epon_path_1g_ds_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_id_pack(bcmolt_epon_path_1g_ds_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_id_unpack(bcmolt_epon_path_1g_ds_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_id_pack(bcmolt_epon_path_1g_ds_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_id_unpack(bcmolt_epon_path_1g_ds_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_us_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_id_pack(bcmolt_epon_path_1g_us_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_us_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_id_unpack(bcmolt_epon_path_1g_us_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_us_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_cfg_id_pack(bcmolt_epon_path_1g_us_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_us_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_cfg_id_unpack(bcmolt_epon_path_1g_us_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_us_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_key_id_pack(bcmolt_epon_path_1g_us_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_us_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_key_id_unpack(bcmolt_epon_path_1g_us_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_id_pack(bcmolt_epon_path_1g_us_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_id_unpack(bcmolt_epon_path_1g_us_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_id_pack(bcmolt_epon_path_1g_us_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_id_unpack(bcmolt_epon_path_1g_us_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_protection_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_state_pack(bcmolt_epon_protection_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_protection_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_state_unpack(bcmolt_epon_protection_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_protection_switching_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_switching_type_pack(bcmolt_epon_protection_switching_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_protection_switching_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_switching_type_unpack(bcmolt_epon_protection_switching_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_protection_switching_detection_options to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_protection_switching_detection_options_pack(bcmolt_protection_switching_detection_options this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_protection_switching_detection_options from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_protection_switching_detection_options_unpack(bcmolt_protection_switching_detection_options *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_protection_switching_reranging_options to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_switching_reranging_options_pack(bcmolt_epon_protection_switching_reranging_options this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_protection_switching_reranging_options from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_protection_switching_reranging_options_unpack(bcmolt_epon_protection_switching_reranging_options *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_pin to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_pin_pack(bcmolt_gpio_pin this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_pin from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_pin_unpack(bcmolt_gpio_pin *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_polarity to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_polarity_pack(bcmolt_gpio_polarity this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_polarity from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_polarity_unpack(bcmolt_gpio_polarity *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_rp_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_rp_cfg_id_pack(bcmolt_epon_rp_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_rp_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_rp_cfg_id_unpack(bcmolt_epon_rp_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_epon_rp_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_epon_rp_key_id_pack(bcmolt_epon_rp_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_rp_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_epon_rp_key_id_unpack(bcmolt_epon_rp_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ext_irq to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ext_irq_pack(bcmolt_ext_irq this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ext_irq from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ext_irq_unpack(bcmolt_ext_irq *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_flush_mac_table_option to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_flush_mac_table_option_pack(bcmolt_flush_mac_table_option this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_flush_mac_table_option from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_flush_mac_table_option_unpack(bcmolt_flush_mac_table_option *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_frequency_adjustment_direction to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_frequency_adjustment_direction_pack(bcmolt_frequency_adjustment_direction this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_frequency_adjustment_direction from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_frequency_adjustment_direction_unpack(bcmolt_frequency_adjustment_direction *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gem_port_direction to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gem_port_direction_pack(bcmolt_gem_port_direction this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gem_port_direction from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gem_port_direction_unpack(bcmolt_gem_port_direction *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gem_port_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gem_port_type_pack(bcmolt_gem_port_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gem_port_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gem_port_type_unpack(bcmolt_gem_port_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gem_port_operation to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gem_port_operation_pack(bcmolt_gem_port_operation this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gem_port_operation from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gem_port_operation_unpack(bcmolt_gem_port_operation *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_cfg_id_pack(bcmolt_gpio_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_cfg_id_unpack(bcmolt_gpio_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_key_id_pack(bcmolt_gpio_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_key_id_unpack(bcmolt_gpio_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_pin_dir to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_pin_dir_pack(bcmolt_gpio_pin_dir this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_pin_dir from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_pin_dir_unpack(bcmolt_gpio_pin_dir *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpio_value to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpio_value_pack(bcmolt_gpio_value this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpio_value from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpio_value_unpack(bcmolt_gpio_value *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_auto_cfg_id_pack(bcmolt_gpon_alloc_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_auto_cfg_id_unpack(bcmolt_gpon_alloc_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_cfg_id_pack(bcmolt_gpon_alloc_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_cfg_id_unpack(bcmolt_gpon_alloc_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_configuration_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_configuration_completed_id_pack(bcmolt_gpon_alloc_configuration_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_configuration_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_configuration_completed_id_unpack(bcmolt_gpon_alloc_configuration_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_get_alloc_stats_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_id_pack(bcmolt_gpon_alloc_get_alloc_stats_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_get_alloc_stats_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_id_unpack(bcmolt_gpon_alloc_get_alloc_stats_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_get_stats_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_stats_id_pack(bcmolt_gpon_alloc_get_stats_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_get_stats_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_stats_id_unpack(bcmolt_gpon_alloc_get_stats_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_key_id_pack(bcmolt_gpon_alloc_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_key_id_unpack(bcmolt_gpon_alloc_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_set_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_set_state_id_pack(bcmolt_gpon_alloc_set_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_set_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_set_state_id_unpack(bcmolt_gpon_alloc_set_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_id_pack(bcmolt_gpon_alloc_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_id_unpack(bcmolt_gpon_alloc_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_id_pack(bcmolt_gpon_alloc_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_id_unpack(bcmolt_gpon_alloc_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_cfg_id_pack(bcmolt_gpon_alloc_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_cfg_id_unpack(bcmolt_gpon_alloc_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_alloc_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_id_pack(bcmolt_gpon_alloc_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_id_unpack(bcmolt_gpon_alloc_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_auto_cfg_id_pack(bcmolt_gpon_gem_port_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_auto_cfg_id_unpack(bcmolt_gpon_gem_port_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_cfg_id_pack(bcmolt_gpon_gem_port_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_cfg_id_unpack(bcmolt_gpon_gem_port_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_configuration_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_configuration_completed_id_pack(bcmolt_gpon_gem_port_configuration_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_configuration_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_configuration_completed_id_unpack(bcmolt_gpon_gem_port_configuration_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_key_id_pack(bcmolt_gpon_gem_port_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_key_id_unpack(bcmolt_gpon_gem_port_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_set_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_set_state_id_pack(bcmolt_gpon_gem_port_set_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_set_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_set_state_id_unpack(bcmolt_gpon_gem_port_set_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_id_pack(bcmolt_gpon_gem_port_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_id_unpack(bcmolt_gpon_gem_port_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_id_pack(bcmolt_gpon_gem_port_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_id_unpack(bcmolt_gpon_gem_port_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_cfg_id_pack(bcmolt_gpon_gem_port_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_cfg_id_unpack(bcmolt_gpon_gem_port_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_id_pack(bcmolt_gpon_gem_port_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_id_unpack(bcmolt_gpon_gem_port_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_gem_port_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_state_pack(bcmolt_gpon_gem_port_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_gem_port_state_unpack(bcmolt_gpon_gem_port_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_auto_cfg_id_pack(bcmolt_gpon_iwf_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_auto_cfg_id_unpack(bcmolt_gpon_iwf_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_cfg_id_pack(bcmolt_gpon_iwf_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_cfg_id_unpack(bcmolt_gpon_iwf_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_ds_egress_flow_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_id_pack(bcmolt_gpon_iwf_ds_egress_flow_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_egress_flow_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_id_unpack(bcmolt_gpon_iwf_ds_egress_flow_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_ds_egress_flow_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_id_pack(bcmolt_gpon_iwf_ds_egress_flow_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_egress_flow_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_id_unpack(bcmolt_gpon_iwf_ds_egress_flow_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_ds_ingress_flow_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_pack(bcmolt_gpon_iwf_ds_ingress_flow_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_ingress_flow_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_id_unpack(bcmolt_gpon_iwf_ds_ingress_flow_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_ds_ingress_flow_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_id_pack(bcmolt_gpon_iwf_ds_ingress_flow_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_ingress_flow_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_id_unpack(bcmolt_gpon_iwf_ds_ingress_flow_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_flush_mac_table_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_flush_mac_table_completed_id_pack(bcmolt_gpon_iwf_flush_mac_table_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_flush_mac_table_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_flush_mac_table_completed_id_unpack(bcmolt_gpon_iwf_flush_mac_table_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_flush_mac_table_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_flush_mac_table_id_pack(bcmolt_gpon_iwf_flush_mac_table_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_flush_mac_table_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_flush_mac_table_id_unpack(bcmolt_gpon_iwf_flush_mac_table_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_key_id_pack(bcmolt_gpon_iwf_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_key_id_unpack(bcmolt_gpon_iwf_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_id_pack(bcmolt_gpon_iwf_mac_table_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_id_unpack(bcmolt_gpon_iwf_mac_table_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_id_pack(bcmolt_gpon_iwf_mac_table_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_id_unpack(bcmolt_gpon_iwf_mac_table_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_key_id_pack(bcmolt_gpon_iwf_mac_table_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_key_id_unpack(bcmolt_gpon_iwf_mac_table_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_mac_aged_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_aged_id_pack(bcmolt_gpon_iwf_mac_table_mac_aged_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_mac_aged_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_aged_id_unpack(bcmolt_gpon_iwf_mac_table_mac_aged_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_mac_dropped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_id_pack(bcmolt_gpon_iwf_mac_table_mac_dropped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_mac_dropped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_id_unpack(bcmolt_gpon_iwf_mac_table_mac_dropped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_mac_move_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_id_pack(bcmolt_gpon_iwf_mac_table_mac_move_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_mac_move_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_id_unpack(bcmolt_gpon_iwf_mac_table_mac_move_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_new_mac_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_id_pack(bcmolt_gpon_iwf_mac_table_new_mac_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_new_mac_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_id_unpack(bcmolt_gpon_iwf_mac_table_new_mac_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_scan_mac_table_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_id_pack(bcmolt_gpon_iwf_scan_mac_table_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_scan_mac_table_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_id_unpack(bcmolt_gpon_iwf_scan_mac_table_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_scan_mac_table_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_id_pack(bcmolt_gpon_iwf_scan_mac_table_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_scan_mac_table_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_id_unpack(bcmolt_gpon_iwf_scan_mac_table_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_id_pack(bcmolt_gpon_iwf_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_id_unpack(bcmolt_gpon_iwf_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_id_pack(bcmolt_gpon_iwf_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_id_unpack(bcmolt_gpon_iwf_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_cfg_id_pack(bcmolt_gpon_iwf_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_cfg_id_unpack(bcmolt_gpon_iwf_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_id_pack(bcmolt_gpon_iwf_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_id_unpack(bcmolt_gpon_iwf_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_us_flow_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_id_pack(bcmolt_gpon_iwf_us_flow_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_us_flow_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_id_unpack(bcmolt_gpon_iwf_us_flow_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_iwf_us_flow_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_key_id_pack(bcmolt_gpon_iwf_us_flow_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_us_flow_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_key_id_unpack(bcmolt_gpon_iwf_us_flow_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_key_exchange_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_key_exchange_mode_pack(bcmolt_key_exchange_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_key_exchange_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_key_exchange_mode_unpack(bcmolt_key_exchange_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_activate_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_activate_all_onus_completed_id_pack(bcmolt_gpon_ni_activate_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_activate_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_activate_all_onus_completed_id_unpack(bcmolt_gpon_ni_activate_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_auto_cfg_id_pack(bcmolt_gpon_ni_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_auto_cfg_id_unpack(bcmolt_gpon_ni_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_broadcast_ploam_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_id_pack(bcmolt_gpon_ni_broadcast_ploam_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_broadcast_ploam_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_id_unpack(bcmolt_gpon_ni_broadcast_ploam_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cfg_id_pack(bcmolt_gpon_ni_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cfg_id_unpack(bcmolt_gpon_ni_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_cpu_packets_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_id_pack(bcmolt_gpon_ni_cpu_packets_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_cpu_packets_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_id_unpack(bcmolt_gpon_ni_cpu_packets_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_cpu_packets_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_id_pack(bcmolt_gpon_ni_cpu_packets_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_cpu_packets_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_id_unpack(bcmolt_gpon_ni_cpu_packets_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_deactivate_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_deactivate_all_onus_completed_id_pack(bcmolt_gpon_ni_deactivate_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_deactivate_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_deactivate_all_onus_completed_id_unpack(bcmolt_gpon_ni_deactivate_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_disable_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_disable_all_onus_completed_id_pack(bcmolt_gpon_ni_disable_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_disable_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_disable_all_onus_completed_id_unpack(bcmolt_gpon_ni_disable_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_disable_serial_number_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_disable_serial_number_id_pack(bcmolt_gpon_ni_disable_serial_number_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_disable_serial_number_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_disable_serial_number_id_unpack(bcmolt_gpon_ni_disable_serial_number_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_enable_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_enable_all_onus_completed_id_pack(bcmolt_gpon_ni_enable_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_enable_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_enable_all_onus_completed_id_unpack(bcmolt_gpon_ni_enable_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_key_id_pack(bcmolt_gpon_ni_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_key_id_unpack(bcmolt_gpon_ni_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_los_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_los_id_pack(bcmolt_gpon_ni_los_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_los_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_los_id_unpack(bcmolt_gpon_ni_los_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_onu_discovered_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_discovered_id_pack(bcmolt_gpon_ni_onu_discovered_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_onu_discovered_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_discovered_id_unpack(bcmolt_gpon_ni_onu_discovered_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_onu_upgrade_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_id_pack(bcmolt_gpon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_onu_upgrade_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_id_unpack(bcmolt_gpon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_onus_ranged_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_id_pack(bcmolt_gpon_ni_protection_switching_onus_ranged_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_onus_ranged_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_id_unpack(bcmolt_gpon_ni_protection_switching_onus_ranged_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_switchover_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_id_pack(bcmolt_gpon_ni_protection_switching_switchover_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_switchover_completed_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_id_unpack(bcmolt_gpon_ni_protection_switching_switchover_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_traffic_resume_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_id_pack(bcmolt_gpon_ni_protection_switching_traffic_resume_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_traffic_resume_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_id_unpack(bcmolt_gpon_ni_protection_switching_traffic_resume_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id 
+ * to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_reset_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_reset_id_pack(bcmolt_gpon_ni_reset_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_reset_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_reset_id_unpack(bcmolt_gpon_ni_reset_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_rogue_detection_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_id_pack(bcmolt_gpon_ni_rogue_detection_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_rogue_detection_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_id_unpack(bcmolt_gpon_ni_rogue_detection_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_rogue_detection_window_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_window_id_pack(bcmolt_gpon_ni_rogue_detection_window_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_rogue_detection_window_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_window_id_unpack(bcmolt_gpon_ni_rogue_detection_window_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_rogue_onu_special_map_cycle_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_serial_number_acquisition_cycle_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_set_onu_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_set_onu_state_id_pack(bcmolt_gpon_ni_set_onu_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_set_onu_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_set_onu_state_id_unpack(bcmolt_gpon_ni_set_onu_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_set_pon_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_set_pon_state_id_pack(bcmolt_gpon_ni_set_pon_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_set_pon_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_set_pon_state_id_unpack(bcmolt_gpon_ni_set_pon_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_single_request_standby_pon_monitoring_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_single_request_standby_pon_monitoring_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_start_onu_upgrade_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_id_pack(bcmolt_gpon_ni_start_onu_upgrade_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_start_onu_upgrade_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_id_unpack(bcmolt_gpon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_id_pack(bcmolt_gpon_ni_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_id_unpack(bcmolt_gpon_ni_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_id_pack(bcmolt_gpon_ni_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_id_unpack(bcmolt_gpon_ni_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_cfg_id_pack(bcmolt_gpon_ni_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_cfg_id_unpack(bcmolt_gpon_ni_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_id_pack(bcmolt_gpon_ni_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_id_unpack(bcmolt_gpon_ni_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_state_change_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_state_change_completed_id_pack(bcmolt_gpon_ni_state_change_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_state_change_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_state_change_completed_id_unpack(bcmolt_gpon_ni_state_change_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_tod_request_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_tod_request_completed_id_pack(bcmolt_gpon_ni_tod_request_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_tod_request_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_tod_request_completed_id_unpack(bcmolt_gpon_ni_tod_request_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_ni_tod_request_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_tod_request_id_pack(bcmolt_gpon_ni_tod_request_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_tod_request_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_ni_tod_request_id_unpack(bcmolt_gpon_ni_tod_request_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_auto_cfg_id_pack(bcmolt_gpon_onu_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_auto_cfg_id_unpack(bcmolt_gpon_onu_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_ber_interval_configuration_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_id_pack(bcmolt_gpon_onu_ber_interval_configuration_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_ber_interval_configuration_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_id_unpack(bcmolt_gpon_onu_ber_interval_configuration_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cfg_id_pack(bcmolt_gpon_onu_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cfg_id_unpack(bcmolt_gpon_onu_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_change_power_level_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_change_power_level_id_pack(bcmolt_gpon_onu_change_power_level_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_change_power_level_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_change_power_level_id_unpack(bcmolt_gpon_onu_change_power_level_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_cpu_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packet_id_pack(bcmolt_gpon_onu_cpu_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_cpu_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packet_id_unpack(bcmolt_gpon_onu_cpu_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_cpu_packets_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packets_id_pack(bcmolt_gpon_onu_cpu_packets_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_cpu_packets_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packets_id_unpack(bcmolt_gpon_onu_cpu_packets_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_dfi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dfi_id_pack(bcmolt_gpon_onu_dfi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_dfi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dfi_id_unpack(bcmolt_gpon_onu_dfi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_dgi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dgi_id_pack(bcmolt_gpon_onu_dgi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_dgi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dgi_id_unpack(bcmolt_gpon_onu_dgi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_dowi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dowi_id_pack(bcmolt_gpon_onu_dowi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_dowi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_dowi_id_unpack(bcmolt_gpon_onu_dowi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_err_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_err_id_pack(bcmolt_gpon_onu_err_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_err_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_err_id_unpack(bcmolt_gpon_onu_err_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_invalid_dbru_report_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_id_pack(bcmolt_gpon_onu_invalid_dbru_report_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_invalid_dbru_report_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_id_unpack(bcmolt_gpon_onu_invalid_dbru_report_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_completed_id_pack(bcmolt_gpon_onu_key_exchange_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_completed_id_unpack(bcmolt_gpon_onu_key_exchange_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_cycle_skipped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_cycle_skipped_id_pack(bcmolt_gpon_onu_key_exchange_cycle_skipped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_cycle_skipped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_cycle_skipped_id_unpack(bcmolt_gpon_onu_key_exchange_cycle_skipped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_decrypt_required_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_id_pack(bcmolt_gpon_onu_key_exchange_decrypt_required_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_decrypt_required_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_id_unpack(bcmolt_gpon_onu_key_exchange_decrypt_required_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_key_mismatch_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_id_pack(bcmolt_gpon_onu_key_exchange_key_mismatch_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_key_mismatch_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_id_unpack(bcmolt_gpon_onu_key_exchange_key_mismatch_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_key_request_timeout_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_key_request_timeout_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_unconsecutive_index_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_pack(bcmolt_gpon_onu_key_exchange_unconsecutive_index_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_unconsecutive_index_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_id_unpack(bcmolt_gpon_onu_key_exchange_unconsecutive_index_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_id_pack(bcmolt_gpon_onu_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_key_id_unpack(bcmolt_gpon_onu_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_loai_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_loai_id_pack(bcmolt_gpon_onu_loai_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_loai_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_loai_id_unpack(bcmolt_gpon_onu_loai_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_loki_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_loki_id_pack(bcmolt_gpon_onu_loki_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_loki_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_loki_id_unpack(bcmolt_gpon_onu_loki_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_memi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_memi_id_pack(bcmolt_gpon_onu_memi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_memi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_memi_id_unpack(bcmolt_gpon_onu_memi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_omci_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_omci_packet_id_pack(bcmolt_gpon_onu_omci_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_omci_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_omci_packet_id_unpack(bcmolt_gpon_onu_omci_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_omci_port_id_configuration_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_omci_port_id_configuration_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_onu_activation_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_completed_id_pack(bcmolt_gpon_onu_onu_activation_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_activation_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_completed_id_unpack(bcmolt_gpon_onu_onu_activation_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_onu_activation_standby_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_id_pack(bcmolt_gpon_onu_onu_activation_standby_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_activation_standby_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_id_unpack(bcmolt_gpon_onu_onu_activation_standby_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_onu_alarm_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_alarm_id_pack(bcmolt_gpon_onu_onu_alarm_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_alarm_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_alarm_id_unpack(bcmolt_gpon_onu_onu_alarm_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_onu_deactivation_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_id_pack(bcmolt_gpon_onu_onu_deactivation_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_deactivation_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_id_unpack(bcmolt_gpon_onu_onu_deactivation_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_onu_disable_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_disable_completed_id_pack(bcmolt_gpon_onu_onu_disable_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_disable_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_disable_completed_id_unpack(bcmolt_gpon_onu_onu_disable_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_onu_enable_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_enable_completed_id_pack(bcmolt_gpon_onu_onu_enable_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_onu_enable_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_enable_completed_id_unpack(bcmolt_gpon_onu_onu_enable_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_optical_reflection_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_optical_reflection_id_pack(bcmolt_gpon_onu_optical_reflection_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_optical_reflection_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_optical_reflection_id_unpack(bcmolt_gpon_onu_optical_reflection_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_password_authentication_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_password_authentication_completed_id_pack(bcmolt_gpon_onu_password_authentication_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_password_authentication_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_password_authentication_completed_id_unpack(bcmolt_gpon_onu_password_authentication_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_pee_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_pee_id_pack(bcmolt_gpon_onu_pee_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_pee_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_pee_id_unpack(bcmolt_gpon_onu_pee_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_ploam_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ploam_packet_id_pack(bcmolt_gpon_onu_ploam_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_ploam_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ploam_packet_id_unpack(bcmolt_gpon_onu_ploam_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_possible_drift_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_possible_drift_id_pack(bcmolt_gpon_onu_possible_drift_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_possible_drift_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_possible_drift_id_unpack(bcmolt_gpon_onu_possible_drift_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_power_management_state_change_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_power_management_state_change_id_pack(bcmolt_gpon_onu_power_management_state_change_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_power_management_state_change_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_power_management_state_change_id_unpack(bcmolt_gpon_onu_power_management_state_change_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_pst_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_pst_id_pack(bcmolt_gpon_onu_pst_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_pst_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_pst_id_unpack(bcmolt_gpon_onu_pst_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_ranging_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ranging_completed_id_pack(bcmolt_gpon_onu_ranging_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_ranging_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_ranging_completed_id_unpack(bcmolt_gpon_onu_ranging_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_rei_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rei_id_pack(bcmolt_gpon_onu_rei_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_rei_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rei_id_unpack(bcmolt_gpon_onu_rei_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_rssi_measurement_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_id_pack(bcmolt_gpon_onu_rssi_measurement_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_rssi_measurement_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_id_unpack(bcmolt_gpon_onu_rssi_measurement_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_rssi_measurement_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rssi_measurement_id_pack(bcmolt_gpon_onu_rssi_measurement_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_rssi_measurement_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_rssi_measurement_id_unpack(bcmolt_gpon_onu_rssi_measurement_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_sdi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sdi_id_pack(bcmolt_gpon_onu_sdi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_sdi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sdi_id_unpack(bcmolt_gpon_onu_sdi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_set_onu_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_set_onu_state_id_pack(bcmolt_gpon_onu_set_onu_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_set_onu_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_set_onu_state_id_unpack(bcmolt_gpon_onu_set_onu_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_sfi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sfi_id_pack(bcmolt_gpon_onu_sfi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_sfi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sfi_id_unpack(bcmolt_gpon_onu_sfi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_id_pack(bcmolt_gpon_onu_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_id_unpack(bcmolt_gpon_onu_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_id_pack(bcmolt_gpon_onu_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_id_unpack(bcmolt_gpon_onu_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_cfg_id_pack(bcmolt_gpon_onu_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_cfg_id_unpack(bcmolt_gpon_onu_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_id_pack(bcmolt_gpon_onu_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_id_unpack(bcmolt_gpon_onu_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_sufi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sufi_id_pack(bcmolt_gpon_onu_sufi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_sufi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_sufi_id_unpack(bcmolt_gpon_onu_sufi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_tiwi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_tiwi_id_pack(bcmolt_gpon_onu_tiwi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_tiwi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_tiwi_id_unpack(bcmolt_gpon_onu_tiwi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_omci_device_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_omci_device_id_pack(bcmolt_omci_device_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_omci_device_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_omci_device_id_unpack(bcmolt_omci_device_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_onu_upgrade_return_code to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_return_code_pack(bcmolt_gpon_onu_upgrade_return_code this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_upgrade_return_code from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_return_code_unpack(bcmolt_gpon_onu_upgrade_return_code *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_omci_result_code to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_omci_result_code_pack(bcmolt_omci_result_code this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_omci_result_code from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_omci_result_code_unpack(bcmolt_omci_result_code *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_onu_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_onu_state_pack(bcmolt_onu_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_onu_state_unpack(bcmolt_onu_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rssi_location_sign to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rssi_location_sign_pack(bcmolt_rssi_location_sign this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rssi_location_sign from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rssi_location_sign_unpack(bcmolt_rssi_location_sign *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_onu_post_discovery_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_onu_post_discovery_mode_pack(bcmolt_onu_post_discovery_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_post_discovery_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_onu_post_discovery_mode_unpack(bcmolt_onu_post_discovery_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_trx_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_trx_cfg_id_pack(bcmolt_gpon_trx_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_trx_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_trx_cfg_id_unpack(bcmolt_gpon_trx_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_gpon_trx_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_gpon_trx_key_id_pack(bcmolt_gpon_trx_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_trx_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_gpon_trx_key_id_unpack(bcmolt_gpon_trx_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_image_transfer_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_image_transfer_status_pack(bcmolt_image_transfer_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_image_transfer_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_image_transfer_status_unpack(bcmolt_image_transfer_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_iwf_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_iwf_mode_pack(bcmolt_iwf_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_iwf_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_iwf_mode_unpack(bcmolt_iwf_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_auto_cfg_id_pack(bcmolt_log_entry_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_auto_cfg_id_unpack(bcmolt_log_entry_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_cfg_id_pack(bcmolt_log_entry_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_cfg_id_unpack(bcmolt_log_entry_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_key_id_pack(bcmolt_log_entry_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_key_id_unpack(bcmolt_log_entry_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_cleared_id_pack(bcmolt_log_entry_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_cleared_id_unpack(bcmolt_log_entry_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_raised_id_pack(bcmolt_log_entry_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_raised_id_unpack(bcmolt_log_entry_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_cfg_id_pack(bcmolt_log_entry_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_cfg_id_unpack(bcmolt_log_entry_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_entry_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_id_pack(bcmolt_log_entry_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_entry_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_entry_stat_id_unpack(bcmolt_log_entry_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_file_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_file_id_pack(bcmolt_log_file_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_file_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_file_id_unpack(bcmolt_log_file_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_level to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_level_pack(bcmolt_log_level this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_level from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_level_unpack(bcmolt_log_level *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_style to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_style_pack(bcmolt_log_style this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_style from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_style_unpack(bcmolt_log_style *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_log_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_log_type_pack(bcmolt_log_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_log_type_unpack(bcmolt_log_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_auto_cfg_id_pack(bcmolt_logger_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_auto_cfg_id_unpack(bcmolt_logger_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_cfg_id_pack(bcmolt_logger_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_cfg_id_unpack(bcmolt_logger_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_clear_log_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_clear_log_id_pack(bcmolt_logger_clear_log_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_clear_log_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_clear_log_id_unpack(bcmolt_logger_clear_log_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_key_id_pack(bcmolt_logger_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_key_id_unpack(bcmolt_logger_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_cleared_id_pack(bcmolt_logger_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_cleared_id_unpack(bcmolt_logger_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_raised_id_pack(bcmolt_logger_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_raised_id_unpack(bcmolt_logger_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_cfg_id_pack(bcmolt_logger_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_cfg_id_unpack(bcmolt_logger_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_logger_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_id_pack(bcmolt_logger_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_logger_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_logger_stat_id_unpack(bcmolt_logger_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mac_table_miss_fallback to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mac_table_miss_fallback_pack(bcmolt_mac_table_miss_fallback this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mac_table_miss_fallback from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mac_table_miss_fallback_unpack(bcmolt_mac_table_miss_fallback *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mac_table_learning_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mac_table_learning_mode_pack(bcmolt_mac_table_learning_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mac_table_learning_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mac_table_learning_mode_unpack(bcmolt_mac_table_learning_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_mapping_tag_method to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_mapping_tag_method_pack(bcmolt_mapping_tag_method this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mapping_tag_method from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_mapping_tag_method_unpack(bcmolt_mapping_tag_method *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_auto_cfg_id_pack(bcmolt_nni_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_auto_cfg_id_unpack(bcmolt_nni_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_cfg_id_pack(bcmolt_nni_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_cfg_id_unpack(bcmolt_nni_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_connection to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_connection_pack(bcmolt_nni_connection this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_connection from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_connection_unpack(bcmolt_nni_connection *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_key_id_pack(bcmolt_nni_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_key_id_unpack(bcmolt_nni_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trivalent to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trivalent_pack(bcmolt_trivalent this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trivalent from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trivalent_unpack(bcmolt_trivalent *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_serdes_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_serdes_cfg_id_pack(bcmolt_nni_serdes_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_serdes_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_serdes_cfg_id_unpack(bcmolt_nni_serdes_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_serdes_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_serdes_key_id_pack(bcmolt_nni_serdes_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_serdes_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_serdes_key_id_unpack(bcmolt_nni_serdes_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_cleared_id_pack(bcmolt_nni_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_cleared_id_unpack(bcmolt_nni_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_raised_id_pack(bcmolt_nni_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_raised_id_unpack(bcmolt_nni_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_cfg_id_pack(bcmolt_nni_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_cfg_id_unpack(bcmolt_nni_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_id_pack(bcmolt_nni_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_stat_id_unpack(bcmolt_nni_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_nni_status_changed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_nni_status_changed_id_pack(bcmolt_nni_status_changed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_status_changed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_nni_status_changed_id_unpack(bcmolt_nni_status_changed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_odn_class to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_odn_class_pack(bcmolt_odn_class this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_odn_class from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_odn_class_unpack(bcmolt_odn_class *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_omci_port_id_operation to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_omci_port_id_operation_pack(bcmolt_omci_port_id_operation this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_omci_port_id_operation from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_omci_port_id_operation_unpack(bcmolt_omci_port_id_operation *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_onu_operation to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_onu_operation_pack(bcmolt_onu_operation this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_operation from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_onu_operation_unpack(bcmolt_onu_operation *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_onu_power_level to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_onu_power_level_pack(bcmolt_onu_power_level this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_power_level from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_onu_power_level_unpack(bcmolt_onu_power_level *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_tc_protocol to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_tc_protocol_pack(bcmolt_tc_protocol this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_tc_protocol from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_tc_protocol_unpack(bcmolt_tc_protocol *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_packet_injection_error to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_packet_injection_error_pack(bcmolt_packet_injection_error this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_packet_injection_error from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_packet_injection_error_unpack(bcmolt_packet_injection_error *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_packet_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_packet_type_pack(bcmolt_packet_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_packet_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_packet_type_unpack(bcmolt_packet_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_password_authentication_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_password_authentication_fail_reason_pack(bcmolt_password_authentication_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_password_authentication_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_password_authentication_fail_reason_unpack(bcmolt_password_authentication_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_polarity to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_polarity_pack(bcmolt_polarity this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_polarity from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_polarity_unpack(bcmolt_polarity *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_polling_interval to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_polling_interval_pack(bcmolt_polling_interval this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_polling_interval from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_polling_interval_unpack(bcmolt_polling_interval *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_pon_operation to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_pon_operation_pack(bcmolt_pon_operation this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_operation from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_pon_operation_unpack(bcmolt_pon_operation *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_pon_protection_switching_options to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_pon_protection_switching_options_pack(bcmolt_pon_protection_switching_options this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_protection_switching_options from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_pon_protection_switching_options_unpack(bcmolt_pon_protection_switching_options *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_pon_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_pon_state_pack(bcmolt_pon_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_pon_state_unpack(bcmolt_pon_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_power_levelling_control to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_power_levelling_control_pack(bcmolt_power_levelling_control this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_power_levelling_control from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_power_levelling_control_unpack(bcmolt_power_levelling_control *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_power_management_transition_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_power_management_transition_reason_pack(bcmolt_power_management_transition_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_power_management_transition_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_power_management_transition_reason_unpack(bcmolt_power_management_transition_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_prbs_polynomial to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_prbs_polynomial_pack(bcmolt_prbs_polynomial this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_polynomial from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_prbs_polynomial_unpack(bcmolt_prbs_polynomial *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_prbs_checker_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_prbs_checker_mode_pack(bcmolt_prbs_checker_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_checker_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_prbs_checker_mode_unpack(bcmolt_prbs_checker_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_prbs_lock_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_prbs_lock_state_pack(bcmolt_prbs_lock_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_lock_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_prbs_lock_state_unpack(bcmolt_prbs_lock_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_raman_mitigation_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_raman_mitigation_mode_pack(bcmolt_raman_mitigation_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_raman_mitigation_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_raman_mitigation_mode_unpack(bcmolt_raman_mitigation_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_ranging_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_ranging_fail_reason_pack(bcmolt_ranging_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ranging_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_ranging_fail_reason_unpack(bcmolt_ranging_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_registration_behavior to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_registration_behavior_pack(bcmolt_registration_behavior this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_registration_behavior from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_registration_behavior_unpack(bcmolt_registration_behavior *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_request_registration_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_request_registration_fail_reason_pack(bcmolt_request_registration_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_request_registration_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_request_registration_fail_reason_unpack(bcmolt_request_registration_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_result to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_result_pack(bcmolt_result this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_result from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_result_unpack(bcmolt_result *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rogue_detection_algorithm_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_type_pack(bcmolt_rogue_detection_algorithm_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_detection_algorithm_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_type_unpack(bcmolt_rogue_detection_algorithm_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rogue_detection_window to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rogue_detection_window_pack(bcmolt_rogue_detection_window this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_detection_window from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rogue_detection_window_unpack(bcmolt_rogue_detection_window *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rogue_measurement_result to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rogue_measurement_result_pack(bcmolt_rogue_measurement_result this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_measurement_result from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rogue_measurement_result_unpack(bcmolt_rogue_measurement_result *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rogue_scan_status to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rogue_scan_status_pack(bcmolt_rogue_scan_status this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_scan_status from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rogue_scan_status_unpack(bcmolt_rogue_scan_status *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_rssi_measurement_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_rssi_measurement_fail_reason_pack(bcmolt_rssi_measurement_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rssi_measurement_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_rssi_measurement_fail_reason_unpack(bcmolt_rssi_measurement_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_secure_mutual_authentication_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_secure_mutual_authentication_fail_reason_pack(bcmolt_secure_mutual_authentication_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_secure_mutual_authentication_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_secure_mutual_authentication_fail_reason_unpack(bcmolt_secure_mutual_authentication_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_serdes_ranging_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_serdes_ranging_mode_pack(bcmolt_serdes_ranging_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_serdes_ranging_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_serdes_ranging_mode_unpack(bcmolt_serdes_ranging_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_serdes_instance to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_serdes_instance_pack(bcmolt_serdes_instance this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_serdes_instance from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_serdes_instance_unpack(bcmolt_serdes_instance *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_shaper_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_shaper_mode_pack(bcmolt_shaper_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_shaper_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_shaper_mode_unpack(bcmolt_shaper_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_software_error_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_software_error_cfg_id_pack(bcmolt_software_error_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_software_error_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_software_error_cfg_id_unpack(bcmolt_software_error_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_software_error_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_software_error_key_id_pack(bcmolt_software_error_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_software_error_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_software_error_key_id_unpack(bcmolt_software_error_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_stat_condition_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_stat_condition_type_pack(bcmolt_stat_condition_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_stat_condition_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_stat_condition_type_unpack(bcmolt_stat_condition_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_switch_over_type_c_onu_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_switch_over_type_c_onu_state_pack(bcmolt_switch_over_type_c_onu_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_switch_over_type_c_onu_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_switch_over_type_c_onu_state_unpack(bcmolt_switch_over_type_c_onu_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_system_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_system_mode_pack(bcmolt_system_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_system_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_system_mode_unpack(bcmolt_system_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_us_operating_wavelength_bands to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_us_operating_wavelength_bands_pack(bcmolt_us_operating_wavelength_bands this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_us_operating_wavelength_bands from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_us_operating_wavelength_bands_unpack(bcmolt_us_operating_wavelength_bands *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_traffic_resume_result to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_traffic_resume_result_pack(bcmolt_traffic_resume_result this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_traffic_resume_result from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_traffic_resume_result_unpack(bcmolt_traffic_resume_result *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_auto_cfg_id_pack(bcmolt_trx_calibration_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_auto_cfg_id_unpack(bcmolt_trx_calibration_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_capture_window_and_statistic_completed_id to 
+ * bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_trx_calibration_capture_window_and_statistic_completed_id 
+ * from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_trx_calibration_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_key_id_pack(bcmolt_trx_calibration_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_key_id_unpack(bcmolt_trx_calibration_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_start_capture_window_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_start_capture_window_id_pack(bcmolt_trx_calibration_start_capture_window_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_start_capture_window_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_start_capture_window_id_unpack(bcmolt_trx_calibration_start_capture_window_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_stop_capture_window_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_stop_capture_window_id_pack(bcmolt_trx_calibration_stop_capture_window_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_stop_capture_window_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_stop_capture_window_id_unpack(bcmolt_trx_calibration_stop_capture_window_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_trigger to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_trigger_pack(bcmolt_trx_calibration_trigger this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_trigger from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_trigger_unpack(bcmolt_trx_calibration_trigger *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_trigger_position to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_trigger_position_pack(bcmolt_trx_calibration_trigger_position this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_trigger_position from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_trigger_position_unpack(bcmolt_trx_calibration_trigger_position *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_calibration_window_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_window_mode_pack(bcmolt_trx_calibration_window_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_calibration_window_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_calibration_window_mode_unpack(bcmolt_trx_calibration_window_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_trx_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_trx_type_pack(bcmolt_trx_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_trx_type_unpack(bcmolt_trx_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_tune_in_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_tune_in_fail_reason_pack(bcmolt_tune_in_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_tune_in_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_tune_in_fail_reason_unpack(bcmolt_tune_in_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_tune_out_fail_reason to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_tune_out_fail_reason_pack(bcmolt_tune_out_fail_reason this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_tune_out_fail_reason from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_tune_out_fail_reason_unpack(bcmolt_tune_out_fail_reason *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_uart_baudrate to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_uart_baudrate_pack(bcmolt_uart_baudrate this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_uart_baudrate from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_uart_baudrate_unpack(bcmolt_uart_baudrate *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_us_gem_port_destination to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_us_gem_port_destination_pack(bcmolt_us_gem_port_destination this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_us_gem_port_destination from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_us_gem_port_destination_unpack(bcmolt_us_gem_port_destination *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_us_vlan_action to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_us_vlan_action_pack(bcmolt_us_vlan_action this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_us_vlan_action from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_us_vlan_action_unpack(bcmolt_us_vlan_action *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_vlan_to_flow_mapping_method to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_vlan_to_flow_mapping_method_pack(bcmolt_vlan_to_flow_mapping_method this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_vlan_to_flow_mapping_method from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_vlan_to_flow_mapping_method_unpack(bcmolt_vlan_to_flow_mapping_method *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_auto_cfg_id_pack(bcmolt_xgpon_alloc_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_auto_cfg_id_unpack(bcmolt_xgpon_alloc_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_cfg_id_pack(bcmolt_xgpon_alloc_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_cfg_id_unpack(bcmolt_xgpon_alloc_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_configuration_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_configuration_completed_id_pack(bcmolt_xgpon_alloc_configuration_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_configuration_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_configuration_completed_id_unpack(bcmolt_xgpon_alloc_configuration_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_get_alloc_stats_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_id_pack(bcmolt_xgpon_alloc_get_alloc_stats_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_get_alloc_stats_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_id_unpack(bcmolt_xgpon_alloc_get_alloc_stats_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_get_stats_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_stats_id_pack(bcmolt_xgpon_alloc_get_stats_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_get_stats_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_stats_id_unpack(bcmolt_xgpon_alloc_get_stats_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_key_id_pack(bcmolt_xgpon_alloc_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_key_id_unpack(bcmolt_xgpon_alloc_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_set_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_set_state_id_pack(bcmolt_xgpon_alloc_set_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_set_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_set_state_id_unpack(bcmolt_xgpon_alloc_set_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_id_pack(bcmolt_xgpon_alloc_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_id_unpack(bcmolt_xgpon_alloc_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_id_pack(bcmolt_xgpon_alloc_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_id_unpack(bcmolt_xgpon_alloc_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_cfg_id_pack(bcmolt_xgpon_alloc_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_cfg_id_unpack(bcmolt_xgpon_alloc_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_alloc_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_id_pack(bcmolt_xgpon_alloc_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_id_unpack(bcmolt_xgpon_alloc_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_id_pack(bcmolt_xgpon_gem_port_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_id_unpack(bcmolt_xgpon_gem_port_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_cfg_id_pack(bcmolt_xgpon_gem_port_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_cfg_id_unpack(bcmolt_xgpon_gem_port_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_key_id_pack(bcmolt_xgpon_gem_port_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_key_id_unpack(bcmolt_xgpon_gem_port_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_id_pack(bcmolt_xgpon_gem_port_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_id_unpack(bcmolt_xgpon_gem_port_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_id_pack(bcmolt_xgpon_gem_port_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_id_unpack(bcmolt_xgpon_gem_port_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_id_pack(bcmolt_xgpon_gem_port_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_id_unpack(bcmolt_xgpon_gem_port_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_id_pack(bcmolt_xgpon_gem_port_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_id_unpack(bcmolt_xgpon_gem_port_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_gem_port_state to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_state_pack(bcmolt_xgpon_gem_port_state this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_state from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_state_unpack(bcmolt_xgpon_gem_port_state *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_iwf_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_iwf_cfg_id_pack(bcmolt_xgpon_iwf_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_iwf_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_iwf_cfg_id_unpack(bcmolt_xgpon_iwf_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_iwf_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_iwf_key_id_pack(bcmolt_xgpon_iwf_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_iwf_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_iwf_key_id_unpack(bcmolt_xgpon_iwf_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_activate_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_activate_all_onus_completed_id_pack(bcmolt_xgpon_ni_activate_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_activate_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_activate_all_onus_completed_id_unpack(bcmolt_xgpon_ni_activate_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_adjust_tx_wavelength_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_id_pack(bcmolt_xgpon_ni_adjust_tx_wavelength_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_adjust_tx_wavelength_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_id_unpack(bcmolt_xgpon_ni_adjust_tx_wavelength_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_auto_cfg_id_pack(bcmolt_xgpon_ni_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_auto_cfg_id_unpack(bcmolt_xgpon_ni_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_broadcast_ploam_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_id_pack(bcmolt_xgpon_ni_broadcast_ploam_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_broadcast_ploam_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_id_unpack(bcmolt_xgpon_ni_broadcast_ploam_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cfg_id_pack(bcmolt_xgpon_ni_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cfg_id_unpack(bcmolt_xgpon_ni_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_cpu_packets_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_id_pack(bcmolt_xgpon_ni_cpu_packets_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_cpu_packets_failure_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_id_unpack(bcmolt_xgpon_ni_cpu_packets_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_cpu_packets_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_id_pack(bcmolt_xgpon_ni_cpu_packets_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_cpu_packets_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_id_unpack(bcmolt_xgpon_ni_cpu_packets_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_deactivate_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_deactivate_all_onus_completed_id_pack(bcmolt_xgpon_ni_deactivate_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_deactivate_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_deactivate_all_onus_completed_id_unpack(bcmolt_xgpon_ni_deactivate_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_disable_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_disable_all_onus_completed_id_pack(bcmolt_xgpon_ni_disable_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_disable_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_disable_all_onus_completed_id_unpack(bcmolt_xgpon_ni_disable_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_disable_serial_number_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_disable_serial_number_id_pack(bcmolt_xgpon_ni_disable_serial_number_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_disable_serial_number_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_disable_serial_number_id_unpack(bcmolt_xgpon_ni_disable_serial_number_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_enable_all_onus_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_enable_all_onus_completed_id_pack(bcmolt_xgpon_ni_enable_all_onus_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_enable_all_onus_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_enable_all_onus_completed_id_unpack(bcmolt_xgpon_ni_enable_all_onus_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_key_id_pack(bcmolt_xgpon_ni_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_key_id_unpack(bcmolt_xgpon_ni_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_los_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_los_id_pack(bcmolt_xgpon_ni_los_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_los_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_los_id_unpack(bcmolt_xgpon_ni_los_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_onu_discovered_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_discovered_id_pack(bcmolt_xgpon_ni_onu_discovered_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_onu_discovered_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_discovered_id_unpack(bcmolt_xgpon_ni_onu_discovered_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_onu_upgrade_complete_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_id_pack(bcmolt_xgpon_ni_onu_upgrade_complete_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_onu_upgrade_complete_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_id_unpack(bcmolt_xgpon_ni_onu_upgrade_complete_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_onus_ranged_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_id_pack(bcmolt_xgpon_ni_protection_switching_onus_ranged_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_onus_ranged_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_id_unpack(bcmolt_xgpon_ni_protection_switching_onus_ranged_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_switchover_completed_id to 
+ * bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_id_pack(bcmolt_xgpon_ni_protection_switching_switchover_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_switchover_completed_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_id_unpack(bcmolt_xgpon_ni_protection_switching_switchover_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_traffic_resume_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_id_pack(bcmolt_xgpon_ni_protection_switching_traffic_resume_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_traffic_resume_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_id_unpack(bcmolt_xgpon_ni_protection_switching_traffic_resume_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_reset_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_reset_id_pack(bcmolt_xgpon_ni_reset_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_reset_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_reset_id_unpack(bcmolt_xgpon_ni_reset_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_rogue_detection_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_id_pack(bcmolt_xgpon_ni_rogue_detection_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_rogue_detection_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_id_unpack(bcmolt_xgpon_ni_rogue_detection_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_rogue_detection_window_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_id_pack(bcmolt_xgpon_ni_rogue_detection_window_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_rogue_detection_window_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_id_unpack(bcmolt_xgpon_ni_rogue_detection_window_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_rogue_onu_special_map_cycle_start_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_run_special_bw_map_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_id_pack(bcmolt_xgpon_ni_run_special_bw_map_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_run_special_bw_map_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_id_unpack(bcmolt_xgpon_ni_run_special_bw_map_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_serial_number_acquisition_cycle_start_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_set_onu_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_onu_state_id_pack(bcmolt_xgpon_ni_set_onu_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_set_onu_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_onu_state_id_unpack(bcmolt_xgpon_ni_set_onu_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_set_pon_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_pon_state_id_pack(bcmolt_xgpon_ni_set_pon_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_set_pon_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_pon_state_id_unpack(bcmolt_xgpon_ni_set_pon_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_single_request_standby_pon_monitoring_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_start_onu_upgrade_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_id_pack(bcmolt_xgpon_ni_start_onu_upgrade_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_start_onu_upgrade_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_id_unpack(bcmolt_xgpon_ni_start_onu_upgrade_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_id_pack(bcmolt_xgpon_ni_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_id_unpack(bcmolt_xgpon_ni_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_id_pack(bcmolt_xgpon_ni_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_id_unpack(bcmolt_xgpon_ni_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_cfg_id_pack(bcmolt_xgpon_ni_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_cfg_id_unpack(bcmolt_xgpon_ni_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_id_pack(bcmolt_xgpon_ni_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_id_unpack(bcmolt_xgpon_ni_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_state_change_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_state_change_completed_id_pack(bcmolt_xgpon_ni_state_change_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_state_change_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_state_change_completed_id_unpack(bcmolt_xgpon_ni_state_change_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_tod_request_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_tod_request_completed_id_pack(bcmolt_xgpon_ni_tod_request_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_tod_request_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_tod_request_completed_id_unpack(bcmolt_xgpon_ni_tod_request_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_ni_tod_request_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_tod_request_id_pack(bcmolt_xgpon_ni_tod_request_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_tod_request_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_ni_tod_request_id_unpack(bcmolt_xgpon_ni_tod_request_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_num_of_onus to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_num_of_onus_pack(bcmolt_xgpon_num_of_onus this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_num_of_onus from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_num_of_onus_unpack(bcmolt_xgpon_num_of_onus *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_adjust_tx_wavelength_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_id_pack(bcmolt_xgpon_onu_adjust_tx_wavelength_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_adjust_tx_wavelength_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_id_unpack(bcmolt_xgpon_onu_adjust_tx_wavelength_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_auto_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_auto_cfg_id_pack(bcmolt_xgpon_onu_auto_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_auto_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_auto_cfg_id_unpack(bcmolt_xgpon_onu_auto_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cfg_id_pack(bcmolt_xgpon_onu_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cfg_id_unpack(bcmolt_xgpon_onu_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_change_power_levelling_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_change_power_levelling_id_pack(bcmolt_xgpon_onu_change_power_levelling_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_change_power_levelling_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_change_power_levelling_id_unpack(bcmolt_xgpon_onu_change_power_levelling_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_cpu_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packet_id_pack(bcmolt_xgpon_onu_cpu_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_cpu_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packet_id_unpack(bcmolt_xgpon_onu_cpu_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_cpu_packets_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packets_id_pack(bcmolt_xgpon_onu_cpu_packets_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_cpu_packets_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packets_id_unpack(bcmolt_xgpon_onu_cpu_packets_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_dfi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dfi_id_pack(bcmolt_xgpon_onu_dfi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_dfi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dfi_id_unpack(bcmolt_xgpon_onu_dfi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_dgi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dgi_id_pack(bcmolt_xgpon_onu_dgi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_dgi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dgi_id_unpack(bcmolt_xgpon_onu_dgi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_dowi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dowi_id_pack(bcmolt_xgpon_onu_dowi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_dowi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_dowi_id_unpack(bcmolt_xgpon_onu_dowi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_get_power_consumption_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_get_power_consumption_id_pack(bcmolt_xgpon_onu_get_power_consumption_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_get_power_consumption_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_get_power_consumption_id_unpack(bcmolt_xgpon_onu_get_power_consumption_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_get_power_level_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_get_power_level_id_pack(bcmolt_xgpon_onu_get_power_level_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_get_power_level_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_get_power_level_id_unpack(bcmolt_xgpon_onu_get_power_level_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_invalid_dbru_report_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_id_pack(bcmolt_xgpon_onu_invalid_dbru_report_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_invalid_dbru_report_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_id_unpack(bcmolt_xgpon_onu_invalid_dbru_report_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_id_pack(bcmolt_xgpon_onu_key_exchange_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_id_unpack(bcmolt_xgpon_onu_key_exchange_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_cycle_skipped_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_cycle_skipped_id_pack(bcmolt_xgpon_onu_key_exchange_cycle_skipped_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_cycle_skipped_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_cycle_skipped_id_unpack(bcmolt_xgpon_onu_key_exchange_cycle_skipped_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_key_mismatch_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_id_pack(bcmolt_xgpon_onu_key_exchange_key_mismatch_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_key_mismatch_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_id_unpack(bcmolt_xgpon_onu_key_exchange_key_mismatch_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_key_request_timeout_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_key_request_timeout_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_id_pack(bcmolt_xgpon_onu_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_id_unpack(bcmolt_xgpon_onu_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_looci_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_looci_id_pack(bcmolt_xgpon_onu_looci_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_looci_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_looci_id_unpack(bcmolt_xgpon_onu_looci_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_omci_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_omci_packet_id_pack(bcmolt_xgpon_onu_omci_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_omci_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_omci_packet_id_unpack(bcmolt_xgpon_onu_omci_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_activation_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_id_pack(bcmolt_xgpon_onu_onu_activation_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_activation_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_id_unpack(bcmolt_xgpon_onu_onu_activation_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_alarm_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_alarm_id_pack(bcmolt_xgpon_onu_onu_alarm_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_alarm_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_alarm_id_unpack(bcmolt_xgpon_onu_onu_alarm_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_deactivation_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_id_pack(bcmolt_xgpon_onu_onu_deactivation_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_deactivation_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_id_unpack(bcmolt_xgpon_onu_onu_deactivation_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_disable_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_id_pack(bcmolt_xgpon_onu_onu_disable_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_disable_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_id_unpack(bcmolt_xgpon_onu_onu_disable_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_enable_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_id_pack(bcmolt_xgpon_onu_onu_enable_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_enable_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_id_unpack(bcmolt_xgpon_onu_onu_enable_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_in_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_id_pack(bcmolt_xgpon_onu_onu_tuning_in_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_in_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_id_unpack(bcmolt_xgpon_onu_onu_tuning_in_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_in_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_id_pack(bcmolt_xgpon_onu_onu_tuning_in_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_in_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_id_unpack(bcmolt_xgpon_onu_onu_tuning_in_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_out_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_id_pack(bcmolt_xgpon_onu_onu_tuning_out_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_out_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_id_unpack(bcmolt_xgpon_onu_onu_tuning_out_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_out_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_id_pack(bcmolt_xgpon_onu_onu_tuning_out_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_out_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_id_unpack(bcmolt_xgpon_onu_onu_tuning_out_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_optical_reflection_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_optical_reflection_id_pack(bcmolt_xgpon_onu_optical_reflection_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_optical_reflection_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_optical_reflection_id_unpack(bcmolt_xgpon_onu_optical_reflection_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_ploam_packet_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_ploam_packet_id_pack(bcmolt_xgpon_onu_ploam_packet_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_ploam_packet_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_ploam_packet_id_unpack(bcmolt_xgpon_onu_ploam_packet_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_possible_drift_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_possible_drift_id_pack(bcmolt_xgpon_onu_possible_drift_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_possible_drift_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_possible_drift_id_unpack(bcmolt_xgpon_onu_possible_drift_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_power_consumption_report_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_consumption_report_id_pack(bcmolt_xgpon_onu_power_consumption_report_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_power_consumption_report_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_consumption_report_id_unpack(bcmolt_xgpon_onu_power_consumption_report_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_power_level_report_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_level_report_id_pack(bcmolt_xgpon_onu_power_level_report_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_power_level_report_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_level_report_id_unpack(bcmolt_xgpon_onu_power_level_report_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_power_management_state_change_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_management_state_change_id_pack(bcmolt_xgpon_onu_power_management_state_change_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_power_management_state_change_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_management_state_change_id_unpack(bcmolt_xgpon_onu_power_management_state_change_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_pqsi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_pqsi_id_pack(bcmolt_xgpon_onu_pqsi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_pqsi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_pqsi_id_unpack(bcmolt_xgpon_onu_pqsi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_ranging_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_ranging_completed_id_pack(bcmolt_xgpon_onu_ranging_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_ranging_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_ranging_completed_id_unpack(bcmolt_xgpon_onu_ranging_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_registration_id_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_id_id_pack(bcmolt_xgpon_onu_registration_id_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_registration_id_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_id_id_unpack(bcmolt_xgpon_onu_registration_id_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_request_registration_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_request_registration_id_pack(bcmolt_xgpon_onu_request_registration_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_request_registration_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_request_registration_id_unpack(bcmolt_xgpon_onu_request_registration_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_rssi_measurement_completed_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_id_pack(bcmolt_xgpon_onu_rssi_measurement_completed_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_rssi_measurement_completed_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_id_unpack(bcmolt_xgpon_onu_rssi_measurement_completed_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_rssi_measurement_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_rssi_measurement_id_pack(bcmolt_xgpon_onu_rssi_measurement_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_rssi_measurement_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_rssi_measurement_id_unpack(bcmolt_xgpon_onu_rssi_measurement_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_sdi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sdi_id_pack(bcmolt_xgpon_onu_sdi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_sdi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sdi_id_unpack(bcmolt_xgpon_onu_sdi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_secure_mutual_authentication_failure_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_pack(bcmolt_xgpon_onu_secure_mutual_authentication_failure_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_secure_mutual_authentication_failure_id from 
+ * bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_id_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_failure_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_secure_mutual_authentication_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_id_pack(bcmolt_xgpon_onu_secure_mutual_authentication_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_secure_mutual_authentication_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_id_unpack(bcmolt_xgpon_onu_secure_mutual_authentication_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_set_onu_state_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_set_onu_state_id_pack(bcmolt_xgpon_onu_set_onu_state_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_set_onu_state_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_set_onu_state_id_unpack(bcmolt_xgpon_onu_set_onu_state_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_sfi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sfi_id_pack(bcmolt_xgpon_onu_sfi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_sfi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sfi_id_unpack(bcmolt_xgpon_onu_sfi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_stat_alarm_cleared_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_id_pack(bcmolt_xgpon_onu_stat_alarm_cleared_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_alarm_cleared_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_id_unpack(bcmolt_xgpon_onu_stat_alarm_cleared_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_stat_alarm_raised_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_id_pack(bcmolt_xgpon_onu_stat_alarm_raised_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_alarm_raised_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_id_unpack(bcmolt_xgpon_onu_stat_alarm_raised_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_stat_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_cfg_id_pack(bcmolt_xgpon_onu_stat_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_cfg_id_unpack(bcmolt_xgpon_onu_stat_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_stat_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_id_pack(bcmolt_xgpon_onu_stat_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_id_unpack(bcmolt_xgpon_onu_stat_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_sufi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sufi_id_pack(bcmolt_xgpon_onu_sufi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_sufi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_sufi_id_unpack(bcmolt_xgpon_onu_sufi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_tiwi_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_tiwi_id_pack(bcmolt_xgpon_onu_tiwi_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_tiwi_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_tiwi_id_unpack(bcmolt_xgpon_onu_tiwi_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_onu_tuning_response_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_tuning_response_id_pack(bcmolt_xgpon_onu_tuning_response_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_tuning_response_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_onu_tuning_response_id_unpack(bcmolt_xgpon_onu_tuning_response_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_serdes_ranging_mode to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_serdes_ranging_mode_pack(bcmolt_xgpon_serdes_ranging_mode this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_serdes_ranging_mode from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_serdes_ranging_mode_unpack(bcmolt_xgpon_serdes_ranging_mode *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_trx_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_cfg_id_pack(bcmolt_xgpon_trx_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_trx_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_cfg_id_unpack(bcmolt_xgpon_trx_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_trx_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_key_id_pack(bcmolt_xgpon_trx_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_trx_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_key_id_unpack(bcmolt_xgpon_trx_key_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xgpon_trx_type to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_type_pack(bcmolt_xgpon_trx_type this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_trx_type from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xgpon_trx_type_unpack(bcmolt_xgpon_trx_type *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xpon_serdes_cfg_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xpon_serdes_cfg_id_pack(bcmolt_xpon_serdes_cfg_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xpon_serdes_cfg_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xpon_serdes_cfg_id_unpack(bcmolt_xpon_serdes_cfg_id *this, bcmolt_buf *buf);
+
+/** Packs a bcmolt_xpon_serdes_key_id to bytes 
+ *
+ * \param this The enumeration to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the pack was successful 
+ */
+bcmos_bool bcmolt_xpon_serdes_key_id_pack(bcmolt_xpon_serdes_key_id this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xpon_serdes_key_id from bytes 
+ *
+ * \param this Pointer to the enumeration to unpack 
+ * \param buf Pointer to the buffer to write to 
+ * \return Whether or not the unpack was successful 
+ */
+bcmos_bool bcmolt_xpon_serdes_key_id_unpack(bcmolt_xpon_serdes_key_id *this, bcmolt_buf *buf);
+
+/** Initializes a bcmolt_actual_schedulershaper struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_actual_schedulershaper_set_default(bcmolt_actual_schedulershaper *this);
+
+/** Packs a bcmolt_actual_schedulershaper to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_actual_schedulershaper_pack(const bcmolt_actual_schedulershaper *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_actual_schedulershaper from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_actual_schedulershaper_unpack(bcmolt_actual_schedulershaper *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_actual_schedulershaper struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_actual_schedulershaper_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_actual_schedulershaper is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_actual_schedulershaper_bounds_check(const bcmolt_actual_schedulershaper *this);
+
+/** Initializes a bcmolt_aes_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_aes_key_set_default(bcmolt_aes_key *this);
+
+/** Packs a bcmolt_aes_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_aes_key_pack(const bcmolt_aes_key *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_aes_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_aes_key_unpack(bcmolt_aes_key *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_aes_key struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_aes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_aes_key is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_aes_key_bounds_check(const bcmolt_aes_key *this);
+
+/** Initializes a bcmolt_api_capture_buffer_reader struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_api_capture_buffer_reader_set_default(bcmolt_api_capture_buffer_reader *this);
+
+/** Packs a bcmolt_api_capture_buffer_reader to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_buffer_reader_pack(const bcmolt_api_capture_buffer_reader *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_api_capture_buffer_reader from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_buffer_reader_unpack(bcmolt_api_capture_buffer_reader *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_api_capture_buffer_reader struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_api_capture_buffer_reader_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_api_capture_buffer_reader is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_buffer_reader_bounds_check(const bcmolt_api_capture_buffer_reader *this);
+
+/** Initializes a bcmolt_api_capture_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_api_capture_config_set_default(bcmolt_api_capture_config *this);
+
+/** Packs a bcmolt_api_capture_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_config_pack(const bcmolt_api_capture_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_api_capture_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_config_unpack(bcmolt_api_capture_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_api_capture_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_api_capture_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_api_capture_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_config_bounds_check(const bcmolt_api_capture_config *this);
+
+/** Initializes a bcmolt_api_capture_stats struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_api_capture_stats_set_default(bcmolt_api_capture_stats *this);
+
+/** Packs a bcmolt_api_capture_stats to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_stats_pack(const bcmolt_api_capture_stats *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_api_capture_stats from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_stats_unpack(bcmolt_api_capture_stats *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_api_capture_stats struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_api_capture_stats_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_api_capture_stats is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_api_capture_stats_bounds_check(const bcmolt_api_capture_stats *this);
+
+/** Initializes a bcmolt_bounds struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_bounds_set_default(bcmolt_bounds *this);
+
+/** Packs a bcmolt_bounds to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bounds_pack(const bcmolt_bounds *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_bounds from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bounds_unpack(bcmolt_bounds *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_bounds struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_bounds_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_bounds is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bounds_bounds_check(const bcmolt_bounds *this);
+
+/** Initializes a bcmolt_arr_bounds_8 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_bounds_8_set_default(bcmolt_arr_bounds_8 *this);
+
+/** Packs a bcmolt_arr_bounds_8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_bounds_8_pack(const bcmolt_arr_bounds_8 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_bounds_8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_bounds_8_unpack(bcmolt_arr_bounds_8 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_bounds_8 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_bounds_8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_bounds_8 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_bounds_8_bounds_check(const bcmolt_arr_bounds_8 *this);
+
+/** Initializes a bcmolt_arr_calibration_record_8 struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_calibration_record_8_set_default(bcmolt_arr_calibration_record_8 *this);
+
+/** Packs a bcmolt_arr_calibration_record_8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_calibration_record_8_pack(const bcmolt_arr_calibration_record_8 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_calibration_record_8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_calibration_record_8_unpack(bcmolt_arr_calibration_record_8 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_calibration_record_8 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_calibration_record_8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_calibration_record_8 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_calibration_record_8_bounds_check(const bcmolt_arr_calibration_record_8 *this);
+
+/** Initializes a bcmolt_ds_frequency_offset struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ds_frequency_offset_set_default(bcmolt_ds_frequency_offset *this);
+
+/** Packs a bcmolt_ds_frequency_offset to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ds_frequency_offset_pack(const bcmolt_ds_frequency_offset *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ds_frequency_offset from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ds_frequency_offset_unpack(bcmolt_ds_frequency_offset *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ds_frequency_offset struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ds_frequency_offset_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ds_frequency_offset is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ds_frequency_offset_bounds_check(const bcmolt_ds_frequency_offset *this);
+
+/** Initializes a bcmolt_channel_profile struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_channel_profile_set_default(bcmolt_channel_profile *this);
+
+/** Packs a bcmolt_channel_profile to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_profile_pack(const bcmolt_channel_profile *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_channel_profile from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_profile_unpack(bcmolt_channel_profile *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_channel_profile struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_channel_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_channel_profile is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_profile_bounds_check(const bcmolt_channel_profile *this);
+
+/** Initializes a bcmolt_arr_channel_profile_8 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_channel_profile_8_set_default(bcmolt_arr_channel_profile_8 *this);
+
+/** Packs a bcmolt_arr_channel_profile_8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_channel_profile_8_pack(const bcmolt_arr_channel_profile_8 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_channel_profile_8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_channel_profile_8_unpack(bcmolt_arr_channel_profile_8 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_channel_profile_8 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_channel_profile_8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_channel_profile_8 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_channel_profile_8_bounds_check(const bcmolt_arr_channel_profile_8 *this);
+
+/** Initializes a bcmolt_power_consumption_channel_report struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_power_consumption_channel_report_set_default(bcmolt_power_consumption_channel_report *this);
+
+/** Packs a bcmolt_power_consumption_channel_report to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_power_consumption_channel_report_pack(const bcmolt_power_consumption_channel_report *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_power_consumption_channel_report from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_power_consumption_channel_report_unpack(bcmolt_power_consumption_channel_report *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_power_consumption_channel_report struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_power_consumption_channel_report_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_power_consumption_channel_report is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_power_consumption_channel_report_bounds_check(const bcmolt_power_consumption_channel_report *this);
+
+/** Initializes a bcmolt_arr_power_consumption_channel_report_8 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_power_consumption_channel_report_8_set_default(bcmolt_arr_power_consumption_channel_report_8 *this);
+
+/** Packs a bcmolt_arr_power_consumption_channel_report_8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_power_consumption_channel_report_8_pack(const bcmolt_arr_power_consumption_channel_report_8 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_power_consumption_channel_report_8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_power_consumption_channel_report_8_unpack(bcmolt_arr_power_consumption_channel_report_8 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_power_consumption_channel_report_8 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_power_consumption_channel_report_8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_power_consumption_channel_report_8 is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_power_consumption_channel_report_8_bounds_check(const bcmolt_arr_power_consumption_channel_report_8 *this);
+
+/** Initializes a bcmolt_arr_u16_2 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u16_2_set_default(bcmolt_arr_u16_2 *this);
+
+/** Packs a bcmolt_arr_u16_2 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_pack(const bcmolt_arr_u16_2 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u16_2 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_unpack(bcmolt_arr_u16_2 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u16_2 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u16_2_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u16_2 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_bounds_check(const bcmolt_arr_u16_2 *this);
+
+/** Initializes a bcmolt_arr_u16_2_hex struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u16_2_hex_set_default(bcmolt_arr_u16_2_hex *this);
+
+/** Packs a bcmolt_arr_u16_2_hex to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_hex_pack(const bcmolt_arr_u16_2_hex *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u16_2_hex from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_hex_unpack(bcmolt_arr_u16_2_hex *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u16_2_hex struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u16_2_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u16_2_hex is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_2_hex_bounds_check(const bcmolt_arr_u16_2_hex *this);
+
+/** Initializes a bcmolt_arr_u16_5_hex struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u16_5_hex_set_default(bcmolt_arr_u16_5_hex *this);
+
+/** Packs a bcmolt_arr_u16_5_hex to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_5_hex_pack(const bcmolt_arr_u16_5_hex *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u16_5_hex from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_5_hex_unpack(bcmolt_arr_u16_5_hex *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u16_5_hex struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u16_5_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u16_5_hex is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_5_hex_bounds_check(const bcmolt_arr_u16_5_hex *this);
+
+/** Initializes a bcmolt_arr_u16_7 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u16_7_set_default(bcmolt_arr_u16_7 *this);
+
+/** Packs a bcmolt_arr_u16_7 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_7_pack(const bcmolt_arr_u16_7 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u16_7 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_7_unpack(bcmolt_arr_u16_7 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u16_7 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u16_7_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u16_7 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u16_7_bounds_check(const bcmolt_arr_u16_7 *this);
+
+/** Initializes a bcmolt_arr_u32_6 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u32_6_set_default(bcmolt_arr_u32_6 *this);
+
+/** Packs a bcmolt_arr_u32_6 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u32_6_pack(const bcmolt_arr_u32_6 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u32_6 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u32_6_unpack(bcmolt_arr_u32_6 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u32_6 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u32_6_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u32_6 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u32_6_bounds_check(const bcmolt_arr_u32_6 *this);
+
+/** Initializes a bcmolt_arr_u8_10 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_10_set_default(bcmolt_arr_u8_10 *this);
+
+/** Packs a bcmolt_arr_u8_10 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_10_pack(const bcmolt_arr_u8_10 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_10 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_10_unpack(bcmolt_arr_u8_10 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_10 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_10_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_10 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_10_bounds_check(const bcmolt_arr_u8_10 *this);
+
+/** Initializes a bcmolt_arr_u8_12 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_12_set_default(bcmolt_arr_u8_12 *this);
+
+/** Packs a bcmolt_arr_u8_12 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_12_pack(const bcmolt_arr_u8_12 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_12 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_12_unpack(bcmolt_arr_u8_12 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_12 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_12_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_12 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_12_bounds_check(const bcmolt_arr_u8_12 *this);
+
+/** Initializes a bcmolt_arr_u8_13 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_13_set_default(bcmolt_arr_u8_13 *this);
+
+/** Packs a bcmolt_arr_u8_13 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_13_pack(const bcmolt_arr_u8_13 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_13 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_13_unpack(bcmolt_arr_u8_13 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_13 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_13_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_13 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_13_bounds_check(const bcmolt_arr_u8_13 *this);
+
+/** Initializes a bcmolt_arr_u8_36 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_36_set_default(bcmolt_arr_u8_36 *this);
+
+/** Packs a bcmolt_arr_u8_36 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_36_pack(const bcmolt_arr_u8_36 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_36 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_36_unpack(bcmolt_arr_u8_36 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_36 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_36_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_36 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_36_bounds_check(const bcmolt_arr_u8_36 *this);
+
+/** Initializes a bcmolt_arr_u8_4 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_4_set_default(bcmolt_arr_u8_4 *this);
+
+/** Packs a bcmolt_arr_u8_4 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_4_pack(const bcmolt_arr_u8_4 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_4 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_4_unpack(bcmolt_arr_u8_4 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_4 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_4_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_4 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_4_bounds_check(const bcmolt_arr_u8_4 *this);
+
+/** Initializes a bcmolt_arr_u8_40 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_u8_40_set_default(bcmolt_arr_u8_40 *this);
+
+/** Packs a bcmolt_arr_u8_40 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_40_pack(const bcmolt_arr_u8_40 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_u8_40 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_40_unpack(bcmolt_arr_u8_40 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_u8_40 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_u8_40_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_u8_40 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_u8_40_bounds_check(const bcmolt_arr_u8_40 *this);
+
+/** Initializes a bcmolt_xgpon_burst_profile struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_burst_profile_set_default(bcmolt_xgpon_burst_profile *this);
+
+/** Packs a bcmolt_xgpon_burst_profile to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_burst_profile_pack(const bcmolt_xgpon_burst_profile *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_burst_profile from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_burst_profile_unpack(bcmolt_xgpon_burst_profile *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_burst_profile struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_burst_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_burst_profile is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_burst_profile_bounds_check(const bcmolt_xgpon_burst_profile *this);
+
+/** Initializes a bcmolt_arr_xgpon_burst_profile_4 struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_xgpon_burst_profile_4_set_default(bcmolt_arr_xgpon_burst_profile_4 *this);
+
+/** Packs a bcmolt_arr_xgpon_burst_profile_4 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_burst_profile_4_pack(const bcmolt_arr_xgpon_burst_profile_4 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_xgpon_burst_profile_4 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_burst_profile_4_unpack(bcmolt_arr_xgpon_burst_profile_4 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_xgpon_burst_profile_4 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_xgpon_burst_profile_4_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_xgpon_burst_profile_4 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_burst_profile_4_bounds_check(const bcmolt_arr_xgpon_burst_profile_4 *this);
+
+/** Initializes a bcmolt_xgpon_trx_configuration struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_trx_configuration_set_default(bcmolt_xgpon_trx_configuration *this);
+
+/** Packs a bcmolt_xgpon_trx_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_configuration_pack(const bcmolt_xgpon_trx_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_trx_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_configuration_unpack(bcmolt_xgpon_trx_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_trx_configuration struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_trx_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_trx_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_configuration_bounds_check(const bcmolt_xgpon_trx_configuration *this);
+
+/** Initializes a bcmolt_arr_xgpon_trx_configuration_4 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_arr_xgpon_trx_configuration_4_set_default(bcmolt_arr_xgpon_trx_configuration_4 *this);
+
+/** Packs a bcmolt_arr_xgpon_trx_configuration_4 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_pack(const bcmolt_arr_xgpon_trx_configuration_4 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_arr_xgpon_trx_configuration_4 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_unpack(bcmolt_arr_xgpon_trx_configuration_4 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_arr_xgpon_trx_configuration_4 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_arr_xgpon_trx_configuration_4 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_arr_xgpon_trx_configuration_4_bounds_check(const bcmolt_arr_xgpon_trx_configuration_4 *this);
+
+/** Initializes a bcmolt_automatic_onu_deactivation struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_automatic_onu_deactivation_set_default(bcmolt_automatic_onu_deactivation *this);
+
+/** Packs a bcmolt_automatic_onu_deactivation to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_automatic_onu_deactivation_pack(const bcmolt_automatic_onu_deactivation *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_automatic_onu_deactivation from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_automatic_onu_deactivation_unpack(bcmolt_automatic_onu_deactivation *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_automatic_onu_deactivation struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_automatic_onu_deactivation_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_automatic_onu_deactivation is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_automatic_onu_deactivation_bounds_check(const bcmolt_automatic_onu_deactivation *this);
+
+/** Initializes a bcmolt_resync_control struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_resync_control_set_default(bcmolt_resync_control *this);
+
+/** Packs a bcmolt_resync_control to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_resync_control_pack(const bcmolt_resync_control *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_resync_control from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_resync_control_unpack(bcmolt_resync_control *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_resync_control struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_resync_control_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_resync_control is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_resync_control_bounds_check(const bcmolt_resync_control *this);
+
+/** Initializes a bcmolt_bcdr_resync_pattern_configuration struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_bcdr_resync_pattern_configuration_set_default(bcmolt_bcdr_resync_pattern_configuration *this);
+
+/** Packs a bcmolt_bcdr_resync_pattern_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bcdr_resync_pattern_configuration_pack(const bcmolt_bcdr_resync_pattern_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_bcdr_resync_pattern_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bcdr_resync_pattern_configuration_unpack(bcmolt_bcdr_resync_pattern_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_bcdr_resync_pattern_configuration struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_bcdr_resync_pattern_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_bcdr_resync_pattern_configuration is out 
+ * of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_bcdr_resync_pattern_configuration_bounds_check(const bcmolt_bcdr_resync_pattern_configuration *this);
+
+/** Initializes a bcmolt_ber_monitor_params struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ber_monitor_params_set_default(bcmolt_ber_monitor_params *this);
+
+/** Packs a bcmolt_ber_monitor_params to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ber_monitor_params_pack(const bcmolt_ber_monitor_params *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ber_monitor_params from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ber_monitor_params_unpack(bcmolt_ber_monitor_params *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ber_monitor_params struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ber_monitor_params_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ber_monitor_params is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ber_monitor_params_bounds_check(const bcmolt_ber_monitor_params *this);
+
+/** Initializes a bcmolt_cbr_rt_allocation_profile struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_cbr_rt_allocation_profile_set_default(bcmolt_cbr_rt_allocation_profile *this);
+
+/** Packs a bcmolt_cbr_rt_allocation_profile to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_cbr_rt_allocation_profile_pack(const bcmolt_cbr_rt_allocation_profile *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_cbr_rt_allocation_profile from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_cbr_rt_allocation_profile_unpack(bcmolt_cbr_rt_allocation_profile *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_cbr_rt_allocation_profile struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_cbr_rt_allocation_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_cbr_rt_allocation_profile is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_cbr_rt_allocation_profile_bounds_check(const bcmolt_cbr_rt_allocation_profile *this);
+
+/** Initializes a bcmolt_ddr_test_completed struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ddr_test_completed_set_default(bcmolt_ddr_test_completed *this);
+
+/** Packs a bcmolt_ddr_test_completed to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ddr_test_completed_pack(const bcmolt_ddr_test_completed *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_ddr_test_completed would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ddr_test_completed_get_packed_length(const bcmolt_ddr_test_completed *this);
+
+/** Unpacks a bcmolt_ddr_test_completed from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ddr_test_completed_unpack(bcmolt_ddr_test_completed *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ddr_test_completed struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ddr_test_completed_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ddr_test_completed is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ddr_test_completed_bounds_check(const bcmolt_ddr_test_completed *this);
+
+/** Initializes a bcmolt_debug_device_cfg struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_debug_device_cfg_set_default(bcmolt_debug_device_cfg *this);
+
+/** Packs a bcmolt_debug_device_cfg to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_device_cfg_pack(const bcmolt_debug_device_cfg *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_debug_device_cfg from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_device_cfg_unpack(bcmolt_debug_device_cfg *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_debug_device_cfg struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_device_cfg_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_debug_device_cfg is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_device_cfg_bounds_check(const bcmolt_debug_device_cfg *this);
+
+/** Initializes a bcmolt_device_nni_speed struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_device_nni_speed_set_default(bcmolt_device_nni_speed *this);
+
+/** Packs a bcmolt_device_nni_speed to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_nni_speed_pack(const bcmolt_device_nni_speed *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_device_nni_speed from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_nni_speed_unpack(bcmolt_device_nni_speed *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_device_nni_speed struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_nni_speed_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_device_nni_speed is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_nni_speed_bounds_check(const bcmolt_device_nni_speed *this);
+
+/* \cond UNDOCUMENTED_SYMBOLS */
+
+/** Initializes a bcmolt_dummy_struct_for_embedded_types struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_dummy_struct_for_embedded_types_set_default(bcmolt_dummy_struct_for_embedded_types *this);
+
+/** Packs a bcmolt_dummy_struct_for_embedded_types to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_dummy_struct_for_embedded_types_pack(const bcmolt_dummy_struct_for_embedded_types *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_dummy_struct_for_embedded_types from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_dummy_struct_for_embedded_types_unpack(bcmolt_dummy_struct_for_embedded_types *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_dummy_struct_for_embedded_types struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_dummy_struct_for_embedded_types_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_dummy_struct_for_embedded_types is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_dummy_struct_for_embedded_types_bounds_check(const bcmolt_dummy_struct_for_embedded_types *this);
+
+/* \endcond */
+
+/** Initializes a bcmolt_embedded_image_entry struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_embedded_image_entry_set_default(bcmolt_embedded_image_entry *this);
+
+/** Packs a bcmolt_embedded_image_entry to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_pack(const bcmolt_embedded_image_entry *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_embedded_image_entry from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_unpack(bcmolt_embedded_image_entry *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_embedded_image_entry struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_embedded_image_entry_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_embedded_image_entry is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_bounds_check(const bcmolt_embedded_image_entry *this);
+
+/** Initializes a bcmolt_embedded_image_entry_list_u8 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_embedded_image_entry_list_u8_set_default(bcmolt_embedded_image_entry_list_u8 *this);
+
+/** Packs a bcmolt_embedded_image_entry_list_u8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_list_u8_pack(const bcmolt_embedded_image_entry_list_u8 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_embedded_image_entry_list_u8 would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_embedded_image_entry_list_u8_get_packed_length(const bcmolt_embedded_image_entry_list_u8 *this);
+
+/** Unpacks a bcmolt_embedded_image_entry_list_u8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_list_u8_unpack(bcmolt_embedded_image_entry_list_u8 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_embedded_image_entry_list_u8 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_embedded_image_entry_list_u8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_embedded_image_entry_list_u8 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_embedded_image_entry_list_u8_bounds_check(const bcmolt_embedded_image_entry_list_u8 *this);
+
+/** Initializes a bcmolt_encryption_information_container struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_encryption_information_container_set_default(bcmolt_encryption_information_container *this);
+
+/** Packs a bcmolt_encryption_information_container to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_encryption_information_container_pack(const bcmolt_encryption_information_container *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_encryption_information_container 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_encryption_information_container_get_packed_length(const bcmolt_encryption_information_container *this);
+
+/** Unpacks a bcmolt_encryption_information_container from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_encryption_information_container_unpack(bcmolt_encryption_information_container *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_encryption_information_container struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_encryption_information_container_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_encryption_information_container is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_encryption_information_container_bounds_check(const bcmolt_encryption_information_container *this);
+
+/** Initializes a bcmolt_epon_clock_transport_configuration struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_clock_transport_configuration_set_default(bcmolt_epon_clock_transport_configuration *this);
+
+/** Packs a bcmolt_epon_clock_transport_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_clock_transport_configuration_pack(const bcmolt_epon_clock_transport_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_clock_transport_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_clock_transport_configuration_unpack(bcmolt_epon_clock_transport_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_clock_transport_configuration struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_clock_transport_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_clock_transport_configuration is out 
+ * of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_clock_transport_configuration_bounds_check(const bcmolt_epon_clock_transport_configuration *this);
+
+/** Initializes a bcmolt_unknown_link_status struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_unknown_link_status_set_default(bcmolt_unknown_link_status *this);
+
+/** Packs a bcmolt_unknown_link_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_unknown_link_status_pack(const bcmolt_unknown_link_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_unknown_link_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_unknown_link_status_unpack(bcmolt_unknown_link_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_unknown_link_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_unknown_link_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_unknown_link_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_unknown_link_status_bounds_check(const bcmolt_unknown_link_status *this);
+
+/** Initializes a bcmolt_laser_on_off_status struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_laser_on_off_status_set_default(bcmolt_laser_on_off_status *this);
+
+/** Packs a bcmolt_laser_on_off_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_laser_on_off_status_pack(const bcmolt_laser_on_off_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_laser_on_off_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_laser_on_off_status_unpack(bcmolt_laser_on_off_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_laser_on_off_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_laser_on_off_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_laser_on_off_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_laser_on_off_status_bounds_check(const bcmolt_laser_on_off_status *this);
+
+/** Initializes a bcmolt_range_status struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_range_status_set_default(bcmolt_range_status *this);
+
+/** Packs a bcmolt_range_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_range_status_pack(const bcmolt_range_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_range_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_range_status_unpack(bcmolt_range_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_range_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_range_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_range_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_range_status_bounds_check(const bcmolt_range_status *this);
+
+/** Initializes a bcmolt_rogue_status struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_rogue_status_set_default(bcmolt_rogue_status *this);
+
+/** Packs a bcmolt_rogue_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_status_pack(const bcmolt_rogue_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_status_unpack(bcmolt_rogue_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_rogue_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_rogue_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_rogue_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_status_bounds_check(const bcmolt_rogue_status *this);
+
+/** Initializes a bcmolt_epon_denied_link_alarm_state struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_denied_link_alarm_state_set_default(bcmolt_epon_denied_link_alarm_state *this);
+
+/** Packs a bcmolt_epon_denied_link_alarm_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_denied_link_alarm_state_pack(const bcmolt_epon_denied_link_alarm_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_denied_link_alarm_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_denied_link_alarm_state_unpack(bcmolt_epon_denied_link_alarm_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_denied_link_alarm_state struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_denied_link_alarm_state is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_denied_link_alarm_state_bounds_check(const bcmolt_epon_denied_link_alarm_state *this);
+
+/** Initializes a bcmolt_epon_encryption_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_encryption_config_set_default(bcmolt_epon_encryption_config *this);
+
+/** Packs a bcmolt_epon_encryption_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_encryption_config_pack(const bcmolt_epon_encryption_config *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_epon_encryption_config would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_encryption_config_get_packed_length(const bcmolt_epon_encryption_config *this);
+
+/** Unpacks a bcmolt_epon_encryption_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_encryption_config_unpack(bcmolt_epon_encryption_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_encryption_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_encryption_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_encryption_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_encryption_config_bounds_check(const bcmolt_epon_encryption_config *this);
+
+/** Initializes a bcmolt_epon_key_exchange_config struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_key_exchange_config_set_default(bcmolt_epon_key_exchange_config *this);
+
+/** Packs a bcmolt_epon_key_exchange_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_key_exchange_config_pack(const bcmolt_epon_key_exchange_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_key_exchange_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_key_exchange_config_unpack(bcmolt_epon_key_exchange_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_key_exchange_config struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_key_exchange_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_key_exchange_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_key_exchange_config_bounds_check(const bcmolt_epon_key_exchange_config *this);
+
+/** Initializes a bcmolt_epon_laser_overhead_parameters struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_laser_overhead_parameters_set_default(bcmolt_epon_laser_overhead_parameters *this);
+
+/** Packs a bcmolt_epon_laser_overhead_parameters to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_laser_overhead_parameters_pack(const bcmolt_epon_laser_overhead_parameters *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_laser_overhead_parameters from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_laser_overhead_parameters_unpack(bcmolt_epon_laser_overhead_parameters *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_laser_overhead_parameters struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_laser_overhead_parameters_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_laser_overhead_parameters is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_laser_overhead_parameters_bounds_check(const bcmolt_epon_laser_overhead_parameters *this);
+
+/** Initializes a bcmolt_epon_link_alarm_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_link_alarm_state_set_default(bcmolt_epon_link_alarm_state *this);
+
+/** Packs a bcmolt_epon_link_alarm_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_alarm_state_pack(const bcmolt_epon_link_alarm_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_alarm_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_alarm_state_unpack(bcmolt_epon_link_alarm_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_link_alarm_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_link_alarm_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_alarm_state_bounds_check(const bcmolt_epon_link_alarm_state *this);
+
+/** Initializes a bcmolt_epon_link_fec_en struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_link_fec_en_set_default(bcmolt_epon_link_fec_en *this);
+
+/** Packs a bcmolt_epon_link_fec_en to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_fec_en_pack(const bcmolt_epon_link_fec_en *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_fec_en from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_fec_en_unpack(bcmolt_epon_link_fec_en *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_link_fec_en struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_fec_en_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_link_fec_en is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_fec_en_bounds_check(const bcmolt_epon_link_fec_en *this);
+
+/** Initializes a bcmolt_epon_link_info struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_link_info_set_default(bcmolt_epon_link_info *this);
+
+/** Packs a bcmolt_epon_link_info to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_info_pack(const bcmolt_epon_link_info *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_link_info from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_info_unpack(bcmolt_epon_link_info *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_link_info struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_info_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_link_info is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_info_bounds_check(const bcmolt_epon_link_info *this);
+
+/** Initializes a bcmolt_gate_parameters struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gate_parameters_set_default(bcmolt_gate_parameters *this);
+
+/** Packs a bcmolt_gate_parameters to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_pack(const bcmolt_gate_parameters *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gate_parameters from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_unpack(bcmolt_gate_parameters *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gate_parameters struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gate_parameters_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gate_parameters is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_bounds_check(const bcmolt_gate_parameters *this);
+
+/** Initializes a bcmolt_gate_parameters_list_u32 struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gate_parameters_list_u32_set_default(bcmolt_gate_parameters_list_u32 *this);
+
+/** Packs a bcmolt_gate_parameters_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_list_u32_pack(const bcmolt_gate_parameters_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gate_parameters_list_u32 would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gate_parameters_list_u32_get_packed_length(const bcmolt_gate_parameters_list_u32 *this);
+
+/** Unpacks a bcmolt_gate_parameters_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_list_u32_unpack(bcmolt_gate_parameters_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gate_parameters_list_u32 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gate_parameters_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gate_parameters_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gate_parameters_list_u32_bounds_check(const bcmolt_gate_parameters_list_u32 *this);
+
+/** Initializes a bcmolt_epon_registration_gate_mode struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_registration_gate_mode_set_default(bcmolt_epon_registration_gate_mode *this);
+
+/** Packs a bcmolt_epon_registration_gate_mode to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_registration_gate_mode_pack(const bcmolt_epon_registration_gate_mode *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_epon_registration_gate_mode would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_registration_gate_mode_get_packed_length(const bcmolt_epon_registration_gate_mode *this);
+
+/** Unpacks a bcmolt_epon_registration_gate_mode from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_registration_gate_mode_unpack(bcmolt_epon_registration_gate_mode *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_registration_gate_mode struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_registration_gate_mode_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_registration_gate_mode is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_registration_gate_mode_bounds_check(const bcmolt_epon_registration_gate_mode *this);
+
+/** Initializes a bcmolt_epon_logical_link_options struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_logical_link_options_set_default(bcmolt_epon_logical_link_options *this);
+
+/** Packs a bcmolt_epon_logical_link_options to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_logical_link_options_pack(const bcmolt_epon_logical_link_options *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_epon_logical_link_options would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_logical_link_options_get_packed_length(const bcmolt_epon_logical_link_options *this);
+
+/** Unpacks a bcmolt_epon_logical_link_options from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_logical_link_options_unpack(bcmolt_epon_logical_link_options *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_logical_link_options struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_logical_link_options_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_logical_link_options is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_logical_link_options_bounds_check(const bcmolt_epon_logical_link_options *this);
+
+/** Initializes a bcmolt_epon_ni_alarm_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_ni_alarm_state_set_default(bcmolt_epon_ni_alarm_state *this);
+
+/** Packs a bcmolt_epon_ni_alarm_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_alarm_state_pack(const bcmolt_epon_ni_alarm_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_alarm_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_alarm_state_unpack(bcmolt_epon_ni_alarm_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_ni_alarm_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_ni_alarm_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_alarm_state_bounds_check(const bcmolt_epon_ni_alarm_state *this);
+
+/** Initializes a bcmolt_epon_ni_encryption_cfg struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_ni_encryption_cfg_set_default(bcmolt_epon_ni_encryption_cfg *this);
+
+/** Packs a bcmolt_epon_ni_encryption_cfg to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_encryption_cfg_pack(const bcmolt_epon_ni_encryption_cfg *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_ni_encryption_cfg from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_encryption_cfg_unpack(bcmolt_epon_ni_encryption_cfg *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_ni_encryption_cfg struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_encryption_cfg_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_ni_encryption_cfg is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_encryption_cfg_bounds_check(const bcmolt_epon_ni_encryption_cfg *this);
+
+/** Initializes a bcmolt_epon_onu_upgrade_params struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_onu_upgrade_params_set_default(bcmolt_epon_onu_upgrade_params *this);
+
+/** Packs a bcmolt_epon_onu_upgrade_params to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_params_pack(const bcmolt_epon_onu_upgrade_params *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_upgrade_params would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_onu_upgrade_params_get_packed_length(const bcmolt_epon_onu_upgrade_params *this);
+
+/** Unpacks a bcmolt_epon_onu_upgrade_params from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_params_unpack(bcmolt_epon_onu_upgrade_params *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_onu_upgrade_params struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_params_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_onu_upgrade_params is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_params_bounds_check(const bcmolt_epon_onu_upgrade_params *this);
+
+/** Initializes a bcmolt_epon_onu_upgrade_status struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_onu_upgrade_status_set_default(bcmolt_epon_onu_upgrade_status *this);
+
+/** Packs a bcmolt_epon_onu_upgrade_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_pack(const bcmolt_epon_onu_upgrade_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_onu_upgrade_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_unpack(bcmolt_epon_onu_upgrade_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_onu_upgrade_status struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_onu_upgrade_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_bounds_check(const bcmolt_epon_onu_upgrade_status *this);
+
+/** Initializes a bcmolt_epon_onu_upgrade_status_list_u32 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_onu_upgrade_status_list_u32_set_default(bcmolt_epon_onu_upgrade_status_list_u32 *this);
+
+/** Packs a bcmolt_epon_onu_upgrade_status_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_pack(const bcmolt_epon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_upgrade_status_list_u32 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_onu_upgrade_status_list_u32_get_packed_length(const bcmolt_epon_onu_upgrade_status_list_u32 *this);
+
+/** Unpacks a bcmolt_epon_onu_upgrade_status_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_unpack(bcmolt_epon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_onu_upgrade_status_list_u32 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_onu_upgrade_status_list_u32 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_onu_upgrade_status_list_u32_bounds_check(const bcmolt_epon_onu_upgrade_status_list_u32 *this);
+
+/** Initializes a bcmolt_epon_protection_switching_configuration struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_epon_protection_switching_configuration_set_default(bcmolt_epon_protection_switching_configuration *this);
+
+/** Packs a bcmolt_epon_protection_switching_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_protection_switching_configuration_pack(const bcmolt_epon_protection_switching_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_epon_protection_switching_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_protection_switching_configuration_unpack(bcmolt_epon_protection_switching_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_epon_protection_switching_configuration struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_protection_switching_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_epon_protection_switching_configuration is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_protection_switching_configuration_bounds_check(const bcmolt_epon_protection_switching_configuration *this);
+
+/** Initializes a bcmolt_u8_list_u16 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_u8_list_u16_set_default(bcmolt_u8_list_u16 *this);
+
+/** Packs a bcmolt_u8_list_u16 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_pack(const bcmolt_u8_list_u16 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_u8_list_u16 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_u8_list_u16_get_packed_length(const bcmolt_u8_list_u16 *this);
+
+/** Unpacks a bcmolt_u8_list_u16 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_unpack(bcmolt_u8_list_u16 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_u8_list_u16 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_u8_list_u16_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_u8_list_u16 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_bounds_check(const bcmolt_u8_list_u16 *this);
+
+/** Initializes a bcmolt_ethernet_frame_masked struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ethernet_frame_masked_set_default(bcmolt_ethernet_frame_masked *this);
+
+/** Packs a bcmolt_ethernet_frame_masked to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_masked_pack(const bcmolt_ethernet_frame_masked *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_ethernet_frame_masked would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ethernet_frame_masked_get_packed_length(const bcmolt_ethernet_frame_masked *this);
+
+/** Unpacks a bcmolt_ethernet_frame_masked from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_masked_unpack(bcmolt_ethernet_frame_masked *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ethernet_frame_masked struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ethernet_frame_masked_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ethernet_frame_masked is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_masked_bounds_check(const bcmolt_ethernet_frame_masked *this);
+
+/** Initializes a bcmolt_ethernet_frame_unmasked struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ethernet_frame_unmasked_set_default(bcmolt_ethernet_frame_unmasked *this);
+
+/** Packs a bcmolt_ethernet_frame_unmasked to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_unmasked_pack(const bcmolt_ethernet_frame_unmasked *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_ethernet_frame_unmasked would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ethernet_frame_unmasked_get_packed_length(const bcmolt_ethernet_frame_unmasked *this);
+
+/** Unpacks a bcmolt_ethernet_frame_unmasked from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_unmasked_unpack(bcmolt_ethernet_frame_unmasked *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ethernet_frame_unmasked struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ethernet_frame_unmasked_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ethernet_frame_unmasked is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ethernet_frame_unmasked_bounds_check(const bcmolt_ethernet_frame_unmasked *this);
+
+/** Initializes a bcmolt_extended_guard_time struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_extended_guard_time_set_default(bcmolt_extended_guard_time *this);
+
+/** Packs a bcmolt_extended_guard_time to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_extended_guard_time_pack(const bcmolt_extended_guard_time *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_extended_guard_time from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_extended_guard_time_unpack(bcmolt_extended_guard_time *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_extended_guard_time struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_extended_guard_time_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_extended_guard_time is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_extended_guard_time_bounds_check(const bcmolt_extended_guard_time *this);
+
+/** Initializes a bcmolt_firmware_sw_version struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_firmware_sw_version_set_default(bcmolt_firmware_sw_version *this);
+
+/** Packs a bcmolt_firmware_sw_version to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_firmware_sw_version_pack(const bcmolt_firmware_sw_version *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_firmware_sw_version from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_firmware_sw_version_unpack(bcmolt_firmware_sw_version *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_firmware_sw_version struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_firmware_sw_version_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_firmware_sw_version is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_firmware_sw_version_bounds_check(const bcmolt_firmware_sw_version *this);
+
+/** Initializes a bcmolt_gem_port_configuration struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gem_port_configuration_set_default(bcmolt_gem_port_configuration *this);
+
+/** Packs a bcmolt_gem_port_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gem_port_configuration_pack(const bcmolt_gem_port_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gem_port_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gem_port_configuration_unpack(bcmolt_gem_port_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gem_port_configuration struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gem_port_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gem_port_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gem_port_configuration_bounds_check(const bcmolt_gem_port_configuration *this);
+
+/** Initializes a bcmolt_gpon_alloc_with_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_alloc_with_state_set_default(bcmolt_gpon_alloc_with_state *this);
+
+/** Packs a bcmolt_gpon_alloc_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_pack(const bcmolt_gpon_alloc_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_alloc_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_unpack(bcmolt_gpon_alloc_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_alloc_with_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_alloc_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_bounds_check(const bcmolt_gpon_alloc_with_state *this);
+
+/** Initializes a bcmolt_gpon_alloc_with_state_list_u16_max_32 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_alloc_with_state_list_u16_max_32_set_default(bcmolt_gpon_alloc_with_state_list_u16_max_32 *this);
+
+/** Packs a bcmolt_gpon_alloc_with_state_list_u16_max_32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_with_state_list_u16_max_32 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_alloc_with_state_list_u16_max_32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_with_state_list_u16_max_32 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_alloc_with_state_list_u16_max_32 is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_with_state_list_u16_max_32_bounds_check(const bcmolt_gpon_alloc_with_state_list_u16_max_32 *this);
+
+/** Initializes a bcmolt_gpon_debug_flow_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_debug_flow_config_set_default(bcmolt_gpon_debug_flow_config *this);
+
+/** Packs a bcmolt_gpon_debug_flow_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_debug_flow_config_pack(const bcmolt_gpon_debug_flow_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_debug_flow_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_debug_flow_config_unpack(bcmolt_gpon_debug_flow_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_debug_flow_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_debug_flow_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_debug_flow_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_debug_flow_config_bounds_check(const bcmolt_gpon_debug_flow_config *this);
+
+/** Initializes a bcmolt_gpon_gem_id_list_u8_max_16 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_gem_id_list_u8_max_16_set_default(bcmolt_gpon_gem_id_list_u8_max_16 *this);
+
+/** Packs a bcmolt_gpon_gem_id_list_u8_max_16 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_pack(const bcmolt_gpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_id_list_u8_max_16 would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_gem_id_list_u8_max_16_get_packed_length(const bcmolt_gpon_gem_id_list_u8_max_16 *this);
+
+/** Unpacks a bcmolt_gpon_gem_id_list_u8_max_16 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_id_list_u8_max_16 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_gem_id_list_u8_max_16 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_id_list_u8_max_16_bounds_check(const bcmolt_gpon_gem_id_list_u8_max_16 *this);
+
+/** Initializes a bcmolt_gpon_gem_port_with_state struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_gem_port_with_state_set_default(bcmolt_gpon_gem_port_with_state *this);
+
+/** Packs a bcmolt_gpon_gem_port_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_pack(const bcmolt_gpon_gem_port_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_gem_port_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_unpack(bcmolt_gpon_gem_port_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_gem_port_with_state struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_bounds_check(const bcmolt_gpon_gem_port_with_state *this);
+
+/** Initializes a bcmolt_gpon_gem_port_with_state_list_u16_max_128 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_gem_port_with_state_list_u16_max_128_set_default(bcmolt_gpon_gem_port_with_state_list_u16_max_128 *this);
+
+/** Packs a bcmolt_gpon_gem_port_with_state_list_u16_max_128 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_gem_port_with_state_list_u16_max_128 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_with_state_list_u16_max_128 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_with_state_list_u16_max_128 struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_with_state_list_u16_max_128 
+ * is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_with_state_list_u16_max_256 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_gem_port_with_state_list_u16_max_256_set_default(bcmolt_gpon_gem_port_with_state_list_u16_max_256 *this);
+
+/** Packs a bcmolt_gpon_gem_port_with_state_list_u16_max_256 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_gem_port_with_state_list_u16_max_256 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_with_state_list_u16_max_256 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_with_state_list_u16_max_256 struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_with_state_list_u16_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_with_state_list_u16_max_256 
+ * is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_debug_flow_config struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_iwf_debug_flow_config_set_default(bcmolt_gpon_iwf_debug_flow_config *this);
+
+/** Packs a bcmolt_gpon_iwf_debug_flow_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_debug_flow_config_pack(const bcmolt_gpon_iwf_debug_flow_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_iwf_debug_flow_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_debug_flow_config_unpack(bcmolt_gpon_iwf_debug_flow_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_iwf_debug_flow_config struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_debug_flow_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_iwf_debug_flow_config is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_debug_flow_config_bounds_check(const bcmolt_gpon_iwf_debug_flow_config *this);
+
+/** Initializes a bcmolt_gpon_key_exchange struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_key_exchange_set_default(bcmolt_gpon_key_exchange *this);
+
+/** Packs a bcmolt_gpon_key_exchange to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_key_exchange_pack(const bcmolt_gpon_key_exchange *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_key_exchange from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_key_exchange_unpack(bcmolt_gpon_key_exchange *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_key_exchange struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_key_exchange_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_key_exchange is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_key_exchange_bounds_check(const bcmolt_gpon_key_exchange *this);
+
+/** Initializes a bcmolt_gpon_mac_table_scan_result struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_mac_table_scan_result_set_default(bcmolt_gpon_mac_table_scan_result *this);
+
+/** Packs a bcmolt_gpon_mac_table_scan_result to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_pack(const bcmolt_gpon_mac_table_scan_result *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_mac_table_scan_result from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_unpack(bcmolt_gpon_mac_table_scan_result *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_mac_table_scan_result struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_mac_table_scan_result is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_bounds_check(const bcmolt_gpon_mac_table_scan_result *this);
+
+/** Initializes a bcmolt_gpon_mac_table_scan_result_list_u16 struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_mac_table_scan_result_list_u16_set_default(bcmolt_gpon_mac_table_scan_result_list_u16 *this);
+
+/** Packs a bcmolt_gpon_mac_table_scan_result_list_u16 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_pack(const bcmolt_gpon_mac_table_scan_result_list_u16 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gpon_mac_table_scan_result_list_u16 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_mac_table_scan_result_list_u16_get_packed_length(const bcmolt_gpon_mac_table_scan_result_list_u16 *this);
+
+/** Unpacks a bcmolt_gpon_mac_table_scan_result_list_u16 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_mac_table_scan_result_list_u16 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_mac_table_scan_result_list_u16 is out 
+ * of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_mac_table_scan_result_list_u16_bounds_check(const bcmolt_gpon_mac_table_scan_result_list_u16 *this);
+
+/** Initializes a bcmolt_gpon_ni_debug struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_ni_debug_set_default(bcmolt_gpon_ni_debug *this);
+
+/** Packs a bcmolt_gpon_ni_debug to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_debug_pack(const bcmolt_gpon_ni_debug *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_ni_debug from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_debug_unpack(bcmolt_gpon_ni_debug *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_ni_debug struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_ni_debug is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_debug_bounds_check(const bcmolt_gpon_ni_debug *this);
+
+/** Initializes a bcmolt_gpon_onu_activation struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_activation_set_default(bcmolt_gpon_onu_activation *this);
+
+/** Packs a bcmolt_gpon_onu_activation to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_activation_pack(const bcmolt_gpon_onu_activation *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_activation from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_activation_unpack(bcmolt_gpon_onu_activation *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_activation struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_activation_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_activation is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_activation_bounds_check(const bcmolt_gpon_onu_activation *this);
+
+/** Initializes a bcmolt_gpon_onu_alarm_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_alarm_state_set_default(bcmolt_gpon_onu_alarm_state *this);
+
+/** Packs a bcmolt_gpon_onu_alarm_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarm_state_pack(const bcmolt_gpon_onu_alarm_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_alarm_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarm_state_unpack(bcmolt_gpon_onu_alarm_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_alarm_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_alarm_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarm_state_bounds_check(const bcmolt_gpon_onu_alarm_state *this);
+
+/** Initializes a bcmolt_gpon_onu_alarms struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_alarms_set_default(bcmolt_gpon_onu_alarms *this);
+
+/** Packs a bcmolt_gpon_onu_alarms to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_pack(const bcmolt_gpon_onu_alarms *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_alarms from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_unpack(bcmolt_gpon_onu_alarms *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_alarms struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_alarms is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_bounds_check(const bcmolt_gpon_onu_alarms *this);
+
+/** Initializes a bcmolt_gpon_onu_alarms_thresholds struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_alarms_thresholds_set_default(bcmolt_gpon_onu_alarms_thresholds *this);
+
+/** Packs a bcmolt_gpon_onu_alarms_thresholds to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_thresholds_pack(const bcmolt_gpon_onu_alarms_thresholds *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_alarms_thresholds from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_thresholds_unpack(bcmolt_gpon_onu_alarms_thresholds *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_alarms_thresholds struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_thresholds_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_alarms_thresholds is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_alarms_thresholds_bounds_check(const bcmolt_gpon_onu_alarms_thresholds *this);
+
+/** Initializes a bcmolt_gpon_onu_eqd struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_eqd_set_default(bcmolt_gpon_onu_eqd *this);
+
+/** Packs a bcmolt_gpon_onu_eqd to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_pack(const bcmolt_gpon_onu_eqd *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_eqd from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_unpack(bcmolt_gpon_onu_eqd *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_eqd struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_eqd is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_bounds_check(const bcmolt_gpon_onu_eqd *this);
+
+/** Initializes a bcmolt_gpon_onu_eqd_list_u32 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_eqd_list_u32_set_default(bcmolt_gpon_onu_eqd_list_u32 *this);
+
+/** Packs a bcmolt_gpon_onu_eqd_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_list_u32_pack(const bcmolt_gpon_onu_eqd_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_eqd_list_u32 would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_eqd_list_u32_get_packed_length(const bcmolt_gpon_onu_eqd_list_u32 *this);
+
+/** Unpacks a bcmolt_gpon_onu_eqd_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_list_u32_unpack(bcmolt_gpon_onu_eqd_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_eqd_list_u32 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_eqd_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_eqd_list_u32_bounds_check(const bcmolt_gpon_onu_eqd_list_u32 *this);
+
+/** Initializes a bcmolt_gpon_onu_id_list_u32_max_256 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_id_list_u32_max_256_set_default(bcmolt_gpon_onu_id_list_u32_max_256 *this);
+
+/** Packs a bcmolt_gpon_onu_id_list_u32_max_256 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_pack(const bcmolt_gpon_onu_id_list_u32_max_256 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_id_list_u32_max_256 would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_id_list_u32_max_256_get_packed_length(const bcmolt_gpon_onu_id_list_u32_max_256 *this);
+
+/** Unpacks a bcmolt_gpon_onu_id_list_u32_max_256 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_id_list_u32_max_256 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_id_list_u32_max_256 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_id_list_u32_max_256_bounds_check(const bcmolt_gpon_onu_id_list_u32_max_256 *this);
+
+/** Initializes a bcmolt_gpon_onu_upgrade_params struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_upgrade_params_set_default(bcmolt_gpon_onu_upgrade_params *this);
+
+/** Packs a bcmolt_gpon_onu_upgrade_params to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_params_pack(const bcmolt_gpon_onu_upgrade_params *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_upgrade_params from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_params_unpack(bcmolt_gpon_onu_upgrade_params *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_upgrade_params struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_params_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_upgrade_params is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_params_bounds_check(const bcmolt_gpon_onu_upgrade_params *this);
+
+/** Initializes a bcmolt_gpon_onu_upgrade_status struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_upgrade_status_set_default(bcmolt_gpon_onu_upgrade_status *this);
+
+/** Packs a bcmolt_gpon_onu_upgrade_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_pack(const bcmolt_gpon_onu_upgrade_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_upgrade_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_unpack(bcmolt_gpon_onu_upgrade_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_upgrade_status struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_upgrade_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_bounds_check(const bcmolt_gpon_onu_upgrade_status *this);
+
+/** Initializes a bcmolt_gpon_onu_upgrade_status_list_u32 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_upgrade_status_list_u32_set_default(bcmolt_gpon_onu_upgrade_status_list_u32 *this);
+
+/** Packs a bcmolt_gpon_onu_upgrade_status_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_pack(const bcmolt_gpon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_upgrade_status_list_u32 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_upgrade_status_list_u32_get_packed_length(const bcmolt_gpon_onu_upgrade_status_list_u32 *this);
+
+/** Unpacks a bcmolt_gpon_onu_upgrade_status_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_unpack(bcmolt_gpon_onu_upgrade_status_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_upgrade_status_list_u32 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_upgrade_status_list_u32 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_upgrade_status_list_u32_bounds_check(const bcmolt_gpon_onu_upgrade_status_list_u32 *this);
+
+/** Initializes a bcmolt_gpon_onu_with_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_with_state_set_default(bcmolt_gpon_onu_with_state *this);
+
+/** Packs a bcmolt_gpon_onu_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_pack(const bcmolt_gpon_onu_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_onu_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_unpack(bcmolt_gpon_onu_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_onu_with_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_bounds_check(const bcmolt_gpon_onu_with_state *this);
+
+/** Initializes a bcmolt_gpon_onu_with_state_list_u16_max_128 struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_onu_with_state_list_u16_max_128_set_default(bcmolt_gpon_onu_with_state_list_u16_max_128 *this);
+
+/** Packs a bcmolt_gpon_onu_with_state_list_u16_max_128 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_with_state_list_u16_max_128 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_with_state_list_u16_max_128 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_with_state_list_u16_max_128 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_onu_with_state_list_u16_max_128 is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_with_state_list_u16_max_128_bounds_check(const bcmolt_gpon_onu_with_state_list_u16_max_128 *this);
+
+/** Initializes a bcmolt_gpon_rssi_general_configuration struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_rssi_general_configuration_set_default(bcmolt_gpon_rssi_general_configuration *this);
+
+/** Packs a bcmolt_gpon_rssi_general_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_rssi_general_configuration_pack(const bcmolt_gpon_rssi_general_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_rssi_general_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_rssi_general_configuration_unpack(bcmolt_gpon_rssi_general_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_rssi_general_configuration struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_rssi_general_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_rssi_general_configuration is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_rssi_general_configuration_bounds_check(const bcmolt_gpon_rssi_general_configuration *this);
+
+/** Initializes a bcmolt_gpon_sn_acquisition struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_gpon_sn_acquisition_set_default(bcmolt_gpon_sn_acquisition *this);
+
+/** Packs a bcmolt_gpon_sn_acquisition to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_sn_acquisition_pack(const bcmolt_gpon_sn_acquisition *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_gpon_sn_acquisition from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_sn_acquisition_unpack(bcmolt_gpon_sn_acquisition *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_gpon_sn_acquisition struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_sn_acquisition_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_gpon_sn_acquisition is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_sn_acquisition_bounds_check(const bcmolt_gpon_sn_acquisition *this);
+
+/** Initializes a bcmolt_host_sw_version struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_host_sw_version_set_default(bcmolt_host_sw_version *this);
+
+/** Packs a bcmolt_host_sw_version to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_host_sw_version_pack(const bcmolt_host_sw_version *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_host_sw_version from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_host_sw_version_unpack(bcmolt_host_sw_version *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_host_sw_version struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_host_sw_version_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_host_sw_version is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_host_sw_version_bounds_check(const bcmolt_host_sw_version *this);
+
+/** Initializes a bcmolt_hw_pon_id struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_hw_pon_id_set_default(bcmolt_hw_pon_id *this);
+
+/** Packs a bcmolt_hw_pon_id to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_hw_pon_id_pack(const bcmolt_hw_pon_id *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_hw_pon_id from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_hw_pon_id_unpack(bcmolt_hw_pon_id *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_hw_pon_id struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_hw_pon_id_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_hw_pon_id is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_hw_pon_id_bounds_check(const bcmolt_hw_pon_id *this);
+
+/** Initializes a bcmolt_ieee_8021as_port_identity struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ieee_8021as_port_identity_set_default(bcmolt_ieee_8021as_port_identity *this);
+
+/** Packs a bcmolt_ieee_8021as_port_identity to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_port_identity_pack(const bcmolt_ieee_8021as_port_identity *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ieee_8021as_port_identity from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_port_identity_unpack(bcmolt_ieee_8021as_port_identity *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ieee_8021as_port_identity struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ieee_8021as_port_identity_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ieee_8021as_port_identity is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_port_identity_bounds_check(const bcmolt_ieee_8021as_port_identity *this);
+
+/** Initializes a bcmolt_ieee_8021as_timestamp struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ieee_8021as_timestamp_set_default(bcmolt_ieee_8021as_timestamp *this);
+
+/** Packs a bcmolt_ieee_8021as_timestamp to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_timestamp_pack(const bcmolt_ieee_8021as_timestamp *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ieee_8021as_timestamp from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_timestamp_unpack(bcmolt_ieee_8021as_timestamp *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ieee_8021as_timestamp struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ieee_8021as_timestamp_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ieee_8021as_timestamp is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_timestamp_bounds_check(const bcmolt_ieee_8021as_timestamp *this);
+
+/** Initializes a bcmolt_ieee_8021as_time_sync struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ieee_8021as_time_sync_set_default(bcmolt_ieee_8021as_time_sync *this);
+
+/** Packs a bcmolt_ieee_8021as_time_sync to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_time_sync_pack(const bcmolt_ieee_8021as_time_sync *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ieee_8021as_time_sync from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_time_sync_unpack(bcmolt_ieee_8021as_time_sync *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ieee_8021as_time_sync struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ieee_8021as_time_sync_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ieee_8021as_time_sync is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ieee_8021as_time_sync_bounds_check(const bcmolt_ieee_8021as_time_sync *this);
+
+/** Initializes a bcmolt_indication_shaping struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_indication_shaping_set_default(bcmolt_indication_shaping *this);
+
+/** Packs a bcmolt_indication_shaping to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_indication_shaping_pack(const bcmolt_indication_shaping *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_indication_shaping from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_indication_shaping_unpack(bcmolt_indication_shaping *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_indication_shaping struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_indication_shaping_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_indication_shaping is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_indication_shaping_bounds_check(const bcmolt_indication_shaping *this);
+
+/** Initializes a bcmolt_la_resync_pattern_configuration struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_la_resync_pattern_configuration_set_default(bcmolt_la_resync_pattern_configuration *this);
+
+/** Packs a bcmolt_la_resync_pattern_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_la_resync_pattern_configuration_pack(const bcmolt_la_resync_pattern_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_la_resync_pattern_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_la_resync_pattern_configuration_unpack(bcmolt_la_resync_pattern_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_la_resync_pattern_configuration struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_la_resync_pattern_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_la_resync_pattern_configuration is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_la_resync_pattern_configuration_bounds_check(const bcmolt_la_resync_pattern_configuration *this);
+
+/** Initializes a bcmolt_log_buffer struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_log_buffer_set_default(bcmolt_log_buffer *this);
+
+/** Packs a bcmolt_log_buffer to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_buffer_pack(const bcmolt_log_buffer *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_log_buffer from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_buffer_unpack(bcmolt_log_buffer *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_log_buffer struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_buffer_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_log_buffer is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_buffer_bounds_check(const bcmolt_log_buffer *this);
+
+/** Initializes a bcmolt_mac_table_configuration struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_mac_table_configuration_set_default(bcmolt_mac_table_configuration *this);
+
+/** Packs a bcmolt_mac_table_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_mac_table_configuration_pack(const bcmolt_mac_table_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_mac_table_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_mac_table_configuration_unpack(bcmolt_mac_table_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_mac_table_configuration struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_mac_table_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_mac_table_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_mac_table_configuration_bounds_check(const bcmolt_mac_table_configuration *this);
+
+/** Initializes a bcmolt_macaddress_list_u32 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_macaddress_list_u32_set_default(bcmolt_macaddress_list_u32 *this);
+
+/** Packs a bcmolt_macaddress_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_pack(const bcmolt_macaddress_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_macaddress_list_u32 would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_macaddress_list_u32_get_packed_length(const bcmolt_macaddress_list_u32 *this);
+
+/** Unpacks a bcmolt_macaddress_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_unpack(bcmolt_macaddress_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_macaddress_list_u32 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_macaddress_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_bounds_check(const bcmolt_macaddress_list_u32 *this);
+
+/** Initializes a bcmolt_macaddress_list_u32_max_2048 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_macaddress_list_u32_max_2048_set_default(bcmolt_macaddress_list_u32_max_2048 *this);
+
+/** Packs a bcmolt_macaddress_list_u32_max_2048 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_max_2048_pack(const bcmolt_macaddress_list_u32_max_2048 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_macaddress_list_u32_max_2048 would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_macaddress_list_u32_max_2048_get_packed_length(const bcmolt_macaddress_list_u32_max_2048 *this);
+
+/** Unpacks a bcmolt_macaddress_list_u32_max_2048 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_max_2048_unpack(bcmolt_macaddress_list_u32_max_2048 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_macaddress_list_u32_max_2048 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_max_2048_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_macaddress_list_u32_max_2048 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_macaddress_list_u32_max_2048_bounds_check(const bcmolt_macaddress_list_u32_max_2048 *this);
+
+/** Initializes a bcmolt_nni_link_status struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_nni_link_status_set_default(bcmolt_nni_link_status *this);
+
+/** Packs a bcmolt_nni_link_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_link_status_pack(const bcmolt_nni_link_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_nni_link_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_link_status_unpack(bcmolt_nni_link_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_nni_link_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_link_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_nni_link_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_link_status_bounds_check(const bcmolt_nni_link_status *this);
+
+/** Initializes a bcmolt_oam_heartbeat_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_oam_heartbeat_config_set_default(bcmolt_oam_heartbeat_config *this);
+
+/** Packs a bcmolt_oam_heartbeat_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_oam_heartbeat_config_pack(const bcmolt_oam_heartbeat_config *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_oam_heartbeat_config would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_oam_heartbeat_config_get_packed_length(const bcmolt_oam_heartbeat_config *this);
+
+/** Unpacks a bcmolt_oam_heartbeat_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_oam_heartbeat_config_unpack(bcmolt_oam_heartbeat_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_oam_heartbeat_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_oam_heartbeat_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_oam_heartbeat_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_oam_heartbeat_config_bounds_check(const bcmolt_oam_heartbeat_config *this);
+
+/** Initializes a bcmolt_onu_power_management_configuration struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_onu_power_management_configuration_set_default(bcmolt_onu_power_management_configuration *this);
+
+/** Packs a bcmolt_onu_power_management_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_power_management_configuration_pack(const bcmolt_onu_power_management_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_power_management_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_power_management_configuration_unpack(bcmolt_onu_power_management_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_onu_power_management_configuration struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_onu_power_management_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_onu_power_management_configuration is out 
+ * of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_power_management_configuration_bounds_check(const bcmolt_onu_power_management_configuration *this);
+
+/** Initializes a bcmolt_onu_tuning_configuration struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_onu_tuning_configuration_set_default(bcmolt_onu_tuning_configuration *this);
+
+/** Packs a bcmolt_onu_tuning_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_tuning_configuration_pack(const bcmolt_onu_tuning_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_onu_tuning_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_tuning_configuration_unpack(bcmolt_onu_tuning_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_onu_tuning_configuration struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_onu_tuning_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_onu_tuning_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_onu_tuning_configuration_bounds_check(const bcmolt_onu_tuning_configuration *this);
+
+/** Initializes a bcmolt_pon_id struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_id_set_default(bcmolt_pon_id *this);
+
+/** Packs a bcmolt_pon_id to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_id_pack(const bcmolt_pon_id *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_id from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_id_unpack(bcmolt_pon_id *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_id struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_id_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_id is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_id_bounds_check(const bcmolt_pon_id *this);
+
+/** Initializes a bcmolt_operation_control struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_operation_control_set_default(bcmolt_operation_control *this);
+
+/** Packs a bcmolt_operation_control to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_operation_control_pack(const bcmolt_operation_control *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_operation_control from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_operation_control_unpack(bcmolt_operation_control *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_operation_control struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_operation_control_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_operation_control is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_operation_control_bounds_check(const bcmolt_operation_control *this);
+
+/** Initializes a bcmolt_periodic_standby_pon_monitoring struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_periodic_standby_pon_monitoring_set_default(bcmolt_periodic_standby_pon_monitoring *this);
+
+/** Packs a bcmolt_periodic_standby_pon_monitoring to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_periodic_standby_pon_monitoring_pack(const bcmolt_periodic_standby_pon_monitoring *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_periodic_standby_pon_monitoring from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_periodic_standby_pon_monitoring_unpack(bcmolt_periodic_standby_pon_monitoring *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_periodic_standby_pon_monitoring struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_periodic_standby_pon_monitoring_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_periodic_standby_pon_monitoring is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_periodic_standby_pon_monitoring_bounds_check(const bcmolt_periodic_standby_pon_monitoring *this);
+
+/** Initializes a bcmolt_pon_aggregate_shaper struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_aggregate_shaper_set_default(bcmolt_pon_aggregate_shaper *this);
+
+/** Packs a bcmolt_pon_aggregate_shaper to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_aggregate_shaper_pack(const bcmolt_pon_aggregate_shaper *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_aggregate_shaper from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_aggregate_shaper_unpack(bcmolt_pon_aggregate_shaper *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_aggregate_shaper struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_aggregate_shaper_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_aggregate_shaper is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_aggregate_shaper_bounds_check(const bcmolt_pon_aggregate_shaper *this);
+
+/** Initializes a bcmolt_pon_alloc_sla struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_alloc_sla_set_default(bcmolt_pon_alloc_sla *this);
+
+/** Packs a bcmolt_pon_alloc_sla to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_alloc_sla_pack(const bcmolt_pon_alloc_sla *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_alloc_sla from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_alloc_sla_unpack(bcmolt_pon_alloc_sla *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_alloc_sla struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_alloc_sla_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_alloc_sla is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_alloc_sla_bounds_check(const bcmolt_pon_alloc_sla *this);
+
+/** Initializes a bcmolt_pon_available_bandwidth struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_available_bandwidth_set_default(bcmolt_pon_available_bandwidth *this);
+
+/** Packs a bcmolt_pon_available_bandwidth to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_available_bandwidth_pack(const bcmolt_pon_available_bandwidth *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_available_bandwidth from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_available_bandwidth_unpack(bcmolt_pon_available_bandwidth *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_available_bandwidth struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_available_bandwidth_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_available_bandwidth is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_available_bandwidth_bounds_check(const bcmolt_pon_available_bandwidth *this);
+
+/** Initializes a bcmolt_pon_dba struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_dba_set_default(bcmolt_pon_dba *this);
+
+/** Packs a bcmolt_pon_dba to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_dba_pack(const bcmolt_pon_dba *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_dba from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_dba_unpack(bcmolt_pon_dba *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_dba struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_dba_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_dba is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_dba_bounds_check(const bcmolt_pon_dba *this);
+
+/** Initializes a bcmolt_pon_distance struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_distance_set_default(bcmolt_pon_distance *this);
+
+/** Packs a bcmolt_pon_distance to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_distance_pack(const bcmolt_pon_distance *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_distance from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_distance_unpack(bcmolt_pon_distance *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_distance struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_distance_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_distance is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_distance_bounds_check(const bcmolt_pon_distance *this);
+
+/** Initializes a bcmolt_pon_drift_control struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_drift_control_set_default(bcmolt_pon_drift_control *this);
+
+/** Packs a bcmolt_pon_drift_control to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_drift_control_pack(const bcmolt_pon_drift_control *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_drift_control from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_drift_control_unpack(bcmolt_pon_drift_control *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_drift_control struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_drift_control_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_drift_control is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_drift_control_bounds_check(const bcmolt_pon_drift_control *this);
+
+/** Initializes a bcmolt_pon_onu_id_list_u32 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_onu_id_list_u32_set_default(bcmolt_pon_onu_id_list_u32 *this);
+
+/** Packs a bcmolt_pon_onu_id_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_onu_id_list_u32_pack(const bcmolt_pon_onu_id_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_pon_onu_id_list_u32 would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_pon_onu_id_list_u32_get_packed_length(const bcmolt_pon_onu_id_list_u32 *this);
+
+/** Unpacks a bcmolt_pon_onu_id_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_onu_id_list_u32_unpack(bcmolt_pon_onu_id_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_onu_id_list_u32 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_onu_id_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_onu_id_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_onu_id_list_u32_bounds_check(const bcmolt_pon_onu_id_list_u32 *this);
+
+/** Initializes a bcmolt_pon_power_level struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_power_level_set_default(bcmolt_pon_power_level *this);
+
+/** Packs a bcmolt_pon_power_level to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_power_level_pack(const bcmolt_pon_power_level *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_power_level from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_power_level_unpack(bcmolt_pon_power_level *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_power_level struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_power_level_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_power_level is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_power_level_bounds_check(const bcmolt_pon_power_level *this);
+
+/** Initializes a bcmolt_pon_protection_switching struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_protection_switching_set_default(bcmolt_pon_protection_switching *this);
+
+/** Packs a bcmolt_pon_protection_switching to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_protection_switching_pack(const bcmolt_pon_protection_switching *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_protection_switching from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_protection_switching_unpack(bcmolt_pon_protection_switching *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_protection_switching struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_protection_switching_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_protection_switching is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_protection_switching_bounds_check(const bcmolt_pon_protection_switching *this);
+
+/** Initializes a bcmolt_pon_status struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_pon_status_set_default(bcmolt_pon_status *this);
+
+/** Packs a bcmolt_pon_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_status_pack(const bcmolt_pon_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_pon_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_status_unpack(bcmolt_pon_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_pon_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_pon_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_pon_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_pon_status_bounds_check(const bcmolt_pon_status *this);
+
+/** Initializes a bcmolt_prbs_checker_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_prbs_checker_config_set_default(bcmolt_prbs_checker_config *this);
+
+/** Packs a bcmolt_prbs_checker_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_checker_config_pack(const bcmolt_prbs_checker_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_checker_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_checker_config_unpack(bcmolt_prbs_checker_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_prbs_checker_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_prbs_checker_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_prbs_checker_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_checker_config_bounds_check(const bcmolt_prbs_checker_config *this);
+
+/** Initializes a bcmolt_prbs_generator_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_prbs_generator_config_set_default(bcmolt_prbs_generator_config *this);
+
+/** Packs a bcmolt_prbs_generator_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_generator_config_pack(const bcmolt_prbs_generator_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_generator_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_generator_config_unpack(bcmolt_prbs_generator_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_prbs_generator_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_prbs_generator_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_prbs_generator_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_generator_config_bounds_check(const bcmolt_prbs_generator_config *this);
+
+/** Initializes a bcmolt_prbs_status struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_prbs_status_set_default(bcmolt_prbs_status *this);
+
+/** Packs a bcmolt_prbs_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_status_pack(const bcmolt_prbs_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_prbs_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_status_unpack(bcmolt_prbs_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_prbs_status struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_prbs_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_prbs_status is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_prbs_status_bounds_check(const bcmolt_prbs_status *this);
+
+/** Initializes a bcmolt_ranging_control_configuration struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ranging_control_configuration_set_default(bcmolt_ranging_control_configuration *this);
+
+/** Packs a bcmolt_ranging_control_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_control_configuration_pack(const bcmolt_ranging_control_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ranging_control_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_control_configuration_unpack(bcmolt_ranging_control_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ranging_control_configuration struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ranging_control_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ranging_control_configuration is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_control_configuration_bounds_check(const bcmolt_ranging_control_configuration *this);
+
+/** Initializes a bcmolt_ranging_resync_conditions struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ranging_resync_conditions_set_default(bcmolt_ranging_resync_conditions *this);
+
+/** Packs a bcmolt_ranging_resync_conditions to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_resync_conditions_pack(const bcmolt_ranging_resync_conditions *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ranging_resync_conditions from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_resync_conditions_unpack(bcmolt_ranging_resync_conditions *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ranging_resync_conditions struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ranging_resync_conditions_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ranging_resync_conditions is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_resync_conditions_bounds_check(const bcmolt_ranging_resync_conditions *this);
+
+/** Initializes a bcmolt_ranging_rssi_control struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ranging_rssi_control_set_default(bcmolt_ranging_rssi_control *this);
+
+/** Packs a bcmolt_ranging_rssi_control to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_rssi_control_pack(const bcmolt_ranging_rssi_control *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ranging_rssi_control from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_rssi_control_unpack(bcmolt_ranging_rssi_control *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ranging_rssi_control struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ranging_rssi_control_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ranging_rssi_control is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ranging_rssi_control_bounds_check(const bcmolt_ranging_rssi_control *this);
+
+/** Initializes a bcmolt_request_registration_status struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_request_registration_status_set_default(bcmolt_request_registration_status *this);
+
+/** Packs a bcmolt_request_registration_status to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_request_registration_status_pack(const bcmolt_request_registration_status *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_request_registration_status from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_request_registration_status_unpack(bcmolt_request_registration_status *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_request_registration_status struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_request_registration_status_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_request_registration_status is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_request_registration_status_bounds_check(const bcmolt_request_registration_status *this);
+
+/** Initializes a bcmolt_rogue_detection_special_map struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_rogue_detection_special_map_set_default(bcmolt_rogue_detection_special_map *this);
+
+/** Packs a bcmolt_rogue_detection_special_map to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_pack(const bcmolt_rogue_detection_special_map *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_rogue_detection_special_map from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_unpack(bcmolt_rogue_detection_special_map *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_rogue_detection_special_map struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_rogue_detection_special_map is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_bounds_check(const bcmolt_rogue_detection_special_map *this);
+
+/** Initializes a bcmolt_rogue_detection_special_map_list_u32_max_8 struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_rogue_detection_special_map_list_u32_max_8_set_default(bcmolt_rogue_detection_special_map_list_u32_max_8 *this);
+
+/** Packs a bcmolt_rogue_detection_special_map_list_u32_max_8 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_rogue_detection_special_map_list_u32_max_8 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_rogue_detection_special_map_list_u32_max_8 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_rogue_detection_special_map_list_u32_max_8 struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_rogue_detection_special_map_list_u32_max_8 
+ * is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_special_map_list_u32_max_8_bounds_check(const bcmolt_rogue_detection_special_map_list_u32_max_8 *this);
+
+/** Initializes a bcmolt_rogue_detection_algorithm struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_rogue_detection_algorithm_set_default(bcmolt_rogue_detection_algorithm *this);
+
+/** Packs a bcmolt_rogue_detection_algorithm to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_pack(const bcmolt_rogue_detection_algorithm *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_rogue_detection_algorithm would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_rogue_detection_algorithm_get_packed_length(const bcmolt_rogue_detection_algorithm *this);
+
+/** Unpacks a bcmolt_rogue_detection_algorithm from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_unpack(bcmolt_rogue_detection_algorithm *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_rogue_detection_algorithm struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_rogue_detection_algorithm is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_detection_algorithm_bounds_check(const bcmolt_rogue_detection_algorithm *this);
+
+/** Initializes a bcmolt_rogue_onu_detection_process struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_rogue_onu_detection_process_set_default(bcmolt_rogue_onu_detection_process *this);
+
+/** Packs a bcmolt_rogue_onu_detection_process to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_onu_detection_process_pack(const bcmolt_rogue_onu_detection_process *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_rogue_onu_detection_process would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_rogue_onu_detection_process_get_packed_length(const bcmolt_rogue_onu_detection_process *this);
+
+/** Unpacks a bcmolt_rogue_onu_detection_process from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_onu_detection_process_unpack(bcmolt_rogue_onu_detection_process *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_rogue_onu_detection_process struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_rogue_onu_detection_process_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_rogue_onu_detection_process is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_rogue_onu_detection_process_bounds_check(const bcmolt_rogue_onu_detection_process *this);
+
+/** Initializes a bcmolt_serdes_configuration struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_serdes_configuration_set_default(bcmolt_serdes_configuration *this);
+
+/** Packs a bcmolt_serdes_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serdes_configuration_pack(const bcmolt_serdes_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_serdes_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serdes_configuration_unpack(bcmolt_serdes_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_serdes_configuration struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_serdes_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_serdes_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serdes_configuration_bounds_check(const bcmolt_serdes_configuration *this);
+
+/** Initializes a bcmolt_serial_number struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_serial_number_set_default(bcmolt_serial_number *this);
+
+/** Packs a bcmolt_serial_number to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serial_number_pack(const bcmolt_serial_number *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_serial_number from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serial_number_unpack(bcmolt_serial_number *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_serial_number struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_serial_number_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_serial_number is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_serial_number_bounds_check(const bcmolt_serial_number *this);
+
+/** Initializes a bcmolt_solicited_scheduler struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_solicited_scheduler_set_default(bcmolt_solicited_scheduler *this);
+
+/** Packs a bcmolt_solicited_scheduler to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_solicited_scheduler_pack(const bcmolt_solicited_scheduler *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_solicited_scheduler from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_solicited_scheduler_unpack(bcmolt_solicited_scheduler *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_solicited_scheduler struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_solicited_scheduler_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_solicited_scheduler is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_solicited_scheduler_bounds_check(const bcmolt_solicited_scheduler *this);
+
+/** Initializes a bcmolt_stat_alarm_trigger_config struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_stat_alarm_trigger_config_set_default(bcmolt_stat_alarm_trigger_config *this);
+
+/** Packs a bcmolt_stat_alarm_trigger_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_trigger_config_pack(const bcmolt_stat_alarm_trigger_config *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_stat_alarm_trigger_config would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_stat_alarm_trigger_config_get_packed_length(const bcmolt_stat_alarm_trigger_config *this);
+
+/** Unpacks a bcmolt_stat_alarm_trigger_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_trigger_config_unpack(bcmolt_stat_alarm_trigger_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_stat_alarm_trigger_config struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_stat_alarm_trigger_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_stat_alarm_trigger_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_trigger_config_bounds_check(const bcmolt_stat_alarm_trigger_config *this);
+
+/** Initializes a bcmolt_stat_alarm_soak_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_stat_alarm_soak_config_set_default(bcmolt_stat_alarm_soak_config *this);
+
+/** Packs a bcmolt_stat_alarm_soak_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_soak_config_pack(const bcmolt_stat_alarm_soak_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_stat_alarm_soak_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_soak_config_unpack(bcmolt_stat_alarm_soak_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_stat_alarm_soak_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_stat_alarm_soak_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_stat_alarm_soak_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_soak_config_bounds_check(const bcmolt_stat_alarm_soak_config *this);
+
+/** Initializes a bcmolt_stat_alarm_config struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_stat_alarm_config_set_default(bcmolt_stat_alarm_config *this);
+
+/** Packs a bcmolt_stat_alarm_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_config_pack(const bcmolt_stat_alarm_config *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_stat_alarm_config would occupy on the 
+ * wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_stat_alarm_config_get_packed_length(const bcmolt_stat_alarm_config *this);
+
+/** Unpacks a bcmolt_stat_alarm_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_config_unpack(bcmolt_stat_alarm_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_stat_alarm_config struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_stat_alarm_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_stat_alarm_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_stat_alarm_config_bounds_check(const bcmolt_stat_alarm_config *this);
+
+/** Initializes a bcmolt_str_100 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_str_100_set_default(bcmolt_str_100 *this);
+
+/** Packs a bcmolt_str_100 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_100_pack(const bcmolt_str_100 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_str_100 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_100_unpack(bcmolt_str_100 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_str_100 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_str_100_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_str_100 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_100_bounds_check(const bcmolt_str_100 *this);
+
+/** Initializes a bcmolt_str_1000 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_str_1000_set_default(bcmolt_str_1000 *this);
+
+/** Packs a bcmolt_str_1000 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_1000_pack(const bcmolt_str_1000 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_str_1000 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_1000_unpack(bcmolt_str_1000 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_str_1000 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_str_1000_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_str_1000 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_1000_bounds_check(const bcmolt_str_1000 *this);
+
+/** Initializes a bcmolt_str_2000 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_str_2000_set_default(bcmolt_str_2000 *this);
+
+/** Packs a bcmolt_str_2000 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_2000_pack(const bcmolt_str_2000 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_str_2000 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_2000_unpack(bcmolt_str_2000 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_str_2000 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_str_2000_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_str_2000 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_2000_bounds_check(const bcmolt_str_2000 *this);
+
+/** Initializes a bcmolt_str_256 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_str_256_set_default(bcmolt_str_256 *this);
+
+/** Packs a bcmolt_str_256 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_256_pack(const bcmolt_str_256 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_str_256 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_256_unpack(bcmolt_str_256 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_str_256 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_str_256_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_str_256 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_256_bounds_check(const bcmolt_str_256 *this);
+
+/** Initializes a bcmolt_str_64 struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_str_64_set_default(bcmolt_str_64 *this);
+
+/** Packs a bcmolt_str_64 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_64_pack(const bcmolt_str_64 *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_str_64 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_64_unpack(bcmolt_str_64 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_str_64 struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_str_64_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_str_64 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_str_64_bounds_check(const bcmolt_str_64 *this);
+
+/** Initializes a bcmolt_sw_error struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_sw_error_set_default(bcmolt_sw_error *this);
+
+/** Packs a bcmolt_sw_error to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_sw_error_pack(const bcmolt_sw_error *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_sw_error from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_sw_error_unpack(bcmolt_sw_error *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_sw_error struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_sw_error_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_sw_error is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_sw_error_bounds_check(const bcmolt_sw_error *this);
+
+/** Initializes a bcmolt_system_profile struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_system_profile_set_default(bcmolt_system_profile *this);
+
+/** Packs a bcmolt_system_profile to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_system_profile_pack(const bcmolt_system_profile *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_system_profile from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_system_profile_unpack(bcmolt_system_profile *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_system_profile struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_system_profile_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_system_profile is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_system_profile_bounds_check(const bcmolt_system_profile *this);
+
+/** Initializes a bcmolt_trx_delimiter struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_trx_delimiter_set_default(bcmolt_trx_delimiter *this);
+
+/** Packs a bcmolt_trx_delimiter to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_delimiter_pack(const bcmolt_trx_delimiter *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_delimiter from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_delimiter_unpack(bcmolt_trx_delimiter *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_trx_delimiter struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_delimiter_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_trx_delimiter is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_delimiter_bounds_check(const bcmolt_trx_delimiter *this);
+
+/** Initializes a bcmolt_trx_energy_detect struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_trx_energy_detect_set_default(bcmolt_trx_energy_detect *this);
+
+/** Packs a bcmolt_trx_energy_detect to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_energy_detect_pack(const bcmolt_trx_energy_detect *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_energy_detect from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_energy_detect_unpack(bcmolt_trx_energy_detect *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_trx_energy_detect struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_energy_detect_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_trx_energy_detect is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_energy_detect_bounds_check(const bcmolt_trx_energy_detect *this);
+
+/** Initializes a bcmolt_trx_preamble struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_trx_preamble_set_default(bcmolt_trx_preamble *this);
+
+/** Packs a bcmolt_trx_preamble to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_preamble_pack(const bcmolt_trx_preamble *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_preamble from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_preamble_unpack(bcmolt_trx_preamble *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_trx_preamble struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_preamble_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_trx_preamble is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_preamble_bounds_check(const bcmolt_trx_preamble *this);
+
+/** Initializes a bcmolt_trx_rx_configuration struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_trx_rx_configuration_set_default(bcmolt_trx_rx_configuration *this);
+
+/** Packs a bcmolt_trx_rx_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_rx_configuration_pack(const bcmolt_trx_rx_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_trx_rx_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_rx_configuration_unpack(bcmolt_trx_rx_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_trx_rx_configuration struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_rx_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_trx_rx_configuration is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_rx_configuration_bounds_check(const bcmolt_trx_rx_configuration *this);
+
+/** Initializes a bcmolt_u32_list_u32_max_500_hex struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_u32_list_u32_max_500_hex_set_default(bcmolt_u32_list_u32_max_500_hex *this);
+
+/** Packs a bcmolt_u32_list_u32_max_500_hex to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u32_list_u32_max_500_hex_pack(const bcmolt_u32_list_u32_max_500_hex *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_u32_list_u32_max_500_hex would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_u32_list_u32_max_500_hex_get_packed_length(const bcmolt_u32_list_u32_max_500_hex *this);
+
+/** Unpacks a bcmolt_u32_list_u32_max_500_hex from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u32_list_u32_max_500_hex_unpack(bcmolt_u32_list_u32_max_500_hex *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_u32_list_u32_max_500_hex struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_u32_list_u32_max_500_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_u32_list_u32_max_500_hex is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u32_list_u32_max_500_hex_bounds_check(const bcmolt_u32_list_u32_max_500_hex *this);
+
+/** Initializes a bcmolt_u8_list_u16_hex struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_u8_list_u16_hex_set_default(bcmolt_u8_list_u16_hex *this);
+
+/** Packs a bcmolt_u8_list_u16_hex to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_hex_pack(const bcmolt_u8_list_u16_hex *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_u8_list_u16_hex would occupy on the 
+ * wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_u8_list_u16_hex_get_packed_length(const bcmolt_u8_list_u16_hex *this);
+
+/** Unpacks a bcmolt_u8_list_u16_hex from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_hex_unpack(bcmolt_u8_list_u16_hex *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_u8_list_u16_hex struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_u8_list_u16_hex_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_u8_list_u16_hex is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u16_hex_bounds_check(const bcmolt_u8_list_u16_hex *this);
+
+/** Initializes a bcmolt_u8_list_u32 struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_u8_list_u32_set_default(bcmolt_u8_list_u32 *this);
+
+/** Packs a bcmolt_u8_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_pack(const bcmolt_u8_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_u8_list_u32 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_u8_list_u32_get_packed_length(const bcmolt_u8_list_u32 *this);
+
+/** Unpacks a bcmolt_u8_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_unpack(bcmolt_u8_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_u8_list_u32 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_u8_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_u8_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_bounds_check(const bcmolt_u8_list_u32 *this);
+
+/** Initializes a bcmolt_u8_list_u32_max_2048 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_u8_list_u32_max_2048_set_default(bcmolt_u8_list_u32_max_2048 *this);
+
+/** Packs a bcmolt_u8_list_u32_max_2048 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_max_2048_pack(const bcmolt_u8_list_u32_max_2048 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_u8_list_u32_max_2048 would occupy on 
+ * the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_u8_list_u32_max_2048_get_packed_length(const bcmolt_u8_list_u32_max_2048 *this);
+
+/** Unpacks a bcmolt_u8_list_u32_max_2048 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_max_2048_unpack(bcmolt_u8_list_u32_max_2048 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_u8_list_u32_max_2048 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_u8_list_u32_max_2048_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_u8_list_u32_max_2048 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_u8_list_u32_max_2048_bounds_check(const bcmolt_u8_list_u32_max_2048 *this);
+
+/** Initializes a bcmolt_ubd_info struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_ubd_info_set_default(bcmolt_ubd_info *this);
+
+/** Packs a bcmolt_ubd_info to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ubd_info_pack(const bcmolt_ubd_info *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_ubd_info from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ubd_info_unpack(bcmolt_ubd_info *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_ubd_info struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ubd_info_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_ubd_info is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ubd_info_bounds_check(const bcmolt_ubd_info *this);
+
+/** Initializes a bcmolt_upstream_bandwidth_distribution struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_upstream_bandwidth_distribution_set_default(bcmolt_upstream_bandwidth_distribution *this);
+
+/** Packs a bcmolt_upstream_bandwidth_distribution to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_upstream_bandwidth_distribution_pack(const bcmolt_upstream_bandwidth_distribution *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_upstream_bandwidth_distribution from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_upstream_bandwidth_distribution_unpack(bcmolt_upstream_bandwidth_distribution *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_upstream_bandwidth_distribution struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_upstream_bandwidth_distribution_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_upstream_bandwidth_distribution is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_upstream_bandwidth_distribution_bounds_check(const bcmolt_upstream_bandwidth_distribution *this);
+
+/** Initializes a bcmolt_vlan_tag struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_vlan_tag_set_default(bcmolt_vlan_tag *this);
+
+/** Packs a bcmolt_vlan_tag to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_vlan_tag_pack(const bcmolt_vlan_tag *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_vlan_tag from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_vlan_tag_unpack(bcmolt_vlan_tag *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_vlan_tag struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_vlan_tag_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_vlan_tag is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_vlan_tag_bounds_check(const bcmolt_vlan_tag *this);
+
+/** Initializes a bcmolt_xgpon_alloc_with_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_alloc_with_state_set_default(bcmolt_xgpon_alloc_with_state *this);
+
+/** Packs a bcmolt_xgpon_alloc_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_pack(const bcmolt_xgpon_alloc_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_alloc_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_unpack(bcmolt_xgpon_alloc_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_alloc_with_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_bounds_check(const bcmolt_xgpon_alloc_with_state *this);
+
+/** Initializes a bcmolt_xgpon_alloc_with_state_list_u16_max_32 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_alloc_with_state_list_u16_max_32_set_default(bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this);
+
+/** Packs a bcmolt_xgpon_alloc_with_state_list_u16_max_32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_alloc_with_state_list_u16_max_32 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_alloc_with_state_list_u16_max_32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_with_state_list_u16_max_32 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_with_state_list_u16_max_32 is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_with_state_list_u16_max_32_bounds_check(const bcmolt_xgpon_alloc_with_state_list_u16_max_32 *this);
+
+/** Initializes a bcmolt_xgpon_ed_state struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_ed_state_set_default(bcmolt_xgpon_ed_state *this);
+
+/** Packs a bcmolt_xgpon_ed_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ed_state_pack(const bcmolt_xgpon_ed_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ed_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ed_state_unpack(bcmolt_xgpon_ed_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_ed_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ed_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_ed_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ed_state_bounds_check(const bcmolt_xgpon_ed_state *this);
+
+/** Initializes a bcmolt_xgpon_gem_id_list_u8_max_16 struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_gem_id_list_u8_max_16_set_default(bcmolt_xgpon_gem_id_list_u8_max_16 *this);
+
+/** Packs a bcmolt_xgpon_gem_id_list_u8_max_16 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_pack(const bcmolt_xgpon_gem_id_list_u8_max_16 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_id_list_u8_max_16 would 
+ * occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_gem_id_list_u8_max_16_get_packed_length(const bcmolt_xgpon_gem_id_list_u8_max_16 *this);
+
+/** Unpacks a bcmolt_xgpon_gem_id_list_u8_max_16 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_id_list_u8_max_16 struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_gem_id_list_u8_max_16 is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_id_list_u8_max_16_bounds_check(const bcmolt_xgpon_gem_id_list_u8_max_16 *this);
+
+/** Initializes a bcmolt_xgpon_gem_port_with_state struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_gem_port_with_state_set_default(bcmolt_xgpon_gem_port_with_state *this);
+
+/** Packs a bcmolt_xgpon_gem_port_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_pack(const bcmolt_xgpon_gem_port_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_gem_port_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_unpack(bcmolt_xgpon_gem_port_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_with_state struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_bounds_check(const bcmolt_xgpon_gem_port_with_state *this);
+
+/** Initializes a bcmolt_xgpon_gem_port_with_state_list_u16_max_128 struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_gem_port_with_state_list_u16_max_128_set_default(bcmolt_xgpon_gem_port_with_state_list_u16_max_128 *this);
+
+/** Packs a bcmolt_xgpon_gem_port_with_state_list_u16_max_128 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_gem_port_with_state_list_u16_max_128 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_with_state_list_u16_max_128 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_with_state_list_u16_max_128 struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_128_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_with_state_list_u16_max_128 
+ * is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_with_state_list_u16_max_256 struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_gem_port_with_state_list_u16_max_256_set_default(bcmolt_xgpon_gem_port_with_state_list_u16_max_256 *this);
+
+/** Packs a bcmolt_xgpon_gem_port_with_state_list_u16_max_256 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_gem_port_with_state_list_u16_max_256 would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_with_state_list_u16_max_256 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_with_state_list_u16_max_256 struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_with_state_list_u16_max_256_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_with_state_list_u16_max_256 
+ * is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_key_exchange struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_key_exchange_set_default(bcmolt_xgpon_key_exchange *this);
+
+/** Packs a bcmolt_xgpon_key_exchange to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_key_exchange_pack(const bcmolt_xgpon_key_exchange *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_key_exchange from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_key_exchange_unpack(bcmolt_xgpon_key_exchange *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_key_exchange struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_key_exchange_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_key_exchange is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_key_exchange_bounds_check(const bcmolt_xgpon_key_exchange *this);
+
+/** Initializes a bcmolt_xgpon_multicast_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_multicast_key_set_default(bcmolt_xgpon_multicast_key *this);
+
+/** Packs a bcmolt_xgpon_multicast_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_multicast_key_pack(const bcmolt_xgpon_multicast_key *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_multicast_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_multicast_key_unpack(bcmolt_xgpon_multicast_key *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_multicast_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_multicast_key_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_multicast_key is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_multicast_key_bounds_check(const bcmolt_xgpon_multicast_key *this);
+
+/** Initializes a bcmolt_xgpon_ni_debug struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_ni_debug_set_default(bcmolt_xgpon_ni_debug *this);
+
+/** Packs a bcmolt_xgpon_ni_debug to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_debug_pack(const bcmolt_xgpon_ni_debug *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ni_debug from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_debug_unpack(bcmolt_xgpon_ni_debug *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_ni_debug struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_ni_debug is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_debug_bounds_check(const bcmolt_xgpon_ni_debug *this);
+
+/** Initializes a bcmolt_xgpon_onu_activation struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_activation_set_default(bcmolt_xgpon_onu_activation *this);
+
+/** Packs a bcmolt_xgpon_onu_activation to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_activation_pack(const bcmolt_xgpon_onu_activation *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_activation from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_activation_unpack(bcmolt_xgpon_onu_activation *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_activation struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_activation_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_activation is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_activation_bounds_check(const bcmolt_xgpon_onu_activation *this);
+
+/** Initializes a bcmolt_xgpon_onu_aes_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_aes_key_set_default(bcmolt_xgpon_onu_aes_key *this);
+
+/** Packs a bcmolt_xgpon_onu_aes_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_aes_key_pack(const bcmolt_xgpon_onu_aes_key *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_aes_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_aes_key_unpack(bcmolt_xgpon_onu_aes_key *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_aes_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_aes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_aes_key is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_aes_key_bounds_check(const bcmolt_xgpon_onu_aes_key *this);
+
+/** Initializes a bcmolt_xgpon_onu_alarm_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_alarm_state_set_default(bcmolt_xgpon_onu_alarm_state *this);
+
+/** Packs a bcmolt_xgpon_onu_alarm_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarm_state_pack(const bcmolt_xgpon_onu_alarm_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_alarm_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarm_state_unpack(bcmolt_xgpon_onu_alarm_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_alarm_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarm_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_alarm_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarm_state_bounds_check(const bcmolt_xgpon_onu_alarm_state *this);
+
+/** Initializes a bcmolt_xgpon_onu_alarms struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_alarms_set_default(bcmolt_xgpon_onu_alarms *this);
+
+/** Packs a bcmolt_xgpon_onu_alarms to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_pack(const bcmolt_xgpon_onu_alarms *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_alarms from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_unpack(bcmolt_xgpon_onu_alarms *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_alarms struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_alarms is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_bounds_check(const bcmolt_xgpon_onu_alarms *this);
+
+/** Initializes a bcmolt_xgpon_onu_alarms_thresholds struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_alarms_thresholds_set_default(bcmolt_xgpon_onu_alarms_thresholds *this);
+
+/** Packs a bcmolt_xgpon_onu_alarms_thresholds to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_pack(const bcmolt_xgpon_onu_alarms_thresholds *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_alarms_thresholds from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_unpack(bcmolt_xgpon_onu_alarms_thresholds *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_alarms_thresholds struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_alarms_thresholds is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_alarms_thresholds_bounds_check(const bcmolt_xgpon_onu_alarms_thresholds *this);
+
+/** Initializes a bcmolt_xgpon_onu_eqd struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_eqd_set_default(bcmolt_xgpon_onu_eqd *this);
+
+/** Packs a bcmolt_xgpon_onu_eqd to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_pack(const bcmolt_xgpon_onu_eqd *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_eqd from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_unpack(bcmolt_xgpon_onu_eqd *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_eqd struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_eqd is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_bounds_check(const bcmolt_xgpon_onu_eqd *this);
+
+/** Initializes a bcmolt_xgpon_onu_eqd_list_u32 struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_eqd_list_u32_set_default(bcmolt_xgpon_onu_eqd_list_u32 *this);
+
+/** Packs a bcmolt_xgpon_onu_eqd_list_u32 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_pack(const bcmolt_xgpon_onu_eqd_list_u32 *this, bcmolt_buf *buf);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_eqd_list_u32 would occupy 
+ * on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_eqd_list_u32_get_packed_length(const bcmolt_xgpon_onu_eqd_list_u32 *this);
+
+/** Unpacks a bcmolt_xgpon_onu_eqd_list_u32 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_unpack(bcmolt_xgpon_onu_eqd_list_u32 *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_eqd_list_u32 struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_eqd_list_u32 is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_eqd_list_u32_bounds_check(const bcmolt_xgpon_onu_eqd_list_u32 *this);
+
+/** Initializes a bcmolt_xgpon_onu_registration_keys struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_registration_keys_set_default(bcmolt_xgpon_onu_registration_keys *this);
+
+/** Packs a bcmolt_xgpon_onu_registration_keys to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_keys_pack(const bcmolt_xgpon_onu_registration_keys *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_registration_keys from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_keys_unpack(bcmolt_xgpon_onu_registration_keys *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_registration_keys struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_keys_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_registration_keys is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_keys_bounds_check(const bcmolt_xgpon_onu_registration_keys *this);
+
+/** Initializes a bcmolt_xgpon_onu_with_state struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_with_state_set_default(bcmolt_xgpon_onu_with_state *this);
+
+/** Packs a bcmolt_xgpon_onu_with_state to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_pack(const bcmolt_xgpon_onu_with_state *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_onu_with_state from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_unpack(bcmolt_xgpon_onu_with_state *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_onu_with_state struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_with_state is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_bounds_check(const bcmolt_xgpon_onu_with_state *this);
+
+/** Initializes a bcmolt_xgpon_onu_with_state_list_u16_max_510 struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_onu_with_state_list_u16_max_510_set_default(bcmolt_xgpon_onu_with_state_list_u16_max_510 *this);
+
+/** Packs a bcmolt_xgpon_onu_with_state_list_u16_max_510 to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_with_state_list_u16_max_510 
+ * would occupy on the wire 
+ *
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_with_state_list_u16_max_510 from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_with_state_list_u16_max_510 struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_onu_with_state_list_u16_max_510 is 
+ * out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_with_state_list_u16_max_510_bounds_check(const bcmolt_xgpon_onu_with_state_list_u16_max_510 *this);
+
+/** Initializes a bcmolt_xgpon_ploam_handling struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_ploam_handling_set_default(bcmolt_xgpon_ploam_handling *this);
+
+/** Packs a bcmolt_xgpon_ploam_handling to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ploam_handling_pack(const bcmolt_xgpon_ploam_handling *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_ploam_handling from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ploam_handling_unpack(bcmolt_xgpon_ploam_handling *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_ploam_handling struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ploam_handling_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_ploam_handling is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ploam_handling_bounds_check(const bcmolt_xgpon_ploam_handling *this);
+
+/** Initializes a bcmolt_xgpon_protection_switching struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_protection_switching_set_default(bcmolt_xgpon_protection_switching *this);
+
+/** Packs a bcmolt_xgpon_protection_switching to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_pack(const bcmolt_xgpon_protection_switching *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_protection_switching from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_unpack(bcmolt_xgpon_protection_switching *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_protection_switching struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_protection_switching is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_bounds_check(const bcmolt_xgpon_protection_switching *this);
+
+/** Initializes a bcmolt_xgpon_protection_switching_debug struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_protection_switching_debug_set_default(bcmolt_xgpon_protection_switching_debug *this);
+
+/** Packs a bcmolt_xgpon_protection_switching_debug to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_debug_pack(const bcmolt_xgpon_protection_switching_debug *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_protection_switching_debug from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_debug_unpack(bcmolt_xgpon_protection_switching_debug *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_protection_switching_debug struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_protection_switching_debug is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_protection_switching_debug_bounds_check(const bcmolt_xgpon_protection_switching_debug *this);
+
+/** Initializes a bcmolt_xgpon_rssi_normal_config struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_rssi_normal_config_set_default(bcmolt_xgpon_rssi_normal_config *this);
+
+/** Packs a bcmolt_xgpon_rssi_normal_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_normal_config_pack(const bcmolt_xgpon_rssi_normal_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_rssi_normal_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_normal_config_unpack(bcmolt_xgpon_rssi_normal_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_rssi_normal_config struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_rssi_normal_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_rssi_normal_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_normal_config_bounds_check(const bcmolt_xgpon_rssi_normal_config *this);
+
+/** Initializes a bcmolt_xgpon_rssi_ranging_config struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_rssi_ranging_config_set_default(bcmolt_xgpon_rssi_ranging_config *this);
+
+/** Packs a bcmolt_xgpon_rssi_ranging_config to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_ranging_config_pack(const bcmolt_xgpon_rssi_ranging_config *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_rssi_ranging_config from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_ranging_config_unpack(bcmolt_xgpon_rssi_ranging_config *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_rssi_ranging_config struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_rssi_ranging_config_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_rssi_ranging_config is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rssi_ranging_config_bounds_check(const bcmolt_xgpon_rssi_ranging_config *this);
+
+/** Initializes a bcmolt_xgpon_rx_ranging_sm_pattern struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_rx_ranging_sm_pattern_set_default(bcmolt_xgpon_rx_ranging_sm_pattern *this);
+
+/** Packs a bcmolt_xgpon_rx_ranging_sm_pattern to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_pack(const bcmolt_xgpon_rx_ranging_sm_pattern *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_rx_ranging_sm_pattern from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_unpack(bcmolt_xgpon_rx_ranging_sm_pattern *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_rx_ranging_sm_pattern struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_rx_ranging_sm_pattern is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_rx_ranging_sm_pattern_bounds_check(const bcmolt_xgpon_rx_ranging_sm_pattern *this);
+
+/** Initializes a bcmolt_xgpon_serdes_configuration struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_serdes_configuration_set_default(bcmolt_xgpon_serdes_configuration *this);
+
+/** Packs a bcmolt_xgpon_serdes_configuration to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_serdes_configuration_pack(const bcmolt_xgpon_serdes_configuration *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_serdes_configuration from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_serdes_configuration_unpack(bcmolt_xgpon_serdes_configuration *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_serdes_configuration struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_serdes_configuration_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_serdes_configuration is out of 
+ * bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_serdes_configuration_bounds_check(const bcmolt_xgpon_serdes_configuration *this);
+
+/** Initializes a bcmolt_xgpon_sn_acquisition struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_sn_acquisition_set_default(bcmolt_xgpon_sn_acquisition *this);
+
+/** Packs a bcmolt_xgpon_sn_acquisition to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_sn_acquisition_pack(const bcmolt_xgpon_sn_acquisition *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_sn_acquisition from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_sn_acquisition_unpack(bcmolt_xgpon_sn_acquisition *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_sn_acquisition struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_sn_acquisition_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_sn_acquisition is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_sn_acquisition_bounds_check(const bcmolt_xgpon_sn_acquisition *this);
+
+/** Initializes a bcmolt_xgpon_trx_debug struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ */
+void bcmolt_xgpon_trx_debug_set_default(bcmolt_xgpon_trx_debug *this);
+
+/** Packs a bcmolt_xgpon_trx_debug to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_debug_pack(const bcmolt_xgpon_trx_debug *this, bcmolt_buf *buf);
+
+/** Unpacks a bcmolt_xgpon_trx_debug from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_debug_unpack(bcmolt_xgpon_trx_debug *this, bcmolt_buf *buf, void **extra_mem);
+
+/** Scans past a packed bcmolt_xgpon_trx_debug struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_trx_debug_scan(bcmolt_buf *packed, uint32_t *extra_mem);
+
+/** Checks if any field in the bcmolt_xgpon_trx_debug is out of bounds 
+ *
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_debug_bounds_check(const bcmolt_xgpon_trx_debug *this);
+
+/** Initializes a bcmolt_ae_ni_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_ni_key_set_default(bcmolt_ae_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_ni_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ae_ni_key_pack(const bcmolt_ae_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_ae_ni_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_ni_key_get_packed_length(const bcmolt_ae_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_ni_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ae_ni_key_unpack(bcmolt_ae_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_ae_ni_key struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_ni_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_ni_cfg_data struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_ni_cfg_data_set_default(bcmolt_ae_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_ni_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ae_ni_cfg_data_pack(const bcmolt_ae_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_ae_ni_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_ni_cfg_data_get_packed_length(const bcmolt_ae_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_ni_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_ni_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_ni_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_ni_set_ae_ni_en_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_ae_ni_set_ae_ni_en_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_ni_set_ae_ni_en_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_ni_set_ae_ni_en_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_ni_set_ae_ni_en_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_ni_set_ae_ni_en_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_ni_set_ae_ni_en_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_ds_key_set_default(bcmolt_ae_path_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_ds_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ae_path_ds_key_pack(const bcmolt_ae_path_ds_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_path_ds_key_get_packed_length(const bcmolt_ae_path_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_path_ds_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_ds_stat_data_set_default(bcmolt_ae_path_ds_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_ds_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_path_ds_stat_data_get_packed_length(const bcmolt_ae_path_ds_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_ds_stat_cfg_data_set_default(bcmolt_ae_path_ds_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_ds_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_ae_path_ds_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_stat_alarm_raised_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_ae_path_ds_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_ds_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_stat_alarm_raised_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_ds_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_ds_auto_cfg_data_set_default(bcmolt_ae_path_ds_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_ds_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_ds_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_ds_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_ds_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_ds_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_us_key_set_default(bcmolt_ae_path_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_us_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_ae_path_us_key_pack(const bcmolt_ae_path_us_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_path_us_key_get_packed_length(const bcmolt_ae_path_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_path_us_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_us_stat_data_set_default(bcmolt_ae_path_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_us_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_ae_path_us_stat_data_get_packed_length(const bcmolt_ae_path_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_ae_path_us_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_us_stat_cfg_data_set_default(bcmolt_ae_path_us_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_us_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_us_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_ae_path_us_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_us_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_stat_alarm_raised_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_ae_path_us_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_us_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_stat_alarm_raised_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_ae_path_us_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_ae_path_us_auto_cfg_data_set_default(bcmolt_ae_path_us_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_ae_path_us_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_ae_path_us_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_ae_path_us_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_ae_path_us_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_ae_path_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_ae_path_us_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_channel_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_channel_key_set_default(bcmolt_channel_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_channel_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_key_pack(const bcmolt_channel_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_channel_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_channel_key_get_packed_length(const bcmolt_channel_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_channel_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_key_unpack(bcmolt_channel_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_channel_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_channel_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_channel_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_key_bounds_check(const bcmolt_channel_key *this, bcmolt_presence_mask fields_present, bcmolt_channel_key_id *failed_prop);
+
+/** Initializes a bcmolt_channel_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_channel_cfg_data_set_default(bcmolt_channel_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_channel_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_cfg_data_pack(const bcmolt_channel_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_channel_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_channel_cfg_data_get_packed_length(const bcmolt_channel_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_channel_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_channel_cfg_data_unpack(bcmolt_channel_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_channel_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_channel_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_channel_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_debug_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_debug_key_set_default(bcmolt_debug_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_debug_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_key_pack(const bcmolt_debug_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_debug_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_debug_key_get_packed_length(const bcmolt_debug_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_debug_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_key_unpack(bcmolt_debug_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_debug_key struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_debug_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_key_bounds_check(const bcmolt_debug_key *this, bcmolt_presence_mask fields_present, bcmolt_debug_key_id *failed_prop);
+
+/** Initializes a bcmolt_debug_cfg_data struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_debug_cfg_data_set_default(bcmolt_debug_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_debug_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_cfg_data_pack(const bcmolt_debug_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_debug_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_debug_cfg_data_get_packed_length(const bcmolt_debug_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_debug_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_cfg_data_unpack(bcmolt_debug_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_debug_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_debug_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_debug_cli_output_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_debug_cli_output_data_set_default(bcmolt_debug_cli_output_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_debug_cli_output_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_cli_output_data_pack(const bcmolt_debug_cli_output_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_debug_cli_output_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_debug_cli_output_data_get_packed_length(const bcmolt_debug_cli_output_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_debug_cli_output_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_debug_cli_output_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_cli_output_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_debug_cli_output_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_debug_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_debug_auto_cfg_data_set_default(bcmolt_debug_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_debug_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_auto_cfg_data_pack(const bcmolt_debug_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_debug_auto_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_debug_auto_cfg_data_get_packed_length(const bcmolt_debug_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_debug_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_debug_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_debug_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_debug_cli_input_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_debug_cli_input_data_set_default(bcmolt_debug_cli_input_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_debug_cli_input_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_debug_cli_input_data_pack(const bcmolt_debug_cli_input_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_debug_cli_input_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_debug_cli_input_data_get_packed_length(const bcmolt_debug_cli_input_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_debug_cli_input_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_debug_cli_input_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_debug_cli_input_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_debug_cli_input_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_key_set_default(bcmolt_device_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_key_pack(const bcmolt_device_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_key_get_packed_length(const bcmolt_device_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_key_unpack(bcmolt_device_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_device_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_key_bounds_check(const bcmolt_device_key *this, bcmolt_presence_mask fields_present, bcmolt_device_key_id *failed_prop);
+
+/** Initializes a bcmolt_device_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_cfg_data_set_default(bcmolt_device_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_cfg_data_pack(const bcmolt_device_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_cfg_data_get_packed_length(const bcmolt_device_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_cfg_data_unpack(bcmolt_device_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_device_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_connection_complete_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_connection_complete_data_set_default(bcmolt_device_connection_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_connection_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_connection_complete_data_pack(const bcmolt_device_connection_complete_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_connection_complete_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_connection_complete_data_get_packed_length(const bcmolt_device_connection_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_connection_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_connection_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_connection_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_connection_complete_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_connection_failure_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_connection_failure_data_set_default(bcmolt_device_connection_failure_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_connection_failure_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_connection_failure_data_pack(const bcmolt_device_connection_failure_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_connection_failure_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_connection_failure_data_get_packed_length(const bcmolt_device_connection_failure_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_connection_failure_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_connection_failure_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_connection_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_connection_failure_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_ddr_test_complete_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_ddr_test_complete_data_set_default(bcmolt_device_ddr_test_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_ddr_test_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_ddr_test_complete_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_ddr_test_complete_data_get_packed_length(const bcmolt_device_ddr_test_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_ddr_test_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_ddr_test_complete_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_ddr_test_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_ddr_test_complete_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_device_keep_alive_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_device_keep_alive_data_set_default(bcmolt_device_device_keep_alive_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_device_keep_alive_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_device_keep_alive_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_device_keep_alive_data_get_packed_length(const bcmolt_device_device_keep_alive_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_device_keep_alive_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_device_keep_alive_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_device_keep_alive_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_device_keep_alive_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_device_ready_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_device_ready_data_set_default(bcmolt_device_device_ready_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_device_ready_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_device_ready_data_pack(const bcmolt_device_device_ready_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_device_ready_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_device_ready_data_get_packed_length(const bcmolt_device_device_ready_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_device_ready_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_device_ready_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_device_ready_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_device_ready_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_image_transfer_complete_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_image_transfer_complete_data_set_default(bcmolt_device_image_transfer_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_image_transfer_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_image_transfer_complete_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_image_transfer_complete_data_get_packed_length(const bcmolt_device_image_transfer_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_image_transfer_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_image_transfer_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_image_transfer_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_image_transfer_complete_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_indications_dropped_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_indications_dropped_data_set_default(bcmolt_device_indications_dropped_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_indications_dropped_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_indications_dropped_data_pack(const bcmolt_device_indications_dropped_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_indications_dropped_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_indications_dropped_data_get_packed_length(const bcmolt_device_indications_dropped_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_indications_dropped_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_indications_dropped_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_indications_dropped_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_indications_dropped_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_sw_error_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_sw_error_data_set_default(bcmolt_device_sw_error_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_sw_error_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_sw_error_data_pack(const bcmolt_device_sw_error_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_sw_error_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_sw_error_data_get_packed_length(const bcmolt_device_sw_error_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_sw_error_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_sw_error_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_sw_error_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_sw_error_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_sw_exception_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_sw_exception_data_set_default(bcmolt_device_sw_exception_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_sw_exception_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_sw_exception_data_pack(const bcmolt_device_sw_exception_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_sw_exception_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_sw_exception_data_get_packed_length(const bcmolt_device_sw_exception_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_sw_exception_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_sw_exception_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_sw_exception_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_sw_exception_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_auto_cfg_data_set_default(bcmolt_device_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_auto_cfg_data_pack(const bcmolt_device_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_auto_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_auto_cfg_data_get_packed_length(const bcmolt_device_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_host_keep_alive_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_host_keep_alive_data_set_default(bcmolt_device_host_keep_alive_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_host_keep_alive_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_host_keep_alive_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_host_keep_alive_data_get_packed_length(const bcmolt_device_host_keep_alive_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_host_keep_alive_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_host_keep_alive_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_host_keep_alive_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_host_keep_alive_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_image_transfer_data_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_image_transfer_data_data_set_default(bcmolt_device_image_transfer_data_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_image_transfer_data_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_image_transfer_data_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_image_transfer_data_data_get_packed_length(const bcmolt_device_image_transfer_data_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_image_transfer_data_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_image_transfer_data_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_image_transfer_data_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_image_transfer_data_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_image_transfer_start_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_image_transfer_start_data_set_default(bcmolt_device_image_transfer_start_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_image_transfer_start_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_image_transfer_start_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_image_transfer_start_data_get_packed_length(const bcmolt_device_image_transfer_start_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_image_transfer_start_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_image_transfer_start_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_image_transfer_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_image_transfer_start_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_reset_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_reset_data_set_default(bcmolt_device_reset_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_reset_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_reset_data_pack(const bcmolt_device_reset_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_device_reset_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_reset_data_get_packed_length(const bcmolt_device_reset_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_reset_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_device_reset_data_unpack(bcmolt_device_reset_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_device_reset_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_reset_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_reset_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_device_run_ddr_test_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_device_run_ddr_test_data_set_default(bcmolt_device_run_ddr_test_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_device_run_ddr_test_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_device_run_ddr_test_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_device_run_ddr_test_data_get_packed_length(const bcmolt_device_run_ddr_test_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_device_run_ddr_test_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_device_run_ddr_test_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_device_run_ddr_test_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_device_run_ddr_test_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_denied_link_key_set_default(bcmolt_epon_denied_link_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_denied_link_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_denied_link_key_pack(const bcmolt_epon_denied_link_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_denied_link_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_denied_link_key_get_packed_length(const bcmolt_epon_denied_link_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_denied_link_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_denied_link_cfg_data_set_default(bcmolt_epon_denied_link_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_denied_link_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_denied_link_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_denied_link_cfg_data_get_packed_length(const bcmolt_epon_denied_link_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_denied_link_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_laser_on_off_violation_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_laser_on_off_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_laser_on_off_violation_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_laser_on_off_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_laser_on_off_violation_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_laser_on_off_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_laser_on_off_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_llid_pool_empty_violation_data struct. 
+ *  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_llid_pool_empty_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_llid_pool_empty_violation_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_llid_pool_empty_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_llid_pool_empty_violation_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_llid_pool_empty_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_llid_pool_empty_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_max_link_violation_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_max_link_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_max_link_violation_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_max_link_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_max_link_violation_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_max_link_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_max_link_violation_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_overhead_profile_violation_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_overhead_profile_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_overhead_profile_violation_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_overhead_profile_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_overhead_profile_violation_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_overhead_profile_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_overhead_profile_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_range_violation_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_denied_link_range_violation_data_set_default(bcmolt_epon_denied_link_range_violation_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_denied_link_range_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_denied_link_range_violation_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_range_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_range_violation_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_range_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_range_violation_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_rogue_violation_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_denied_link_rogue_violation_data_set_default(bcmolt_epon_denied_link_rogue_violation_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_denied_link_rogue_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_denied_link_rogue_violation_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_rogue_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_rogue_violation_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_rogue_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_rogue_violation_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_system_resource_violation_data struct. 
+ *  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_system_resource_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_system_resource_violation_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_system_resource_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_system_resource_violation_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_system_resource_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_system_resource_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_tdm_channels_exhausted_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_tdm_channels_exhausted_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_tdm_channels_exhausted_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_tdm_channels_exhausted_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_tdm_channels_exhausted_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_tdm_channels_exhausted_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_tdm_channels_exhausted_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_unknown_link_violation_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_unknown_link_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_unknown_link_violation_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_unknown_link_violation_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_unknown_link_violation_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_unknown_link_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_unknown_link_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_upstream_bandwidth_violation_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_denied_link_upstream_bandwidth_violation_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_denied_link_upstream_bandwidth_violation_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_upstream_bandwidth_violation_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_epon_denied_link_upstream_bandwidth_violation_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_upstream_bandwidth_violation_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_denied_link_upstream_bandwidth_violation_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_denied_link_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_denied_link_auto_cfg_data_set_default(bcmolt_epon_denied_link_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_denied_link_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_denied_link_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_denied_link_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_denied_link_auto_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_denied_link_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_denied_link_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_key_set_default(bcmolt_epon_link_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_key_pack(const bcmolt_epon_link_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_link_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_key_get_packed_length(const bcmolt_epon_link_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_key_unpack(bcmolt_epon_link_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_epon_link_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_cfg_data_set_default(bcmolt_epon_link_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_cfg_data_pack(const bcmolt_epon_link_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_link_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_cfg_data_get_packed_length(const bcmolt_epon_link_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_stat_data_set_default(bcmolt_epon_link_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_link_stat_data_pack(const bcmolt_epon_link_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_link_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_stat_data_get_packed_length(const bcmolt_epon_link_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_stat_cfg_data_set_default(bcmolt_epon_link_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_stat_cfg_data_get_packed_length(const bcmolt_epon_link_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_duplicate_mpcp_registration_request_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_link_duplicate_mpcp_registration_request_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_link_duplicate_mpcp_registration_request_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_duplicate_mpcp_registration_request_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_epon_link_duplicate_mpcp_registration_request_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_duplicate_mpcp_registration_request_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_link_duplicate_mpcp_registration_request_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_key_exchange_failure_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_key_exchange_failure_data_set_default(bcmolt_epon_link_key_exchange_failure_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_key_exchange_failure_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_key_exchange_failure_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_failure_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_key_exchange_failure_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_key_exchange_failure_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_link_speed_mismatch_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_link_speed_mismatch_data_set_default(bcmolt_epon_link_link_speed_mismatch_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_link_speed_mismatch_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_link_speed_mismatch_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_link_speed_mismatch_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_link_speed_mismatch_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_link_speed_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_link_speed_mismatch_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_mpcp_discovered_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_mpcp_discovered_data_set_default(bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_mpcp_discovered_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_mpcp_discovered_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_mpcp_discovered_data_get_packed_length(const bcmolt_epon_link_mpcp_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_mpcp_discovered_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_mpcp_discovered_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_mpcp_discovered_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_mpcp_report_timeout_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_mpcp_report_timeout_data_set_default(bcmolt_epon_link_mpcp_report_timeout_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_mpcp_report_timeout_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_mpcp_report_timeout_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_mpcp_report_timeout_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_mpcp_report_timeout_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_mpcp_report_timeout_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_mpcp_report_timeout_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_oam_keepalive_timeout_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_oam_keepalive_timeout_data_set_default(bcmolt_epon_link_oam_keepalive_timeout_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timeout_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_oam_keepalive_timeout_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timeout_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_oam_keepalive_timeout_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timeout_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_oam_keepalive_timeout_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_preprovisioned_link_created_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_preprovisioned_link_created_data_set_default(bcmolt_epon_link_preprovisioned_link_created_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_preprovisioned_link_created_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_link_preprovisioned_link_created_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_preprovisioned_link_created_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_preprovisioned_link_created_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_preprovisioned_link_created_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_preprovisioned_link_created_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_protection_switch_occurred_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_protection_switch_occurred_data_set_default(bcmolt_epon_link_protection_switch_occurred_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_protection_switch_occurred_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_link_protection_switch_occurred_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_protection_switch_occurred_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_protection_switch_occurred_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_protection_switch_occurred_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_protection_switch_occurred_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_range_value_changed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_range_value_changed_data_set_default(bcmolt_epon_link_range_value_changed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_range_value_changed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_range_value_changed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_range_value_changed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_range_value_changed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_range_value_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_range_value_changed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_stat_alarm_cleared_data_set_default(bcmolt_epon_link_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_stat_alarm_raised_data_set_default(bcmolt_epon_link_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_auto_cfg_data_set_default(bcmolt_epon_link_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_auto_cfg_data_get_packed_length(const bcmolt_epon_link_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_key_exchange_start_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_key_exchange_start_data_set_default(bcmolt_epon_link_key_exchange_start_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_key_exchange_start_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_key_exchange_start_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_key_exchange_start_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_key_exchange_start_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_key_exchange_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_key_exchange_start_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_oam_keepalive_timer_start_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_link_oam_keepalive_timer_start_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_link_oam_keepalive_timer_start_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_link_oam_keepalive_timer_start_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_oam_keepalive_timer_start_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_oam_keepalive_timer_start_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_oam_keepalive_timer_start_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_static_registration_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_static_registration_data_set_default(bcmolt_epon_link_static_registration_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_static_registration_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_static_registration_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_static_registration_data_get_packed_length(const bcmolt_epon_link_static_registration_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_static_registration_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_static_registration_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_static_registration_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_static_registration_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_inject_frame_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_inject_frame_data_set_default(bcmolt_epon_link_inject_frame_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_inject_frame_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_inject_frame_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_inject_frame_data_get_packed_length(const bcmolt_epon_link_inject_frame_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_inject_frame_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_inject_frame_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_inject_frame_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_inject_frame_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_link_frame_captured_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_link_frame_captured_data_set_default(bcmolt_epon_link_frame_captured_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_link_frame_captured_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_link_frame_captured_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_link_frame_captured_data_get_packed_length(const bcmolt_epon_link_frame_captured_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_link_frame_captured_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_link_frame_captured_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_link_frame_captured_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_link_frame_captured_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_key_set_default(bcmolt_epon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_key_pack(const bcmolt_epon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_key_get_packed_length(const bcmolt_epon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_key_unpack(bcmolt_epon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_epon_ni_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_cfg_data_set_default(bcmolt_epon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_ni_cfg_data_pack(const bcmolt_epon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_cfg_data_get_packed_length(const bcmolt_epon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_llid_quarantined_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_llid_quarantined_data_set_default(bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_llid_quarantined_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_llid_quarantined_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_llid_quarantined_data_get_packed_length(const bcmolt_epon_ni_llid_quarantined_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_llid_quarantined_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_llid_quarantined_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_llid_quarantined_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_llid_quarantined_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_mpcp_timestamp_changed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_mpcp_timestamp_changed_data_set_default(bcmolt_epon_ni_mpcp_timestamp_changed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_mpcp_timestamp_changed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_mpcp_timestamp_changed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_mpcp_timestamp_changed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_mpcp_timestamp_changed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_mpcp_timestamp_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_mpcp_timestamp_changed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_no_reports_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_no_reports_data_set_default(bcmolt_epon_ni_no_reports_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_no_reports_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_no_reports_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_no_reports_data_get_packed_length(const bcmolt_epon_ni_no_reports_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_no_reports_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_no_reports_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_no_reports_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_no_reports_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_onu_upgrade_complete_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_onu_upgrade_complete_data_set_default(bcmolt_epon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_onu_upgrade_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_onu_upgrade_complete_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_onu_upgrade_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_onu_upgrade_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_onu_upgrade_complete_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_rogue_scan_complete_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_rogue_scan_complete_data_set_default(bcmolt_epon_ni_rogue_scan_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_rogue_scan_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_rogue_scan_complete_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_rogue_scan_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_rogue_scan_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_scan_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_rogue_scan_complete_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_rssi_measurement_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_rssi_measurement_completed_data_set_default(bcmolt_epon_ni_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_rssi_measurement_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_ni_rssi_measurement_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_rssi_measurement_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_rssi_measurement_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_rssi_measurement_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_state_change_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_state_change_completed_data_set_default(bcmolt_epon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_state_change_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_state_change_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_state_change_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_state_change_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_state_change_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_auto_cfg_data_set_default(bcmolt_epon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_auto_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_auto_cfg_data_get_packed_length(const bcmolt_epon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_add_link_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_add_link_data_set_default(bcmolt_epon_ni_add_link_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_add_link_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_add_link_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_ni_add_link_data_get_packed_length(const bcmolt_epon_ni_add_link_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_ni_add_link_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_add_link_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_add_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_add_link_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_add_multicast_link_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_add_multicast_link_data_set_default(bcmolt_epon_ni_add_multicast_link_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_add_multicast_link_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_add_multicast_link_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_add_multicast_link_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_add_multicast_link_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_add_multicast_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_add_multicast_link_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_add_protected_standby_link_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_add_protected_standby_link_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_ni_add_protected_standby_link_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_add_protected_standby_link_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_add_protected_standby_link_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_add_protected_standby_link_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_add_protected_standby_link_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_issue_rssi_grant_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_issue_rssi_grant_data_set_default(bcmolt_epon_ni_issue_rssi_grant_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_issue_rssi_grant_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_issue_rssi_grant_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_issue_rssi_grant_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_issue_rssi_grant_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_issue_rssi_grant_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_issue_rssi_grant_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_protection_switching_apply_rerange_delta_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_protection_switching_apply_rerange_delta_data to 
+ * bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_ni_protection_switching_apply_rerange_delta_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_protection_switching_apply_rerange_delta_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_epon_ni_protection_switching_apply_rerange_delta_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_epon_ni_protection_switching_apply_rerange_delta_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_rogue_llid_scan_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_rogue_llid_scan_data_set_default(bcmolt_epon_ni_rogue_llid_scan_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_rogue_llid_scan_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_rogue_llid_scan_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_rogue_llid_scan_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_rogue_llid_scan_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_rogue_llid_scan_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_rogue_llid_scan_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_set_epon_ni_en_state_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_ni_set_epon_ni_en_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_set_epon_ni_en_state_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_set_epon_ni_en_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_set_epon_ni_en_state_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_set_epon_ni_en_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_set_epon_ni_en_state_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_ni_start_onu_upgrade_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_ni_start_onu_upgrade_data_set_default(bcmolt_epon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_ni_start_onu_upgrade_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_ni_start_onu_upgrade_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_ni_start_onu_upgrade_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_ni_start_onu_upgrade_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_ni_start_onu_upgrade_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_10g_us_key_set_default(bcmolt_epon_onu_10g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_10g_us_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_10g_us_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_onu_10g_us_key_get_packed_length(const bcmolt_epon_onu_10g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_10g_us_cfg_data_set_default(bcmolt_epon_onu_10g_us_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_10g_us_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_10g_us_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_10g_us_stat_data_set_default(bcmolt_epon_onu_10g_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_10g_us_stat_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_10g_us_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_onu_10g_us_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_stat_alarm_cleared_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_onu_10g_us_stat_alarm_raised_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_10g_us_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_10g_us_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_10g_us_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_10g_us_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_10g_us_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_10g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_10g_us_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_1g_us_key_set_default(bcmolt_epon_onu_1g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_1g_us_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_onu_1g_us_key_get_packed_length(const bcmolt_epon_onu_1g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_1g_us_cfg_data_set_default(bcmolt_epon_onu_1g_us_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_1g_us_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_onu_1g_us_stat_data_set_default(bcmolt_epon_onu_1g_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_stat_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_onu_1g_us_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_onu_1g_us_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_onu_1g_us_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_onu_1g_us_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_onu_1g_us_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_onu_1g_us_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_onu_1g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_onu_1g_us_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_ds_key_set_default(bcmolt_epon_path_10g_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_ds_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_ds_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_path_10g_ds_key_get_packed_length(const bcmolt_epon_path_10g_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_ds_cfg_data_set_default(bcmolt_epon_path_10g_ds_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_ds_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_ds_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_stat_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_ds_stat_data_set_default(bcmolt_epon_path_10g_ds_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_ds_stat_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_stat_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_ds_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_stat_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_10g_ds_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_stat_alarm_cleared_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_stat_alarm_cleared_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_10g_ds_stat_alarm_raised_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_stat_alarm_raised_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_ds_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_ds_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_ds_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_ds_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_ds_auto_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_ds_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_us_key_set_default(bcmolt_epon_path_10g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_us_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_us_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_path_10g_us_key_get_packed_length(const bcmolt_epon_path_10g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_path_10g_us_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_us_cfg_data_set_default(bcmolt_epon_path_10g_us_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_us_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_us_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_stat_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_10g_us_stat_data_set_default(bcmolt_epon_path_10g_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_us_stat_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_stat_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_us_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_stat_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_10g_us_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_stat_alarm_cleared_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_stat_alarm_cleared_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_10g_us_stat_alarm_raised_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_stat_alarm_raised_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_10g_us_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_10g_us_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_10g_us_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_10g_us_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_10g_us_auto_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_10g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_10g_us_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_ds_key_set_default(bcmolt_epon_path_1g_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_ds_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_ds_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_path_1g_ds_key_get_packed_length(const bcmolt_epon_path_1g_ds_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_ds_cfg_data_set_default(bcmolt_epon_path_1g_ds_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_ds_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_ds_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_ds_stat_data_set_default(bcmolt_epon_path_1g_ds_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_ds_stat_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_ds_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_1g_ds_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_stat_alarm_cleared_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_1g_ds_stat_alarm_raised_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_ds_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_ds_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_ds_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_ds_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_ds_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_ds_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_ds_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_us_key_set_default(bcmolt_epon_path_1g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_us_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_us_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_path_1g_us_key_get_packed_length(const bcmolt_epon_path_1g_us_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_path_1g_us_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_us_cfg_data_set_default(bcmolt_epon_path_1g_us_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_us_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_us_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_path_1g_us_stat_data_set_default(bcmolt_epon_path_1g_us_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_us_stat_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_us_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_1g_us_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_stat_alarm_cleared_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_epon_path_1g_us_stat_alarm_raised_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_path_1g_us_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_epon_path_1g_us_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_epon_path_1g_us_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_epon_path_1g_us_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_path_1g_us_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_path_1g_us_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_path_1g_us_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_rp_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_rp_key_set_default(bcmolt_epon_rp_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_rp_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_rp_key_pack(const bcmolt_epon_rp_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_rp_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_rp_key_get_packed_length(const bcmolt_epon_rp_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_rp_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_rp_key_unpack(bcmolt_epon_rp_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_epon_rp_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_rp_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_rp_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_epon_rp_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_epon_rp_cfg_data_set_default(bcmolt_epon_rp_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_epon_rp_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_epon_rp_cfg_data_pack(const bcmolt_epon_rp_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_epon_rp_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_epon_rp_cfg_data_get_packed_length(const bcmolt_epon_rp_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_epon_rp_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_epon_rp_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_epon_rp_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_epon_rp_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpio_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpio_key_set_default(bcmolt_gpio_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpio_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpio_key_pack(const bcmolt_gpio_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpio_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpio_key_get_packed_length(const bcmolt_gpio_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpio_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpio_key_unpack(bcmolt_gpio_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpio_key struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpio_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpio_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpio_key_bounds_check(const bcmolt_gpio_key *this, bcmolt_presence_mask fields_present, bcmolt_gpio_key_id *failed_prop);
+
+/** Initializes a bcmolt_gpio_cfg_data struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpio_cfg_data_set_default(bcmolt_gpio_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpio_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpio_cfg_data_pack(const bcmolt_gpio_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpio_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpio_cfg_data_get_packed_length(const bcmolt_gpio_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpio_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpio_cfg_data_unpack(bcmolt_gpio_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpio_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpio_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpio_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_key_set_default(bcmolt_gpon_alloc_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_key_pack(const bcmolt_gpon_alloc_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_key_get_packed_length(const bcmolt_gpon_alloc_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_key_unpack(bcmolt_gpon_alloc_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpon_alloc_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_cfg_data_set_default(bcmolt_gpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_cfg_data_pack(const bcmolt_gpon_alloc_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_cfg_data_get_packed_length(const bcmolt_gpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_stat_data_set_default(bcmolt_gpon_alloc_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_data_pack(const bcmolt_gpon_alloc_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_stat_data_get_packed_length(const bcmolt_gpon_alloc_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_stat_cfg_data_set_default(bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_stat_cfg_data_get_packed_length(const bcmolt_gpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_configuration_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_configuration_completed_data_set_default(bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_configuration_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_alloc_configuration_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_configuration_completed_data_get_packed_length(const bcmolt_gpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_configuration_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_configuration_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_configuration_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_get_alloc_stats_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_alloc_get_alloc_stats_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_alloc_get_alloc_stats_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_alloc_get_alloc_stats_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_get_alloc_stats_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_alloc_stats_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_get_alloc_stats_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_stat_alarm_cleared_data_set_default(bcmolt_gpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_stat_alarm_raised_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_stat_alarm_raised_data_set_default(bcmolt_gpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_alloc_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_stat_alarm_raised_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_auto_cfg_data_set_default(bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_auto_cfg_data_get_packed_length(const bcmolt_gpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_get_stats_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_get_stats_data_set_default(bcmolt_gpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_get_stats_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_get_stats_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_get_stats_data_get_packed_length(const bcmolt_gpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_get_stats_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_get_stats_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_get_stats_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_get_stats_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_alloc_set_state_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_alloc_set_state_data_set_default(bcmolt_gpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_alloc_set_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_alloc_set_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_alloc_set_state_data_get_packed_length(const bcmolt_gpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_alloc_set_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_alloc_set_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_alloc_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_alloc_set_state_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_key_set_default(bcmolt_gpon_gem_port_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_gem_port_key_pack(const bcmolt_gpon_gem_port_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_gem_port_key_get_packed_length(const bcmolt_gpon_gem_port_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_gem_port_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_cfg_data_set_default(bcmolt_gpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_gem_port_cfg_data_get_packed_length(const bcmolt_gpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_gem_port_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_stat_data_set_default(bcmolt_gpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_stat_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_gem_port_stat_data_get_packed_length(const bcmolt_gpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_stat_cfg_data_set_default(bcmolt_gpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_configuration_completed_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_configuration_completed_data_set_default(bcmolt_gpon_gem_port_configuration_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_configuration_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_gem_port_configuration_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_configuration_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_configuration_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_configuration_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_gem_port_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_stat_alarm_raised_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_gem_port_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_auto_cfg_data_set_default(bcmolt_gpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_gem_port_set_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_gem_port_set_state_data_set_default(bcmolt_gpon_gem_port_set_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_gem_port_set_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_gem_port_set_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_gem_port_set_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_gem_port_set_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_gem_port_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_gem_port_set_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_key_set_default(bcmolt_gpon_iwf_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_key_pack(const bcmolt_gpon_iwf_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_key_get_packed_length(const bcmolt_gpon_iwf_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_key_unpack(bcmolt_gpon_iwf_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpon_iwf_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_cfg_data_set_default(bcmolt_gpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_cfg_data_pack(const bcmolt_gpon_iwf_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_cfg_data_get_packed_length(const bcmolt_gpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_stat_data_set_default(bcmolt_gpon_iwf_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_data_pack(const bcmolt_gpon_iwf_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_stat_data_get_packed_length(const bcmolt_gpon_iwf_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_stat_cfg_data_set_default(bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_stat_cfg_data_get_packed_length(const bcmolt_gpon_iwf_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_scan_mac_table_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_scan_mac_table_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_iwf_scan_mac_table_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_scan_mac_table_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_scan_mac_table_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_scan_mac_table_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_stat_alarm_cleared_data_set_default(bcmolt_gpon_iwf_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_stat_alarm_raised_data_set_default(bcmolt_gpon_iwf_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_auto_cfg_data_set_default(bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_auto_cfg_data_get_packed_length(const bcmolt_gpon_iwf_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_flush_mac_table_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_flush_mac_table_data_set_default(bcmolt_gpon_iwf_flush_mac_table_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_flush_mac_table_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_flush_mac_table_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_flush_mac_table_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_flush_mac_table_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_flush_mac_table_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_flush_mac_table_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_scan_mac_table_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_scan_mac_table_data_set_default(bcmolt_gpon_iwf_scan_mac_table_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_scan_mac_table_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_scan_mac_table_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_scan_mac_table_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_scan_mac_table_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_scan_mac_table_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_scan_mac_table_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_ds_egress_flow_key struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_ds_egress_flow_key_set_default(bcmolt_gpon_iwf_ds_egress_flow_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_ds_egress_flow_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_ds_egress_flow_key would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_egress_flow_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_ds_egress_flow_key struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_ds_egress_flow_key is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_ds_egress_flow_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_ds_egress_flow_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_ds_egress_flow_cfg_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_egress_flow_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_ds_egress_flow_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_egress_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_ds_egress_flow_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_ds_ingress_flow_key struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_ds_ingress_flow_key_set_default(bcmolt_gpon_iwf_ds_ingress_flow_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_ds_ingress_flow_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_ds_ingress_flow_key would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_ingress_flow_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_ds_ingress_flow_key struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_ds_ingress_flow_key is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_ds_ingress_flow_cfg_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_ds_ingress_flow_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_ds_ingress_flow_cfg_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_ds_ingress_flow_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_ds_ingress_flow_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_ds_ingress_flow_cfg_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_mac_table_key_set_default(bcmolt_gpon_iwf_mac_table_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_key would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_mac_table_key_get_packed_length(const bcmolt_gpon_iwf_mac_table_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_mac_table_cfg_data_set_default(bcmolt_gpon_iwf_mac_table_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_mac_dropped_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_mac_dropped_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_mac_dropped_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_mac_dropped_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_mac_dropped_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_dropped_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_mac_dropped_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_mac_move_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_mac_move_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_mac_move_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_mac_move_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_mac_move_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_mac_move_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_mac_move_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_new_mac_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_new_mac_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_new_mac_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_new_mac_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_new_mac_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_new_mac_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_new_mac_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_mac_table_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_iwf_mac_table_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_mac_table_auto_cfg_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_mac_table_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_mac_table_auto_cfg_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_mac_table_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_mac_table_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_us_flow_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_us_flow_key_set_default(bcmolt_gpon_iwf_us_flow_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_us_flow_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_us_flow_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_iwf_us_flow_key_get_packed_length(const bcmolt_gpon_iwf_us_flow_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_iwf_us_flow_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_us_flow_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_us_flow_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_iwf_us_flow_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_iwf_us_flow_cfg_data_set_default(bcmolt_gpon_iwf_us_flow_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_iwf_us_flow_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_iwf_us_flow_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_iwf_us_flow_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_iwf_us_flow_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_iwf_us_flow_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_iwf_us_flow_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_key_set_default(bcmolt_gpon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_key_pack(const bcmolt_gpon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_key_get_packed_length(const bcmolt_gpon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_key_unpack(bcmolt_gpon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpon_ni_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_cfg_data_set_default(bcmolt_gpon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_cfg_data_pack(const bcmolt_gpon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_cfg_data_get_packed_length(const bcmolt_gpon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_stat_data_set_default(bcmolt_gpon_ni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_data_pack(const bcmolt_gpon_ni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_stat_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_stat_data_get_packed_length(const bcmolt_gpon_ni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_stat_cfg_data_set_default(bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_stat_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_stat_cfg_data_get_packed_length(const bcmolt_gpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_cpu_packets_failure_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_cpu_packets_failure_data_set_default(bcmolt_gpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_cpu_packets_failure_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_cpu_packets_failure_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_cpu_packets_failure_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_cpu_packets_failure_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_cpu_packets_failure_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_los_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_los_data_set_default(bcmolt_gpon_ni_los_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_los_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_ni_los_data_pack(const bcmolt_gpon_ni_los_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_los_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_los_data_get_packed_length(const bcmolt_gpon_ni_los_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_los_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_los_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_los_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_los_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_onu_discovered_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_onu_discovered_data_set_default(bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_onu_discovered_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_onu_discovered_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_onu_discovered_data_get_packed_length(const bcmolt_gpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_onu_discovered_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_onu_discovered_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_onu_discovered_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_onu_upgrade_complete_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_onu_upgrade_complete_data_set_default(bcmolt_gpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_onu_upgrade_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_onu_upgrade_complete_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_onu_upgrade_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_onu_upgrade_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_onu_upgrade_complete_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_protection_switching_onus_ranged_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_onus_ranged_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_protection_switching_onus_ranged_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_onus_ranged_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_protection_switching_onus_ranged_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_onus_ranged_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_ni_protection_switching_onus_ranged_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_protection_switching_switchover_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_switchover_completed_data to 
+ * bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_protection_switching_switchover_completed_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_switchover_completed_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_gpon_ni_protection_switching_switchover_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_switchover_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_ni_protection_switching_switchover_completed_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_protection_switching_traffic_resume_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_protection_switching_traffic_resume_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_protection_switching_traffic_resume_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_protection_switching_traffic_resume_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_protection_switching_traffic_resume_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_protection_switching_traffic_resume_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_ni_protection_switching_traffic_resume_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_rogue_detection_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_rogue_detection_completed_data_set_default(bcmolt_gpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_rogue_detection_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_rogue_detection_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_rogue_detection_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_rogue_detection_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_rogue_detection_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_stat_alarm_cleared_data_set_default(bcmolt_gpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_stat_alarm_cleared_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_stat_alarm_raised_data_set_default(bcmolt_gpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_state_change_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_state_change_completed_data_set_default(bcmolt_gpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_state_change_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_state_change_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_state_change_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_state_change_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_state_change_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_tod_request_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_tod_request_completed_data_set_default(bcmolt_gpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_tod_request_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_tod_request_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_tod_request_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_tod_request_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_tod_request_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_tod_request_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_auto_cfg_data_set_default(bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_auto_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_auto_cfg_data_get_packed_length(const bcmolt_gpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_disable_serial_number_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_disable_serial_number_data_set_default(bcmolt_gpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_disable_serial_number_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_disable_serial_number_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_disable_serial_number_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_disable_serial_number_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_disable_serial_number_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_disable_serial_number_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data to 
+ * bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+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);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_rogue_detection_window_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_rogue_detection_window_data_set_default(bcmolt_gpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_rogue_detection_window_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_rogue_detection_window_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_rogue_detection_window_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_rogue_detection_window_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_rogue_detection_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_rogue_detection_window_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_set_onu_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_set_onu_state_data_set_default(bcmolt_gpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_set_onu_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_set_onu_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_set_onu_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_set_onu_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_set_onu_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_set_pon_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_set_pon_state_data_set_default(bcmolt_gpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_set_pon_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_set_pon_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_set_pon_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_set_pon_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_set_pon_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_set_pon_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_start_onu_upgrade_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_start_onu_upgrade_data_set_default(bcmolt_gpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_start_onu_upgrade_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_start_onu_upgrade_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_start_onu_upgrade_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_start_onu_upgrade_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_start_onu_upgrade_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_broadcast_ploam_packet_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_broadcast_ploam_packet_data_set_default(bcmolt_gpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_broadcast_ploam_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_broadcast_ploam_packet_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_ni_broadcast_ploam_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_broadcast_ploam_packet_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_broadcast_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_broadcast_ploam_packet_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_ni_cpu_packets_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_ni_cpu_packets_data_set_default(bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_ni_cpu_packets_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_ni_cpu_packets_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_ni_cpu_packets_data_get_packed_length(const bcmolt_gpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_ni_cpu_packets_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_ni_cpu_packets_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_ni_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_ni_cpu_packets_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_key_set_default(bcmolt_gpon_onu_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_key_pack(const bcmolt_gpon_onu_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_key_get_packed_length(const bcmolt_gpon_onu_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_key_unpack(bcmolt_gpon_onu_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpon_onu_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_cfg_data_set_default(bcmolt_gpon_onu_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_cfg_data_pack(const bcmolt_gpon_onu_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_cfg_data_get_packed_length(const bcmolt_gpon_onu_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_stat_data_set_default(bcmolt_gpon_onu_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_data_pack(const bcmolt_gpon_onu_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_stat_data_get_packed_length(const bcmolt_gpon_onu_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_stat_cfg_data_set_default(bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_stat_cfg_data_get_packed_length(const bcmolt_gpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_ber_interval_configuration_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_ber_interval_configuration_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_ber_interval_configuration_completed_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_ber_interval_configuration_completed_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_gpon_onu_ber_interval_configuration_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_ber_interval_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_ber_interval_configuration_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_dfi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_dfi_data_set_default(bcmolt_gpon_onu_dfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_dfi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_dfi_data_pack(const bcmolt_gpon_onu_dfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_dfi_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_dfi_data_get_packed_length(const bcmolt_gpon_onu_dfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_dfi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_dfi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_dfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_dfi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_dgi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_dgi_data_set_default(bcmolt_gpon_onu_dgi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_dgi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_dgi_data_pack(const bcmolt_gpon_onu_dgi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_dgi_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_dgi_data_get_packed_length(const bcmolt_gpon_onu_dgi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_dgi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_dgi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_dgi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_dgi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_dowi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_dowi_data_set_default(bcmolt_gpon_onu_dowi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_dowi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_dowi_data_pack(const bcmolt_gpon_onu_dowi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_dowi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_dowi_data_get_packed_length(const bcmolt_gpon_onu_dowi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_dowi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_dowi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_dowi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_dowi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_err_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_err_data_set_default(bcmolt_gpon_onu_err_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_err_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_err_data_pack(const bcmolt_gpon_onu_err_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_err_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_err_data_get_packed_length(const bcmolt_gpon_onu_err_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_err_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_err_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_err_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_err_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_invalid_dbru_report_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_invalid_dbru_report_data_set_default(bcmolt_gpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_invalid_dbru_report_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_invalid_dbru_report_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_invalid_dbru_report_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_invalid_dbru_report_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_invalid_dbru_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_invalid_dbru_report_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_key_exchange_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_key_exchange_completed_data_set_default(bcmolt_gpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_key_exchange_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_key_exchange_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_key_exchange_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_key_exchange_decrypt_required_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_decrypt_required_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_key_exchange_decrypt_required_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_decrypt_required_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_key_exchange_decrypt_required_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_decrypt_required_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_key_exchange_decrypt_required_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_key_exchange_key_mismatch_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_key_mismatch_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_key_exchange_key_mismatch_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_key_mismatch_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_key_exchange_key_mismatch_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_key_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_key_exchange_key_mismatch_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_key_exchange_unconsecutive_index_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_key_exchange_unconsecutive_index_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_key_exchange_unconsecutive_index_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_key_exchange_unconsecutive_index_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_key_exchange_unconsecutive_index_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_key_exchange_unconsecutive_index_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_loai_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_loai_data_set_default(bcmolt_gpon_onu_loai_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_loai_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_loai_data_pack(const bcmolt_gpon_onu_loai_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_loai_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_loai_data_get_packed_length(const bcmolt_gpon_onu_loai_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_loai_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_loai_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_loai_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_loai_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_loki_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_loki_data_set_default(bcmolt_gpon_onu_loki_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_loki_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_loki_data_pack(const bcmolt_gpon_onu_loki_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_loki_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_loki_data_get_packed_length(const bcmolt_gpon_onu_loki_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_loki_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_loki_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_loki_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_loki_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_memi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_memi_data_set_default(bcmolt_gpon_onu_memi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_memi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_memi_data_pack(const bcmolt_gpon_onu_memi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_memi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_memi_data_get_packed_length(const bcmolt_gpon_onu_memi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_memi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_memi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_memi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_memi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_omci_port_id_configuration_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_omci_port_id_configuration_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_omci_port_id_configuration_completed_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_omci_port_id_configuration_completed_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_gpon_onu_omci_port_id_configuration_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_omci_port_id_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_omci_port_id_configuration_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_activation_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_onu_activation_completed_data_set_default(bcmolt_gpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_onu_activation_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_onu_activation_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_onu_activation_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_activation_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_onu_activation_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_activation_standby_completed_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_onu_activation_standby_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_onu_activation_standby_completed_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_onu_activation_standby_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_activation_standby_completed_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_activation_standby_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_onu_activation_standby_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_alarm_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_onu_alarm_data_set_default(bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_onu_alarm_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_onu_alarm_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_onu_alarm_data_get_packed_length(const bcmolt_gpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_onu_alarm_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_alarm_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_alarm_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_onu_alarm_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_deactivation_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_onu_deactivation_completed_data_set_default(bcmolt_gpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_onu_deactivation_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_onu_deactivation_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_onu_deactivation_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_deactivation_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_deactivation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_onu_deactivation_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_disable_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_onu_disable_completed_data_set_default(bcmolt_gpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_onu_disable_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_onu_disable_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_onu_disable_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_disable_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_disable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_onu_disable_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_onu_enable_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_onu_enable_completed_data_set_default(bcmolt_gpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_onu_enable_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_onu_enable_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_onu_enable_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_onu_enable_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_onu_enable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_onu_enable_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_password_authentication_completed_data struct. 
+ *  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_password_authentication_completed_data_set_default(bcmolt_gpon_onu_password_authentication_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_password_authentication_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_password_authentication_completed_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_password_authentication_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_password_authentication_completed_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_password_authentication_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_password_authentication_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_pee_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_pee_data_set_default(bcmolt_gpon_onu_pee_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_pee_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_pee_data_pack(const bcmolt_gpon_onu_pee_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_pee_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_pee_data_get_packed_length(const bcmolt_gpon_onu_pee_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_pee_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_pee_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_pee_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_pee_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_possible_drift_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_possible_drift_data_set_default(bcmolt_gpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_possible_drift_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_possible_drift_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_possible_drift_data_get_packed_length(const bcmolt_gpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_possible_drift_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_possible_drift_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_possible_drift_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_possible_drift_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_power_management_state_change_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_gpon_onu_power_management_state_change_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_power_management_state_change_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_power_management_state_change_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_power_management_state_change_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_power_management_state_change_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_gpon_onu_power_management_state_change_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_pst_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_pst_data_set_default(bcmolt_gpon_onu_pst_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_pst_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_pst_data_pack(const bcmolt_gpon_onu_pst_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_pst_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_pst_data_get_packed_length(const bcmolt_gpon_onu_pst_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_pst_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_pst_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_pst_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_pst_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_ranging_completed_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_ranging_completed_data_set_default(bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_ranging_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_ranging_completed_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_ranging_completed_data_get_packed_length(const bcmolt_gpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_ranging_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_ranging_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_ranging_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_ranging_completed_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_rei_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_rei_data_set_default(bcmolt_gpon_onu_rei_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_rei_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_rei_data_pack(const bcmolt_gpon_onu_rei_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_rei_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_rei_data_get_packed_length(const bcmolt_gpon_onu_rei_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_rei_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_rei_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_rei_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_rei_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_rssi_measurement_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_rssi_measurement_completed_data_set_default(bcmolt_gpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_rssi_measurement_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_gpon_onu_rssi_measurement_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_rssi_measurement_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_rssi_measurement_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_rssi_measurement_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_sdi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_sdi_data_set_default(bcmolt_gpon_onu_sdi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_sdi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_sdi_data_pack(const bcmolt_gpon_onu_sdi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_sdi_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_sdi_data_get_packed_length(const bcmolt_gpon_onu_sdi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_sdi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_sdi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_sdi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_sdi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_sfi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_sfi_data_set_default(bcmolt_gpon_onu_sfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_sfi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_sfi_data_pack(const bcmolt_gpon_onu_sfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_sfi_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_sfi_data_get_packed_length(const bcmolt_gpon_onu_sfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_sfi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_sfi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_sfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_sfi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_stat_alarm_cleared_data_set_default(bcmolt_gpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_stat_alarm_raised_data_set_default(bcmolt_gpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_sufi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_sufi_data_set_default(bcmolt_gpon_onu_sufi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_sufi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_sufi_data_pack(const bcmolt_gpon_onu_sufi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_sufi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_sufi_data_get_packed_length(const bcmolt_gpon_onu_sufi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_sufi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_sufi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_sufi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_sufi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_tiwi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_tiwi_data_set_default(bcmolt_gpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_tiwi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_onu_tiwi_data_pack(const bcmolt_gpon_onu_tiwi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_tiwi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_tiwi_data_get_packed_length(const bcmolt_gpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_tiwi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_tiwi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_tiwi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_tiwi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_auto_cfg_data_set_default(bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_auto_cfg_data_get_packed_length(const bcmolt_gpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_change_power_level_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_change_power_level_data_set_default(bcmolt_gpon_onu_change_power_level_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_change_power_level_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_change_power_level_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_change_power_level_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_change_power_level_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_change_power_level_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_change_power_level_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_set_onu_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_set_onu_state_data_set_default(bcmolt_gpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_set_onu_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_set_onu_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_gpon_onu_set_onu_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_set_onu_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_set_onu_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_cpu_packets_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_cpu_packets_data_set_default(bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_cpu_packets_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_cpu_packets_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_cpu_packets_data_get_packed_length(const bcmolt_gpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_cpu_packets_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_cpu_packets_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_cpu_packets_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_ploam_packet_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_ploam_packet_data_set_default(bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_ploam_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_ploam_packet_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_ploam_packet_data_get_packed_length(const bcmolt_gpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_ploam_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_ploam_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_ploam_packet_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_cpu_packet_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_cpu_packet_data_set_default(bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_cpu_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_cpu_packet_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_cpu_packet_data_get_packed_length(const bcmolt_gpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_cpu_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_cpu_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_cpu_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_cpu_packet_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_onu_omci_packet_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_onu_omci_packet_data_set_default(bcmolt_gpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_onu_omci_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_gpon_onu_omci_packet_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_onu_omci_packet_data_get_packed_length(const bcmolt_gpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_onu_omci_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_onu_omci_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_onu_omci_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_onu_omci_packet_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_trx_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_trx_key_set_default(bcmolt_gpon_trx_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_trx_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_trx_key_pack(const bcmolt_gpon_trx_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_trx_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_trx_key_get_packed_length(const bcmolt_gpon_trx_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_trx_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_trx_key_unpack(bcmolt_gpon_trx_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_gpon_trx_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_trx_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_trx_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_gpon_trx_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_gpon_trx_cfg_data_set_default(bcmolt_gpon_trx_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_gpon_trx_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_gpon_trx_cfg_data_pack(const bcmolt_gpon_trx_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_gpon_trx_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_gpon_trx_cfg_data_get_packed_length(const bcmolt_gpon_trx_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_gpon_trx_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_gpon_trx_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_gpon_trx_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_gpon_trx_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_key_set_default(bcmolt_log_entry_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_entry_key_pack(const bcmolt_log_entry_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_log_entry_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_log_entry_key_get_packed_length(const bcmolt_log_entry_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_log_entry_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_entry_key_unpack(bcmolt_log_entry_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_log_entry_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_cfg_data_set_default(bcmolt_log_entry_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_entry_cfg_data_pack(const bcmolt_log_entry_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_log_entry_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_log_entry_cfg_data_get_packed_length(const bcmolt_log_entry_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_log_entry_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_stat_data_set_default(bcmolt_log_entry_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_log_entry_stat_data_pack(const bcmolt_log_entry_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_log_entry_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_log_entry_stat_data_get_packed_length(const bcmolt_log_entry_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_log_entry_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_stat_cfg_data_set_default(bcmolt_log_entry_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_log_entry_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_log_entry_stat_cfg_data_get_packed_length(const bcmolt_log_entry_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_log_entry_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_stat_alarm_cleared_data_set_default(bcmolt_log_entry_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_log_entry_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_log_entry_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_stat_alarm_raised_data_set_default(bcmolt_log_entry_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_log_entry_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_log_entry_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_log_entry_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_log_entry_auto_cfg_data_set_default(bcmolt_log_entry_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_log_entry_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_log_entry_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_log_entry_auto_cfg_data_get_packed_length(const bcmolt_log_entry_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_log_entry_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_log_entry_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_log_entry_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_log_entry_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_key_set_default(bcmolt_logger_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_key_pack(const bcmolt_logger_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_logger_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_key_get_packed_length(const bcmolt_logger_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_key_unpack(bcmolt_logger_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_logger_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_key_bounds_check(const bcmolt_logger_key *this, bcmolt_presence_mask fields_present, bcmolt_logger_key_id *failed_prop);
+
+/** Initializes a bcmolt_logger_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_cfg_data_set_default(bcmolt_logger_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_cfg_data_pack(const bcmolt_logger_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_logger_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_cfg_data_get_packed_length(const bcmolt_logger_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_cfg_data_unpack(bcmolt_logger_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_logger_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_stat_data_set_default(bcmolt_logger_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_stat_data_pack(const bcmolt_logger_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_logger_stat_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_stat_data_get_packed_length(const bcmolt_logger_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_stat_data_unpack(bcmolt_logger_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_logger_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_stat_cfg_data_set_default(bcmolt_logger_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_stat_cfg_data_pack(const bcmolt_logger_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_logger_stat_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_stat_cfg_data_get_packed_length(const bcmolt_logger_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_logger_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_stat_alarm_cleared_data_set_default(bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_logger_stat_alarm_cleared_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_stat_alarm_cleared_data_get_packed_length(const bcmolt_logger_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_logger_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_stat_alarm_raised_data_set_default(bcmolt_logger_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_logger_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_stat_alarm_raised_data_get_packed_length(const bcmolt_logger_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_logger_stat_alarm_raised_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_logger_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_logger_auto_cfg_data_set_default(bcmolt_logger_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_logger_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_logger_auto_cfg_data_pack(const bcmolt_logger_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_logger_auto_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_logger_auto_cfg_data_get_packed_length(const bcmolt_logger_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_logger_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_logger_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_logger_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_logger_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_key_set_default(bcmolt_nni_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_key_pack(const bcmolt_nni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_key_get_packed_length(const bcmolt_nni_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_key_unpack(bcmolt_nni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_nni_key struct and collects memory requirements 
+ * above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_key_bounds_check(const bcmolt_nni_key *this, bcmolt_presence_mask fields_present, bcmolt_nni_key_id *failed_prop);
+
+/** Initializes a bcmolt_nni_cfg_data struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_cfg_data_set_default(bcmolt_nni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_cfg_data_pack(const bcmolt_nni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_cfg_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_cfg_data_get_packed_length(const bcmolt_nni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_cfg_data_unpack(bcmolt_nni_cfg_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_nni_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_stat_data struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_stat_data_set_default(bcmolt_nni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_stat_data_pack(const bcmolt_nni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_stat_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_stat_data_get_packed_length(const bcmolt_nni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_stat_data_unpack(bcmolt_nni_stat_data *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_nni_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_stat_cfg_data_set_default(bcmolt_nni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_stat_cfg_data_pack(const bcmolt_nni_stat_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_stat_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_stat_cfg_data_get_packed_length(const bcmolt_nni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_stat_alarm_cleared_data_set_default(bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_nni_stat_alarm_cleared_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_stat_alarm_cleared_data_get_packed_length(const bcmolt_nni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_stat_alarm_cleared_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_stat_alarm_raised_data_set_default(bcmolt_nni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_nni_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_stat_alarm_raised_data_get_packed_length(const bcmolt_nni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_stat_alarm_raised_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_status_changed_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_status_changed_data_set_default(bcmolt_nni_status_changed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_status_changed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_status_changed_data_pack(const bcmolt_nni_status_changed_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_status_changed_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_status_changed_data_get_packed_length(const bcmolt_nni_status_changed_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_status_changed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_status_changed_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_status_changed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_status_changed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_auto_cfg_data_set_default(bcmolt_nni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_auto_cfg_data_pack(const bcmolt_nni_auto_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_auto_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_auto_cfg_data_get_packed_length(const bcmolt_nni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_serdes_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_serdes_key_set_default(bcmolt_nni_serdes_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_serdes_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_serdes_key_pack(const bcmolt_nni_serdes_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_serdes_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_serdes_key_get_packed_length(const bcmolt_nni_serdes_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_serdes_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_serdes_key_unpack(bcmolt_nni_serdes_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_nni_serdes_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_serdes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_serdes_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_nni_serdes_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_nni_serdes_cfg_data_set_default(bcmolt_nni_serdes_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_nni_serdes_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_nni_serdes_cfg_data_pack(const bcmolt_nni_serdes_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_nni_serdes_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_nni_serdes_cfg_data_get_packed_length(const bcmolt_nni_serdes_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_nni_serdes_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_nni_serdes_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_nni_serdes_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_nni_serdes_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_software_error_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_software_error_key_set_default(bcmolt_software_error_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_software_error_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_software_error_key_pack(const bcmolt_software_error_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_software_error_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_software_error_key_get_packed_length(const bcmolt_software_error_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_software_error_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_software_error_key_unpack(bcmolt_software_error_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_software_error_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_software_error_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_software_error_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_software_error_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_software_error_cfg_data_set_default(bcmolt_software_error_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_software_error_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_software_error_cfg_data_pack(const bcmolt_software_error_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_software_error_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_software_error_cfg_data_get_packed_length(const bcmolt_software_error_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_software_error_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_software_error_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_software_error_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_software_error_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_trx_calibration_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_trx_calibration_key_set_default(bcmolt_trx_calibration_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_trx_calibration_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_calibration_key_pack(const bcmolt_trx_calibration_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_trx_calibration_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_trx_calibration_key_get_packed_length(const bcmolt_trx_calibration_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_trx_calibration_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_trx_calibration_key_unpack(bcmolt_trx_calibration_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_trx_calibration_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_calibration_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_trx_calibration_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a 
+ * bcmolt_trx_calibration_capture_window_and_statistic_completed_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_trx_calibration_capture_window_and_statistic_completed_data 
+ * to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_trx_calibration_capture_window_and_statistic_completed_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_trx_calibration_capture_window_and_statistic_completed_data 
+ * from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_trx_calibration_capture_window_and_statistic_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_calibration_capture_window_and_statistic_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_trx_calibration_capture_window_and_statistic_completed_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_trx_calibration_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_trx_calibration_auto_cfg_data_set_default(bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_trx_calibration_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_trx_calibration_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_trx_calibration_auto_cfg_data_get_packed_length(const bcmolt_trx_calibration_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_trx_calibration_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_trx_calibration_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_calibration_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_trx_calibration_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_trx_calibration_start_capture_window_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_trx_calibration_start_capture_window_data_set_default(bcmolt_trx_calibration_start_capture_window_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_trx_calibration_start_capture_window_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_trx_calibration_start_capture_window_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_trx_calibration_start_capture_window_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_trx_calibration_start_capture_window_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_calibration_start_capture_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_trx_calibration_start_capture_window_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_trx_calibration_stop_capture_window_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_trx_calibration_stop_capture_window_data_set_default(bcmolt_trx_calibration_stop_capture_window_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_trx_calibration_stop_capture_window_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_trx_calibration_stop_capture_window_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_trx_calibration_stop_capture_window_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_trx_calibration_stop_capture_window_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_trx_calibration_stop_capture_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_trx_calibration_stop_capture_window_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_key_set_default(bcmolt_xgpon_alloc_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_key_pack(const bcmolt_xgpon_alloc_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_key_get_packed_length(const bcmolt_xgpon_alloc_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_key_unpack(bcmolt_xgpon_alloc_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xgpon_alloc_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_cfg_data_set_default(bcmolt_xgpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_cfg_data_pack(const bcmolt_xgpon_alloc_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_stat_data_set_default(bcmolt_xgpon_alloc_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_data_pack(const bcmolt_xgpon_alloc_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_stat_data_get_packed_length(const bcmolt_xgpon_alloc_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_stat_cfg_data_set_default(bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_stat_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_configuration_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_configuration_completed_data_set_default(bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_configuration_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_alloc_configuration_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_configuration_completed_data_get_packed_length(const bcmolt_xgpon_alloc_configuration_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_configuration_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_configuration_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_configuration_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_configuration_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_get_alloc_stats_completed_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_alloc_get_alloc_stats_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_alloc_get_alloc_stats_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_alloc_get_alloc_stats_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_get_alloc_stats_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_alloc_stats_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_get_alloc_stats_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_stat_alarm_cleared_data_set_default(bcmolt_xgpon_alloc_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_stat_alarm_raised_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_stat_alarm_raised_data_set_default(bcmolt_xgpon_alloc_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_alloc_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_stat_alarm_raised_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_auto_cfg_data_set_default(bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_auto_cfg_data_get_packed_length(const bcmolt_xgpon_alloc_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_get_stats_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_get_stats_data_set_default(bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_get_stats_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_get_stats_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_get_stats_data_get_packed_length(const bcmolt_xgpon_alloc_get_stats_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_get_stats_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_get_stats_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_get_stats_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_get_stats_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_alloc_set_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_alloc_set_state_data_set_default(bcmolt_xgpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_alloc_set_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_alloc_set_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_alloc_set_state_data_get_packed_length(const bcmolt_xgpon_alloc_set_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_alloc_set_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_alloc_set_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_alloc_set_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_alloc_set_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_gem_port_key_set_default(bcmolt_xgpon_gem_port_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_gem_port_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_key_pack(const bcmolt_xgpon_gem_port_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_key would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_gem_port_key_get_packed_length(const bcmolt_xgpon_gem_port_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_gem_port_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_gem_port_cfg_data_set_default(bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_gem_port_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_gem_port_cfg_data_get_packed_length(const bcmolt_xgpon_gem_port_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_gem_port_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_stat_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_gem_port_stat_data_set_default(bcmolt_xgpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_stat_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_gem_port_stat_data_get_packed_length(const bcmolt_xgpon_gem_port_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_stat_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_stat_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_gem_port_stat_cfg_data_set_default(bcmolt_xgpon_gem_port_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_stat_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_stat_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_stat_alarm_cleared_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_gem_port_stat_alarm_cleared_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_stat_alarm_cleared_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_stat_alarm_raised_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_gem_port_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_stat_alarm_raised_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_gem_port_auto_cfg_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_gem_port_auto_cfg_data_set_default(bcmolt_xgpon_gem_port_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_gem_port_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_gem_port_auto_cfg_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_gem_port_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_gem_port_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_gem_port_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_gem_port_auto_cfg_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_iwf_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_iwf_key_set_default(bcmolt_xgpon_iwf_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_iwf_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_iwf_key_pack(const bcmolt_xgpon_iwf_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_iwf_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_iwf_key_get_packed_length(const bcmolt_xgpon_iwf_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_iwf_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_iwf_key_unpack(bcmolt_xgpon_iwf_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xgpon_iwf_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_iwf_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_iwf_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_iwf_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_iwf_cfg_data_set_default(bcmolt_xgpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_iwf_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_iwf_cfg_data_pack(const bcmolt_xgpon_iwf_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_iwf_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_iwf_cfg_data_get_packed_length(const bcmolt_xgpon_iwf_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_iwf_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_iwf_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_iwf_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_iwf_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_key_set_default(bcmolt_xgpon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_key_pack(const bcmolt_xgpon_ni_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_key would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_key_get_packed_length(const bcmolt_xgpon_ni_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_key_unpack(bcmolt_xgpon_ni_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xgpon_ni_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_cfg_data_set_default(bcmolt_xgpon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_cfg_data_pack(const bcmolt_xgpon_ni_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_cfg_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_cfg_data_get_packed_length(const bcmolt_xgpon_ni_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_stat_data_set_default(bcmolt_xgpon_ni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_data_pack(const bcmolt_xgpon_ni_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_stat_data_get_packed_length(const bcmolt_xgpon_ni_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_stat_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_stat_cfg_data_set_default(bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_stat_cfg_data_get_packed_length(const bcmolt_xgpon_ni_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_stat_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_cpu_packets_failure_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_cpu_packets_failure_data_set_default(bcmolt_xgpon_ni_cpu_packets_failure_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_cpu_packets_failure_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_cpu_packets_failure_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_cpu_packets_failure_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_cpu_packets_failure_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_cpu_packets_failure_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_los_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_los_data_set_default(bcmolt_xgpon_ni_los_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_los_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_ni_los_data_pack(const bcmolt_xgpon_ni_los_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_los_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_los_data_get_packed_length(const bcmolt_xgpon_ni_los_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_los_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_los_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_los_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_los_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_onu_discovered_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_onu_discovered_data_set_default(bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_onu_discovered_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_onu_discovered_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_onu_discovered_data_get_packed_length(const bcmolt_xgpon_ni_onu_discovered_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_onu_discovered_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_onu_discovered_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_discovered_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_onu_discovered_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_onu_upgrade_complete_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_onu_upgrade_complete_data_set_default(bcmolt_xgpon_ni_onu_upgrade_complete_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_onu_upgrade_complete_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_onu_upgrade_complete_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_onu_upgrade_complete_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_onu_upgrade_complete_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_onu_upgrade_complete_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_onu_upgrade_complete_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_protection_switching_onus_ranged_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_onus_ranged_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_ni_protection_switching_onus_ranged_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_onus_ranged_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_protection_switching_onus_ranged_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_onus_ranged_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_ni_protection_switching_onus_ranged_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_protection_switching_switchover_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_switchover_completed_data to 
+ * bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_ni_protection_switching_switchover_completed_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_switchover_completed_data 
+ * from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_xgpon_ni_protection_switching_switchover_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_switchover_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_ni_protection_switching_switchover_completed_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_protection_switching_traffic_resume_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_protection_switching_traffic_resume_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_ni_protection_switching_traffic_resume_data would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_protection_switching_traffic_resume_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_protection_switching_traffic_resume_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_protection_switching_traffic_resume_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_ni_protection_switching_traffic_resume_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_rogue_detection_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_rogue_detection_completed_data_set_default(bcmolt_xgpon_ni_rogue_detection_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_rogue_detection_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_ni_rogue_detection_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_rogue_detection_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_rogue_detection_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_rogue_detection_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_stat_alarm_cleared_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_stat_alarm_cleared_data_set_default(bcmolt_xgpon_ni_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_stat_alarm_cleared_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_stat_alarm_raised_data_set_default(bcmolt_xgpon_ni_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_stat_alarm_raised_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_state_change_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_state_change_completed_data_set_default(bcmolt_xgpon_ni_state_change_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_state_change_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_state_change_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_state_change_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_state_change_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_state_change_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_state_change_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_tod_request_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_tod_request_completed_data_set_default(bcmolt_xgpon_ni_tod_request_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_tod_request_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_tod_request_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_tod_request_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_tod_request_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_tod_request_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_tod_request_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_auto_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_auto_cfg_data_set_default(bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_auto_cfg_data_get_packed_length(const bcmolt_xgpon_ni_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_auto_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_adjust_tx_wavelength_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_adjust_tx_wavelength_data_set_default(bcmolt_xgpon_ni_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_adjust_tx_wavelength_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_adjust_tx_wavelength_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_adjust_tx_wavelength_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_adjust_tx_wavelength_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_adjust_tx_wavelength_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_adjust_tx_wavelength_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_disable_serial_number_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_disable_serial_number_data_set_default(bcmolt_xgpon_ni_disable_serial_number_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_disable_serial_number_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_disable_serial_number_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_disable_serial_number_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_disable_serial_number_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_disable_serial_number_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_disable_serial_number_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_rogue_detection_window_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_rogue_detection_window_data_set_default(bcmolt_xgpon_ni_rogue_detection_window_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_rogue_detection_window_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_rogue_detection_window_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_rogue_detection_window_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_rogue_detection_window_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_rogue_detection_window_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_rogue_detection_window_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_run_special_bw_map_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_ni_run_special_bw_map_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_run_special_bw_map_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_run_special_bw_map_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_run_special_bw_map_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_run_special_bw_map_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_run_special_bw_map_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_set_onu_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_set_onu_state_data_set_default(bcmolt_xgpon_ni_set_onu_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_set_onu_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_set_onu_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_set_onu_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_set_onu_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_set_onu_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_set_pon_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_set_pon_state_data_set_default(bcmolt_xgpon_ni_set_pon_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_set_pon_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_set_pon_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_set_pon_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_set_pon_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_set_pon_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_set_pon_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_start_onu_upgrade_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_start_onu_upgrade_data_set_default(bcmolt_xgpon_ni_start_onu_upgrade_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_start_onu_upgrade_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_start_onu_upgrade_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_start_onu_upgrade_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_start_onu_upgrade_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_start_onu_upgrade_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_start_onu_upgrade_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_broadcast_ploam_packet_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_broadcast_ploam_packet_data_set_default(bcmolt_xgpon_ni_broadcast_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_broadcast_ploam_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_broadcast_ploam_packet_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_ni_broadcast_ploam_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_broadcast_ploam_packet_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_broadcast_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_broadcast_ploam_packet_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_ni_cpu_packets_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_ni_cpu_packets_data_set_default(bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_ni_cpu_packets_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_ni_cpu_packets_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_ni_cpu_packets_data_get_packed_length(const bcmolt_xgpon_ni_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_ni_cpu_packets_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_ni_cpu_packets_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_ni_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_ni_cpu_packets_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_key_set_default(bcmolt_xgpon_onu_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_pack(const bcmolt_xgpon_onu_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_key_get_packed_length(const bcmolt_xgpon_onu_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_unpack(bcmolt_xgpon_onu_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xgpon_onu_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_cfg_data_set_default(bcmolt_xgpon_onu_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_cfg_data_pack(const bcmolt_xgpon_onu_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_cfg_data_get_packed_length(const bcmolt_xgpon_onu_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_stat_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_stat_data_set_default(bcmolt_xgpon_onu_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_stat_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_data_pack(const bcmolt_xgpon_onu_stat_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_stat_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_stat_data_get_packed_length(const bcmolt_xgpon_onu_stat_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_stat_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_stat_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_stat_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_stat_cfg_data_set_default(bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_stat_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_stat_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_stat_cfg_data_get_packed_length(const bcmolt_xgpon_onu_stat_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_stat_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_stat_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_dfi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_dfi_data_set_default(bcmolt_xgpon_onu_dfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_dfi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_dfi_data_pack(const bcmolt_xgpon_onu_dfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_dfi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_dfi_data_get_packed_length(const bcmolt_xgpon_onu_dfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_dfi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_dfi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_dfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_dfi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_dgi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_dgi_data_set_default(bcmolt_xgpon_onu_dgi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_dgi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_dgi_data_pack(const bcmolt_xgpon_onu_dgi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_dgi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_dgi_data_get_packed_length(const bcmolt_xgpon_onu_dgi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_dgi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_dgi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_dgi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_dgi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_dowi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_dowi_data_set_default(bcmolt_xgpon_onu_dowi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_dowi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_dowi_data_pack(const bcmolt_xgpon_onu_dowi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_dowi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_dowi_data_get_packed_length(const bcmolt_xgpon_onu_dowi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_dowi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_dowi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_dowi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_dowi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_invalid_dbru_report_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_invalid_dbru_report_data_set_default(bcmolt_xgpon_onu_invalid_dbru_report_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_invalid_dbru_report_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_invalid_dbru_report_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_invalid_dbru_report_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_invalid_dbru_report_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_invalid_dbru_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_invalid_dbru_report_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_key_exchange_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_key_exchange_completed_data_set_default(bcmolt_xgpon_onu_key_exchange_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_key_exchange_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_key_exchange_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_key_exchange_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_key_exchange_key_mismatch_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_key_exchange_key_mismatch_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_key_exchange_key_mismatch_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_key_exchange_key_mismatch_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_key_exchange_key_mismatch_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_key_exchange_key_mismatch_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_key_exchange_key_mismatch_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_looci_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_looci_data_set_default(bcmolt_xgpon_onu_looci_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_looci_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_looci_data_pack(const bcmolt_xgpon_onu_looci_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_looci_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_looci_data_get_packed_length(const bcmolt_xgpon_onu_looci_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_looci_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_looci_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_looci_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_looci_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_activation_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_activation_completed_data_set_default(bcmolt_xgpon_onu_onu_activation_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_activation_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_onu_activation_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_activation_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_activation_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_activation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_activation_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_alarm_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_alarm_data_set_default(bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_alarm_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_onu_alarm_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_onu_alarm_data_get_packed_length(const bcmolt_xgpon_onu_onu_alarm_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_alarm_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_alarm_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_alarm_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_alarm_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_deactivation_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_deactivation_completed_data_set_default(bcmolt_xgpon_onu_onu_deactivation_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_deactivation_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_onu_deactivation_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_deactivation_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_deactivation_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_deactivation_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_deactivation_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_disable_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_disable_completed_data_set_default(bcmolt_xgpon_onu_onu_disable_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_disable_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_onu_disable_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_disable_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_disable_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_disable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_disable_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_enable_completed_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_enable_completed_data_set_default(bcmolt_xgpon_onu_onu_enable_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_enable_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_onu_enable_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_enable_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_enable_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_enable_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_enable_completed_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_tuning_in_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_in_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_onu_tuning_in_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_in_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_tuning_in_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_in_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_tuning_in_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_tuning_out_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_out_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_onu_tuning_out_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_out_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_tuning_out_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_tuning_out_completed_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_possible_drift_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_possible_drift_data_set_default(bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_possible_drift_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_possible_drift_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_possible_drift_data_get_packed_length(const bcmolt_xgpon_onu_possible_drift_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_possible_drift_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_possible_drift_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_possible_drift_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_possible_drift_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_power_consumption_report_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_power_consumption_report_data_set_default(bcmolt_xgpon_onu_power_consumption_report_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_power_consumption_report_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_power_consumption_report_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_power_consumption_report_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_power_consumption_report_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_consumption_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_power_consumption_report_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_power_level_report_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_power_level_report_data_set_default(bcmolt_xgpon_onu_power_level_report_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_power_level_report_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_power_level_report_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_power_level_report_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_power_level_report_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_level_report_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_power_level_report_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_power_management_state_change_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_power_management_state_change_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_power_management_state_change_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_power_management_state_change_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_power_management_state_change_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_power_management_state_change_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_onu_power_management_state_change_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_pqsi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_pqsi_data_set_default(bcmolt_xgpon_onu_pqsi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_pqsi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_pqsi_data_pack(const bcmolt_xgpon_onu_pqsi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_pqsi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_pqsi_data_get_packed_length(const bcmolt_xgpon_onu_pqsi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_pqsi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_pqsi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_pqsi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_pqsi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_ranging_completed_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_ranging_completed_data_set_default(bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_ranging_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_ranging_completed_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_ranging_completed_data_get_packed_length(const bcmolt_xgpon_onu_ranging_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_ranging_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_ranging_completed_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_ranging_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_ranging_completed_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_registration_id_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_registration_id_data_set_default(bcmolt_xgpon_onu_registration_id_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_registration_id_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_registration_id_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_registration_id_data_get_packed_length(const bcmolt_xgpon_onu_registration_id_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_registration_id_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_registration_id_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_registration_id_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_registration_id_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_rssi_measurement_completed_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_rssi_measurement_completed_data_set_default(bcmolt_xgpon_onu_rssi_measurement_completed_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_rssi_measurement_completed_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_rssi_measurement_completed_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_rssi_measurement_completed_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_rssi_measurement_completed_data struct 
+ * and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_rssi_measurement_completed_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_rssi_measurement_completed_data 
+ * is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_sdi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_sdi_data_set_default(bcmolt_xgpon_onu_sdi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_sdi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_sdi_data_pack(const bcmolt_xgpon_onu_sdi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_sdi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_sdi_data_get_packed_length(const bcmolt_xgpon_onu_sdi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_sdi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_sdi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_sdi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_sdi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_secure_mutual_authentication_failure_data 
+ * struct.  This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+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);
+
+/** Packs a bcmolt_xgpon_onu_secure_mutual_authentication_failure_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_secure_mutual_authentication_failure_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_secure_mutual_authentication_failure_data from 
+ * bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed 
+ * bcmolt_xgpon_onu_secure_mutual_authentication_failure_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_onu_secure_mutual_authentication_failure_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_sfi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_sfi_data_set_default(bcmolt_xgpon_onu_sfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_sfi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_sfi_data_pack(const bcmolt_xgpon_onu_sfi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_sfi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_sfi_data_get_packed_length(const bcmolt_xgpon_onu_sfi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_sfi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_sfi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_sfi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_sfi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_stat_alarm_cleared_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_stat_alarm_cleared_data_set_default(bcmolt_xgpon_onu_stat_alarm_cleared_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_stat_alarm_cleared_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_stat_alarm_cleared_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_alarm_cleared_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_stat_alarm_cleared_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_cleared_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_stat_alarm_cleared_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_stat_alarm_raised_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_stat_alarm_raised_data_set_default(bcmolt_xgpon_onu_stat_alarm_raised_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_stat_alarm_raised_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_stat_alarm_raised_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_stat_alarm_raised_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_stat_alarm_raised_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_stat_alarm_raised_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_stat_alarm_raised_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_sufi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_sufi_data_set_default(bcmolt_xgpon_onu_sufi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_sufi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_sufi_data_pack(const bcmolt_xgpon_onu_sufi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_sufi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_sufi_data_get_packed_length(const bcmolt_xgpon_onu_sufi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_sufi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_sufi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_sufi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_sufi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_tiwi_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_tiwi_data_set_default(bcmolt_xgpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_tiwi_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_onu_tiwi_data_pack(const bcmolt_xgpon_onu_tiwi_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_tiwi_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_tiwi_data_get_packed_length(const bcmolt_xgpon_onu_tiwi_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_tiwi_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_tiwi_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_tiwi_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_tiwi_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_tuning_response_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_tuning_response_data_set_default(bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_tuning_response_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_tuning_response_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_tuning_response_data_get_packed_length(const bcmolt_xgpon_onu_tuning_response_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_tuning_response_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_tuning_response_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_tuning_response_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_tuning_response_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_auto_cfg_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_auto_cfg_data_set_default(bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_auto_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_auto_cfg_data would occupy 
+ * on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_auto_cfg_data_get_packed_length(const bcmolt_xgpon_onu_auto_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_auto_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_auto_cfg_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_auto_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_auto_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_adjust_tx_wavelength_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_adjust_tx_wavelength_data_set_default(bcmolt_xgpon_onu_adjust_tx_wavelength_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_adjust_tx_wavelength_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_adjust_tx_wavelength_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_adjust_tx_wavelength_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_adjust_tx_wavelength_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_adjust_tx_wavelength_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_adjust_tx_wavelength_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_change_power_levelling_data struct.  This 
+ * sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_change_power_levelling_data_set_default(bcmolt_xgpon_onu_change_power_levelling_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_change_power_levelling_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_change_power_levelling_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_change_power_levelling_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_change_power_levelling_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_change_power_levelling_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_change_power_levelling_data is 
+ * out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_onu_tuning_out_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_onu_tuning_out_data_set_default(bcmolt_xgpon_onu_onu_tuning_out_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_onu_tuning_out_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_onu_tuning_out_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_onu_tuning_out_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_onu_tuning_out_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_onu_tuning_out_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_onu_tuning_out_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_request_registration_data struct.  This sets 
+ * all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_request_registration_data_set_default(bcmolt_xgpon_onu_request_registration_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_request_registration_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_request_registration_data 
+ * would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_request_registration_data_get_packed_length(const bcmolt_xgpon_onu_request_registration_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_request_registration_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_request_registration_data struct and 
+ * collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_request_registration_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_request_registration_data is out 
+ * of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_secure_mutual_authentication_data struct.  
+ * This sets all fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_secure_mutual_authentication_data_set_default(bcmolt_xgpon_onu_secure_mutual_authentication_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_secure_mutual_authentication_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a 
+ * bcmolt_xgpon_onu_secure_mutual_authentication_data would occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_secure_mutual_authentication_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_secure_mutual_authentication_data 
+ * struct and collects memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_secure_mutual_authentication_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the 
+ * bcmolt_xgpon_onu_secure_mutual_authentication_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_set_onu_state_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_set_onu_state_data_set_default(bcmolt_xgpon_onu_set_onu_state_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_set_onu_state_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_set_onu_state_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+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);
+
+/** Unpacks a bcmolt_xgpon_onu_set_onu_state_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_set_onu_state_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_set_onu_state_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_set_onu_state_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_cpu_packets_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_cpu_packets_data_set_default(bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_cpu_packets_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_cpu_packets_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_cpu_packets_data_get_packed_length(const bcmolt_xgpon_onu_cpu_packets_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_cpu_packets_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_cpu_packets_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packets_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_cpu_packets_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_ploam_packet_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_ploam_packet_data_set_default(bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_ploam_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_ploam_packet_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_ploam_packet_data_get_packed_length(const bcmolt_xgpon_onu_ploam_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_ploam_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_ploam_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_ploam_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_ploam_packet_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_cpu_packet_data struct.  This sets all fields 
+ * to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_cpu_packet_data_set_default(bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_cpu_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_cpu_packet_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_cpu_packet_data_get_packed_length(const bcmolt_xgpon_onu_cpu_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_cpu_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_cpu_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_cpu_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_cpu_packet_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_onu_omci_packet_data struct.  This sets all 
+ * fields to default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_onu_omci_packet_data_set_default(bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_onu_omci_packet_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+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);
+
+/** Gets the number of bytes that a bcmolt_xgpon_onu_omci_packet_data would 
+ * occupy on the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_onu_omci_packet_data_get_packed_length(const bcmolt_xgpon_onu_omci_packet_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_onu_omci_packet_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_onu_omci_packet_data struct and collects 
+ * memory requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_onu_omci_packet_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_onu_omci_packet_data is out of 
+ * bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_trx_key struct.  This sets all fields to default 
+ * values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_trx_key_set_default(bcmolt_xgpon_trx_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_trx_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_key_pack(const bcmolt_xgpon_trx_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_trx_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_trx_key_get_packed_length(const bcmolt_xgpon_trx_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_trx_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_key_unpack(bcmolt_xgpon_trx_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xgpon_trx_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_trx_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_trx_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xgpon_trx_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xgpon_trx_cfg_data_set_default(bcmolt_xgpon_trx_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xgpon_trx_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xgpon_trx_cfg_data_pack(const bcmolt_xgpon_trx_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xgpon_trx_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xgpon_trx_cfg_data_get_packed_length(const bcmolt_xgpon_trx_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xgpon_trx_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xgpon_trx_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xgpon_trx_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xgpon_trx_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xpon_serdes_key struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xpon_serdes_key_set_default(bcmolt_xpon_serdes_key *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xpon_serdes_key to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xpon_serdes_key_pack(const bcmolt_xpon_serdes_key *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xpon_serdes_key would occupy on the 
+ * wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xpon_serdes_key_get_packed_length(const bcmolt_xpon_serdes_key *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xpon_serdes_key from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xpon_serdes_key_unpack(bcmolt_xpon_serdes_key *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+
+/** Scans past a packed bcmolt_xpon_serdes_key struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xpon_serdes_key_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xpon_serdes_key is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/** Initializes a bcmolt_xpon_serdes_cfg_data struct.  This sets all fields to 
+ * default values. 
+ *
+ * \param this Pointer to the structure 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ */
+void bcmolt_xpon_serdes_cfg_data_set_default(bcmolt_xpon_serdes_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Packs a bcmolt_xpon_serdes_cfg_data to bytes 
+ *
+ * \param this Pointer to the object to pack 
+ * \param buf Pointer to the buffer to write to 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the pack was successful, FALSE otherwise 
+ */
+bcmos_bool bcmolt_xpon_serdes_cfg_data_pack(const bcmolt_xpon_serdes_cfg_data *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+
+/** Gets the number of bytes that a bcmolt_xpon_serdes_cfg_data would occupy on 
+ * the wire 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return The structure size in bytes 
+ */
+uint32_t bcmolt_xpon_serdes_cfg_data_get_packed_length(const bcmolt_xpon_serdes_cfg_data *this, bcmolt_presence_mask fields_present);
+
+/** Unpacks a bcmolt_xpon_serdes_cfg_data from bytes 
+ *
+ * \param this Pointer to the object to unpack 
+ * \param buf Pointer to the buffer to read from 
+ * \param extra_mem Pointer to the first location in memory to use to store 
+ * pointer fields that are NULL.  Setting this to NULL will cause an error when 
+ * a NULL pointer is encountered. 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE if the unpack was successful, FALSE otherwise 
+ */
+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);
+
+/** Scans past a packed bcmolt_xpon_serdes_cfg_data struct and collects memory 
+ * requirements above and beyond sizeof() 
+ *
+ * \param packed A stream pointing to the packed byte stream 
+ * \param extra_mem Number of additional storage bytes required 
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \return TRUE on success, FALSE on failure 
+ */
+bcmos_bool bcmolt_xpon_serdes_cfg_data_scan(bcmolt_buf *packed, uint32_t *extra_mem, bcmolt_presence_mask fields_present);
+
+/** Checks if any field in the bcmolt_xpon_serdes_cfg_data is out of bounds 
+ *
+ * \param fields_present Bitmask of which fields are present in the structure. 
+ * \param failed_prop Reference to the property that was out of range (only set 
+ * on failure) 
+ * \return TRUE if all fields are in the correct range, FALSE otherwise 
+ */
+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);
+
+/* Maple device selected as a target for CLI commands */
+extern bcmolt_devid current_device;
+
+/** 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);
+
+/** 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);
+
+/** Checks if objects with the given tag are valid in the given system mode. */
+bcmos_bool bcmolt_obj_tag_valid_for_system_mode(bcmolt_system_mode system_mode, bcmolt_obj_tag tag);
+
+/** Checks if the given object is supported in the given system mode.
+ * \param[in] system_mode System mode
+ * \param[in] obj         Object ID
+ * \return true if the object is supported in the given system mode, false otherwise.
+ */
+bcmos_bool bcmolt_object_is_supported(bcmolt_system_mode system_mode, bcmolt_obj_id obj);
+
+/** Gets the name of the given system mode as a string. */
+const char *bcmolt_system_mode_name(bcmolt_system_mode mode);
+
+/** 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_NOT_SUPPORTED
+ */
+bcmos_errno bcmolt_xgpon_num_of_onus_set(bcmolt_devid dev, bcmolt_xgpon_num_of_onus xgpon_num_of_onus);
+
+/** Get xgpon num of onus
+ * \param[in]  dev            Device id
+ * \param[in]  xgpon_num_of_onus    XGPON num of onus
+ * \returns BCM_ERR_OK
+ */
+bcmos_errno bcmolt_xgpon_num_of_onus_get(bcmolt_devid dev, bcmolt_xgpon_num_of_onus *xgpon_num_of_onus);
+#endif /* BCMOLT_MODEL_TYPES_H_ */
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.c b/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.c
new file mode 100644
index 0000000..b417f95
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.c
@@ -0,0 +1,2145 @@
+/*
+<: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_buf.h>
+#include <bcmolt_msg.h>
+#include "bcmolt_msg_pack.h"
+
+typedef uint32_t (*bcmolt_func_packed_len) (void *this, bcmolt_presence_mask fields_present);
+typedef bcmos_bool (*bcmolt_func_pack) (void *this, bcmolt_buf *buf, bcmolt_presence_mask fields_present);
+typedef bcmos_bool (*bcmolt_func_unpack) (void *this, bcmolt_buf *buf, void **extra_mem, bcmolt_presence_mask fields_present);
+typedef bcmos_bool (*bcmolt_func_mem_scan) (bcmolt_buf * buf, uint32_t * extra_mem, bcmolt_presence_mask fields_present);
+
+/******************************************************************************/
+typedef struct bcmolt_group_info
+{
+    bcmolt_obj_id obj_type;
+    bcmolt_mgt_group group;
+    uint16_t subgroup;
+    uint32_t size;
+    uint32_t container_size;    /* sizeof() the key/data container struct (0 for key groups) */
+    uint32_t data_offset;       /* offsetof() data field within container struct (0 for key groups) */
+    bcmolt_func_packed_len get_packed_length;
+    bcmolt_func_pack pack;
+    bcmolt_func_unpack unpack;
+    bcmolt_func_mem_scan mem_scan;
+} bcmolt_group_info;
+
+/******************************************************************************/
+typedef struct bcmolt_group_ids
+{
+    uint32_t subgroup_count;
+    bcmolt_group_id *subgroup_ids;
+} bcmolt_group_ids;
+
+/******************************************************************************/
+typedef struct bcmolt_instance_info
+{
+    int8_t offset;
+    int8_t size;
+} bcmolt_instance_info;
+
+/******************************************************************************/
+static bcmolt_group_info group_info_ae_ni_key = { BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_ae_ni_key), 0, 0, (bcmolt_func_packed_len) bcmolt_ae_ni_key_get_packed_length, (bcmolt_func_pack) bcmolt_ae_ni_key_pack, (bcmolt_func_unpack) bcmolt_ae_ni_key_unpack, bcmolt_ae_ni_key_scan };
+static bcmolt_group_info group_info_ae_ni_cfg = { BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_ae_ni_cfg_data), sizeof(bcmolt_ae_ni_cfg), offsetof(bcmolt_ae_ni_cfg, data), (bcmolt_func_packed_len) bcmolt_ae_ni_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_ni_cfg_data_pack, (bcmolt_func_unpack) bcmolt_ae_ni_cfg_data_unpack, bcmolt_ae_ni_cfg_data_scan };
+static bcmolt_group_info group_info_ae_ni_set_ae_ni_en_state = { BCMOLT_OBJ_ID_AE_NI, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_ae_ni_set_ae_ni_en_state_data), sizeof(bcmolt_ae_ni_set_ae_ni_en_state), offsetof(bcmolt_ae_ni_set_ae_ni_en_state, data), (bcmolt_func_packed_len) bcmolt_ae_ni_set_ae_ni_en_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_ni_set_ae_ni_en_state_data_pack, (bcmolt_func_unpack) bcmolt_ae_ni_set_ae_ni_en_state_data_unpack, bcmolt_ae_ni_set_ae_ni_en_state_data_scan };
+static bcmolt_group_info group_info_ae_path_ds_key = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_ae_path_ds_key), 0, 0, (bcmolt_func_packed_len) bcmolt_ae_path_ds_key_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_key_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_key_unpack, bcmolt_ae_path_ds_key_scan };
+static bcmolt_group_info group_info_ae_path_ds_stat = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_ae_path_ds_stat_data), sizeof(bcmolt_ae_path_ds_stat), offsetof(bcmolt_ae_path_ds_stat, data), (bcmolt_func_packed_len) bcmolt_ae_path_ds_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_stat_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_stat_data_unpack, bcmolt_ae_path_ds_stat_data_scan };
+static bcmolt_group_info group_info_ae_path_ds_stat_cfg = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_ae_path_ds_stat_cfg_data), sizeof(bcmolt_ae_path_ds_stat_cfg), offsetof(bcmolt_ae_path_ds_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_ae_path_ds_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_stat_cfg_data_unpack, bcmolt_ae_path_ds_stat_cfg_data_scan };
+static bcmolt_group_info group_info_ae_path_ds_stat_alarm_cleared = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_ae_path_ds_stat_alarm_cleared_data), sizeof(bcmolt_ae_path_ds_stat_alarm_cleared), offsetof(bcmolt_ae_path_ds_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_ae_path_ds_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_stat_alarm_cleared_data_unpack, bcmolt_ae_path_ds_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_ae_path_ds_stat_alarm_raised = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_ae_path_ds_stat_alarm_raised_data), sizeof(bcmolt_ae_path_ds_stat_alarm_raised), offsetof(bcmolt_ae_path_ds_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_ae_path_ds_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_stat_alarm_raised_data_unpack, bcmolt_ae_path_ds_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_ae_path_ds_auto_cfg = { BCMOLT_OBJ_ID_AE_PATH_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_ae_path_ds_auto_cfg_data), sizeof(bcmolt_ae_path_ds_auto_cfg), offsetof(bcmolt_ae_path_ds_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_ae_path_ds_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_ds_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_ds_auto_cfg_data_unpack, bcmolt_ae_path_ds_auto_cfg_data_scan };
+static bcmolt_group_info group_info_ae_path_us_key = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_ae_path_us_key), 0, 0, (bcmolt_func_packed_len) bcmolt_ae_path_us_key_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_key_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_key_unpack, bcmolt_ae_path_us_key_scan };
+static bcmolt_group_info group_info_ae_path_us_stat = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_ae_path_us_stat_data), sizeof(bcmolt_ae_path_us_stat), offsetof(bcmolt_ae_path_us_stat, data), (bcmolt_func_packed_len) bcmolt_ae_path_us_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_stat_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_stat_data_unpack, bcmolt_ae_path_us_stat_data_scan };
+static bcmolt_group_info group_info_ae_path_us_stat_cfg = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_ae_path_us_stat_cfg_data), sizeof(bcmolt_ae_path_us_stat_cfg), offsetof(bcmolt_ae_path_us_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_ae_path_us_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_stat_cfg_data_unpack, bcmolt_ae_path_us_stat_cfg_data_scan };
+static bcmolt_group_info group_info_ae_path_us_stat_alarm_cleared = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_ae_path_us_stat_alarm_cleared_data), sizeof(bcmolt_ae_path_us_stat_alarm_cleared), offsetof(bcmolt_ae_path_us_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_ae_path_us_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_stat_alarm_cleared_data_unpack, bcmolt_ae_path_us_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_ae_path_us_stat_alarm_raised = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_ae_path_us_stat_alarm_raised_data), sizeof(bcmolt_ae_path_us_stat_alarm_raised), offsetof(bcmolt_ae_path_us_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_ae_path_us_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_stat_alarm_raised_data_unpack, bcmolt_ae_path_us_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_ae_path_us_auto_cfg = { BCMOLT_OBJ_ID_AE_PATH_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_ae_path_us_auto_cfg_data), sizeof(bcmolt_ae_path_us_auto_cfg), offsetof(bcmolt_ae_path_us_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_ae_path_us_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_ae_path_us_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_ae_path_us_auto_cfg_data_unpack, bcmolt_ae_path_us_auto_cfg_data_scan };
+static bcmolt_group_info group_info_channel_key = { BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_channel_key), 0, 0, (bcmolt_func_packed_len) bcmolt_channel_key_get_packed_length, (bcmolt_func_pack) bcmolt_channel_key_pack, (bcmolt_func_unpack) bcmolt_channel_key_unpack, bcmolt_channel_key_scan };
+static bcmolt_group_info group_info_channel_cfg = { BCMOLT_OBJ_ID_CHANNEL, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_channel_cfg_data), sizeof(bcmolt_channel_cfg), offsetof(bcmolt_channel_cfg, data), (bcmolt_func_packed_len) bcmolt_channel_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_channel_cfg_data_pack, (bcmolt_func_unpack) bcmolt_channel_cfg_data_unpack, bcmolt_channel_cfg_data_scan };
+static bcmolt_group_info group_info_debug_key = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_debug_key), 0, 0, (bcmolt_func_packed_len) bcmolt_debug_key_get_packed_length, (bcmolt_func_pack) bcmolt_debug_key_pack, (bcmolt_func_unpack) bcmolt_debug_key_unpack, bcmolt_debug_key_scan };
+static bcmolt_group_info group_info_debug_cfg = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_debug_cfg_data), sizeof(bcmolt_debug_cfg), offsetof(bcmolt_debug_cfg, data), (bcmolt_func_packed_len) bcmolt_debug_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_debug_cfg_data_pack, (bcmolt_func_unpack) bcmolt_debug_cfg_data_unpack, bcmolt_debug_cfg_data_scan };
+static bcmolt_group_info group_info_debug_cli_output = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_debug_cli_output_data), sizeof(bcmolt_debug_cli_output), offsetof(bcmolt_debug_cli_output, data), (bcmolt_func_packed_len) bcmolt_debug_cli_output_data_get_packed_length, (bcmolt_func_pack) bcmolt_debug_cli_output_data_pack, (bcmolt_func_unpack) bcmolt_debug_cli_output_data_unpack, bcmolt_debug_cli_output_data_scan };
+static bcmolt_group_info group_info_debug_file_almost_full = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_AUTO, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_debug_auto_cfg = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_debug_auto_cfg_data), sizeof(bcmolt_debug_auto_cfg), offsetof(bcmolt_debug_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_debug_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_debug_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_debug_auto_cfg_data_unpack, bcmolt_debug_auto_cfg_data_scan };
+static bcmolt_group_info group_info_debug_cli_input = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_debug_cli_input_data), sizeof(bcmolt_debug_cli_input), offsetof(bcmolt_debug_cli_input, data), (bcmolt_func_packed_len) bcmolt_debug_cli_input_data_get_packed_length, (bcmolt_func_pack) bcmolt_debug_cli_input_data_pack, (bcmolt_func_unpack) bcmolt_debug_cli_input_data_unpack, bcmolt_debug_cli_input_data_scan };
+static bcmolt_group_info group_info_debug_reset_api_capture = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_OPER, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_debug_start_api_capture = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_OPER, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_debug_stop_api_capture = { BCMOLT_OBJ_ID_DEBUG, BCMOLT_MGT_GROUP_OPER, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_device_key = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_device_key), 0, 0, (bcmolt_func_packed_len) bcmolt_device_key_get_packed_length, (bcmolt_func_pack) bcmolt_device_key_pack, (bcmolt_func_unpack) bcmolt_device_key_unpack, bcmolt_device_key_scan };
+static bcmolt_group_info group_info_device_cfg = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_device_cfg_data), sizeof(bcmolt_device_cfg), offsetof(bcmolt_device_cfg, data), (bcmolt_func_packed_len) bcmolt_device_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_cfg_data_pack, (bcmolt_func_unpack) bcmolt_device_cfg_data_unpack, bcmolt_device_cfg_data_scan };
+static bcmolt_group_info group_info_device_connection_complete = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_device_connection_complete_data), sizeof(bcmolt_device_connection_complete), offsetof(bcmolt_device_connection_complete, data), (bcmolt_func_packed_len) bcmolt_device_connection_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_connection_complete_data_pack, (bcmolt_func_unpack) bcmolt_device_connection_complete_data_unpack, bcmolt_device_connection_complete_data_scan };
+static bcmolt_group_info group_info_device_connection_established = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_device_connection_failure = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_device_connection_failure_data), sizeof(bcmolt_device_connection_failure), offsetof(bcmolt_device_connection_failure, data), (bcmolt_func_packed_len) bcmolt_device_connection_failure_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_connection_failure_data_pack, (bcmolt_func_unpack) bcmolt_device_connection_failure_data_unpack, bcmolt_device_connection_failure_data_scan };
+static bcmolt_group_info group_info_device_ddr_test_complete = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_device_ddr_test_complete_data), sizeof(bcmolt_device_ddr_test_complete), offsetof(bcmolt_device_ddr_test_complete, data), (bcmolt_func_packed_len) bcmolt_device_ddr_test_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_ddr_test_complete_data_pack, (bcmolt_func_unpack) bcmolt_device_ddr_test_complete_data_unpack, bcmolt_device_ddr_test_complete_data_scan };
+static bcmolt_group_info group_info_device_device_keep_alive = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 4, sizeof(bcmolt_device_device_keep_alive_data), sizeof(bcmolt_device_device_keep_alive), offsetof(bcmolt_device_device_keep_alive, data), (bcmolt_func_packed_len) bcmolt_device_device_keep_alive_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_device_keep_alive_data_pack, (bcmolt_func_unpack) bcmolt_device_device_keep_alive_data_unpack, bcmolt_device_device_keep_alive_data_scan };
+static bcmolt_group_info group_info_device_device_ready = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_device_device_ready_data), sizeof(bcmolt_device_device_ready), offsetof(bcmolt_device_device_ready, data), (bcmolt_func_packed_len) bcmolt_device_device_ready_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_device_ready_data_pack, (bcmolt_func_unpack) bcmolt_device_device_ready_data_unpack, bcmolt_device_device_ready_data_scan };
+static bcmolt_group_info group_info_device_disconnection_complete = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 6, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_device_image_transfer_complete = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 7, sizeof(bcmolt_device_image_transfer_complete_data), sizeof(bcmolt_device_image_transfer_complete), offsetof(bcmolt_device_image_transfer_complete, data), (bcmolt_func_packed_len) bcmolt_device_image_transfer_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_image_transfer_complete_data_pack, (bcmolt_func_unpack) bcmolt_device_image_transfer_complete_data_unpack, bcmolt_device_image_transfer_complete_data_scan };
+static bcmolt_group_info group_info_device_indications_dropped = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_device_indications_dropped_data), sizeof(bcmolt_device_indications_dropped), offsetof(bcmolt_device_indications_dropped, data), (bcmolt_func_packed_len) bcmolt_device_indications_dropped_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_indications_dropped_data_pack, (bcmolt_func_unpack) bcmolt_device_indications_dropped_data_unpack, bcmolt_device_indications_dropped_data_scan };
+static bcmolt_group_info group_info_device_sw_error = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_device_sw_error_data), sizeof(bcmolt_device_sw_error), offsetof(bcmolt_device_sw_error, data), (bcmolt_func_packed_len) bcmolt_device_sw_error_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_sw_error_data_pack, (bcmolt_func_unpack) bcmolt_device_sw_error_data_unpack, bcmolt_device_sw_error_data_scan };
+static bcmolt_group_info group_info_device_sw_exception = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO, 10, sizeof(bcmolt_device_sw_exception_data), sizeof(bcmolt_device_sw_exception), offsetof(bcmolt_device_sw_exception, data), (bcmolt_func_packed_len) bcmolt_device_sw_exception_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_sw_exception_data_pack, (bcmolt_func_unpack) bcmolt_device_sw_exception_data_unpack, bcmolt_device_sw_exception_data_scan };
+static bcmolt_group_info group_info_device_auto_cfg = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_device_auto_cfg_data), sizeof(bcmolt_device_auto_cfg), offsetof(bcmolt_device_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_device_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_device_auto_cfg_data_unpack, bcmolt_device_auto_cfg_data_scan };
+static bcmolt_group_info group_info_device_connect = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_device_disconnect = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_device_host_keep_alive = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 2, sizeof(bcmolt_device_host_keep_alive_data), sizeof(bcmolt_device_host_keep_alive), offsetof(bcmolt_device_host_keep_alive, data), (bcmolt_func_packed_len) bcmolt_device_host_keep_alive_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_host_keep_alive_data_pack, (bcmolt_func_unpack) bcmolt_device_host_keep_alive_data_unpack, bcmolt_device_host_keep_alive_data_scan };
+static bcmolt_group_info group_info_device_image_transfer_data = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 3, sizeof(bcmolt_device_image_transfer_data_data), sizeof(bcmolt_device_image_transfer_data), offsetof(bcmolt_device_image_transfer_data, data), (bcmolt_func_packed_len) bcmolt_device_image_transfer_data_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_image_transfer_data_data_pack, (bcmolt_func_unpack) bcmolt_device_image_transfer_data_data_unpack, bcmolt_device_image_transfer_data_data_scan };
+static bcmolt_group_info group_info_device_image_transfer_start = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 4, sizeof(bcmolt_device_image_transfer_start_data), sizeof(bcmolt_device_image_transfer_start), offsetof(bcmolt_device_image_transfer_start, data), (bcmolt_func_packed_len) bcmolt_device_image_transfer_start_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_image_transfer_start_data_pack, (bcmolt_func_unpack) bcmolt_device_image_transfer_start_data_unpack, bcmolt_device_image_transfer_start_data_scan };
+static bcmolt_group_info group_info_device_reset = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 5, sizeof(bcmolt_device_reset_data), sizeof(bcmolt_device_reset), offsetof(bcmolt_device_reset, data), (bcmolt_func_packed_len) bcmolt_device_reset_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_reset_data_pack, (bcmolt_func_unpack) bcmolt_device_reset_data_unpack, bcmolt_device_reset_data_scan };
+static bcmolt_group_info group_info_device_run_ddr_test = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 6, sizeof(bcmolt_device_run_ddr_test_data), sizeof(bcmolt_device_run_ddr_test), offsetof(bcmolt_device_run_ddr_test, data), (bcmolt_func_packed_len) bcmolt_device_run_ddr_test_data_get_packed_length, (bcmolt_func_pack) bcmolt_device_run_ddr_test_data_pack, (bcmolt_func_unpack) bcmolt_device_run_ddr_test_data_unpack, bcmolt_device_run_ddr_test_data_scan };
+static bcmolt_group_info group_info_device_sw_upgrade_activate = { BCMOLT_OBJ_ID_DEVICE, BCMOLT_MGT_GROUP_OPER, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_denied_link_key = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_denied_link_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_denied_link_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_key_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_key_unpack, bcmolt_epon_denied_link_key_scan };
+static bcmolt_group_info group_info_epon_denied_link_cfg = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_denied_link_cfg_data), sizeof(bcmolt_epon_denied_link_cfg), offsetof(bcmolt_epon_denied_link_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_cfg_data_unpack, bcmolt_epon_denied_link_cfg_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_laser_on_off_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_denied_link_laser_on_off_violation_data), sizeof(bcmolt_epon_denied_link_laser_on_off_violation), offsetof(bcmolt_epon_denied_link_laser_on_off_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_laser_on_off_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_laser_on_off_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_laser_on_off_violation_data_unpack, bcmolt_epon_denied_link_laser_on_off_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_llid_pool_empty_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_denied_link_llid_pool_empty_violation_data), sizeof(bcmolt_epon_denied_link_llid_pool_empty_violation), offsetof(bcmolt_epon_denied_link_llid_pool_empty_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_llid_pool_empty_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_llid_pool_empty_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_llid_pool_empty_violation_data_unpack, bcmolt_epon_denied_link_llid_pool_empty_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_max_link_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_epon_denied_link_max_link_violation_data), sizeof(bcmolt_epon_denied_link_max_link_violation), offsetof(bcmolt_epon_denied_link_max_link_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_max_link_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_max_link_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_max_link_violation_data_unpack, bcmolt_epon_denied_link_max_link_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_overhead_profile_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_epon_denied_link_overhead_profile_violation_data), sizeof(bcmolt_epon_denied_link_overhead_profile_violation), offsetof(bcmolt_epon_denied_link_overhead_profile_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_overhead_profile_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_overhead_profile_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_overhead_profile_violation_data_unpack, bcmolt_epon_denied_link_overhead_profile_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_range_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 4, sizeof(bcmolt_epon_denied_link_range_violation_data), sizeof(bcmolt_epon_denied_link_range_violation), offsetof(bcmolt_epon_denied_link_range_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_range_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_range_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_range_violation_data_unpack, bcmolt_epon_denied_link_range_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_rogue_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_epon_denied_link_rogue_violation_data), sizeof(bcmolt_epon_denied_link_rogue_violation), offsetof(bcmolt_epon_denied_link_rogue_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_rogue_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_rogue_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_rogue_violation_data_unpack, bcmolt_epon_denied_link_rogue_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_system_resource_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_epon_denied_link_system_resource_violation_data), sizeof(bcmolt_epon_denied_link_system_resource_violation), offsetof(bcmolt_epon_denied_link_system_resource_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_system_resource_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_system_resource_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_system_resource_violation_data_unpack, bcmolt_epon_denied_link_system_resource_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_tdm_channels_exhausted = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 7, sizeof(bcmolt_epon_denied_link_tdm_channels_exhausted_data), sizeof(bcmolt_epon_denied_link_tdm_channels_exhausted), offsetof(bcmolt_epon_denied_link_tdm_channels_exhausted, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_tdm_channels_exhausted_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_tdm_channels_exhausted_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_tdm_channels_exhausted_data_unpack, bcmolt_epon_denied_link_tdm_channels_exhausted_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_unknown_link_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_epon_denied_link_unknown_link_violation_data), sizeof(bcmolt_epon_denied_link_unknown_link_violation), offsetof(bcmolt_epon_denied_link_unknown_link_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_unknown_link_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_unknown_link_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_unknown_link_violation_data_unpack, bcmolt_epon_denied_link_unknown_link_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_upstream_bandwidth_violation = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_epon_denied_link_upstream_bandwidth_violation_data), sizeof(bcmolt_epon_denied_link_upstream_bandwidth_violation), offsetof(bcmolt_epon_denied_link_upstream_bandwidth_violation, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_upstream_bandwidth_violation_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_upstream_bandwidth_violation_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_upstream_bandwidth_violation_data_unpack, bcmolt_epon_denied_link_upstream_bandwidth_violation_data_scan };
+static bcmolt_group_info group_info_epon_denied_link_auto_cfg = { BCMOLT_OBJ_ID_EPON_DENIED_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_denied_link_auto_cfg_data), sizeof(bcmolt_epon_denied_link_auto_cfg), offsetof(bcmolt_epon_denied_link_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_denied_link_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_denied_link_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_denied_link_auto_cfg_data_unpack, bcmolt_epon_denied_link_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_link_key = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_link_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_link_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_key_pack, (bcmolt_func_unpack) bcmolt_epon_link_key_unpack, bcmolt_epon_link_key_scan };
+static bcmolt_group_info group_info_epon_link_cfg = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_link_cfg_data), sizeof(bcmolt_epon_link_cfg), offsetof(bcmolt_epon_link_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_link_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_cfg_data_unpack, bcmolt_epon_link_cfg_data_scan };
+static bcmolt_group_info group_info_epon_link_stat = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_link_stat_data), sizeof(bcmolt_epon_link_stat), offsetof(bcmolt_epon_link_stat, data), (bcmolt_func_packed_len) bcmolt_epon_link_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_stat_data_unpack, bcmolt_epon_link_stat_data_scan };
+static bcmolt_group_info group_info_epon_link_stat_cfg = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_link_stat_cfg_data), sizeof(bcmolt_epon_link_stat_cfg), offsetof(bcmolt_epon_link_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_link_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_stat_cfg_data_unpack, bcmolt_epon_link_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_link_duplicate_mpcp_registration_request = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_link_duplicate_mpcp_registration_request_data), sizeof(bcmolt_epon_link_duplicate_mpcp_registration_request), offsetof(bcmolt_epon_link_duplicate_mpcp_registration_request, data), (bcmolt_func_packed_len) bcmolt_epon_link_duplicate_mpcp_registration_request_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_duplicate_mpcp_registration_request_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_duplicate_mpcp_registration_request_data_unpack, bcmolt_epon_link_duplicate_mpcp_registration_request_data_scan };
+static bcmolt_group_info group_info_epon_link_encryption_enabled = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_key_exchange_failure = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_epon_link_key_exchange_failure_data), sizeof(bcmolt_epon_link_key_exchange_failure), offsetof(bcmolt_epon_link_key_exchange_failure, data), (bcmolt_func_packed_len) bcmolt_epon_link_key_exchange_failure_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_key_exchange_failure_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_key_exchange_failure_data_unpack, bcmolt_epon_link_key_exchange_failure_data_scan };
+static bcmolt_group_info group_info_epon_link_key_exchange_started = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_key_exchange_stopped = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 4, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_link_deleted = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 5, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_link_speed_mismatch = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_epon_link_link_speed_mismatch_data), sizeof(bcmolt_epon_link_link_speed_mismatch), offsetof(bcmolt_epon_link_link_speed_mismatch, data), (bcmolt_func_packed_len) bcmolt_epon_link_link_speed_mismatch_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_link_speed_mismatch_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_link_speed_mismatch_data_unpack, bcmolt_epon_link_link_speed_mismatch_data_scan };
+static bcmolt_group_info group_info_epon_link_mpcp_deregistered = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_mpcp_discovered = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_epon_link_mpcp_discovered_data), sizeof(bcmolt_epon_link_mpcp_discovered), offsetof(bcmolt_epon_link_mpcp_discovered, data), (bcmolt_func_packed_len) bcmolt_epon_link_mpcp_discovered_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_mpcp_discovered_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_mpcp_discovered_data_unpack, bcmolt_epon_link_mpcp_discovered_data_scan };
+static bcmolt_group_info group_info_epon_link_mpcp_reg_ack_timeout = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 9, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_mpcp_report_timeout = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 10, sizeof(bcmolt_epon_link_mpcp_report_timeout_data), sizeof(bcmolt_epon_link_mpcp_report_timeout), offsetof(bcmolt_epon_link_mpcp_report_timeout, data), (bcmolt_func_packed_len) bcmolt_epon_link_mpcp_report_timeout_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_mpcp_report_timeout_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_mpcp_report_timeout_data_unpack, bcmolt_epon_link_mpcp_report_timeout_data_scan };
+static bcmolt_group_info group_info_epon_link_oam_keepalive_timeout = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 11, sizeof(bcmolt_epon_link_oam_keepalive_timeout_data), sizeof(bcmolt_epon_link_oam_keepalive_timeout), offsetof(bcmolt_epon_link_oam_keepalive_timeout, data), (bcmolt_func_packed_len) bcmolt_epon_link_oam_keepalive_timeout_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_oam_keepalive_timeout_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_oam_keepalive_timeout_data_unpack, bcmolt_epon_link_oam_keepalive_timeout_data_scan };
+static bcmolt_group_info group_info_epon_link_oam_keepalive_timer_started = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 12, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_oam_keepalive_timer_stopped = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 13, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_preprovisioned_link_created = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 14, sizeof(bcmolt_epon_link_preprovisioned_link_created_data), sizeof(bcmolt_epon_link_preprovisioned_link_created), offsetof(bcmolt_epon_link_preprovisioned_link_created, data), (bcmolt_func_packed_len) bcmolt_epon_link_preprovisioned_link_created_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_preprovisioned_link_created_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_preprovisioned_link_created_data_unpack, bcmolt_epon_link_preprovisioned_link_created_data_scan };
+static bcmolt_group_info group_info_epon_link_protection_switch_occurred = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 15, sizeof(bcmolt_epon_link_protection_switch_occurred_data), sizeof(bcmolt_epon_link_protection_switch_occurred), offsetof(bcmolt_epon_link_protection_switch_occurred, data), (bcmolt_func_packed_len) bcmolt_epon_link_protection_switch_occurred_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_protection_switch_occurred_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_protection_switch_occurred_data_unpack, bcmolt_epon_link_protection_switch_occurred_data_scan };
+static bcmolt_group_info group_info_epon_link_range_value_changed = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 16, sizeof(bcmolt_epon_link_range_value_changed_data), sizeof(bcmolt_epon_link_range_value_changed), offsetof(bcmolt_epon_link_range_value_changed, data), (bcmolt_func_packed_len) bcmolt_epon_link_range_value_changed_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_range_value_changed_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_range_value_changed_data_unpack, bcmolt_epon_link_range_value_changed_data_scan };
+static bcmolt_group_info group_info_epon_link_rerange_failure = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 17, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 18, sizeof(bcmolt_epon_link_stat_alarm_cleared_data), sizeof(bcmolt_epon_link_stat_alarm_cleared), offsetof(bcmolt_epon_link_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_link_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_stat_alarm_cleared_data_unpack, bcmolt_epon_link_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_link_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 19, sizeof(bcmolt_epon_link_stat_alarm_raised_data), sizeof(bcmolt_epon_link_stat_alarm_raised), offsetof(bcmolt_epon_link_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_link_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_stat_alarm_raised_data_unpack, bcmolt_epon_link_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_link_static_registration_done = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO, 20, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_auto_cfg = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_link_auto_cfg_data), sizeof(bcmolt_epon_link_auto_cfg), offsetof(bcmolt_epon_link_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_link_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_auto_cfg_data_unpack, bcmolt_epon_link_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_link_delete_link = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_force_rediscovery = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_key_exchange_start = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 2, sizeof(bcmolt_epon_link_key_exchange_start_data), sizeof(bcmolt_epon_link_key_exchange_start), offsetof(bcmolt_epon_link_key_exchange_start, data), (bcmolt_func_packed_len) bcmolt_epon_link_key_exchange_start_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_key_exchange_start_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_key_exchange_start_data_unpack, bcmolt_epon_link_key_exchange_start_data_scan };
+static bcmolt_group_info group_info_epon_link_key_exchange_stop = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_oam_keepalive_timer_start = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 4, sizeof(bcmolt_epon_link_oam_keepalive_timer_start_data), sizeof(bcmolt_epon_link_oam_keepalive_timer_start), offsetof(bcmolt_epon_link_oam_keepalive_timer_start, data), (bcmolt_func_packed_len) bcmolt_epon_link_oam_keepalive_timer_start_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_oam_keepalive_timer_start_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_oam_keepalive_timer_start_data_unpack, bcmolt_epon_link_oam_keepalive_timer_start_data_scan };
+static bcmolt_group_info group_info_epon_link_oam_keepalive_timer_stop = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 5, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_link_static_registration = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_OPER, 6, sizeof(bcmolt_epon_link_static_registration_data), sizeof(bcmolt_epon_link_static_registration), offsetof(bcmolt_epon_link_static_registration, data), (bcmolt_func_packed_len) bcmolt_epon_link_static_registration_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_static_registration_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_static_registration_data_unpack, bcmolt_epon_link_static_registration_data_scan };
+static bcmolt_group_info group_info_epon_link_inject_frame = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_PROXY, 0, sizeof(bcmolt_epon_link_inject_frame_data), sizeof(bcmolt_epon_link_inject_frame), offsetof(bcmolt_epon_link_inject_frame, data), (bcmolt_func_packed_len) bcmolt_epon_link_inject_frame_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_inject_frame_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_inject_frame_data_unpack, bcmolt_epon_link_inject_frame_data_scan };
+static bcmolt_group_info group_info_epon_link_frame_captured = { BCMOLT_OBJ_ID_EPON_LINK, BCMOLT_MGT_GROUP_PROXY_RX, 0, sizeof(bcmolt_epon_link_frame_captured_data), sizeof(bcmolt_epon_link_frame_captured), offsetof(bcmolt_epon_link_frame_captured, data), (bcmolt_func_packed_len) bcmolt_epon_link_frame_captured_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_link_frame_captured_data_pack, (bcmolt_func_unpack) bcmolt_epon_link_frame_captured_data_unpack, bcmolt_epon_link_frame_captured_data_scan };
+static bcmolt_group_info group_info_epon_ni_key = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_ni_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_ni_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_key_pack, (bcmolt_func_unpack) bcmolt_epon_ni_key_unpack, bcmolt_epon_ni_key_scan };
+static bcmolt_group_info group_info_epon_ni_cfg = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_ni_cfg_data), sizeof(bcmolt_epon_ni_cfg), offsetof(bcmolt_epon_ni_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_ni_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_cfg_data_unpack, bcmolt_epon_ni_cfg_data_scan };
+static bcmolt_group_info group_info_epon_ni_auto_rogue_scan_10g_failure = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_ni_auto_rogue_scan_1g_failure = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_ni_llid_quarantined = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_epon_ni_llid_quarantined_data), sizeof(bcmolt_epon_ni_llid_quarantined), offsetof(bcmolt_epon_ni_llid_quarantined, data), (bcmolt_func_packed_len) bcmolt_epon_ni_llid_quarantined_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_llid_quarantined_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_llid_quarantined_data_unpack, bcmolt_epon_ni_llid_quarantined_data_scan };
+static bcmolt_group_info group_info_epon_ni_mpcp_timestamp_changed = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_epon_ni_mpcp_timestamp_changed_data), sizeof(bcmolt_epon_ni_mpcp_timestamp_changed), offsetof(bcmolt_epon_ni_mpcp_timestamp_changed, data), (bcmolt_func_packed_len) bcmolt_epon_ni_mpcp_timestamp_changed_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_mpcp_timestamp_changed_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_mpcp_timestamp_changed_data_unpack, bcmolt_epon_ni_mpcp_timestamp_changed_data_scan };
+static bcmolt_group_info group_info_epon_ni_no_reports = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 4, sizeof(bcmolt_epon_ni_no_reports_data), sizeof(bcmolt_epon_ni_no_reports), offsetof(bcmolt_epon_ni_no_reports, data), (bcmolt_func_packed_len) bcmolt_epon_ni_no_reports_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_no_reports_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_no_reports_data_unpack, bcmolt_epon_ni_no_reports_data_scan };
+static bcmolt_group_info group_info_epon_ni_onu_upgrade_complete = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_epon_ni_onu_upgrade_complete_data), sizeof(bcmolt_epon_ni_onu_upgrade_complete), offsetof(bcmolt_epon_ni_onu_upgrade_complete, data), (bcmolt_func_packed_len) bcmolt_epon_ni_onu_upgrade_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_onu_upgrade_complete_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_onu_upgrade_complete_data_unpack, bcmolt_epon_ni_onu_upgrade_complete_data_scan };
+static bcmolt_group_info group_info_epon_ni_rerange_failure = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 6, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_epon_ni_rogue_scan_complete = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 7, sizeof(bcmolt_epon_ni_rogue_scan_complete_data), sizeof(bcmolt_epon_ni_rogue_scan_complete), offsetof(bcmolt_epon_ni_rogue_scan_complete, data), (bcmolt_func_packed_len) bcmolt_epon_ni_rogue_scan_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_rogue_scan_complete_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_rogue_scan_complete_data_unpack, bcmolt_epon_ni_rogue_scan_complete_data_scan };
+static bcmolt_group_info group_info_epon_ni_rssi_measurement_completed = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_epon_ni_rssi_measurement_completed_data), sizeof(bcmolt_epon_ni_rssi_measurement_completed), offsetof(bcmolt_epon_ni_rssi_measurement_completed, data), (bcmolt_func_packed_len) bcmolt_epon_ni_rssi_measurement_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_rssi_measurement_completed_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_rssi_measurement_completed_data_unpack, bcmolt_epon_ni_rssi_measurement_completed_data_scan };
+static bcmolt_group_info group_info_epon_ni_state_change_completed = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_epon_ni_state_change_completed_data), sizeof(bcmolt_epon_ni_state_change_completed), offsetof(bcmolt_epon_ni_state_change_completed, data), (bcmolt_func_packed_len) bcmolt_epon_ni_state_change_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_state_change_completed_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_state_change_completed_data_unpack, bcmolt_epon_ni_state_change_completed_data_scan };
+static bcmolt_group_info group_info_epon_ni_auto_cfg = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_ni_auto_cfg_data), sizeof(bcmolt_epon_ni_auto_cfg), offsetof(bcmolt_epon_ni_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_ni_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_auto_cfg_data_unpack, bcmolt_epon_ni_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_ni_add_link = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_epon_ni_add_link_data), sizeof(bcmolt_epon_ni_add_link), offsetof(bcmolt_epon_ni_add_link, data), (bcmolt_func_packed_len) bcmolt_epon_ni_add_link_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_add_link_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_add_link_data_unpack, bcmolt_epon_ni_add_link_data_scan };
+static bcmolt_group_info group_info_epon_ni_add_multicast_link = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_epon_ni_add_multicast_link_data), sizeof(bcmolt_epon_ni_add_multicast_link), offsetof(bcmolt_epon_ni_add_multicast_link, data), (bcmolt_func_packed_len) bcmolt_epon_ni_add_multicast_link_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_add_multicast_link_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_add_multicast_link_data_unpack, bcmolt_epon_ni_add_multicast_link_data_scan };
+static bcmolt_group_info group_info_epon_ni_add_protected_standby_link = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 2, sizeof(bcmolt_epon_ni_add_protected_standby_link_data), sizeof(bcmolt_epon_ni_add_protected_standby_link), offsetof(bcmolt_epon_ni_add_protected_standby_link, data), (bcmolt_func_packed_len) bcmolt_epon_ni_add_protected_standby_link_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_add_protected_standby_link_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_add_protected_standby_link_data_unpack, bcmolt_epon_ni_add_protected_standby_link_data_scan };
+static bcmolt_group_info group_info_epon_ni_issue_rssi_grant = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 3, sizeof(bcmolt_epon_ni_issue_rssi_grant_data), sizeof(bcmolt_epon_ni_issue_rssi_grant), offsetof(bcmolt_epon_ni_issue_rssi_grant, data), (bcmolt_func_packed_len) bcmolt_epon_ni_issue_rssi_grant_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_issue_rssi_grant_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_issue_rssi_grant_data_unpack, bcmolt_epon_ni_issue_rssi_grant_data_scan };
+static bcmolt_group_info group_info_epon_ni_protection_switching_apply_rerange_delta = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 4, sizeof(bcmolt_epon_ni_protection_switching_apply_rerange_delta_data), sizeof(bcmolt_epon_ni_protection_switching_apply_rerange_delta), offsetof(bcmolt_epon_ni_protection_switching_apply_rerange_delta, data), (bcmolt_func_packed_len) bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_unpack, bcmolt_epon_ni_protection_switching_apply_rerange_delta_data_scan };
+static bcmolt_group_info group_info_epon_ni_rogue_llid_scan = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 5, sizeof(bcmolt_epon_ni_rogue_llid_scan_data), sizeof(bcmolt_epon_ni_rogue_llid_scan), offsetof(bcmolt_epon_ni_rogue_llid_scan, data), (bcmolt_func_packed_len) bcmolt_epon_ni_rogue_llid_scan_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_rogue_llid_scan_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_rogue_llid_scan_data_unpack, bcmolt_epon_ni_rogue_llid_scan_data_scan };
+static bcmolt_group_info group_info_epon_ni_set_epon_ni_en_state = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 6, sizeof(bcmolt_epon_ni_set_epon_ni_en_state_data), sizeof(bcmolt_epon_ni_set_epon_ni_en_state), offsetof(bcmolt_epon_ni_set_epon_ni_en_state, data), (bcmolt_func_packed_len) bcmolt_epon_ni_set_epon_ni_en_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_set_epon_ni_en_state_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_set_epon_ni_en_state_data_unpack, bcmolt_epon_ni_set_epon_ni_en_state_data_scan };
+static bcmolt_group_info group_info_epon_ni_start_onu_upgrade = { BCMOLT_OBJ_ID_EPON_NI, BCMOLT_MGT_GROUP_OPER, 7, sizeof(bcmolt_epon_ni_start_onu_upgrade_data), sizeof(bcmolt_epon_ni_start_onu_upgrade), offsetof(bcmolt_epon_ni_start_onu_upgrade, data), (bcmolt_func_packed_len) bcmolt_epon_ni_start_onu_upgrade_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_ni_start_onu_upgrade_data_pack, (bcmolt_func_unpack) bcmolt_epon_ni_start_onu_upgrade_data_unpack, bcmolt_epon_ni_start_onu_upgrade_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_key = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_onu_10g_us_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_key_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_key_unpack, bcmolt_epon_onu_10g_us_key_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_cfg = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_onu_10g_us_cfg_data), sizeof(bcmolt_epon_onu_10g_us_cfg), offsetof(bcmolt_epon_onu_10g_us_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_cfg_data_unpack, bcmolt_epon_onu_10g_us_cfg_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_stat = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_onu_10g_us_stat_data), sizeof(bcmolt_epon_onu_10g_us_stat), offsetof(bcmolt_epon_onu_10g_us_stat, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_stat_data_unpack, bcmolt_epon_onu_10g_us_stat_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_stat_cfg = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_onu_10g_us_stat_cfg_data), sizeof(bcmolt_epon_onu_10g_us_stat_cfg), offsetof(bcmolt_epon_onu_10g_us_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_stat_cfg_data_unpack, bcmolt_epon_onu_10g_us_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_onu_10g_us_stat_alarm_cleared_data), sizeof(bcmolt_epon_onu_10g_us_stat_alarm_cleared), offsetof(bcmolt_epon_onu_10g_us_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_unpack, bcmolt_epon_onu_10g_us_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_onu_10g_us_stat_alarm_raised_data), sizeof(bcmolt_epon_onu_10g_us_stat_alarm_raised), offsetof(bcmolt_epon_onu_10g_us_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_stat_alarm_raised_data_unpack, bcmolt_epon_onu_10g_us_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_onu_10g_us_auto_cfg = { BCMOLT_OBJ_ID_EPON_ONU_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_onu_10g_us_auto_cfg_data), sizeof(bcmolt_epon_onu_10g_us_auto_cfg), offsetof(bcmolt_epon_onu_10g_us_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_10g_us_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_10g_us_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_10g_us_auto_cfg_data_unpack, bcmolt_epon_onu_10g_us_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_key = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_onu_1g_us_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_key_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_key_unpack, bcmolt_epon_onu_1g_us_key_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_cfg = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_onu_1g_us_cfg_data), sizeof(bcmolt_epon_onu_1g_us_cfg), offsetof(bcmolt_epon_onu_1g_us_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_cfg_data_unpack, bcmolt_epon_onu_1g_us_cfg_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_stat = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_onu_1g_us_stat_data), sizeof(bcmolt_epon_onu_1g_us_stat), offsetof(bcmolt_epon_onu_1g_us_stat, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_stat_data_unpack, bcmolt_epon_onu_1g_us_stat_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_stat_cfg = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_onu_1g_us_stat_cfg_data), sizeof(bcmolt_epon_onu_1g_us_stat_cfg), offsetof(bcmolt_epon_onu_1g_us_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_stat_cfg_data_unpack, bcmolt_epon_onu_1g_us_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_onu_1g_us_stat_alarm_cleared_data), sizeof(bcmolt_epon_onu_1g_us_stat_alarm_cleared), offsetof(bcmolt_epon_onu_1g_us_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_unpack, bcmolt_epon_onu_1g_us_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_onu_1g_us_stat_alarm_raised_data), sizeof(bcmolt_epon_onu_1g_us_stat_alarm_raised), offsetof(bcmolt_epon_onu_1g_us_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_stat_alarm_raised_data_unpack, bcmolt_epon_onu_1g_us_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_onu_1g_us_auto_cfg = { BCMOLT_OBJ_ID_EPON_ONU_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_onu_1g_us_auto_cfg_data), sizeof(bcmolt_epon_onu_1g_us_auto_cfg), offsetof(bcmolt_epon_onu_1g_us_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_onu_1g_us_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_onu_1g_us_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_onu_1g_us_auto_cfg_data_unpack, bcmolt_epon_onu_1g_us_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_key = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_path_10g_ds_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_key_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_key_unpack, bcmolt_epon_path_10g_ds_key_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_path_10g_ds_cfg_data), sizeof(bcmolt_epon_path_10g_ds_cfg), offsetof(bcmolt_epon_path_10g_ds_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_cfg_data_unpack, bcmolt_epon_path_10g_ds_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_stat = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_path_10g_ds_stat_data), sizeof(bcmolt_epon_path_10g_ds_stat), offsetof(bcmolt_epon_path_10g_ds_stat, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_stat_data_unpack, bcmolt_epon_path_10g_ds_stat_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_stat_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_path_10g_ds_stat_cfg_data), sizeof(bcmolt_epon_path_10g_ds_stat_cfg), offsetof(bcmolt_epon_path_10g_ds_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_stat_cfg_data_unpack, bcmolt_epon_path_10g_ds_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_path_10g_ds_stat_alarm_cleared_data), sizeof(bcmolt_epon_path_10g_ds_stat_alarm_cleared), offsetof(bcmolt_epon_path_10g_ds_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_unpack, bcmolt_epon_path_10g_ds_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_path_10g_ds_stat_alarm_raised_data), sizeof(bcmolt_epon_path_10g_ds_stat_alarm_raised), offsetof(bcmolt_epon_path_10g_ds_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_stat_alarm_raised_data_unpack, bcmolt_epon_path_10g_ds_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_ds_auto_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_path_10g_ds_auto_cfg_data), sizeof(bcmolt_epon_path_10g_ds_auto_cfg), offsetof(bcmolt_epon_path_10g_ds_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_ds_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_ds_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_ds_auto_cfg_data_unpack, bcmolt_epon_path_10g_ds_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_key = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_path_10g_us_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_key_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_key_unpack, bcmolt_epon_path_10g_us_key_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_path_10g_us_cfg_data), sizeof(bcmolt_epon_path_10g_us_cfg), offsetof(bcmolt_epon_path_10g_us_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_cfg_data_unpack, bcmolt_epon_path_10g_us_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_stat = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_path_10g_us_stat_data), sizeof(bcmolt_epon_path_10g_us_stat), offsetof(bcmolt_epon_path_10g_us_stat, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_stat_data_unpack, bcmolt_epon_path_10g_us_stat_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_stat_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_path_10g_us_stat_cfg_data), sizeof(bcmolt_epon_path_10g_us_stat_cfg), offsetof(bcmolt_epon_path_10g_us_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_stat_cfg_data_unpack, bcmolt_epon_path_10g_us_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_path_10g_us_stat_alarm_cleared_data), sizeof(bcmolt_epon_path_10g_us_stat_alarm_cleared), offsetof(bcmolt_epon_path_10g_us_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_stat_alarm_cleared_data_unpack, bcmolt_epon_path_10g_us_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_path_10g_us_stat_alarm_raised_data), sizeof(bcmolt_epon_path_10g_us_stat_alarm_raised), offsetof(bcmolt_epon_path_10g_us_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_stat_alarm_raised_data_unpack, bcmolt_epon_path_10g_us_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_path_10g_us_auto_cfg = { BCMOLT_OBJ_ID_EPON_PATH_10G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_path_10g_us_auto_cfg_data), sizeof(bcmolt_epon_path_10g_us_auto_cfg), offsetof(bcmolt_epon_path_10g_us_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_10g_us_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_10g_us_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_10g_us_auto_cfg_data_unpack, bcmolt_epon_path_10g_us_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_key = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_path_1g_ds_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_key_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_key_unpack, bcmolt_epon_path_1g_ds_key_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_path_1g_ds_cfg_data), sizeof(bcmolt_epon_path_1g_ds_cfg), offsetof(bcmolt_epon_path_1g_ds_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_cfg_data_unpack, bcmolt_epon_path_1g_ds_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_stat = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_path_1g_ds_stat_data), sizeof(bcmolt_epon_path_1g_ds_stat), offsetof(bcmolt_epon_path_1g_ds_stat, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_stat_data_unpack, bcmolt_epon_path_1g_ds_stat_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_stat_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_path_1g_ds_stat_cfg_data), sizeof(bcmolt_epon_path_1g_ds_stat_cfg), offsetof(bcmolt_epon_path_1g_ds_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_stat_cfg_data_unpack, bcmolt_epon_path_1g_ds_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_path_1g_ds_stat_alarm_cleared_data), sizeof(bcmolt_epon_path_1g_ds_stat_alarm_cleared), offsetof(bcmolt_epon_path_1g_ds_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_unpack, bcmolt_epon_path_1g_ds_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_path_1g_ds_stat_alarm_raised_data), sizeof(bcmolt_epon_path_1g_ds_stat_alarm_raised), offsetof(bcmolt_epon_path_1g_ds_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_stat_alarm_raised_data_unpack, bcmolt_epon_path_1g_ds_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_ds_auto_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_DS, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_path_1g_ds_auto_cfg_data), sizeof(bcmolt_epon_path_1g_ds_auto_cfg), offsetof(bcmolt_epon_path_1g_ds_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_ds_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_ds_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_ds_auto_cfg_data_unpack, bcmolt_epon_path_1g_ds_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_key = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_path_1g_us_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_key_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_key_unpack, bcmolt_epon_path_1g_us_key_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_path_1g_us_cfg_data), sizeof(bcmolt_epon_path_1g_us_cfg), offsetof(bcmolt_epon_path_1g_us_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_cfg_data_unpack, bcmolt_epon_path_1g_us_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_stat = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_epon_path_1g_us_stat_data), sizeof(bcmolt_epon_path_1g_us_stat), offsetof(bcmolt_epon_path_1g_us_stat, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_stat_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_stat_data_unpack, bcmolt_epon_path_1g_us_stat_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_stat_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_epon_path_1g_us_stat_cfg_data), sizeof(bcmolt_epon_path_1g_us_stat_cfg), offsetof(bcmolt_epon_path_1g_us_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_stat_cfg_data_unpack, bcmolt_epon_path_1g_us_stat_cfg_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_stat_alarm_cleared = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_epon_path_1g_us_stat_alarm_cleared_data), sizeof(bcmolt_epon_path_1g_us_stat_alarm_cleared), offsetof(bcmolt_epon_path_1g_us_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_stat_alarm_cleared_data_unpack, bcmolt_epon_path_1g_us_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_stat_alarm_raised = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_epon_path_1g_us_stat_alarm_raised_data), sizeof(bcmolt_epon_path_1g_us_stat_alarm_raised), offsetof(bcmolt_epon_path_1g_us_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_stat_alarm_raised_data_unpack, bcmolt_epon_path_1g_us_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_epon_path_1g_us_auto_cfg = { BCMOLT_OBJ_ID_EPON_PATH_1G_US, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_epon_path_1g_us_auto_cfg_data), sizeof(bcmolt_epon_path_1g_us_auto_cfg), offsetof(bcmolt_epon_path_1g_us_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_path_1g_us_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_path_1g_us_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_path_1g_us_auto_cfg_data_unpack, bcmolt_epon_path_1g_us_auto_cfg_data_scan };
+static bcmolt_group_info group_info_epon_rp_key = { BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_epon_rp_key), 0, 0, (bcmolt_func_packed_len) bcmolt_epon_rp_key_get_packed_length, (bcmolt_func_pack) bcmolt_epon_rp_key_pack, (bcmolt_func_unpack) bcmolt_epon_rp_key_unpack, bcmolt_epon_rp_key_scan };
+static bcmolt_group_info group_info_epon_rp_cfg = { BCMOLT_OBJ_ID_EPON_RP, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_epon_rp_cfg_data), sizeof(bcmolt_epon_rp_cfg), offsetof(bcmolt_epon_rp_cfg, data), (bcmolt_func_packed_len) bcmolt_epon_rp_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_epon_rp_cfg_data_pack, (bcmolt_func_unpack) bcmolt_epon_rp_cfg_data_unpack, bcmolt_epon_rp_cfg_data_scan };
+static bcmolt_group_info group_info_gpio_key = { BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpio_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpio_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpio_key_pack, (bcmolt_func_unpack) bcmolt_gpio_key_unpack, bcmolt_gpio_key_scan };
+static bcmolt_group_info group_info_gpio_cfg = { BCMOLT_OBJ_ID_GPIO, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpio_cfg_data), sizeof(bcmolt_gpio_cfg), offsetof(bcmolt_gpio_cfg, data), (bcmolt_func_packed_len) bcmolt_gpio_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpio_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpio_cfg_data_unpack, bcmolt_gpio_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_key = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_alloc_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_alloc_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_key_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_key_unpack, bcmolt_gpon_alloc_key_scan };
+static bcmolt_group_info group_info_gpon_alloc_cfg = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_alloc_cfg_data), sizeof(bcmolt_gpon_alloc_cfg), offsetof(bcmolt_gpon_alloc_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_cfg_data_unpack, bcmolt_gpon_alloc_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_stat = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_gpon_alloc_stat_data), sizeof(bcmolt_gpon_alloc_stat), offsetof(bcmolt_gpon_alloc_stat, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_stat_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_stat_data_unpack, bcmolt_gpon_alloc_stat_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_stat_cfg = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_gpon_alloc_stat_cfg_data), sizeof(bcmolt_gpon_alloc_stat_cfg), offsetof(bcmolt_gpon_alloc_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_stat_cfg_data_unpack, bcmolt_gpon_alloc_stat_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_configuration_completed = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_gpon_alloc_configuration_completed_data), sizeof(bcmolt_gpon_alloc_configuration_completed), offsetof(bcmolt_gpon_alloc_configuration_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_configuration_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_configuration_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_configuration_completed_data_unpack, bcmolt_gpon_alloc_configuration_completed_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_get_alloc_stats_completed = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_alloc_get_alloc_stats_completed_data), sizeof(bcmolt_gpon_alloc_get_alloc_stats_completed), offsetof(bcmolt_gpon_alloc_get_alloc_stats_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_get_alloc_stats_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_get_alloc_stats_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_get_alloc_stats_completed_data_unpack, bcmolt_gpon_alloc_get_alloc_stats_completed_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_stat_alarm_cleared = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_gpon_alloc_stat_alarm_cleared_data), sizeof(bcmolt_gpon_alloc_stat_alarm_cleared), offsetof(bcmolt_gpon_alloc_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_stat_alarm_cleared_data_unpack, bcmolt_gpon_alloc_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_stat_alarm_raised = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_gpon_alloc_stat_alarm_raised_data), sizeof(bcmolt_gpon_alloc_stat_alarm_raised), offsetof(bcmolt_gpon_alloc_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_stat_alarm_raised_data_unpack, bcmolt_gpon_alloc_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_auto_cfg = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_alloc_auto_cfg_data), sizeof(bcmolt_gpon_alloc_auto_cfg), offsetof(bcmolt_gpon_alloc_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_auto_cfg_data_unpack, bcmolt_gpon_alloc_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_get_stats = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_gpon_alloc_get_stats_data), sizeof(bcmolt_gpon_alloc_get_stats), offsetof(bcmolt_gpon_alloc_get_stats, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_get_stats_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_get_stats_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_get_stats_data_unpack, bcmolt_gpon_alloc_get_stats_data_scan };
+static bcmolt_group_info group_info_gpon_alloc_set_state = { BCMOLT_OBJ_ID_GPON_ALLOC, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_gpon_alloc_set_state_data), sizeof(bcmolt_gpon_alloc_set_state), offsetof(bcmolt_gpon_alloc_set_state, data), (bcmolt_func_packed_len) bcmolt_gpon_alloc_set_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_alloc_set_state_data_pack, (bcmolt_func_unpack) bcmolt_gpon_alloc_set_state_data_unpack, bcmolt_gpon_alloc_set_state_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_key = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_gem_port_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_gem_port_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_key_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_key_unpack, bcmolt_gpon_gem_port_key_scan };
+static bcmolt_group_info group_info_gpon_gem_port_cfg = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_gem_port_cfg_data), sizeof(bcmolt_gpon_gem_port_cfg), offsetof(bcmolt_gpon_gem_port_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_cfg_data_unpack, bcmolt_gpon_gem_port_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_stat = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_gpon_gem_port_stat_data), sizeof(bcmolt_gpon_gem_port_stat), offsetof(bcmolt_gpon_gem_port_stat, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_stat_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_stat_data_unpack, bcmolt_gpon_gem_port_stat_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_stat_cfg = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_gpon_gem_port_stat_cfg_data), sizeof(bcmolt_gpon_gem_port_stat_cfg), offsetof(bcmolt_gpon_gem_port_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_stat_cfg_data_unpack, bcmolt_gpon_gem_port_stat_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_configuration_completed = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_gpon_gem_port_configuration_completed_data), sizeof(bcmolt_gpon_gem_port_configuration_completed), offsetof(bcmolt_gpon_gem_port_configuration_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_configuration_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_configuration_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_configuration_completed_data_unpack, bcmolt_gpon_gem_port_configuration_completed_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_stat_alarm_cleared = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_gem_port_stat_alarm_cleared_data), sizeof(bcmolt_gpon_gem_port_stat_alarm_cleared), offsetof(bcmolt_gpon_gem_port_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_stat_alarm_cleared_data_unpack, bcmolt_gpon_gem_port_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_stat_alarm_raised = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_gpon_gem_port_stat_alarm_raised_data), sizeof(bcmolt_gpon_gem_port_stat_alarm_raised), offsetof(bcmolt_gpon_gem_port_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_stat_alarm_raised_data_unpack, bcmolt_gpon_gem_port_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_auto_cfg = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_gem_port_auto_cfg_data), sizeof(bcmolt_gpon_gem_port_auto_cfg), offsetof(bcmolt_gpon_gem_port_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_auto_cfg_data_unpack, bcmolt_gpon_gem_port_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_gem_port_set_state = { BCMOLT_OBJ_ID_GPON_GEM_PORT, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_gpon_gem_port_set_state_data), sizeof(bcmolt_gpon_gem_port_set_state), offsetof(bcmolt_gpon_gem_port_set_state, data), (bcmolt_func_packed_len) bcmolt_gpon_gem_port_set_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_gem_port_set_state_data_pack, (bcmolt_func_unpack) bcmolt_gpon_gem_port_set_state_data_unpack, bcmolt_gpon_gem_port_set_state_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_key = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_iwf_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_iwf_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_key_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_key_unpack, bcmolt_gpon_iwf_key_scan };
+static bcmolt_group_info group_info_gpon_iwf_cfg = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_iwf_cfg_data), sizeof(bcmolt_gpon_iwf_cfg), offsetof(bcmolt_gpon_iwf_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_cfg_data_unpack, bcmolt_gpon_iwf_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_stat = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_gpon_iwf_stat_data), sizeof(bcmolt_gpon_iwf_stat), offsetof(bcmolt_gpon_iwf_stat, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_stat_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_stat_data_unpack, bcmolt_gpon_iwf_stat_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_stat_cfg = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_gpon_iwf_stat_cfg_data), sizeof(bcmolt_gpon_iwf_stat_cfg), offsetof(bcmolt_gpon_iwf_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_stat_cfg_data_unpack, bcmolt_gpon_iwf_stat_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_flush_mac_table_completed = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_iwf_scan_mac_table_completed = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_iwf_scan_mac_table_completed_data), sizeof(bcmolt_gpon_iwf_scan_mac_table_completed), offsetof(bcmolt_gpon_iwf_scan_mac_table_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_scan_mac_table_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_scan_mac_table_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_scan_mac_table_completed_data_unpack, bcmolt_gpon_iwf_scan_mac_table_completed_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_stat_alarm_cleared = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_gpon_iwf_stat_alarm_cleared_data), sizeof(bcmolt_gpon_iwf_stat_alarm_cleared), offsetof(bcmolt_gpon_iwf_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_stat_alarm_cleared_data_unpack, bcmolt_gpon_iwf_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_stat_alarm_raised = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_gpon_iwf_stat_alarm_raised_data), sizeof(bcmolt_gpon_iwf_stat_alarm_raised), offsetof(bcmolt_gpon_iwf_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_stat_alarm_raised_data_unpack, bcmolt_gpon_iwf_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_auto_cfg = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_iwf_auto_cfg_data), sizeof(bcmolt_gpon_iwf_auto_cfg), offsetof(bcmolt_gpon_iwf_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_auto_cfg_data_unpack, bcmolt_gpon_iwf_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_flush_mac_table = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_gpon_iwf_flush_mac_table_data), sizeof(bcmolt_gpon_iwf_flush_mac_table), offsetof(bcmolt_gpon_iwf_flush_mac_table, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_flush_mac_table_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_flush_mac_table_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_flush_mac_table_data_unpack, bcmolt_gpon_iwf_flush_mac_table_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_scan_mac_table = { BCMOLT_OBJ_ID_GPON_IWF, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_gpon_iwf_scan_mac_table_data), sizeof(bcmolt_gpon_iwf_scan_mac_table), offsetof(bcmolt_gpon_iwf_scan_mac_table, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_scan_mac_table_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_scan_mac_table_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_scan_mac_table_data_unpack, bcmolt_gpon_iwf_scan_mac_table_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_ds_egress_flow_key = { BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_iwf_ds_egress_flow_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_iwf_ds_egress_flow_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_ds_egress_flow_key_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_ds_egress_flow_key_unpack, bcmolt_gpon_iwf_ds_egress_flow_key_scan };
+static bcmolt_group_info group_info_gpon_iwf_ds_egress_flow_cfg = { BCMOLT_OBJ_ID_GPON_IWF_DS_EGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_iwf_ds_egress_flow_cfg_data), sizeof(bcmolt_gpon_iwf_ds_egress_flow_cfg), offsetof(bcmolt_gpon_iwf_ds_egress_flow_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_ds_egress_flow_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_ds_egress_flow_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_ds_egress_flow_cfg_data_unpack, bcmolt_gpon_iwf_ds_egress_flow_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_ds_ingress_flow_key = { BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_iwf_ds_ingress_flow_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_iwf_ds_ingress_flow_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_ds_ingress_flow_key_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_ds_ingress_flow_key_unpack, bcmolt_gpon_iwf_ds_ingress_flow_key_scan };
+static bcmolt_group_info group_info_gpon_iwf_ds_ingress_flow_cfg = { BCMOLT_OBJ_ID_GPON_IWF_DS_INGRESS_FLOW, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_iwf_ds_ingress_flow_cfg_data), sizeof(bcmolt_gpon_iwf_ds_ingress_flow_cfg), offsetof(bcmolt_gpon_iwf_ds_ingress_flow_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_unpack, bcmolt_gpon_iwf_ds_ingress_flow_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_key = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_iwf_mac_table_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_key_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_key_unpack, bcmolt_gpon_iwf_mac_table_key_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_cfg = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_iwf_mac_table_cfg_data), sizeof(bcmolt_gpon_iwf_mac_table_cfg), offsetof(bcmolt_gpon_iwf_mac_table_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_cfg_data_unpack, bcmolt_gpon_iwf_mac_table_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_mac_aged = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_mac_dropped = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_iwf_mac_table_mac_dropped_data), sizeof(bcmolt_gpon_iwf_mac_table_mac_dropped), offsetof(bcmolt_gpon_iwf_mac_table_mac_dropped, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_mac_dropped_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_mac_dropped_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_mac_dropped_data_unpack, bcmolt_gpon_iwf_mac_table_mac_dropped_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_mac_move = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_gpon_iwf_mac_table_mac_move_data), sizeof(bcmolt_gpon_iwf_mac_table_mac_move), offsetof(bcmolt_gpon_iwf_mac_table_mac_move, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_mac_move_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_mac_move_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_mac_move_data_unpack, bcmolt_gpon_iwf_mac_table_mac_move_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_new_mac = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_gpon_iwf_mac_table_new_mac_data), sizeof(bcmolt_gpon_iwf_mac_table_new_mac), offsetof(bcmolt_gpon_iwf_mac_table_new_mac, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_new_mac_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_new_mac_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_new_mac_data_unpack, bcmolt_gpon_iwf_mac_table_new_mac_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_mac_table_auto_cfg = { BCMOLT_OBJ_ID_GPON_IWF_MAC_TABLE, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_iwf_mac_table_auto_cfg_data), sizeof(bcmolt_gpon_iwf_mac_table_auto_cfg), offsetof(bcmolt_gpon_iwf_mac_table_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_mac_table_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_mac_table_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_mac_table_auto_cfg_data_unpack, bcmolt_gpon_iwf_mac_table_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_iwf_us_flow_key = { BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_iwf_us_flow_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_iwf_us_flow_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_us_flow_key_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_us_flow_key_unpack, bcmolt_gpon_iwf_us_flow_key_scan };
+static bcmolt_group_info group_info_gpon_iwf_us_flow_cfg = { BCMOLT_OBJ_ID_GPON_IWF_US_FLOW, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_iwf_us_flow_cfg_data), sizeof(bcmolt_gpon_iwf_us_flow_cfg), offsetof(bcmolt_gpon_iwf_us_flow_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_iwf_us_flow_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_iwf_us_flow_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_iwf_us_flow_cfg_data_unpack, bcmolt_gpon_iwf_us_flow_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_ni_key = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_ni_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_ni_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_key_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_key_unpack, bcmolt_gpon_ni_key_scan };
+static bcmolt_group_info group_info_gpon_ni_cfg = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_ni_cfg_data), sizeof(bcmolt_gpon_ni_cfg), offsetof(bcmolt_gpon_ni_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_cfg_data_unpack, bcmolt_gpon_ni_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_ni_stat = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_gpon_ni_stat_data), sizeof(bcmolt_gpon_ni_stat), offsetof(bcmolt_gpon_ni_stat, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_stat_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_stat_data_unpack, bcmolt_gpon_ni_stat_data_scan };
+static bcmolt_group_info group_info_gpon_ni_stat_cfg = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_gpon_ni_stat_cfg_data), sizeof(bcmolt_gpon_ni_stat_cfg), offsetof(bcmolt_gpon_ni_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_stat_cfg_data_unpack, bcmolt_gpon_ni_stat_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_ni_activate_all_onus_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_cpu_packets_failure = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_ni_cpu_packets_failure_data), sizeof(bcmolt_gpon_ni_cpu_packets_failure), offsetof(bcmolt_gpon_ni_cpu_packets_failure, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_cpu_packets_failure_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_cpu_packets_failure_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_cpu_packets_failure_data_unpack, bcmolt_gpon_ni_cpu_packets_failure_data_scan };
+static bcmolt_group_info group_info_gpon_ni_deactivate_all_onus_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_disable_all_onus_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_enable_all_onus_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 4, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_los = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_gpon_ni_los_data), sizeof(bcmolt_gpon_ni_los), offsetof(bcmolt_gpon_ni_los, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_los_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_los_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_los_data_unpack, bcmolt_gpon_ni_los_data_scan };
+static bcmolt_group_info group_info_gpon_ni_onu_discovered = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_gpon_ni_onu_discovered_data), sizeof(bcmolt_gpon_ni_onu_discovered), offsetof(bcmolt_gpon_ni_onu_discovered, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_onu_discovered_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_onu_discovered_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_onu_discovered_data_unpack, bcmolt_gpon_ni_onu_discovered_data_scan };
+static bcmolt_group_info group_info_gpon_ni_onu_upgrade_complete = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 7, sizeof(bcmolt_gpon_ni_onu_upgrade_complete_data), sizeof(bcmolt_gpon_ni_onu_upgrade_complete), offsetof(bcmolt_gpon_ni_onu_upgrade_complete, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_onu_upgrade_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_onu_upgrade_complete_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_onu_upgrade_complete_data_unpack, bcmolt_gpon_ni_onu_upgrade_complete_data_scan };
+static bcmolt_group_info group_info_gpon_ni_protection_switching_onus_ranged = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_gpon_ni_protection_switching_onus_ranged_data), sizeof(bcmolt_gpon_ni_protection_switching_onus_ranged), offsetof(bcmolt_gpon_ni_protection_switching_onus_ranged, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_protection_switching_onus_ranged_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_protection_switching_onus_ranged_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_protection_switching_onus_ranged_data_unpack, bcmolt_gpon_ni_protection_switching_onus_ranged_data_scan };
+static bcmolt_group_info group_info_gpon_ni_protection_switching_switchover_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_gpon_ni_protection_switching_switchover_completed_data), sizeof(bcmolt_gpon_ni_protection_switching_switchover_completed), offsetof(bcmolt_gpon_ni_protection_switching_switchover_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_protection_switching_switchover_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_protection_switching_switchover_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_protection_switching_switchover_completed_data_unpack, bcmolt_gpon_ni_protection_switching_switchover_completed_data_scan };
+static bcmolt_group_info group_info_gpon_ni_protection_switching_traffic_resume = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 10, sizeof(bcmolt_gpon_ni_protection_switching_traffic_resume_data), sizeof(bcmolt_gpon_ni_protection_switching_traffic_resume), offsetof(bcmolt_gpon_ni_protection_switching_traffic_resume, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_protection_switching_traffic_resume_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_protection_switching_traffic_resume_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_protection_switching_traffic_resume_data_unpack, bcmolt_gpon_ni_protection_switching_traffic_resume_data_scan };
+static bcmolt_group_info group_info_gpon_ni_rogue_detection_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 11, sizeof(bcmolt_gpon_ni_rogue_detection_completed_data), sizeof(bcmolt_gpon_ni_rogue_detection_completed), offsetof(bcmolt_gpon_ni_rogue_detection_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_rogue_detection_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_rogue_detection_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_rogue_detection_completed_data_unpack, bcmolt_gpon_ni_rogue_detection_completed_data_scan };
+static bcmolt_group_info group_info_gpon_ni_rogue_onu_special_map_cycle_start = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 12, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_serial_number_acquisition_cycle_start = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 13, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_standby_pon_monitoring_cycle_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 14, sizeof(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data), sizeof(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed), offsetof(bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_unpack, bcmolt_gpon_ni_standby_pon_monitoring_cycle_completed_data_scan };
+static bcmolt_group_info group_info_gpon_ni_stat_alarm_cleared = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 15, sizeof(bcmolt_gpon_ni_stat_alarm_cleared_data), sizeof(bcmolt_gpon_ni_stat_alarm_cleared), offsetof(bcmolt_gpon_ni_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_stat_alarm_cleared_data_unpack, bcmolt_gpon_ni_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_gpon_ni_stat_alarm_raised = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 16, sizeof(bcmolt_gpon_ni_stat_alarm_raised_data), sizeof(bcmolt_gpon_ni_stat_alarm_raised), offsetof(bcmolt_gpon_ni_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_stat_alarm_raised_data_unpack, bcmolt_gpon_ni_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_gpon_ni_state_change_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 17, sizeof(bcmolt_gpon_ni_state_change_completed_data), sizeof(bcmolt_gpon_ni_state_change_completed), offsetof(bcmolt_gpon_ni_state_change_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_state_change_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_state_change_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_state_change_completed_data_unpack, bcmolt_gpon_ni_state_change_completed_data_scan };
+static bcmolt_group_info group_info_gpon_ni_tod_request_completed = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO, 18, sizeof(bcmolt_gpon_ni_tod_request_completed_data), sizeof(bcmolt_gpon_ni_tod_request_completed), offsetof(bcmolt_gpon_ni_tod_request_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_tod_request_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_tod_request_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_tod_request_completed_data_unpack, bcmolt_gpon_ni_tod_request_completed_data_scan };
+static bcmolt_group_info group_info_gpon_ni_auto_cfg = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_ni_auto_cfg_data), sizeof(bcmolt_gpon_ni_auto_cfg), offsetof(bcmolt_gpon_ni_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_auto_cfg_data_unpack, bcmolt_gpon_ni_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_ni_disable_serial_number = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_gpon_ni_disable_serial_number_data), sizeof(bcmolt_gpon_ni_disable_serial_number), offsetof(bcmolt_gpon_ni_disable_serial_number, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_disable_serial_number_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_disable_serial_number_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_disable_serial_number_data_unpack, bcmolt_gpon_ni_disable_serial_number_data_scan };
+static bcmolt_group_info group_info_gpon_ni_protection_switching_type_c_set_multiple_onu_state = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data), sizeof(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state), offsetof(bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_protection_switching_type_c_set_multiple_onu_state_data_pack, (bcmolt_func_unpack) 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_scan };
+static bcmolt_group_info group_info_gpon_ni_reset = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_rogue_detection_window = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 3, sizeof(bcmolt_gpon_ni_rogue_detection_window_data), sizeof(bcmolt_gpon_ni_rogue_detection_window), offsetof(bcmolt_gpon_ni_rogue_detection_window, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_rogue_detection_window_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_rogue_detection_window_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_rogue_detection_window_data_unpack, bcmolt_gpon_ni_rogue_detection_window_data_scan };
+static bcmolt_group_info group_info_gpon_ni_set_onu_state = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 4, sizeof(bcmolt_gpon_ni_set_onu_state_data), sizeof(bcmolt_gpon_ni_set_onu_state), offsetof(bcmolt_gpon_ni_set_onu_state, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_set_onu_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_set_onu_state_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_set_onu_state_data_unpack, bcmolt_gpon_ni_set_onu_state_data_scan };
+static bcmolt_group_info group_info_gpon_ni_set_pon_state = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 5, sizeof(bcmolt_gpon_ni_set_pon_state_data), sizeof(bcmolt_gpon_ni_set_pon_state), offsetof(bcmolt_gpon_ni_set_pon_state, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_set_pon_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_set_pon_state_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_set_pon_state_data_unpack, bcmolt_gpon_ni_set_pon_state_data_scan };
+static bcmolt_group_info group_info_gpon_ni_single_request_standby_pon_monitoring = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 6, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_start_onu_upgrade = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 7, sizeof(bcmolt_gpon_ni_start_onu_upgrade_data), sizeof(bcmolt_gpon_ni_start_onu_upgrade), offsetof(bcmolt_gpon_ni_start_onu_upgrade, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_start_onu_upgrade_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_start_onu_upgrade_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_start_onu_upgrade_data_unpack, bcmolt_gpon_ni_start_onu_upgrade_data_scan };
+static bcmolt_group_info group_info_gpon_ni_tod_request = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_OPER, 8, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_ni_broadcast_ploam_packet = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, 0, sizeof(bcmolt_gpon_ni_broadcast_ploam_packet_data), sizeof(bcmolt_gpon_ni_broadcast_ploam_packet), offsetof(bcmolt_gpon_ni_broadcast_ploam_packet, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_broadcast_ploam_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_broadcast_ploam_packet_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_broadcast_ploam_packet_data_unpack, bcmolt_gpon_ni_broadcast_ploam_packet_data_scan };
+static bcmolt_group_info group_info_gpon_ni_cpu_packets = { BCMOLT_OBJ_ID_GPON_NI, BCMOLT_MGT_GROUP_PROXY, 1, sizeof(bcmolt_gpon_ni_cpu_packets_data), sizeof(bcmolt_gpon_ni_cpu_packets), offsetof(bcmolt_gpon_ni_cpu_packets, data), (bcmolt_func_packed_len) bcmolt_gpon_ni_cpu_packets_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_ni_cpu_packets_data_pack, (bcmolt_func_unpack) bcmolt_gpon_ni_cpu_packets_data_unpack, bcmolt_gpon_ni_cpu_packets_data_scan };
+static bcmolt_group_info group_info_gpon_onu_key = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_onu_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_onu_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_key_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_key_unpack, bcmolt_gpon_onu_key_scan };
+static bcmolt_group_info group_info_gpon_onu_cfg = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_onu_cfg_data), sizeof(bcmolt_gpon_onu_cfg), offsetof(bcmolt_gpon_onu_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_cfg_data_unpack, bcmolt_gpon_onu_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_onu_stat = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_gpon_onu_stat_data), sizeof(bcmolt_gpon_onu_stat), offsetof(bcmolt_gpon_onu_stat, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_stat_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_stat_data_unpack, bcmolt_gpon_onu_stat_data_scan };
+static bcmolt_group_info group_info_gpon_onu_stat_cfg = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_gpon_onu_stat_cfg_data), sizeof(bcmolt_gpon_onu_stat_cfg), offsetof(bcmolt_gpon_onu_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_stat_cfg_data_unpack, bcmolt_gpon_onu_stat_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_onu_ber_interval_configuration_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_gpon_onu_ber_interval_configuration_completed_data), sizeof(bcmolt_gpon_onu_ber_interval_configuration_completed), offsetof(bcmolt_gpon_onu_ber_interval_configuration_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_ber_interval_configuration_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_ber_interval_configuration_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_ber_interval_configuration_completed_data_unpack, bcmolt_gpon_onu_ber_interval_configuration_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_dfi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_gpon_onu_dfi_data), sizeof(bcmolt_gpon_onu_dfi), offsetof(bcmolt_gpon_onu_dfi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_dfi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_dfi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_dfi_data_unpack, bcmolt_gpon_onu_dfi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_dgi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_gpon_onu_dgi_data), sizeof(bcmolt_gpon_onu_dgi), offsetof(bcmolt_gpon_onu_dgi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_dgi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_dgi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_dgi_data_unpack, bcmolt_gpon_onu_dgi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_dowi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_gpon_onu_dowi_data), sizeof(bcmolt_gpon_onu_dowi), offsetof(bcmolt_gpon_onu_dowi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_dowi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_dowi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_dowi_data_unpack, bcmolt_gpon_onu_dowi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_err = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 4, sizeof(bcmolt_gpon_onu_err_data), sizeof(bcmolt_gpon_onu_err), offsetof(bcmolt_gpon_onu_err, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_err_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_err_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_err_data_unpack, bcmolt_gpon_onu_err_data_scan };
+static bcmolt_group_info group_info_gpon_onu_invalid_dbru_report = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_gpon_onu_invalid_dbru_report_data), sizeof(bcmolt_gpon_onu_invalid_dbru_report), offsetof(bcmolt_gpon_onu_invalid_dbru_report, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_invalid_dbru_report_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_invalid_dbru_report_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_invalid_dbru_report_data_unpack, bcmolt_gpon_onu_invalid_dbru_report_data_scan };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_gpon_onu_key_exchange_completed_data), sizeof(bcmolt_gpon_onu_key_exchange_completed), offsetof(bcmolt_gpon_onu_key_exchange_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_key_exchange_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_key_exchange_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_key_exchange_completed_data_unpack, bcmolt_gpon_onu_key_exchange_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_cycle_skipped = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_decrypt_required = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_gpon_onu_key_exchange_decrypt_required_data), sizeof(bcmolt_gpon_onu_key_exchange_decrypt_required), offsetof(bcmolt_gpon_onu_key_exchange_decrypt_required, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_key_exchange_decrypt_required_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_key_exchange_decrypt_required_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_key_exchange_decrypt_required_data_unpack, bcmolt_gpon_onu_key_exchange_decrypt_required_data_scan };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_key_mismatch = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_gpon_onu_key_exchange_key_mismatch_data), sizeof(bcmolt_gpon_onu_key_exchange_key_mismatch), offsetof(bcmolt_gpon_onu_key_exchange_key_mismatch, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_key_exchange_key_mismatch_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_key_exchange_key_mismatch_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_key_exchange_key_mismatch_data_unpack, bcmolt_gpon_onu_key_exchange_key_mismatch_data_scan };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_key_request_timeout = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 10, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_onu_key_exchange_unconsecutive_index = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 11, sizeof(bcmolt_gpon_onu_key_exchange_unconsecutive_index_data), sizeof(bcmolt_gpon_onu_key_exchange_unconsecutive_index), offsetof(bcmolt_gpon_onu_key_exchange_unconsecutive_index, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_unpack, bcmolt_gpon_onu_key_exchange_unconsecutive_index_data_scan };
+static bcmolt_group_info group_info_gpon_onu_loai = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 12, sizeof(bcmolt_gpon_onu_loai_data), sizeof(bcmolt_gpon_onu_loai), offsetof(bcmolt_gpon_onu_loai, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_loai_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_loai_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_loai_data_unpack, bcmolt_gpon_onu_loai_data_scan };
+static bcmolt_group_info group_info_gpon_onu_loki = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 13, sizeof(bcmolt_gpon_onu_loki_data), sizeof(bcmolt_gpon_onu_loki), offsetof(bcmolt_gpon_onu_loki, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_loki_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_loki_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_loki_data_unpack, bcmolt_gpon_onu_loki_data_scan };
+static bcmolt_group_info group_info_gpon_onu_memi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 14, sizeof(bcmolt_gpon_onu_memi_data), sizeof(bcmolt_gpon_onu_memi), offsetof(bcmolt_gpon_onu_memi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_memi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_memi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_memi_data_unpack, bcmolt_gpon_onu_memi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_omci_port_id_configuration_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 15, sizeof(bcmolt_gpon_onu_omci_port_id_configuration_completed_data), sizeof(bcmolt_gpon_onu_omci_port_id_configuration_completed), offsetof(bcmolt_gpon_onu_omci_port_id_configuration_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_omci_port_id_configuration_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_omci_port_id_configuration_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_omci_port_id_configuration_completed_data_unpack, bcmolt_gpon_onu_omci_port_id_configuration_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_activation_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 16, sizeof(bcmolt_gpon_onu_onu_activation_completed_data), sizeof(bcmolt_gpon_onu_onu_activation_completed), offsetof(bcmolt_gpon_onu_onu_activation_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_activation_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_activation_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_activation_completed_data_unpack, bcmolt_gpon_onu_onu_activation_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_activation_standby_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 17, sizeof(bcmolt_gpon_onu_onu_activation_standby_completed_data), sizeof(bcmolt_gpon_onu_onu_activation_standby_completed), offsetof(bcmolt_gpon_onu_onu_activation_standby_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_activation_standby_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_activation_standby_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_activation_standby_completed_data_unpack, bcmolt_gpon_onu_onu_activation_standby_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_alarm = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 18, sizeof(bcmolt_gpon_onu_onu_alarm_data), sizeof(bcmolt_gpon_onu_onu_alarm), offsetof(bcmolt_gpon_onu_onu_alarm, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_alarm_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_alarm_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_alarm_data_unpack, bcmolt_gpon_onu_onu_alarm_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_deactivation_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 19, sizeof(bcmolt_gpon_onu_onu_deactivation_completed_data), sizeof(bcmolt_gpon_onu_onu_deactivation_completed), offsetof(bcmolt_gpon_onu_onu_deactivation_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_deactivation_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_deactivation_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_deactivation_completed_data_unpack, bcmolt_gpon_onu_onu_deactivation_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_disable_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 20, sizeof(bcmolt_gpon_onu_onu_disable_completed_data), sizeof(bcmolt_gpon_onu_onu_disable_completed), offsetof(bcmolt_gpon_onu_onu_disable_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_disable_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_disable_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_disable_completed_data_unpack, bcmolt_gpon_onu_onu_disable_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_onu_enable_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 21, sizeof(bcmolt_gpon_onu_onu_enable_completed_data), sizeof(bcmolt_gpon_onu_onu_enable_completed), offsetof(bcmolt_gpon_onu_onu_enable_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_onu_enable_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_onu_enable_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_onu_enable_completed_data_unpack, bcmolt_gpon_onu_onu_enable_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_optical_reflection = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 22, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_onu_password_authentication_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 23, sizeof(bcmolt_gpon_onu_password_authentication_completed_data), sizeof(bcmolt_gpon_onu_password_authentication_completed), offsetof(bcmolt_gpon_onu_password_authentication_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_password_authentication_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_password_authentication_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_password_authentication_completed_data_unpack, bcmolt_gpon_onu_password_authentication_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_pee = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 24, sizeof(bcmolt_gpon_onu_pee_data), sizeof(bcmolt_gpon_onu_pee), offsetof(bcmolt_gpon_onu_pee, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_pee_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_pee_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_pee_data_unpack, bcmolt_gpon_onu_pee_data_scan };
+static bcmolt_group_info group_info_gpon_onu_possible_drift = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 25, sizeof(bcmolt_gpon_onu_possible_drift_data), sizeof(bcmolt_gpon_onu_possible_drift), offsetof(bcmolt_gpon_onu_possible_drift, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_possible_drift_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_possible_drift_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_possible_drift_data_unpack, bcmolt_gpon_onu_possible_drift_data_scan };
+static bcmolt_group_info group_info_gpon_onu_power_management_state_change = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 26, sizeof(bcmolt_gpon_onu_power_management_state_change_data), sizeof(bcmolt_gpon_onu_power_management_state_change), offsetof(bcmolt_gpon_onu_power_management_state_change, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_power_management_state_change_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_power_management_state_change_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_power_management_state_change_data_unpack, bcmolt_gpon_onu_power_management_state_change_data_scan };
+static bcmolt_group_info group_info_gpon_onu_pst = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 27, sizeof(bcmolt_gpon_onu_pst_data), sizeof(bcmolt_gpon_onu_pst), offsetof(bcmolt_gpon_onu_pst, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_pst_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_pst_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_pst_data_unpack, bcmolt_gpon_onu_pst_data_scan };
+static bcmolt_group_info group_info_gpon_onu_ranging_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 28, sizeof(bcmolt_gpon_onu_ranging_completed_data), sizeof(bcmolt_gpon_onu_ranging_completed), offsetof(bcmolt_gpon_onu_ranging_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_ranging_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_ranging_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_ranging_completed_data_unpack, bcmolt_gpon_onu_ranging_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_rei = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 29, sizeof(bcmolt_gpon_onu_rei_data), sizeof(bcmolt_gpon_onu_rei), offsetof(bcmolt_gpon_onu_rei, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_rei_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_rei_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_rei_data_unpack, bcmolt_gpon_onu_rei_data_scan };
+static bcmolt_group_info group_info_gpon_onu_rssi_measurement_completed = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 30, sizeof(bcmolt_gpon_onu_rssi_measurement_completed_data), sizeof(bcmolt_gpon_onu_rssi_measurement_completed), offsetof(bcmolt_gpon_onu_rssi_measurement_completed, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_rssi_measurement_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_rssi_measurement_completed_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_rssi_measurement_completed_data_unpack, bcmolt_gpon_onu_rssi_measurement_completed_data_scan };
+static bcmolt_group_info group_info_gpon_onu_sdi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 31, sizeof(bcmolt_gpon_onu_sdi_data), sizeof(bcmolt_gpon_onu_sdi), offsetof(bcmolt_gpon_onu_sdi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_sdi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_sdi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_sdi_data_unpack, bcmolt_gpon_onu_sdi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_sfi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 32, sizeof(bcmolt_gpon_onu_sfi_data), sizeof(bcmolt_gpon_onu_sfi), offsetof(bcmolt_gpon_onu_sfi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_sfi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_sfi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_sfi_data_unpack, bcmolt_gpon_onu_sfi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_stat_alarm_cleared = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 33, sizeof(bcmolt_gpon_onu_stat_alarm_cleared_data), sizeof(bcmolt_gpon_onu_stat_alarm_cleared), offsetof(bcmolt_gpon_onu_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_stat_alarm_cleared_data_unpack, bcmolt_gpon_onu_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_gpon_onu_stat_alarm_raised = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 34, sizeof(bcmolt_gpon_onu_stat_alarm_raised_data), sizeof(bcmolt_gpon_onu_stat_alarm_raised), offsetof(bcmolt_gpon_onu_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_stat_alarm_raised_data_unpack, bcmolt_gpon_onu_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_gpon_onu_sufi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 35, sizeof(bcmolt_gpon_onu_sufi_data), sizeof(bcmolt_gpon_onu_sufi), offsetof(bcmolt_gpon_onu_sufi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_sufi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_sufi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_sufi_data_unpack, bcmolt_gpon_onu_sufi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_tiwi = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO, 36, sizeof(bcmolt_gpon_onu_tiwi_data), sizeof(bcmolt_gpon_onu_tiwi), offsetof(bcmolt_gpon_onu_tiwi, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_tiwi_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_tiwi_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_tiwi_data_unpack, bcmolt_gpon_onu_tiwi_data_scan };
+static bcmolt_group_info group_info_gpon_onu_auto_cfg = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_gpon_onu_auto_cfg_data), sizeof(bcmolt_gpon_onu_auto_cfg), offsetof(bcmolt_gpon_onu_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_auto_cfg_data_unpack, bcmolt_gpon_onu_auto_cfg_data_scan };
+static bcmolt_group_info group_info_gpon_onu_change_power_level = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_gpon_onu_change_power_level_data), sizeof(bcmolt_gpon_onu_change_power_level), offsetof(bcmolt_gpon_onu_change_power_level, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_change_power_level_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_change_power_level_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_change_power_level_data_unpack, bcmolt_gpon_onu_change_power_level_data_scan };
+static bcmolt_group_info group_info_gpon_onu_rssi_measurement = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_OPER, 1, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_gpon_onu_set_onu_state = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_OPER, 2, sizeof(bcmolt_gpon_onu_set_onu_state_data), sizeof(bcmolt_gpon_onu_set_onu_state), offsetof(bcmolt_gpon_onu_set_onu_state, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_set_onu_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_set_onu_state_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_set_onu_state_data_unpack, bcmolt_gpon_onu_set_onu_state_data_scan };
+static bcmolt_group_info group_info_gpon_onu_cpu_packets = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, 0, sizeof(bcmolt_gpon_onu_cpu_packets_data), sizeof(bcmolt_gpon_onu_cpu_packets), offsetof(bcmolt_gpon_onu_cpu_packets, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_cpu_packets_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_cpu_packets_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_cpu_packets_data_unpack, bcmolt_gpon_onu_cpu_packets_data_scan };
+static bcmolt_group_info group_info_gpon_onu_ploam_packet = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY, 1, sizeof(bcmolt_gpon_onu_ploam_packet_data), sizeof(bcmolt_gpon_onu_ploam_packet), offsetof(bcmolt_gpon_onu_ploam_packet, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_ploam_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_ploam_packet_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_ploam_packet_data_unpack, bcmolt_gpon_onu_ploam_packet_data_scan };
+static bcmolt_group_info group_info_gpon_onu_cpu_packet = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY_RX, 0, sizeof(bcmolt_gpon_onu_cpu_packet_data), sizeof(bcmolt_gpon_onu_cpu_packet), offsetof(bcmolt_gpon_onu_cpu_packet, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_cpu_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_cpu_packet_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_cpu_packet_data_unpack, bcmolt_gpon_onu_cpu_packet_data_scan };
+static bcmolt_group_info group_info_gpon_onu_omci_packet = { BCMOLT_OBJ_ID_GPON_ONU, BCMOLT_MGT_GROUP_PROXY_RX, 1, sizeof(bcmolt_gpon_onu_omci_packet_data), sizeof(bcmolt_gpon_onu_omci_packet), offsetof(bcmolt_gpon_onu_omci_packet, data), (bcmolt_func_packed_len) bcmolt_gpon_onu_omci_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_onu_omci_packet_data_pack, (bcmolt_func_unpack) bcmolt_gpon_onu_omci_packet_data_unpack, bcmolt_gpon_onu_omci_packet_data_scan };
+static bcmolt_group_info group_info_gpon_trx_key = { BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_gpon_trx_key), 0, 0, (bcmolt_func_packed_len) bcmolt_gpon_trx_key_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_trx_key_pack, (bcmolt_func_unpack) bcmolt_gpon_trx_key_unpack, bcmolt_gpon_trx_key_scan };
+static bcmolt_group_info group_info_gpon_trx_cfg = { BCMOLT_OBJ_ID_GPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_gpon_trx_cfg_data), sizeof(bcmolt_gpon_trx_cfg), offsetof(bcmolt_gpon_trx_cfg, data), (bcmolt_func_packed_len) bcmolt_gpon_trx_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_gpon_trx_cfg_data_pack, (bcmolt_func_unpack) bcmolt_gpon_trx_cfg_data_unpack, bcmolt_gpon_trx_cfg_data_scan };
+static bcmolt_group_info group_info_log_entry_key = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_log_entry_key), 0, 0, (bcmolt_func_packed_len) bcmolt_log_entry_key_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_key_pack, (bcmolt_func_unpack) bcmolt_log_entry_key_unpack, bcmolt_log_entry_key_scan };
+static bcmolt_group_info group_info_log_entry_cfg = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_log_entry_cfg_data), sizeof(bcmolt_log_entry_cfg), offsetof(bcmolt_log_entry_cfg, data), (bcmolt_func_packed_len) bcmolt_log_entry_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_cfg_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_cfg_data_unpack, bcmolt_log_entry_cfg_data_scan };
+static bcmolt_group_info group_info_log_entry_stat = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_log_entry_stat_data), sizeof(bcmolt_log_entry_stat), offsetof(bcmolt_log_entry_stat, data), (bcmolt_func_packed_len) bcmolt_log_entry_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_stat_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_stat_data_unpack, bcmolt_log_entry_stat_data_scan };
+static bcmolt_group_info group_info_log_entry_stat_cfg = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_log_entry_stat_cfg_data), sizeof(bcmolt_log_entry_stat_cfg), offsetof(bcmolt_log_entry_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_log_entry_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_stat_cfg_data_unpack, bcmolt_log_entry_stat_cfg_data_scan };
+static bcmolt_group_info group_info_log_entry_stat_alarm_cleared = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_log_entry_stat_alarm_cleared_data), sizeof(bcmolt_log_entry_stat_alarm_cleared), offsetof(bcmolt_log_entry_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_log_entry_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_stat_alarm_cleared_data_unpack, bcmolt_log_entry_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_log_entry_stat_alarm_raised = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_log_entry_stat_alarm_raised_data), sizeof(bcmolt_log_entry_stat_alarm_raised), offsetof(bcmolt_log_entry_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_log_entry_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_stat_alarm_raised_data_unpack, bcmolt_log_entry_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_log_entry_auto_cfg = { BCMOLT_OBJ_ID_LOG_ENTRY, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_log_entry_auto_cfg_data), sizeof(bcmolt_log_entry_auto_cfg), offsetof(bcmolt_log_entry_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_log_entry_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_log_entry_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_log_entry_auto_cfg_data_unpack, bcmolt_log_entry_auto_cfg_data_scan };
+static bcmolt_group_info group_info_logger_key = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_logger_key), 0, 0, (bcmolt_func_packed_len) bcmolt_logger_key_get_packed_length, (bcmolt_func_pack) bcmolt_logger_key_pack, (bcmolt_func_unpack) bcmolt_logger_key_unpack, bcmolt_logger_key_scan };
+static bcmolt_group_info group_info_logger_cfg = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_logger_cfg_data), sizeof(bcmolt_logger_cfg), offsetof(bcmolt_logger_cfg, data), (bcmolt_func_packed_len) bcmolt_logger_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_cfg_data_pack, (bcmolt_func_unpack) bcmolt_logger_cfg_data_unpack, bcmolt_logger_cfg_data_scan };
+static bcmolt_group_info group_info_logger_stat = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_logger_stat_data), sizeof(bcmolt_logger_stat), offsetof(bcmolt_logger_stat, data), (bcmolt_func_packed_len) bcmolt_logger_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_stat_data_pack, (bcmolt_func_unpack) bcmolt_logger_stat_data_unpack, bcmolt_logger_stat_data_scan };
+static bcmolt_group_info group_info_logger_stat_cfg = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_logger_stat_cfg_data), sizeof(bcmolt_logger_stat_cfg), offsetof(bcmolt_logger_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_logger_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_logger_stat_cfg_data_unpack, bcmolt_logger_stat_cfg_data_scan };
+static bcmolt_group_info group_info_logger_stat_alarm_cleared = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_logger_stat_alarm_cleared_data), sizeof(bcmolt_logger_stat_alarm_cleared), offsetof(bcmolt_logger_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_logger_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_logger_stat_alarm_cleared_data_unpack, bcmolt_logger_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_logger_stat_alarm_raised = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_logger_stat_alarm_raised_data), sizeof(bcmolt_logger_stat_alarm_raised), offsetof(bcmolt_logger_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_logger_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_logger_stat_alarm_raised_data_unpack, bcmolt_logger_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_logger_auto_cfg = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_logger_auto_cfg_data), sizeof(bcmolt_logger_auto_cfg), offsetof(bcmolt_logger_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_logger_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_logger_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_logger_auto_cfg_data_unpack, bcmolt_logger_auto_cfg_data_scan };
+static bcmolt_group_info group_info_logger_clear_log = { BCMOLT_OBJ_ID_LOGGER, BCMOLT_MGT_GROUP_OPER, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_nni_key = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_nni_key), 0, 0, (bcmolt_func_packed_len) bcmolt_nni_key_get_packed_length, (bcmolt_func_pack) bcmolt_nni_key_pack, (bcmolt_func_unpack) bcmolt_nni_key_unpack, bcmolt_nni_key_scan };
+static bcmolt_group_info group_info_nni_cfg = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_nni_cfg_data), sizeof(bcmolt_nni_cfg), offsetof(bcmolt_nni_cfg, data), (bcmolt_func_packed_len) bcmolt_nni_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_cfg_data_pack, (bcmolt_func_unpack) bcmolt_nni_cfg_data_unpack, bcmolt_nni_cfg_data_scan };
+static bcmolt_group_info group_info_nni_stat = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_nni_stat_data), sizeof(bcmolt_nni_stat), offsetof(bcmolt_nni_stat, data), (bcmolt_func_packed_len) bcmolt_nni_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_stat_data_pack, (bcmolt_func_unpack) bcmolt_nni_stat_data_unpack, bcmolt_nni_stat_data_scan };
+static bcmolt_group_info group_info_nni_stat_cfg = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_nni_stat_cfg_data), sizeof(bcmolt_nni_stat_cfg), offsetof(bcmolt_nni_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_nni_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_nni_stat_cfg_data_unpack, bcmolt_nni_stat_cfg_data_scan };
+static bcmolt_group_info group_info_nni_stat_alarm_cleared = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_nni_stat_alarm_cleared_data), sizeof(bcmolt_nni_stat_alarm_cleared), offsetof(bcmolt_nni_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_nni_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_nni_stat_alarm_cleared_data_unpack, bcmolt_nni_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_nni_stat_alarm_raised = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_nni_stat_alarm_raised_data), sizeof(bcmolt_nni_stat_alarm_raised), offsetof(bcmolt_nni_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_nni_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_nni_stat_alarm_raised_data_unpack, bcmolt_nni_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_nni_status_changed = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_nni_status_changed_data), sizeof(bcmolt_nni_status_changed), offsetof(bcmolt_nni_status_changed, data), (bcmolt_func_packed_len) bcmolt_nni_status_changed_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_status_changed_data_pack, (bcmolt_func_unpack) bcmolt_nni_status_changed_data_unpack, bcmolt_nni_status_changed_data_scan };
+static bcmolt_group_info group_info_nni_auto_cfg = { BCMOLT_OBJ_ID_NNI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_nni_auto_cfg_data), sizeof(bcmolt_nni_auto_cfg), offsetof(bcmolt_nni_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_nni_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_nni_auto_cfg_data_unpack, bcmolt_nni_auto_cfg_data_scan };
+static bcmolt_group_info group_info_nni_serdes_key = { BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_nni_serdes_key), 0, 0, (bcmolt_func_packed_len) bcmolt_nni_serdes_key_get_packed_length, (bcmolt_func_pack) bcmolt_nni_serdes_key_pack, (bcmolt_func_unpack) bcmolt_nni_serdes_key_unpack, bcmolt_nni_serdes_key_scan };
+static bcmolt_group_info group_info_nni_serdes_cfg = { BCMOLT_OBJ_ID_NNI_SERDES, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_nni_serdes_cfg_data), sizeof(bcmolt_nni_serdes_cfg), offsetof(bcmolt_nni_serdes_cfg, data), (bcmolt_func_packed_len) bcmolt_nni_serdes_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_nni_serdes_cfg_data_pack, (bcmolt_func_unpack) bcmolt_nni_serdes_cfg_data_unpack, bcmolt_nni_serdes_cfg_data_scan };
+static bcmolt_group_info group_info_software_error_key = { BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_software_error_key), 0, 0, (bcmolt_func_packed_len) bcmolt_software_error_key_get_packed_length, (bcmolt_func_pack) bcmolt_software_error_key_pack, (bcmolt_func_unpack) bcmolt_software_error_key_unpack, bcmolt_software_error_key_scan };
+static bcmolt_group_info group_info_software_error_cfg = { BCMOLT_OBJ_ID_SOFTWARE_ERROR, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_software_error_cfg_data), sizeof(bcmolt_software_error_cfg), offsetof(bcmolt_software_error_cfg, data), (bcmolt_func_packed_len) bcmolt_software_error_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_software_error_cfg_data_pack, (bcmolt_func_unpack) bcmolt_software_error_cfg_data_unpack, bcmolt_software_error_cfg_data_scan };
+static bcmolt_group_info group_info_trx_calibration_key = { BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_trx_calibration_key), 0, 0, (bcmolt_func_packed_len) bcmolt_trx_calibration_key_get_packed_length, (bcmolt_func_pack) bcmolt_trx_calibration_key_pack, (bcmolt_func_unpack) bcmolt_trx_calibration_key_unpack, bcmolt_trx_calibration_key_scan };
+static bcmolt_group_info group_info_trx_calibration_capture_window_and_statistic_completed = { BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_trx_calibration_capture_window_and_statistic_completed_data), sizeof(bcmolt_trx_calibration_capture_window_and_statistic_completed), offsetof(bcmolt_trx_calibration_capture_window_and_statistic_completed, data), (bcmolt_func_packed_len) bcmolt_trx_calibration_capture_window_and_statistic_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_trx_calibration_capture_window_and_statistic_completed_data_pack, (bcmolt_func_unpack) bcmolt_trx_calibration_capture_window_and_statistic_completed_data_unpack, bcmolt_trx_calibration_capture_window_and_statistic_completed_data_scan };
+static bcmolt_group_info group_info_trx_calibration_auto_cfg = { BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_trx_calibration_auto_cfg_data), sizeof(bcmolt_trx_calibration_auto_cfg), offsetof(bcmolt_trx_calibration_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_trx_calibration_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_trx_calibration_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_trx_calibration_auto_cfg_data_unpack, bcmolt_trx_calibration_auto_cfg_data_scan };
+static bcmolt_group_info group_info_trx_calibration_start_capture_window = { BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_trx_calibration_start_capture_window_data), sizeof(bcmolt_trx_calibration_start_capture_window), offsetof(bcmolt_trx_calibration_start_capture_window, data), (bcmolt_func_packed_len) bcmolt_trx_calibration_start_capture_window_data_get_packed_length, (bcmolt_func_pack) bcmolt_trx_calibration_start_capture_window_data_pack, (bcmolt_func_unpack) bcmolt_trx_calibration_start_capture_window_data_unpack, bcmolt_trx_calibration_start_capture_window_data_scan };
+static bcmolt_group_info group_info_trx_calibration_stop_capture_window = { BCMOLT_OBJ_ID_TRX_CALIBRATION, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_trx_calibration_stop_capture_window_data), sizeof(bcmolt_trx_calibration_stop_capture_window), offsetof(bcmolt_trx_calibration_stop_capture_window, data), (bcmolt_func_packed_len) bcmolt_trx_calibration_stop_capture_window_data_get_packed_length, (bcmolt_func_pack) bcmolt_trx_calibration_stop_capture_window_data_pack, (bcmolt_func_unpack) bcmolt_trx_calibration_stop_capture_window_data_unpack, bcmolt_trx_calibration_stop_capture_window_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_key = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_alloc_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_alloc_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_key_unpack, bcmolt_xgpon_alloc_key_scan };
+static bcmolt_group_info group_info_xgpon_alloc_cfg = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_alloc_cfg_data), sizeof(bcmolt_xgpon_alloc_cfg), offsetof(bcmolt_xgpon_alloc_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_cfg_data_unpack, bcmolt_xgpon_alloc_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_stat = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_xgpon_alloc_stat_data), sizeof(bcmolt_xgpon_alloc_stat), offsetof(bcmolt_xgpon_alloc_stat, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_stat_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_stat_data_unpack, bcmolt_xgpon_alloc_stat_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_stat_cfg = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_xgpon_alloc_stat_cfg_data), sizeof(bcmolt_xgpon_alloc_stat_cfg), offsetof(bcmolt_xgpon_alloc_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_stat_cfg_data_unpack, bcmolt_xgpon_alloc_stat_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_configuration_completed = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_xgpon_alloc_configuration_completed_data), sizeof(bcmolt_xgpon_alloc_configuration_completed), offsetof(bcmolt_xgpon_alloc_configuration_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_configuration_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_configuration_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_configuration_completed_data_unpack, bcmolt_xgpon_alloc_configuration_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_get_alloc_stats_completed = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_xgpon_alloc_get_alloc_stats_completed_data), sizeof(bcmolt_xgpon_alloc_get_alloc_stats_completed), offsetof(bcmolt_xgpon_alloc_get_alloc_stats_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_get_alloc_stats_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_get_alloc_stats_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_get_alloc_stats_completed_data_unpack, bcmolt_xgpon_alloc_get_alloc_stats_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_stat_alarm_cleared = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_xgpon_alloc_stat_alarm_cleared_data), sizeof(bcmolt_xgpon_alloc_stat_alarm_cleared), offsetof(bcmolt_xgpon_alloc_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_stat_alarm_cleared_data_unpack, bcmolt_xgpon_alloc_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_stat_alarm_raised = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_xgpon_alloc_stat_alarm_raised_data), sizeof(bcmolt_xgpon_alloc_stat_alarm_raised), offsetof(bcmolt_xgpon_alloc_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_stat_alarm_raised_data_unpack, bcmolt_xgpon_alloc_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_auto_cfg = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_xgpon_alloc_auto_cfg_data), sizeof(bcmolt_xgpon_alloc_auto_cfg), offsetof(bcmolt_xgpon_alloc_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_auto_cfg_data_unpack, bcmolt_xgpon_alloc_auto_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_get_stats = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_xgpon_alloc_get_stats_data), sizeof(bcmolt_xgpon_alloc_get_stats), offsetof(bcmolt_xgpon_alloc_get_stats, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_get_stats_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_get_stats_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_get_stats_data_unpack, bcmolt_xgpon_alloc_get_stats_data_scan };
+static bcmolt_group_info group_info_xgpon_alloc_set_state = { BCMOLT_OBJ_ID_XGPON_ALLOC, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_xgpon_alloc_set_state_data), sizeof(bcmolt_xgpon_alloc_set_state), offsetof(bcmolt_xgpon_alloc_set_state, data), (bcmolt_func_packed_len) bcmolt_xgpon_alloc_set_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_alloc_set_state_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_alloc_set_state_data_unpack, bcmolt_xgpon_alloc_set_state_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_key = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_gem_port_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_key_unpack, bcmolt_xgpon_gem_port_key_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_cfg = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_gem_port_cfg_data), sizeof(bcmolt_xgpon_gem_port_cfg), offsetof(bcmolt_xgpon_gem_port_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_cfg_data_unpack, bcmolt_xgpon_gem_port_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_stat = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_xgpon_gem_port_stat_data), sizeof(bcmolt_xgpon_gem_port_stat), offsetof(bcmolt_xgpon_gem_port_stat, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_stat_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_stat_data_unpack, bcmolt_xgpon_gem_port_stat_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_stat_cfg = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_xgpon_gem_port_stat_cfg_data), sizeof(bcmolt_xgpon_gem_port_stat_cfg), offsetof(bcmolt_xgpon_gem_port_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_stat_cfg_data_unpack, bcmolt_xgpon_gem_port_stat_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_stat_alarm_cleared = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_xgpon_gem_port_stat_alarm_cleared_data), sizeof(bcmolt_xgpon_gem_port_stat_alarm_cleared), offsetof(bcmolt_xgpon_gem_port_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_stat_alarm_cleared_data_unpack, bcmolt_xgpon_gem_port_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_stat_alarm_raised = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_xgpon_gem_port_stat_alarm_raised_data), sizeof(bcmolt_xgpon_gem_port_stat_alarm_raised), offsetof(bcmolt_xgpon_gem_port_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_stat_alarm_raised_data_unpack, bcmolt_xgpon_gem_port_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_xgpon_gem_port_auto_cfg = { BCMOLT_OBJ_ID_XGPON_GEM_PORT, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_xgpon_gem_port_auto_cfg_data), sizeof(bcmolt_xgpon_gem_port_auto_cfg), offsetof(bcmolt_xgpon_gem_port_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_gem_port_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_gem_port_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_gem_port_auto_cfg_data_unpack, bcmolt_xgpon_gem_port_auto_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_iwf_key = { BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_iwf_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_iwf_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_iwf_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_iwf_key_unpack, bcmolt_xgpon_iwf_key_scan };
+static bcmolt_group_info group_info_xgpon_iwf_cfg = { BCMOLT_OBJ_ID_XGPON_IWF, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_iwf_cfg_data), sizeof(bcmolt_xgpon_iwf_cfg), offsetof(bcmolt_xgpon_iwf_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_iwf_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_iwf_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_iwf_cfg_data_unpack, bcmolt_xgpon_iwf_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_key = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_ni_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_ni_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_key_unpack, bcmolt_xgpon_ni_key_scan };
+static bcmolt_group_info group_info_xgpon_ni_cfg = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_ni_cfg_data), sizeof(bcmolt_xgpon_ni_cfg), offsetof(bcmolt_xgpon_ni_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_cfg_data_unpack, bcmolt_xgpon_ni_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_stat = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_xgpon_ni_stat_data), sizeof(bcmolt_xgpon_ni_stat), offsetof(bcmolt_xgpon_ni_stat, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_stat_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_stat_data_unpack, bcmolt_xgpon_ni_stat_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_stat_cfg = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_xgpon_ni_stat_cfg_data), sizeof(bcmolt_xgpon_ni_stat_cfg), offsetof(bcmolt_xgpon_ni_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_stat_cfg_data_unpack, bcmolt_xgpon_ni_stat_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_activate_all_onus_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 0, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_cpu_packets_failure = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_xgpon_ni_cpu_packets_failure_data), sizeof(bcmolt_xgpon_ni_cpu_packets_failure), offsetof(bcmolt_xgpon_ni_cpu_packets_failure, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_cpu_packets_failure_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_cpu_packets_failure_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_cpu_packets_failure_data_unpack, bcmolt_xgpon_ni_cpu_packets_failure_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_deactivate_all_onus_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_disable_all_onus_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_enable_all_onus_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 4, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_los = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 5, sizeof(bcmolt_xgpon_ni_los_data), sizeof(bcmolt_xgpon_ni_los), offsetof(bcmolt_xgpon_ni_los, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_los_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_los_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_los_data_unpack, bcmolt_xgpon_ni_los_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_onu_discovered = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_xgpon_ni_onu_discovered_data), sizeof(bcmolt_xgpon_ni_onu_discovered), offsetof(bcmolt_xgpon_ni_onu_discovered, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_onu_discovered_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_onu_discovered_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_onu_discovered_data_unpack, bcmolt_xgpon_ni_onu_discovered_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_onu_upgrade_complete = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 7, sizeof(bcmolt_xgpon_ni_onu_upgrade_complete_data), sizeof(bcmolt_xgpon_ni_onu_upgrade_complete), offsetof(bcmolt_xgpon_ni_onu_upgrade_complete, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_onu_upgrade_complete_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_onu_upgrade_complete_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_onu_upgrade_complete_data_unpack, bcmolt_xgpon_ni_onu_upgrade_complete_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_protection_switching_onus_ranged = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_xgpon_ni_protection_switching_onus_ranged_data), sizeof(bcmolt_xgpon_ni_protection_switching_onus_ranged), offsetof(bcmolt_xgpon_ni_protection_switching_onus_ranged, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_protection_switching_onus_ranged_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_protection_switching_onus_ranged_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_protection_switching_onus_ranged_data_unpack, bcmolt_xgpon_ni_protection_switching_onus_ranged_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_protection_switching_switchover_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_xgpon_ni_protection_switching_switchover_completed_data), sizeof(bcmolt_xgpon_ni_protection_switching_switchover_completed), offsetof(bcmolt_xgpon_ni_protection_switching_switchover_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_protection_switching_switchover_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_protection_switching_switchover_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_protection_switching_switchover_completed_data_unpack, bcmolt_xgpon_ni_protection_switching_switchover_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_protection_switching_traffic_resume = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 10, sizeof(bcmolt_xgpon_ni_protection_switching_traffic_resume_data), sizeof(bcmolt_xgpon_ni_protection_switching_traffic_resume), offsetof(bcmolt_xgpon_ni_protection_switching_traffic_resume, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_protection_switching_traffic_resume_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_protection_switching_traffic_resume_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_protection_switching_traffic_resume_data_unpack, bcmolt_xgpon_ni_protection_switching_traffic_resume_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_rogue_detection_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 11, sizeof(bcmolt_xgpon_ni_rogue_detection_completed_data), sizeof(bcmolt_xgpon_ni_rogue_detection_completed), offsetof(bcmolt_xgpon_ni_rogue_detection_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_rogue_detection_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_rogue_detection_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_rogue_detection_completed_data_unpack, bcmolt_xgpon_ni_rogue_detection_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_rogue_onu_special_map_cycle_start = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 12, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_serial_number_acquisition_cycle_start = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 13, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_standby_pon_monitoring_cycle_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 14, sizeof(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data), sizeof(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed), offsetof(bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_unpack, bcmolt_xgpon_ni_standby_pon_monitoring_cycle_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_stat_alarm_cleared = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 15, sizeof(bcmolt_xgpon_ni_stat_alarm_cleared_data), sizeof(bcmolt_xgpon_ni_stat_alarm_cleared), offsetof(bcmolt_xgpon_ni_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_stat_alarm_cleared_data_unpack, bcmolt_xgpon_ni_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_stat_alarm_raised = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 16, sizeof(bcmolt_xgpon_ni_stat_alarm_raised_data), sizeof(bcmolt_xgpon_ni_stat_alarm_raised), offsetof(bcmolt_xgpon_ni_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_stat_alarm_raised_data_unpack, bcmolt_xgpon_ni_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_state_change_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 17, sizeof(bcmolt_xgpon_ni_state_change_completed_data), sizeof(bcmolt_xgpon_ni_state_change_completed), offsetof(bcmolt_xgpon_ni_state_change_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_state_change_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_state_change_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_state_change_completed_data_unpack, bcmolt_xgpon_ni_state_change_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_tod_request_completed = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO, 18, sizeof(bcmolt_xgpon_ni_tod_request_completed_data), sizeof(bcmolt_xgpon_ni_tod_request_completed), offsetof(bcmolt_xgpon_ni_tod_request_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_tod_request_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_tod_request_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_tod_request_completed_data_unpack, bcmolt_xgpon_ni_tod_request_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_auto_cfg = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_xgpon_ni_auto_cfg_data), sizeof(bcmolt_xgpon_ni_auto_cfg), offsetof(bcmolt_xgpon_ni_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_auto_cfg_data_unpack, bcmolt_xgpon_ni_auto_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_adjust_tx_wavelength = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_xgpon_ni_adjust_tx_wavelength_data), sizeof(bcmolt_xgpon_ni_adjust_tx_wavelength), offsetof(bcmolt_xgpon_ni_adjust_tx_wavelength, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_adjust_tx_wavelength_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_adjust_tx_wavelength_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_adjust_tx_wavelength_data_unpack, bcmolt_xgpon_ni_adjust_tx_wavelength_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_disable_serial_number = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_xgpon_ni_disable_serial_number_data), sizeof(bcmolt_xgpon_ni_disable_serial_number), offsetof(bcmolt_xgpon_ni_disable_serial_number, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_disable_serial_number_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_disable_serial_number_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_disable_serial_number_data_unpack, bcmolt_xgpon_ni_disable_serial_number_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_reset = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_rogue_detection_window = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 3, sizeof(bcmolt_xgpon_ni_rogue_detection_window_data), sizeof(bcmolt_xgpon_ni_rogue_detection_window), offsetof(bcmolt_xgpon_ni_rogue_detection_window, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_rogue_detection_window_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_rogue_detection_window_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_rogue_detection_window_data_unpack, bcmolt_xgpon_ni_rogue_detection_window_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_run_special_bw_map = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 4, sizeof(bcmolt_xgpon_ni_run_special_bw_map_data), sizeof(bcmolt_xgpon_ni_run_special_bw_map), offsetof(bcmolt_xgpon_ni_run_special_bw_map, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_run_special_bw_map_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_run_special_bw_map_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_run_special_bw_map_data_unpack, bcmolt_xgpon_ni_run_special_bw_map_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_set_onu_state = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 5, sizeof(bcmolt_xgpon_ni_set_onu_state_data), sizeof(bcmolt_xgpon_ni_set_onu_state), offsetof(bcmolt_xgpon_ni_set_onu_state, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_set_onu_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_set_onu_state_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_set_onu_state_data_unpack, bcmolt_xgpon_ni_set_onu_state_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_set_pon_state = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 6, sizeof(bcmolt_xgpon_ni_set_pon_state_data), sizeof(bcmolt_xgpon_ni_set_pon_state), offsetof(bcmolt_xgpon_ni_set_pon_state, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_set_pon_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_set_pon_state_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_set_pon_state_data_unpack, bcmolt_xgpon_ni_set_pon_state_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_single_request_standby_pon_monitoring = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_start_onu_upgrade = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 8, sizeof(bcmolt_xgpon_ni_start_onu_upgrade_data), sizeof(bcmolt_xgpon_ni_start_onu_upgrade), offsetof(bcmolt_xgpon_ni_start_onu_upgrade, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_start_onu_upgrade_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_start_onu_upgrade_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_start_onu_upgrade_data_unpack, bcmolt_xgpon_ni_start_onu_upgrade_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_tod_request = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_OPER, 9, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_ni_broadcast_ploam_packet = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, 0, sizeof(bcmolt_xgpon_ni_broadcast_ploam_packet_data), sizeof(bcmolt_xgpon_ni_broadcast_ploam_packet), offsetof(bcmolt_xgpon_ni_broadcast_ploam_packet, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_broadcast_ploam_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_broadcast_ploam_packet_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_broadcast_ploam_packet_data_unpack, bcmolt_xgpon_ni_broadcast_ploam_packet_data_scan };
+static bcmolt_group_info group_info_xgpon_ni_cpu_packets = { BCMOLT_OBJ_ID_XGPON_NI, BCMOLT_MGT_GROUP_PROXY, 1, sizeof(bcmolt_xgpon_ni_cpu_packets_data), sizeof(bcmolt_xgpon_ni_cpu_packets), offsetof(bcmolt_xgpon_ni_cpu_packets, data), (bcmolt_func_packed_len) bcmolt_xgpon_ni_cpu_packets_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_ni_cpu_packets_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_ni_cpu_packets_data_unpack, bcmolt_xgpon_ni_cpu_packets_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_key = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_onu_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_onu_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_key_unpack, bcmolt_xgpon_onu_key_scan };
+static bcmolt_group_info group_info_xgpon_onu_cfg = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_onu_cfg_data), sizeof(bcmolt_xgpon_onu_cfg), offsetof(bcmolt_xgpon_onu_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_cfg_data_unpack, bcmolt_xgpon_onu_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_stat = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_STAT, 0, sizeof(bcmolt_xgpon_onu_stat_data), sizeof(bcmolt_xgpon_onu_stat), offsetof(bcmolt_xgpon_onu_stat, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_stat_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_stat_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_stat_data_unpack, bcmolt_xgpon_onu_stat_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_stat_cfg = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_STAT_CFG, 0, sizeof(bcmolt_xgpon_onu_stat_cfg_data), sizeof(bcmolt_xgpon_onu_stat_cfg), offsetof(bcmolt_xgpon_onu_stat_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_stat_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_stat_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_stat_cfg_data_unpack, bcmolt_xgpon_onu_stat_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_dfi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 0, sizeof(bcmolt_xgpon_onu_dfi_data), sizeof(bcmolt_xgpon_onu_dfi), offsetof(bcmolt_xgpon_onu_dfi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_dfi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_dfi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_dfi_data_unpack, bcmolt_xgpon_onu_dfi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_dgi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 1, sizeof(bcmolt_xgpon_onu_dgi_data), sizeof(bcmolt_xgpon_onu_dgi), offsetof(bcmolt_xgpon_onu_dgi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_dgi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_dgi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_dgi_data_unpack, bcmolt_xgpon_onu_dgi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_dowi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 2, sizeof(bcmolt_xgpon_onu_dowi_data), sizeof(bcmolt_xgpon_onu_dowi), offsetof(bcmolt_xgpon_onu_dowi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_dowi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_dowi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_dowi_data_unpack, bcmolt_xgpon_onu_dowi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_invalid_dbru_report = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 3, sizeof(bcmolt_xgpon_onu_invalid_dbru_report_data), sizeof(bcmolt_xgpon_onu_invalid_dbru_report), offsetof(bcmolt_xgpon_onu_invalid_dbru_report, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_invalid_dbru_report_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_invalid_dbru_report_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_invalid_dbru_report_data_unpack, bcmolt_xgpon_onu_invalid_dbru_report_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_key_exchange_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 4, sizeof(bcmolt_xgpon_onu_key_exchange_completed_data), sizeof(bcmolt_xgpon_onu_key_exchange_completed), offsetof(bcmolt_xgpon_onu_key_exchange_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_key_exchange_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_key_exchange_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_key_exchange_completed_data_unpack, bcmolt_xgpon_onu_key_exchange_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_key_exchange_cycle_skipped = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 5, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_key_exchange_key_mismatch = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 6, sizeof(bcmolt_xgpon_onu_key_exchange_key_mismatch_data), sizeof(bcmolt_xgpon_onu_key_exchange_key_mismatch), offsetof(bcmolt_xgpon_onu_key_exchange_key_mismatch, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_key_exchange_key_mismatch_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_key_exchange_key_mismatch_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_key_exchange_key_mismatch_data_unpack, bcmolt_xgpon_onu_key_exchange_key_mismatch_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_key_exchange_key_request_timeout = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_looci = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 8, sizeof(bcmolt_xgpon_onu_looci_data), sizeof(bcmolt_xgpon_onu_looci), offsetof(bcmolt_xgpon_onu_looci, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_looci_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_looci_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_looci_data_unpack, bcmolt_xgpon_onu_looci_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_activation_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 9, sizeof(bcmolt_xgpon_onu_onu_activation_completed_data), sizeof(bcmolt_xgpon_onu_onu_activation_completed), offsetof(bcmolt_xgpon_onu_onu_activation_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_activation_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_activation_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_activation_completed_data_unpack, bcmolt_xgpon_onu_onu_activation_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_alarm = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 10, sizeof(bcmolt_xgpon_onu_onu_alarm_data), sizeof(bcmolt_xgpon_onu_onu_alarm), offsetof(bcmolt_xgpon_onu_onu_alarm, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_alarm_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_alarm_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_alarm_data_unpack, bcmolt_xgpon_onu_onu_alarm_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_deactivation_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 11, sizeof(bcmolt_xgpon_onu_onu_deactivation_completed_data), sizeof(bcmolt_xgpon_onu_onu_deactivation_completed), offsetof(bcmolt_xgpon_onu_onu_deactivation_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_deactivation_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_deactivation_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_deactivation_completed_data_unpack, bcmolt_xgpon_onu_onu_deactivation_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_disable_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 12, sizeof(bcmolt_xgpon_onu_onu_disable_completed_data), sizeof(bcmolt_xgpon_onu_onu_disable_completed), offsetof(bcmolt_xgpon_onu_onu_disable_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_disable_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_disable_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_disable_completed_data_unpack, bcmolt_xgpon_onu_onu_disable_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_enable_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 13, sizeof(bcmolt_xgpon_onu_onu_enable_completed_data), sizeof(bcmolt_xgpon_onu_onu_enable_completed), offsetof(bcmolt_xgpon_onu_onu_enable_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_enable_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_enable_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_enable_completed_data_unpack, bcmolt_xgpon_onu_onu_enable_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_tuning_in_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 14, sizeof(bcmolt_xgpon_onu_onu_tuning_in_completed_data), sizeof(bcmolt_xgpon_onu_onu_tuning_in_completed), offsetof(bcmolt_xgpon_onu_onu_tuning_in_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_tuning_in_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_tuning_in_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_tuning_in_completed_data_unpack, bcmolt_xgpon_onu_onu_tuning_in_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_onu_tuning_out_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 15, sizeof(bcmolt_xgpon_onu_onu_tuning_out_completed_data), sizeof(bcmolt_xgpon_onu_onu_tuning_out_completed), offsetof(bcmolt_xgpon_onu_onu_tuning_out_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_tuning_out_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_tuning_out_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_tuning_out_completed_data_unpack, bcmolt_xgpon_onu_onu_tuning_out_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_optical_reflection = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 16, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_possible_drift = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 17, sizeof(bcmolt_xgpon_onu_possible_drift_data), sizeof(bcmolt_xgpon_onu_possible_drift), offsetof(bcmolt_xgpon_onu_possible_drift, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_possible_drift_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_possible_drift_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_possible_drift_data_unpack, bcmolt_xgpon_onu_possible_drift_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_power_consumption_report = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 18, sizeof(bcmolt_xgpon_onu_power_consumption_report_data), sizeof(bcmolt_xgpon_onu_power_consumption_report), offsetof(bcmolt_xgpon_onu_power_consumption_report, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_power_consumption_report_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_power_consumption_report_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_power_consumption_report_data_unpack, bcmolt_xgpon_onu_power_consumption_report_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_power_level_report = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 19, sizeof(bcmolt_xgpon_onu_power_level_report_data), sizeof(bcmolt_xgpon_onu_power_level_report), offsetof(bcmolt_xgpon_onu_power_level_report, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_power_level_report_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_power_level_report_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_power_level_report_data_unpack, bcmolt_xgpon_onu_power_level_report_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_power_management_state_change = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 20, sizeof(bcmolt_xgpon_onu_power_management_state_change_data), sizeof(bcmolt_xgpon_onu_power_management_state_change), offsetof(bcmolt_xgpon_onu_power_management_state_change, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_power_management_state_change_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_power_management_state_change_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_power_management_state_change_data_unpack, bcmolt_xgpon_onu_power_management_state_change_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_pqsi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 21, sizeof(bcmolt_xgpon_onu_pqsi_data), sizeof(bcmolt_xgpon_onu_pqsi), offsetof(bcmolt_xgpon_onu_pqsi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_pqsi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_pqsi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_pqsi_data_unpack, bcmolt_xgpon_onu_pqsi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_ranging_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 22, sizeof(bcmolt_xgpon_onu_ranging_completed_data), sizeof(bcmolt_xgpon_onu_ranging_completed), offsetof(bcmolt_xgpon_onu_ranging_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_ranging_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_ranging_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_ranging_completed_data_unpack, bcmolt_xgpon_onu_ranging_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_registration_id = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 23, sizeof(bcmolt_xgpon_onu_registration_id_data), sizeof(bcmolt_xgpon_onu_registration_id), offsetof(bcmolt_xgpon_onu_registration_id, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_registration_id_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_registration_id_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_registration_id_data_unpack, bcmolt_xgpon_onu_registration_id_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_rssi_measurement_completed = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 24, sizeof(bcmolt_xgpon_onu_rssi_measurement_completed_data), sizeof(bcmolt_xgpon_onu_rssi_measurement_completed), offsetof(bcmolt_xgpon_onu_rssi_measurement_completed, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_rssi_measurement_completed_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_rssi_measurement_completed_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_rssi_measurement_completed_data_unpack, bcmolt_xgpon_onu_rssi_measurement_completed_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_sdi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 25, sizeof(bcmolt_xgpon_onu_sdi_data), sizeof(bcmolt_xgpon_onu_sdi), offsetof(bcmolt_xgpon_onu_sdi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_sdi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_sdi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_sdi_data_unpack, bcmolt_xgpon_onu_sdi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_secure_mutual_authentication_failure = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 26, sizeof(bcmolt_xgpon_onu_secure_mutual_authentication_failure_data), sizeof(bcmolt_xgpon_onu_secure_mutual_authentication_failure), offsetof(bcmolt_xgpon_onu_secure_mutual_authentication_failure, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_unpack, bcmolt_xgpon_onu_secure_mutual_authentication_failure_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_sfi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 27, sizeof(bcmolt_xgpon_onu_sfi_data), sizeof(bcmolt_xgpon_onu_sfi), offsetof(bcmolt_xgpon_onu_sfi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_sfi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_sfi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_sfi_data_unpack, bcmolt_xgpon_onu_sfi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_stat_alarm_cleared = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 28, sizeof(bcmolt_xgpon_onu_stat_alarm_cleared_data), sizeof(bcmolt_xgpon_onu_stat_alarm_cleared), offsetof(bcmolt_xgpon_onu_stat_alarm_cleared, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_stat_alarm_cleared_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_stat_alarm_cleared_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_stat_alarm_cleared_data_unpack, bcmolt_xgpon_onu_stat_alarm_cleared_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_stat_alarm_raised = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 29, sizeof(bcmolt_xgpon_onu_stat_alarm_raised_data), sizeof(bcmolt_xgpon_onu_stat_alarm_raised), offsetof(bcmolt_xgpon_onu_stat_alarm_raised, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_stat_alarm_raised_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_stat_alarm_raised_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_stat_alarm_raised_data_unpack, bcmolt_xgpon_onu_stat_alarm_raised_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_sufi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 30, sizeof(bcmolt_xgpon_onu_sufi_data), sizeof(bcmolt_xgpon_onu_sufi), offsetof(bcmolt_xgpon_onu_sufi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_sufi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_sufi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_sufi_data_unpack, bcmolt_xgpon_onu_sufi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_tiwi = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 31, sizeof(bcmolt_xgpon_onu_tiwi_data), sizeof(bcmolt_xgpon_onu_tiwi), offsetof(bcmolt_xgpon_onu_tiwi, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_tiwi_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_tiwi_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_tiwi_data_unpack, bcmolt_xgpon_onu_tiwi_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_tuning_response = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO, 32, sizeof(bcmolt_xgpon_onu_tuning_response_data), sizeof(bcmolt_xgpon_onu_tuning_response), offsetof(bcmolt_xgpon_onu_tuning_response, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_tuning_response_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_tuning_response_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_tuning_response_data_unpack, bcmolt_xgpon_onu_tuning_response_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_auto_cfg = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_AUTO_CFG, 0, sizeof(bcmolt_xgpon_onu_auto_cfg_data), sizeof(bcmolt_xgpon_onu_auto_cfg), offsetof(bcmolt_xgpon_onu_auto_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_auto_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_auto_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_auto_cfg_data_unpack, bcmolt_xgpon_onu_auto_cfg_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_adjust_tx_wavelength = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 0, sizeof(bcmolt_xgpon_onu_adjust_tx_wavelength_data), sizeof(bcmolt_xgpon_onu_adjust_tx_wavelength), offsetof(bcmolt_xgpon_onu_adjust_tx_wavelength, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_adjust_tx_wavelength_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_adjust_tx_wavelength_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_adjust_tx_wavelength_data_unpack, bcmolt_xgpon_onu_adjust_tx_wavelength_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_change_power_levelling = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 1, sizeof(bcmolt_xgpon_onu_change_power_levelling_data), sizeof(bcmolt_xgpon_onu_change_power_levelling), offsetof(bcmolt_xgpon_onu_change_power_levelling, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_change_power_levelling_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_change_power_levelling_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_change_power_levelling_data_unpack, bcmolt_xgpon_onu_change_power_levelling_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_get_power_consumption = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 2, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_get_power_level = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 3, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_onu_tuning_in = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 4, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_onu_tuning_out = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 5, sizeof(bcmolt_xgpon_onu_onu_tuning_out_data), sizeof(bcmolt_xgpon_onu_onu_tuning_out), offsetof(bcmolt_xgpon_onu_onu_tuning_out, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_onu_tuning_out_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_onu_tuning_out_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_onu_tuning_out_data_unpack, bcmolt_xgpon_onu_onu_tuning_out_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_request_registration = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 6, sizeof(bcmolt_xgpon_onu_request_registration_data), sizeof(bcmolt_xgpon_onu_request_registration), offsetof(bcmolt_xgpon_onu_request_registration, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_request_registration_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_request_registration_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_request_registration_data_unpack, bcmolt_xgpon_onu_request_registration_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_rssi_measurement = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 7, 0, 0, 0, NULL, NULL, NULL };
+static bcmolt_group_info group_info_xgpon_onu_secure_mutual_authentication = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 8, sizeof(bcmolt_xgpon_onu_secure_mutual_authentication_data), sizeof(bcmolt_xgpon_onu_secure_mutual_authentication), offsetof(bcmolt_xgpon_onu_secure_mutual_authentication, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_secure_mutual_authentication_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_secure_mutual_authentication_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_secure_mutual_authentication_data_unpack, bcmolt_xgpon_onu_secure_mutual_authentication_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_set_onu_state = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_OPER, 9, sizeof(bcmolt_xgpon_onu_set_onu_state_data), sizeof(bcmolt_xgpon_onu_set_onu_state), offsetof(bcmolt_xgpon_onu_set_onu_state, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_set_onu_state_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_set_onu_state_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_set_onu_state_data_unpack, bcmolt_xgpon_onu_set_onu_state_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_cpu_packets = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, 0, sizeof(bcmolt_xgpon_onu_cpu_packets_data), sizeof(bcmolt_xgpon_onu_cpu_packets), offsetof(bcmolt_xgpon_onu_cpu_packets, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_cpu_packets_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_cpu_packets_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_cpu_packets_data_unpack, bcmolt_xgpon_onu_cpu_packets_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_ploam_packet = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY, 1, sizeof(bcmolt_xgpon_onu_ploam_packet_data), sizeof(bcmolt_xgpon_onu_ploam_packet), offsetof(bcmolt_xgpon_onu_ploam_packet, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_ploam_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_ploam_packet_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_ploam_packet_data_unpack, bcmolt_xgpon_onu_ploam_packet_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_cpu_packet = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY_RX, 0, sizeof(bcmolt_xgpon_onu_cpu_packet_data), sizeof(bcmolt_xgpon_onu_cpu_packet), offsetof(bcmolt_xgpon_onu_cpu_packet, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_cpu_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_cpu_packet_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_cpu_packet_data_unpack, bcmolt_xgpon_onu_cpu_packet_data_scan };
+static bcmolt_group_info group_info_xgpon_onu_omci_packet = { BCMOLT_OBJ_ID_XGPON_ONU, BCMOLT_MGT_GROUP_PROXY_RX, 1, sizeof(bcmolt_xgpon_onu_omci_packet_data), sizeof(bcmolt_xgpon_onu_omci_packet), offsetof(bcmolt_xgpon_onu_omci_packet, data), (bcmolt_func_packed_len) bcmolt_xgpon_onu_omci_packet_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_onu_omci_packet_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_onu_omci_packet_data_unpack, bcmolt_xgpon_onu_omci_packet_data_scan };
+static bcmolt_group_info group_info_xgpon_trx_key = { BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xgpon_trx_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xgpon_trx_key_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_trx_key_pack, (bcmolt_func_unpack) bcmolt_xgpon_trx_key_unpack, bcmolt_xgpon_trx_key_scan };
+static bcmolt_group_info group_info_xgpon_trx_cfg = { BCMOLT_OBJ_ID_XGPON_TRX, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xgpon_trx_cfg_data), sizeof(bcmolt_xgpon_trx_cfg), offsetof(bcmolt_xgpon_trx_cfg, data), (bcmolt_func_packed_len) bcmolt_xgpon_trx_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xgpon_trx_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xgpon_trx_cfg_data_unpack, bcmolt_xgpon_trx_cfg_data_scan };
+static bcmolt_group_info group_info_xpon_serdes_key = { BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_KEY, 0, sizeof(bcmolt_xpon_serdes_key), 0, 0, (bcmolt_func_packed_len) bcmolt_xpon_serdes_key_get_packed_length, (bcmolt_func_pack) bcmolt_xpon_serdes_key_pack, (bcmolt_func_unpack) bcmolt_xpon_serdes_key_unpack, bcmolt_xpon_serdes_key_scan };
+static bcmolt_group_info group_info_xpon_serdes_cfg = { BCMOLT_OBJ_ID_XPON_SERDES, BCMOLT_MGT_GROUP_CFG, 0, sizeof(bcmolt_xpon_serdes_cfg_data), sizeof(bcmolt_xpon_serdes_cfg), offsetof(bcmolt_xpon_serdes_cfg, data), (bcmolt_func_packed_len) bcmolt_xpon_serdes_cfg_data_get_packed_length, (bcmolt_func_pack) bcmolt_xpon_serdes_cfg_data_pack, (bcmolt_func_unpack) bcmolt_xpon_serdes_cfg_data_unpack, bcmolt_xpon_serdes_cfg_data_scan };
+static bcmolt_group_info *group_info[] =
+{
+    &group_info_ae_ni_key,
+    &group_info_ae_ni_cfg,
+    &group_info_ae_ni_set_ae_ni_en_state,
+    &group_info_ae_path_ds_key,
+    &group_info_ae_path_ds_stat,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_cfg,
+    &group_info_ae_path_ds_stat_alarm_cleared,
+    &group_info_ae_path_ds_stat_alarm_raised,
+    &group_info_ae_path_ds_auto_cfg,
+    &group_info_ae_path_us_key,
+    &group_info_ae_path_us_stat,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_cfg,
+    &group_info_ae_path_us_stat_alarm_cleared,
+    &group_info_ae_path_us_stat_alarm_raised,
+    &group_info_ae_path_us_auto_cfg,
+    &group_info_channel_key,
+    &group_info_channel_cfg,
+    &group_info_debug_key,
+    &group_info_debug_cfg,
+    &group_info_debug_cli_output,
+    &group_info_debug_file_almost_full,
+    &group_info_debug_auto_cfg,
+    &group_info_debug_cli_input,
+    &group_info_debug_reset_api_capture,
+    &group_info_debug_start_api_capture,
+    &group_info_debug_stop_api_capture,
+    &group_info_device_key,
+    &group_info_device_cfg,
+    &group_info_device_connection_complete,
+    &group_info_device_connection_established,
+    &group_info_device_connection_failure,
+    &group_info_device_ddr_test_complete,
+    &group_info_device_device_keep_alive,
+    &group_info_device_device_ready,
+    &group_info_device_disconnection_complete,
+    &group_info_device_image_transfer_complete,
+    &group_info_device_indications_dropped,
+    &group_info_device_sw_error,
+    &group_info_device_sw_exception,
+    &group_info_device_auto_cfg,
+    &group_info_device_connect,
+    &group_info_device_disconnect,
+    &group_info_device_host_keep_alive,
+    &group_info_device_image_transfer_data,
+    &group_info_device_image_transfer_start,
+    &group_info_device_reset,
+    &group_info_device_run_ddr_test,
+    &group_info_device_sw_upgrade_activate,
+    &group_info_epon_denied_link_key,
+    &group_info_epon_denied_link_cfg,
+    &group_info_epon_denied_link_laser_on_off_violation,
+    &group_info_epon_denied_link_llid_pool_empty_violation,
+    &group_info_epon_denied_link_max_link_violation,
+    &group_info_epon_denied_link_overhead_profile_violation,
+    &group_info_epon_denied_link_range_violation,
+    &group_info_epon_denied_link_rogue_violation,
+    &group_info_epon_denied_link_system_resource_violation,
+    &group_info_epon_denied_link_tdm_channels_exhausted,
+    &group_info_epon_denied_link_unknown_link_violation,
+    &group_info_epon_denied_link_upstream_bandwidth_violation,
+    &group_info_epon_denied_link_auto_cfg,
+    &group_info_epon_link_key,
+    &group_info_epon_link_cfg,
+    &group_info_epon_link_stat,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_stat_cfg,
+    &group_info_epon_link_duplicate_mpcp_registration_request,
+    &group_info_epon_link_encryption_enabled,
+    &group_info_epon_link_key_exchange_failure,
+    &group_info_epon_link_key_exchange_started,
+    &group_info_epon_link_key_exchange_stopped,
+    &group_info_epon_link_link_deleted,
+    &group_info_epon_link_link_speed_mismatch,
+    &group_info_epon_link_mpcp_deregistered,
+    &group_info_epon_link_mpcp_discovered,
+    &group_info_epon_link_mpcp_reg_ack_timeout,
+    &group_info_epon_link_mpcp_report_timeout,
+    &group_info_epon_link_oam_keepalive_timeout,
+    &group_info_epon_link_oam_keepalive_timer_started,
+    &group_info_epon_link_oam_keepalive_timer_stopped,
+    &group_info_epon_link_preprovisioned_link_created,
+    &group_info_epon_link_protection_switch_occurred,
+    &group_info_epon_link_range_value_changed,
+    &group_info_epon_link_rerange_failure,
+    &group_info_epon_link_stat_alarm_cleared,
+    &group_info_epon_link_stat_alarm_raised,
+    &group_info_epon_link_static_registration_done,
+    &group_info_epon_link_auto_cfg,
+    &group_info_epon_link_delete_link,
+    &group_info_epon_link_force_rediscovery,
+    &group_info_epon_link_key_exchange_start,
+    &group_info_epon_link_key_exchange_stop,
+    &group_info_epon_link_oam_keepalive_timer_start,
+    &group_info_epon_link_oam_keepalive_timer_stop,
+    &group_info_epon_link_static_registration,
+    &group_info_epon_link_inject_frame,
+    &group_info_epon_link_frame_captured,
+    &group_info_epon_ni_key,
+    &group_info_epon_ni_cfg,
+    &group_info_epon_ni_auto_rogue_scan_10g_failure,
+    &group_info_epon_ni_auto_rogue_scan_1g_failure,
+    &group_info_epon_ni_llid_quarantined,
+    &group_info_epon_ni_mpcp_timestamp_changed,
+    &group_info_epon_ni_no_reports,
+    &group_info_epon_ni_onu_upgrade_complete,
+    &group_info_epon_ni_rerange_failure,
+    &group_info_epon_ni_rogue_scan_complete,
+    &group_info_epon_ni_rssi_measurement_completed,
+    &group_info_epon_ni_state_change_completed,
+    &group_info_epon_ni_auto_cfg,
+    &group_info_epon_ni_add_link,
+    &group_info_epon_ni_add_multicast_link,
+    &group_info_epon_ni_add_protected_standby_link,
+    &group_info_epon_ni_issue_rssi_grant,
+    &group_info_epon_ni_protection_switching_apply_rerange_delta,
+    &group_info_epon_ni_rogue_llid_scan,
+    &group_info_epon_ni_set_epon_ni_en_state,
+    &group_info_epon_ni_start_onu_upgrade,
+    &group_info_epon_onu_10g_us_key,
+    &group_info_epon_onu_10g_us_cfg,
+    &group_info_epon_onu_10g_us_stat,
+    &group_info_epon_onu_10g_us_stat_cfg,
+    &group_info_epon_onu_10g_us_stat_cfg,
+    &group_info_epon_onu_10g_us_stat_cfg,
+    &group_info_epon_onu_10g_us_stat_cfg,
+    &group_info_epon_onu_10g_us_stat_alarm_cleared,
+    &group_info_epon_onu_10g_us_stat_alarm_raised,
+    &group_info_epon_onu_10g_us_auto_cfg,
+    &group_info_epon_onu_1g_us_key,
+    &group_info_epon_onu_1g_us_cfg,
+    &group_info_epon_onu_1g_us_stat,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_cfg,
+    &group_info_epon_onu_1g_us_stat_alarm_cleared,
+    &group_info_epon_onu_1g_us_stat_alarm_raised,
+    &group_info_epon_onu_1g_us_auto_cfg,
+    &group_info_epon_path_10g_ds_key,
+    &group_info_epon_path_10g_ds_cfg,
+    &group_info_epon_path_10g_ds_stat,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_cfg,
+    &group_info_epon_path_10g_ds_stat_alarm_cleared,
+    &group_info_epon_path_10g_ds_stat_alarm_raised,
+    &group_info_epon_path_10g_ds_auto_cfg,
+    &group_info_epon_path_10g_us_key,
+    &group_info_epon_path_10g_us_cfg,
+    &group_info_epon_path_10g_us_stat,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_cfg,
+    &group_info_epon_path_10g_us_stat_alarm_cleared,
+    &group_info_epon_path_10g_us_stat_alarm_raised,
+    &group_info_epon_path_10g_us_auto_cfg,
+    &group_info_epon_path_1g_ds_key,
+    &group_info_epon_path_1g_ds_cfg,
+    &group_info_epon_path_1g_ds_stat,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_cfg,
+    &group_info_epon_path_1g_ds_stat_alarm_cleared,
+    &group_info_epon_path_1g_ds_stat_alarm_raised,
+    &group_info_epon_path_1g_ds_auto_cfg,
+    &group_info_epon_path_1g_us_key,
+    &group_info_epon_path_1g_us_cfg,
+    &group_info_epon_path_1g_us_stat,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_cfg,
+    &group_info_epon_path_1g_us_stat_alarm_cleared,
+    &group_info_epon_path_1g_us_stat_alarm_raised,
+    &group_info_epon_path_1g_us_auto_cfg,
+    &group_info_epon_rp_key,
+    &group_info_epon_rp_cfg,
+    &group_info_gpio_key,
+    &group_info_gpio_cfg,
+    &group_info_gpon_alloc_key,
+    &group_info_gpon_alloc_cfg,
+    &group_info_gpon_alloc_stat,
+    &group_info_gpon_alloc_stat_cfg,
+    &group_info_gpon_alloc_configuration_completed,
+    &group_info_gpon_alloc_get_alloc_stats_completed,
+    &group_info_gpon_alloc_stat_alarm_cleared,
+    &group_info_gpon_alloc_stat_alarm_raised,
+    &group_info_gpon_alloc_auto_cfg,
+    &group_info_gpon_alloc_get_stats,
+    &group_info_gpon_alloc_set_state,
+    &group_info_gpon_gem_port_key,
+    &group_info_gpon_gem_port_cfg,
+    &group_info_gpon_gem_port_stat,
+    &group_info_gpon_gem_port_stat_cfg,
+    &group_info_gpon_gem_port_stat_cfg,
+    &group_info_gpon_gem_port_stat_cfg,
+    &group_info_gpon_gem_port_stat_cfg,
+    &group_info_gpon_gem_port_configuration_completed,
+    &group_info_gpon_gem_port_stat_alarm_cleared,
+    &group_info_gpon_gem_port_stat_alarm_raised,
+    &group_info_gpon_gem_port_auto_cfg,
+    &group_info_gpon_gem_port_set_state,
+    &group_info_gpon_iwf_key,
+    &group_info_gpon_iwf_cfg,
+    &group_info_gpon_iwf_stat,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_stat_cfg,
+    &group_info_gpon_iwf_flush_mac_table_completed,
+    &group_info_gpon_iwf_scan_mac_table_completed,
+    &group_info_gpon_iwf_stat_alarm_cleared,
+    &group_info_gpon_iwf_stat_alarm_raised,
+    &group_info_gpon_iwf_auto_cfg,
+    &group_info_gpon_iwf_flush_mac_table,
+    &group_info_gpon_iwf_scan_mac_table,
+    &group_info_gpon_iwf_ds_egress_flow_key,
+    &group_info_gpon_iwf_ds_egress_flow_cfg,
+    &group_info_gpon_iwf_ds_ingress_flow_key,
+    &group_info_gpon_iwf_ds_ingress_flow_cfg,
+    &group_info_gpon_iwf_mac_table_key,
+    &group_info_gpon_iwf_mac_table_cfg,
+    &group_info_gpon_iwf_mac_table_mac_aged,
+    &group_info_gpon_iwf_mac_table_mac_dropped,
+    &group_info_gpon_iwf_mac_table_mac_move,
+    &group_info_gpon_iwf_mac_table_new_mac,
+    &group_info_gpon_iwf_mac_table_auto_cfg,
+    &group_info_gpon_iwf_us_flow_key,
+    &group_info_gpon_iwf_us_flow_cfg,
+    &group_info_gpon_ni_key,
+    &group_info_gpon_ni_cfg,
+    &group_info_gpon_ni_stat,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_stat_cfg,
+    &group_info_gpon_ni_activate_all_onus_completed,
+    &group_info_gpon_ni_cpu_packets_failure,
+    &group_info_gpon_ni_deactivate_all_onus_completed,
+    &group_info_gpon_ni_disable_all_onus_completed,
+    &group_info_gpon_ni_enable_all_onus_completed,
+    &group_info_gpon_ni_los,
+    &group_info_gpon_ni_onu_discovered,
+    &group_info_gpon_ni_onu_upgrade_complete,
+    &group_info_gpon_ni_protection_switching_onus_ranged,
+    &group_info_gpon_ni_protection_switching_switchover_completed,
+    &group_info_gpon_ni_protection_switching_traffic_resume,
+    &group_info_gpon_ni_rogue_detection_completed,
+    &group_info_gpon_ni_rogue_onu_special_map_cycle_start,
+    &group_info_gpon_ni_serial_number_acquisition_cycle_start,
+    &group_info_gpon_ni_standby_pon_monitoring_cycle_completed,
+    &group_info_gpon_ni_stat_alarm_cleared,
+    &group_info_gpon_ni_stat_alarm_raised,
+    &group_info_gpon_ni_state_change_completed,
+    &group_info_gpon_ni_tod_request_completed,
+    &group_info_gpon_ni_auto_cfg,
+    &group_info_gpon_ni_disable_serial_number,
+    &group_info_gpon_ni_protection_switching_type_c_set_multiple_onu_state,
+    &group_info_gpon_ni_reset,
+    &group_info_gpon_ni_rogue_detection_window,
+    &group_info_gpon_ni_set_onu_state,
+    &group_info_gpon_ni_set_pon_state,
+    &group_info_gpon_ni_single_request_standby_pon_monitoring,
+    &group_info_gpon_ni_start_onu_upgrade,
+    &group_info_gpon_ni_tod_request,
+    &group_info_gpon_ni_broadcast_ploam_packet,
+    &group_info_gpon_ni_cpu_packets,
+    &group_info_gpon_onu_key,
+    &group_info_gpon_onu_cfg,
+    &group_info_gpon_onu_stat,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_stat_cfg,
+    &group_info_gpon_onu_ber_interval_configuration_completed,
+    &group_info_gpon_onu_dfi,
+    &group_info_gpon_onu_dgi,
+    &group_info_gpon_onu_dowi,
+    &group_info_gpon_onu_err,
+    &group_info_gpon_onu_invalid_dbru_report,
+    &group_info_gpon_onu_key_exchange_completed,
+    &group_info_gpon_onu_key_exchange_cycle_skipped,
+    &group_info_gpon_onu_key_exchange_decrypt_required,
+    &group_info_gpon_onu_key_exchange_key_mismatch,
+    &group_info_gpon_onu_key_exchange_key_request_timeout,
+    &group_info_gpon_onu_key_exchange_unconsecutive_index,
+    &group_info_gpon_onu_loai,
+    &group_info_gpon_onu_loki,
+    &group_info_gpon_onu_memi,
+    &group_info_gpon_onu_omci_port_id_configuration_completed,
+    &group_info_gpon_onu_onu_activation_completed,
+    &group_info_gpon_onu_onu_activation_standby_completed,
+    &group_info_gpon_onu_onu_alarm,
+    &group_info_gpon_onu_onu_deactivation_completed,
+    &group_info_gpon_onu_onu_disable_completed,
+    &group_info_gpon_onu_onu_enable_completed,
+    &group_info_gpon_onu_optical_reflection,
+    &group_info_gpon_onu_password_authentication_completed,
+    &group_info_gpon_onu_pee,
+    &group_info_gpon_onu_possible_drift,
+    &group_info_gpon_onu_power_management_state_change,
+    &group_info_gpon_onu_pst,
+    &group_info_gpon_onu_ranging_completed,
+    &group_info_gpon_onu_rei,
+    &group_info_gpon_onu_rssi_measurement_completed,
+    &group_info_gpon_onu_sdi,
+    &group_info_gpon_onu_sfi,
+    &group_info_gpon_onu_stat_alarm_cleared,
+    &group_info_gpon_onu_stat_alarm_raised,
+    &group_info_gpon_onu_sufi,
+    &group_info_gpon_onu_tiwi,
+    &group_info_gpon_onu_auto_cfg,
+    &group_info_gpon_onu_change_power_level,
+    &group_info_gpon_onu_rssi_measurement,
+    &group_info_gpon_onu_set_onu_state,
+    &group_info_gpon_onu_cpu_packets,
+    &group_info_gpon_onu_ploam_packet,
+    &group_info_gpon_onu_cpu_packet,
+    &group_info_gpon_onu_omci_packet,
+    &group_info_gpon_trx_key,
+    &group_info_gpon_trx_cfg,
+    &group_info_log_entry_key,
+    &group_info_log_entry_cfg,
+    &group_info_log_entry_stat,
+    &group_info_log_entry_stat_cfg,
+    &group_info_log_entry_stat_cfg,
+    &group_info_log_entry_stat_alarm_cleared,
+    &group_info_log_entry_stat_alarm_raised,
+    &group_info_log_entry_auto_cfg,
+    &group_info_logger_key,
+    &group_info_logger_cfg,
+    &group_info_logger_stat,
+    &group_info_logger_stat_cfg,
+    &group_info_logger_stat_alarm_cleared,
+    &group_info_logger_stat_alarm_raised,
+    &group_info_logger_auto_cfg,
+    &group_info_logger_clear_log,
+    &group_info_nni_key,
+    &group_info_nni_cfg,
+    &group_info_nni_stat,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_cfg,
+    &group_info_nni_stat_alarm_cleared,
+    &group_info_nni_stat_alarm_raised,
+    &group_info_nni_status_changed,
+    &group_info_nni_auto_cfg,
+    &group_info_nni_serdes_key,
+    &group_info_nni_serdes_cfg,
+    &group_info_software_error_key,
+    &group_info_software_error_cfg,
+    &group_info_trx_calibration_key,
+    &group_info_trx_calibration_capture_window_and_statistic_completed,
+    &group_info_trx_calibration_auto_cfg,
+    &group_info_trx_calibration_start_capture_window,
+    &group_info_trx_calibration_stop_capture_window,
+    &group_info_xgpon_alloc_key,
+    &group_info_xgpon_alloc_cfg,
+    &group_info_xgpon_alloc_stat,
+    &group_info_xgpon_alloc_stat_cfg,
+    &group_info_xgpon_alloc_configuration_completed,
+    &group_info_xgpon_alloc_get_alloc_stats_completed,
+    &group_info_xgpon_alloc_stat_alarm_cleared,
+    &group_info_xgpon_alloc_stat_alarm_raised,
+    &group_info_xgpon_alloc_auto_cfg,
+    &group_info_xgpon_alloc_get_stats,
+    &group_info_xgpon_alloc_set_state,
+    &group_info_xgpon_gem_port_key,
+    &group_info_xgpon_gem_port_cfg,
+    &group_info_xgpon_gem_port_stat,
+    &group_info_xgpon_gem_port_stat_cfg,
+    &group_info_xgpon_gem_port_stat_cfg,
+    &group_info_xgpon_gem_port_stat_cfg,
+    &group_info_xgpon_gem_port_stat_cfg,
+    &group_info_xgpon_gem_port_stat_alarm_cleared,
+    &group_info_xgpon_gem_port_stat_alarm_raised,
+    &group_info_xgpon_gem_port_auto_cfg,
+    &group_info_xgpon_iwf_key,
+    &group_info_xgpon_iwf_cfg,
+    &group_info_xgpon_ni_key,
+    &group_info_xgpon_ni_cfg,
+    &group_info_xgpon_ni_stat,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_stat_cfg,
+    &group_info_xgpon_ni_activate_all_onus_completed,
+    &group_info_xgpon_ni_cpu_packets_failure,
+    &group_info_xgpon_ni_deactivate_all_onus_completed,
+    &group_info_xgpon_ni_disable_all_onus_completed,
+    &group_info_xgpon_ni_enable_all_onus_completed,
+    &group_info_xgpon_ni_los,
+    &group_info_xgpon_ni_onu_discovered,
+    &group_info_xgpon_ni_onu_upgrade_complete,
+    &group_info_xgpon_ni_protection_switching_onus_ranged,
+    &group_info_xgpon_ni_protection_switching_switchover_completed,
+    &group_info_xgpon_ni_protection_switching_traffic_resume,
+    &group_info_xgpon_ni_rogue_detection_completed,
+    &group_info_xgpon_ni_rogue_onu_special_map_cycle_start,
+    &group_info_xgpon_ni_serial_number_acquisition_cycle_start,
+    &group_info_xgpon_ni_standby_pon_monitoring_cycle_completed,
+    &group_info_xgpon_ni_stat_alarm_cleared,
+    &group_info_xgpon_ni_stat_alarm_raised,
+    &group_info_xgpon_ni_state_change_completed,
+    &group_info_xgpon_ni_tod_request_completed,
+    &group_info_xgpon_ni_auto_cfg,
+    &group_info_xgpon_ni_adjust_tx_wavelength,
+    &group_info_xgpon_ni_disable_serial_number,
+    &group_info_xgpon_ni_reset,
+    &group_info_xgpon_ni_rogue_detection_window,
+    &group_info_xgpon_ni_run_special_bw_map,
+    &group_info_xgpon_ni_set_onu_state,
+    &group_info_xgpon_ni_set_pon_state,
+    &group_info_xgpon_ni_single_request_standby_pon_monitoring,
+    &group_info_xgpon_ni_start_onu_upgrade,
+    &group_info_xgpon_ni_tod_request,
+    &group_info_xgpon_ni_broadcast_ploam_packet,
+    &group_info_xgpon_ni_cpu_packets,
+    &group_info_xgpon_onu_key,
+    &group_info_xgpon_onu_cfg,
+    &group_info_xgpon_onu_stat,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_stat_cfg,
+    &group_info_xgpon_onu_dfi,
+    &group_info_xgpon_onu_dgi,
+    &group_info_xgpon_onu_dowi,
+    &group_info_xgpon_onu_invalid_dbru_report,
+    &group_info_xgpon_onu_key_exchange_completed,
+    &group_info_xgpon_onu_key_exchange_cycle_skipped,
+    &group_info_xgpon_onu_key_exchange_key_mismatch,
+    &group_info_xgpon_onu_key_exchange_key_request_timeout,
+    &group_info_xgpon_onu_looci,
+    &group_info_xgpon_onu_onu_activation_completed,
+    &group_info_xgpon_onu_onu_alarm,
+    &group_info_xgpon_onu_onu_deactivation_completed,
+    &group_info_xgpon_onu_onu_disable_completed,
+    &group_info_xgpon_onu_onu_enable_completed,
+    &group_info_xgpon_onu_onu_tuning_in_completed,
+    &group_info_xgpon_onu_onu_tuning_out_completed,
+    &group_info_xgpon_onu_optical_reflection,
+    &group_info_xgpon_onu_possible_drift,
+    &group_info_xgpon_onu_power_consumption_report,
+    &group_info_xgpon_onu_power_level_report,
+    &group_info_xgpon_onu_power_management_state_change,
+    &group_info_xgpon_onu_pqsi,
+    &group_info_xgpon_onu_ranging_completed,
+    &group_info_xgpon_onu_registration_id,
+    &group_info_xgpon_onu_rssi_measurement_completed,
+    &group_info_xgpon_onu_sdi,
+    &group_info_xgpon_onu_secure_mutual_authentication_failure,
+    &group_info_xgpon_onu_sfi,
+    &group_info_xgpon_onu_stat_alarm_cleared,
+    &group_info_xgpon_onu_stat_alarm_raised,
+    &group_info_xgpon_onu_sufi,
+    &group_info_xgpon_onu_tiwi,
+    &group_info_xgpon_onu_tuning_response,
+    &group_info_xgpon_onu_auto_cfg,
+    &group_info_xgpon_onu_adjust_tx_wavelength,
+    &group_info_xgpon_onu_change_power_levelling,
+    &group_info_xgpon_onu_get_power_consumption,
+    &group_info_xgpon_onu_get_power_level,
+    &group_info_xgpon_onu_onu_tuning_in,
+    &group_info_xgpon_onu_onu_tuning_out,
+    &group_info_xgpon_onu_request_registration,
+    &group_info_xgpon_onu_rssi_measurement,
+    &group_info_xgpon_onu_secure_mutual_authentication,
+    &group_info_xgpon_onu_set_onu_state,
+    &group_info_xgpon_onu_cpu_packets,
+    &group_info_xgpon_onu_ploam_packet,
+    &group_info_xgpon_onu_cpu_packet,
+    &group_info_xgpon_onu_omci_packet,
+    &group_info_xgpon_trx_key,
+    &group_info_xgpon_trx_cfg,
+    &group_info_xpon_serdes_key,
+    &group_info_xpon_serdes_cfg
+};
+static bcmolt_group_id group_ids_ae_ni_key[] = { BCMOLT_GROUP_ID_AE_NI_KEY };
+static bcmolt_group_id group_ids_ae_ni_cfg[] = { BCMOLT_GROUP_ID_AE_NI_CFG };
+static bcmolt_group_id group_ids_ae_ni_oper[] = { BCMOLT_GROUP_ID_AE_NI_SET_AE_NI_EN_STATE };
+static bcmolt_group_id group_ids_ae_path_ds_key[] = { BCMOLT_GROUP_ID_AE_PATH_DS_KEY };
+static bcmolt_group_id group_ids_ae_path_ds_stat[] = { BCMOLT_GROUP_ID_AE_PATH_DS_STAT };
+static bcmolt_group_id group_ids_ae_path_ds_stat_cfg[] = { BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_BYTES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_CFG_ABORT_FRAMES };
+static bcmolt_group_id group_ids_ae_path_ds_auto[] = { BCMOLT_GROUP_ID_AE_PATH_DS_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_AE_PATH_DS_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_ae_path_ds_auto_cfg[] = { BCMOLT_GROUP_ID_AE_PATH_DS_AUTO_CFG };
+static bcmolt_group_id group_ids_ae_path_us_key[] = { BCMOLT_GROUP_ID_AE_PATH_US_KEY };
+static bcmolt_group_id group_ids_ae_path_us_stat[] = { BCMOLT_GROUP_ID_AE_PATH_US_STAT };
+static bcmolt_group_id group_ids_ae_path_us_stat_cfg[] = { BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_BYTES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_ABORT_FRAMES, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_FCS_ERROR, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_OVERSIZE_ERROR, BCMOLT_GROUP_ID_AE_PATH_US_STAT_CFG_RUNT_ERROR };
+static bcmolt_group_id group_ids_ae_path_us_auto[] = { BCMOLT_GROUP_ID_AE_PATH_US_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_AE_PATH_US_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_ae_path_us_auto_cfg[] = { BCMOLT_GROUP_ID_AE_PATH_US_AUTO_CFG };
+static bcmolt_group_id group_ids_channel_key[] = { BCMOLT_GROUP_ID_CHANNEL_KEY };
+static bcmolt_group_id group_ids_channel_cfg[] = { BCMOLT_GROUP_ID_CHANNEL_CFG };
+static bcmolt_group_id group_ids_debug_key[] = { BCMOLT_GROUP_ID_DEBUG_KEY };
+static bcmolt_group_id group_ids_debug_cfg[] = { BCMOLT_GROUP_ID_DEBUG_CFG };
+static bcmolt_group_id group_ids_debug_auto[] = { BCMOLT_GROUP_ID_DEBUG_CLI_OUTPUT, BCMOLT_GROUP_ID_DEBUG_FILE_ALMOST_FULL };
+static bcmolt_group_id group_ids_debug_auto_cfg[] = { BCMOLT_GROUP_ID_DEBUG_AUTO_CFG };
+static bcmolt_group_id group_ids_debug_oper[] = { BCMOLT_GROUP_ID_DEBUG_CLI_INPUT, BCMOLT_GROUP_ID_DEBUG_RESET_API_CAPTURE, BCMOLT_GROUP_ID_DEBUG_START_API_CAPTURE, BCMOLT_GROUP_ID_DEBUG_STOP_API_CAPTURE };
+static bcmolt_group_id group_ids_device_key[] = { BCMOLT_GROUP_ID_DEVICE_KEY };
+static bcmolt_group_id group_ids_device_cfg[] = { BCMOLT_GROUP_ID_DEVICE_CFG };
+static bcmolt_group_id group_ids_device_auto[] = { BCMOLT_GROUP_ID_DEVICE_CONNECTION_COMPLETE, BCMOLT_GROUP_ID_DEVICE_CONNECTION_ESTABLISHED, BCMOLT_GROUP_ID_DEVICE_CONNECTION_FAILURE, BCMOLT_GROUP_ID_DEVICE_DDR_TEST_COMPLETE, BCMOLT_GROUP_ID_DEVICE_DEVICE_KEEP_ALIVE, BCMOLT_GROUP_ID_DEVICE_DEVICE_READY, BCMOLT_GROUP_ID_DEVICE_DISCONNECTION_COMPLETE, BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_COMPLETE, BCMOLT_GROUP_ID_DEVICE_INDICATIONS_DROPPED, BCMOLT_GROUP_ID_DEVICE_SW_ERROR, BCMOLT_GROUP_ID_DEVICE_SW_EXCEPTION };
+static bcmolt_group_id group_ids_device_auto_cfg[] = { BCMOLT_GROUP_ID_DEVICE_AUTO_CFG };
+static bcmolt_group_id group_ids_device_oper[] = { BCMOLT_GROUP_ID_DEVICE_CONNECT, BCMOLT_GROUP_ID_DEVICE_DISCONNECT, BCMOLT_GROUP_ID_DEVICE_HOST_KEEP_ALIVE, BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_DATA, BCMOLT_GROUP_ID_DEVICE_IMAGE_TRANSFER_START, BCMOLT_GROUP_ID_DEVICE_RESET, BCMOLT_GROUP_ID_DEVICE_RUN_DDR_TEST, BCMOLT_GROUP_ID_DEVICE_SW_UPGRADE_ACTIVATE };
+static bcmolt_group_id group_ids_epon_denied_link_key[] = { BCMOLT_GROUP_ID_EPON_DENIED_LINK_KEY };
+static bcmolt_group_id group_ids_epon_denied_link_cfg[] = { BCMOLT_GROUP_ID_EPON_DENIED_LINK_CFG };
+static bcmolt_group_id group_ids_epon_denied_link_auto[] = { BCMOLT_GROUP_ID_EPON_DENIED_LINK_LASER_ON_OFF_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_LLID_POOL_EMPTY_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_MAX_LINK_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_OVERHEAD_PROFILE_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_RANGE_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_ROGUE_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_SYSTEM_RESOURCE_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_TDM_CHANNELS_EXHAUSTED, BCMOLT_GROUP_ID_EPON_DENIED_LINK_UNKNOWN_LINK_VIOLATION, BCMOLT_GROUP_ID_EPON_DENIED_LINK_UPSTREAM_BANDWIDTH_VIOLATION };
+static bcmolt_group_id group_ids_epon_denied_link_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_DENIED_LINK_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_link_key[] = { BCMOLT_GROUP_ID_EPON_LINK_KEY };
+static bcmolt_group_id group_ids_epon_link_cfg[] = { BCMOLT_GROUP_ID_EPON_LINK_CFG };
+static bcmolt_group_id group_ids_epon_link_stat[] = { BCMOLT_GROUP_ID_EPON_LINK_STAT };
+static bcmolt_group_id group_ids_epon_link_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_DATA_BYTES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_DATA_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_64, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OAM_BYTES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_REPORT_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_FCS_ERROR, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_OVERSIZE_ERROR, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_RUNT_ERROR, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_LINE_CODE_ERROR, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_RX_LINE_CODE_ERROR_MAX, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_DATA_BYTES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_DATA_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_64, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_OAM_BYTES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_LINK_STAT_CFG_TX_GATES };
+static bcmolt_group_id group_ids_epon_link_auto[] = { BCMOLT_GROUP_ID_EPON_LINK_DUPLICATE_MPCP_REGISTRATION_REQUEST, BCMOLT_GROUP_ID_EPON_LINK_ENCRYPTION_ENABLED, BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_FAILURE, BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STARTED, BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STOPPED, BCMOLT_GROUP_ID_EPON_LINK_LINK_DELETED, BCMOLT_GROUP_ID_EPON_LINK_LINK_SPEED_MISMATCH, BCMOLT_GROUP_ID_EPON_LINK_MPCP_DEREGISTERED, BCMOLT_GROUP_ID_EPON_LINK_MPCP_DISCOVERED, BCMOLT_GROUP_ID_EPON_LINK_MPCP_REG_ACK_TIMEOUT, BCMOLT_GROUP_ID_EPON_LINK_MPCP_REPORT_TIMEOUT, BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMEOUT, BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STARTED, BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STOPPED, BCMOLT_GROUP_ID_EPON_LINK_PREPROVISIONED_LINK_CREATED, BCMOLT_GROUP_ID_EPON_LINK_PROTECTION_SWITCH_OCCURRED, BCMOLT_GROUP_ID_EPON_LINK_RANGE_VALUE_CHANGED, BCMOLT_GROUP_ID_EPON_LINK_RERANGE_FAILURE, BCMOLT_GROUP_ID_EPON_LINK_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_LINK_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_EPON_LINK_STATIC_REGISTRATION_DONE };
+static bcmolt_group_id group_ids_epon_link_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_LINK_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_link_oper[] = { BCMOLT_GROUP_ID_EPON_LINK_DELETE_LINK, BCMOLT_GROUP_ID_EPON_LINK_FORCE_REDISCOVERY, BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_START, BCMOLT_GROUP_ID_EPON_LINK_KEY_EXCHANGE_STOP, BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_START, BCMOLT_GROUP_ID_EPON_LINK_OAM_KEEPALIVE_TIMER_STOP, BCMOLT_GROUP_ID_EPON_LINK_STATIC_REGISTRATION };
+static bcmolt_group_id group_ids_epon_link_proxy[] = { BCMOLT_GROUP_ID_EPON_LINK_INJECT_FRAME };
+static bcmolt_group_id group_ids_epon_link_proxy_rx[] = { BCMOLT_GROUP_ID_EPON_LINK_FRAME_CAPTURED };
+static bcmolt_group_id group_ids_epon_ni_key[] = { BCMOLT_GROUP_ID_EPON_NI_KEY };
+static bcmolt_group_id group_ids_epon_ni_cfg[] = { BCMOLT_GROUP_ID_EPON_NI_CFG };
+static bcmolt_group_id group_ids_epon_ni_auto[] = { BCMOLT_GROUP_ID_EPON_NI_AUTO_ROGUE_SCAN_10G_FAILURE, BCMOLT_GROUP_ID_EPON_NI_AUTO_ROGUE_SCAN_1G_FAILURE, BCMOLT_GROUP_ID_EPON_NI_LLID_QUARANTINED, BCMOLT_GROUP_ID_EPON_NI_MPCP_TIMESTAMP_CHANGED, BCMOLT_GROUP_ID_EPON_NI_NO_REPORTS, BCMOLT_GROUP_ID_EPON_NI_ONU_UPGRADE_COMPLETE, BCMOLT_GROUP_ID_EPON_NI_RERANGE_FAILURE, BCMOLT_GROUP_ID_EPON_NI_ROGUE_SCAN_COMPLETE, BCMOLT_GROUP_ID_EPON_NI_RSSI_MEASUREMENT_COMPLETED, BCMOLT_GROUP_ID_EPON_NI_STATE_CHANGE_COMPLETED };
+static bcmolt_group_id group_ids_epon_ni_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_NI_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_ni_oper[] = { BCMOLT_GROUP_ID_EPON_NI_ADD_LINK, BCMOLT_GROUP_ID_EPON_NI_ADD_MULTICAST_LINK, BCMOLT_GROUP_ID_EPON_NI_ADD_PROTECTED_STANDBY_LINK, BCMOLT_GROUP_ID_EPON_NI_ISSUE_RSSI_GRANT, BCMOLT_GROUP_ID_EPON_NI_PROTECTION_SWITCHING_APPLY_RERANGE_DELTA, BCMOLT_GROUP_ID_EPON_NI_ROGUE_LLID_SCAN, BCMOLT_GROUP_ID_EPON_NI_SET_EPON_NI_EN_STATE, BCMOLT_GROUP_ID_EPON_NI_START_ONU_UPGRADE };
+static bcmolt_group_id group_ids_epon_onu_10g_us_key[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_KEY };
+static bcmolt_group_id group_ids_epon_onu_10g_us_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_CFG };
+static bcmolt_group_id group_ids_epon_onu_10g_us_stat[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT };
+static bcmolt_group_id group_ids_epon_onu_10g_us_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_CODE_WORDS_TOTAL, BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_CODE_WORDS_DECODE_FAILS, BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_ZEROES_CORRECTED, BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_CFG_FEC_ONES_CORRECTED };
+static bcmolt_group_id group_ids_epon_onu_10g_us_auto[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_ONU_10G_US_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_onu_10g_us_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_10G_US_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_onu_1g_us_key[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_KEY };
+static bcmolt_group_id group_ids_epon_onu_1g_us_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_CFG };
+static bcmolt_group_id group_ids_epon_onu_1g_us_stat[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT };
+static bcmolt_group_id group_ids_epon_onu_1g_us_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_GOOD_FRAMES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_GOOD_BYTES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_OVERSZ_FRAMES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_NON_FEC_GOOD_FRAMES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_NON_FEC_GOOD_BYTES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_GOOD_FRAMES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_GOOD_BYTES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_FRAMES_EXC_ERRS, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_NO_ERRS, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_CORR_ERRS, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_BLKS_UNCORR_ERRS, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_BYTES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_ZEROES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_FEC_CORR_ONES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_UNDERSZ_FRAMES, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_CFG_ERRORSZ_FRAMES };
+static bcmolt_group_id group_ids_epon_onu_1g_us_auto[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_ONU_1G_US_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_onu_1g_us_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_ONU_1G_US_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_path_10g_ds_key[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_KEY };
+static bcmolt_group_id group_ids_epon_path_10g_ds_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_CFG };
+static bcmolt_group_id group_ids_epon_path_10g_ds_stat[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT };
+static bcmolt_group_id group_ids_epon_path_10g_ds_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_OAM_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_GATE_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_CFG_ABORT_FRAMES };
+static bcmolt_group_id group_ids_epon_path_10g_ds_auto[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_PATH_10G_DS_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_path_10g_ds_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_DS_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_path_10g_us_key[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_KEY };
+static bcmolt_group_id group_ids_epon_path_10g_us_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_CFG };
+static bcmolt_group_id group_ids_epon_path_10g_us_stat[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT };
+static bcmolt_group_id group_ids_epon_path_10g_us_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OAM_BYTES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_REPORT_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_ABORT_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_FCS_ERROR, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_CRC_8_ERROR, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OUT_OF_SLOT, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_OVERSIZE_ERROR, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_CFG_RUNT_ERROR };
+static bcmolt_group_id group_ids_epon_path_10g_us_auto[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_PATH_10G_US_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_path_10g_us_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_10G_US_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_path_1g_ds_key[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_KEY };
+static bcmolt_group_id group_ids_epon_path_1g_ds_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_CFG };
+static bcmolt_group_id group_ids_epon_path_1g_ds_stat[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT };
+static bcmolt_group_id group_ids_epon_path_1g_ds_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_OAM_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_GATE_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_CFG_ABORT_FRAMES };
+static bcmolt_group_id group_ids_epon_path_1g_ds_auto[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_PATH_1G_DS_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_path_1g_ds_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_DS_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_path_1g_us_key[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_KEY };
+static bcmolt_group_id group_ids_epon_path_1g_us_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_CFG };
+static bcmolt_group_id group_ids_epon_path_1g_us_stat[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT };
+static bcmolt_group_id group_ids_epon_path_1g_us_stat_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_64, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_65_127, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_128_255, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_256_511, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_512_1023, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_1024_1518, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_1519_2047, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_2048_4095, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_4096_9216, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FRAMES_9217_16383, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_BROADCAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_DATA_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_MULTICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_UNICAST_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_MPCP_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OAM_BYTES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OAM_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_REPORT_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_ABORT_FRAMES, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_FCS_ERROR, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_CRC_8_ERROR, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OUT_OF_SLOT, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_OVERSIZE_ERROR, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_CFG_RUNT_ERROR };
+static bcmolt_group_id group_ids_epon_path_1g_us_auto[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_EPON_PATH_1G_US_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_epon_path_1g_us_auto_cfg[] = { BCMOLT_GROUP_ID_EPON_PATH_1G_US_AUTO_CFG };
+static bcmolt_group_id group_ids_epon_rp_key[] = { BCMOLT_GROUP_ID_EPON_RP_KEY };
+static bcmolt_group_id group_ids_epon_rp_cfg[] = { BCMOLT_GROUP_ID_EPON_RP_CFG };
+static bcmolt_group_id group_ids_gpio_key[] = { BCMOLT_GROUP_ID_GPIO_KEY };
+static bcmolt_group_id group_ids_gpio_cfg[] = { BCMOLT_GROUP_ID_GPIO_CFG };
+static bcmolt_group_id group_ids_gpon_alloc_key[] = { BCMOLT_GROUP_ID_GPON_ALLOC_KEY };
+static bcmolt_group_id group_ids_gpon_alloc_cfg[] = { BCMOLT_GROUP_ID_GPON_ALLOC_CFG };
+static bcmolt_group_id group_ids_gpon_alloc_stat[] = { BCMOLT_GROUP_ID_GPON_ALLOC_STAT };
+static bcmolt_group_id group_ids_gpon_alloc_stat_cfg[] = { BCMOLT_GROUP_ID_GPON_ALLOC_STAT_CFG_RX_BYTES };
+static bcmolt_group_id group_ids_gpon_alloc_auto[] = { BCMOLT_GROUP_ID_GPON_ALLOC_CONFIGURATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ALLOC_GET_ALLOC_STATS_COMPLETED, BCMOLT_GROUP_ID_GPON_ALLOC_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_GPON_ALLOC_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_gpon_alloc_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_ALLOC_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_alloc_oper[] = { BCMOLT_GROUP_ID_GPON_ALLOC_GET_STATS, BCMOLT_GROUP_ID_GPON_ALLOC_SET_STATE };
+static bcmolt_group_id group_ids_gpon_gem_port_key[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_KEY };
+static bcmolt_group_id group_ids_gpon_gem_port_cfg[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_CFG };
+static bcmolt_group_id group_ids_gpon_gem_port_stat[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT };
+static bcmolt_group_id group_ids_gpon_gem_port_stat_cfg[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_RX_PACKETS, BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_RX_BYTES, BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_TX_PACKETS, BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_CFG_TX_BYTES };
+static bcmolt_group_id group_ids_gpon_gem_port_auto[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_CONFIGURATION_COMPLETED, BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_GPON_GEM_PORT_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_gpon_gem_port_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_gem_port_oper[] = { BCMOLT_GROUP_ID_GPON_GEM_PORT_SET_STATE };
+static bcmolt_group_id group_ids_gpon_iwf_key[] = { BCMOLT_GROUP_ID_GPON_IWF_KEY };
+static bcmolt_group_id group_ids_gpon_iwf_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_stat[] = { BCMOLT_GROUP_ID_GPON_IWF_STAT };
+static bcmolt_group_id group_ids_gpon_iwf_stat_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_HIT_EVENT, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_MISS_EVENT, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_DUE_TO_MISS_EVENT, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_DUE_TO_HIT_EVENT, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_DS_DROP_TO_DISABLED_GEM, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_NEW_MAC_DISCOVERED, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_MOVE_EVENT, BCMOLT_GROUP_ID_GPON_IWF_STAT_CFG_NEW_MAC_DROP_DUE_TO_FIFO_FULL };
+static bcmolt_group_id group_ids_gpon_iwf_auto[] = { BCMOLT_GROUP_ID_GPON_IWF_FLUSH_MAC_TABLE_COMPLETED, BCMOLT_GROUP_ID_GPON_IWF_SCAN_MAC_TABLE_COMPLETED, BCMOLT_GROUP_ID_GPON_IWF_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_GPON_IWF_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_gpon_iwf_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_oper[] = { BCMOLT_GROUP_ID_GPON_IWF_FLUSH_MAC_TABLE, BCMOLT_GROUP_ID_GPON_IWF_SCAN_MAC_TABLE };
+static bcmolt_group_id group_ids_gpon_iwf_ds_egress_flow_key[] = { BCMOLT_GROUP_ID_GPON_IWF_DS_EGRESS_FLOW_KEY };
+static bcmolt_group_id group_ids_gpon_iwf_ds_egress_flow_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_DS_EGRESS_FLOW_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_ds_ingress_flow_key[] = { BCMOLT_GROUP_ID_GPON_IWF_DS_INGRESS_FLOW_KEY };
+static bcmolt_group_id group_ids_gpon_iwf_ds_ingress_flow_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_DS_INGRESS_FLOW_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_mac_table_key[] = { BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_KEY };
+static bcmolt_group_id group_ids_gpon_iwf_mac_table_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_mac_table_auto[] = { BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_AGED, BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_DROPPED, BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_MAC_MOVE, BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_NEW_MAC };
+static bcmolt_group_id group_ids_gpon_iwf_mac_table_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_MAC_TABLE_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_iwf_us_flow_key[] = { BCMOLT_GROUP_ID_GPON_IWF_US_FLOW_KEY };
+static bcmolt_group_id group_ids_gpon_iwf_us_flow_cfg[] = { BCMOLT_GROUP_ID_GPON_IWF_US_FLOW_CFG };
+static bcmolt_group_id group_ids_gpon_ni_key[] = { BCMOLT_GROUP_ID_GPON_NI_KEY };
+static bcmolt_group_id group_ids_gpon_ni_cfg[] = { BCMOLT_GROUP_ID_GPON_NI_CFG };
+static bcmolt_group_id group_ids_gpon_ni_stat[] = { BCMOLT_GROUP_ID_GPON_NI_STAT };
+static bcmolt_group_id group_ids_gpon_ni_stat_cfg[] = { BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_FEC_CODEWORDS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_FEC_CODEWORDS_UNCORRECTED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_BIP8_BYTES, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_BIP8_ERRORS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_PACKETS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_DROPPED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_IDLE, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_CORRECTED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_GEM_ILLEGAL, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_VALID, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_INVALID, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_ALLOCATIONS_DISABLED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_NON_IDLE, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_ERROR, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PLOAMS_DROPPED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_CPU, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_OMCI, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_DROPPED_TOO_SHORT, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_DROPPED_TOO_LONG, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_CRC_ERRORS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_KEY_ERRORS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_FRAGMENTS_ERRORS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_RX_PACKETS_DROPPED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_GEM, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_PLOAMS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_GEM_FRAGMENTS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_CPU, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_OMCI, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_CPU_OMCI_PACKETS_DROPPED, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_ILLEGAL_LENGTH, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_TPID_MISS, BCMOLT_GROUP_ID_GPON_NI_STAT_CFG_TX_DROPPED_VID_MISS };
+static bcmolt_group_id group_ids_gpon_ni_auto[] = { BCMOLT_GROUP_ID_GPON_NI_ACTIVATE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_CPU_PACKETS_FAILURE, BCMOLT_GROUP_ID_GPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_DISABLE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_ENABLE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_LOS, BCMOLT_GROUP_ID_GPON_NI_ONU_DISCOVERED, BCMOLT_GROUP_ID_GPON_NI_ONU_UPGRADE_COMPLETE, BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_ONUS_RANGED, BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME, BCMOLT_GROUP_ID_GPON_NI_ROGUE_DETECTION_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START, BCMOLT_GROUP_ID_GPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START, BCMOLT_GROUP_ID_GPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_GPON_NI_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_GPON_NI_STATE_CHANGE_COMPLETED, BCMOLT_GROUP_ID_GPON_NI_TOD_REQUEST_COMPLETED };
+static bcmolt_group_id group_ids_gpon_ni_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_NI_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_ni_oper[] = { BCMOLT_GROUP_ID_GPON_NI_DISABLE_SERIAL_NUMBER, BCMOLT_GROUP_ID_GPON_NI_PROTECTION_SWITCHING_TYPE_C_SET_MULTIPLE_ONU_STATE, BCMOLT_GROUP_ID_GPON_NI_RESET, BCMOLT_GROUP_ID_GPON_NI_ROGUE_DETECTION_WINDOW, BCMOLT_GROUP_ID_GPON_NI_SET_ONU_STATE, BCMOLT_GROUP_ID_GPON_NI_SET_PON_STATE, BCMOLT_GROUP_ID_GPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING, BCMOLT_GROUP_ID_GPON_NI_START_ONU_UPGRADE, BCMOLT_GROUP_ID_GPON_NI_TOD_REQUEST };
+static bcmolt_group_id group_ids_gpon_ni_proxy[] = { BCMOLT_GROUP_ID_GPON_NI_BROADCAST_PLOAM_PACKET, BCMOLT_GROUP_ID_GPON_NI_CPU_PACKETS };
+static bcmolt_group_id group_ids_gpon_onu_key[] = { BCMOLT_GROUP_ID_GPON_ONU_KEY };
+static bcmolt_group_id group_ids_gpon_onu_cfg[] = { BCMOLT_GROUP_ID_GPON_ONU_CFG };
+static bcmolt_group_id group_ids_gpon_onu_stat[] = { BCMOLT_GROUP_ID_GPON_ONU_STAT };
+static bcmolt_group_id group_ids_gpon_onu_stat_cfg[] = { BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_BYTES_CORRECTED, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS_CORRECTED, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_FEC_CODEWORDS_UNCORRECTED, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BIP8_BYTES, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BIP8_ERRORS, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PLOAMS_CRC_ERROR, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PLOAMS_NON_IDLE, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_POSITIVE_DRIFT, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_NEGATIVE_DRIFT, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_OMCI, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_BER_REPORTED, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_UNRECEIVED_BURST, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_LCDG_ERRORS, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RDI_ERRORS, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_BYTES, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_RX_PACKETS, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_TX_BYTES, BCMOLT_GROUP_ID_GPON_ONU_STAT_CFG_TX_PACKETS };
+static bcmolt_group_id group_ids_gpon_onu_auto[] = { BCMOLT_GROUP_ID_GPON_ONU_BER_INTERVAL_CONFIGURATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_DFI, BCMOLT_GROUP_ID_GPON_ONU_DGI, BCMOLT_GROUP_ID_GPON_ONU_DOWI, BCMOLT_GROUP_ID_GPON_ONU_ERR, BCMOLT_GROUP_ID_GPON_ONU_INVALID_DBRU_REPORT, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_DECRYPT_REQUIRED, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_KEY_MISMATCH, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT, BCMOLT_GROUP_ID_GPON_ONU_KEY_EXCHANGE_UNCONSECUTIVE_INDEX, BCMOLT_GROUP_ID_GPON_ONU_LOAI, BCMOLT_GROUP_ID_GPON_ONU_LOKI, BCMOLT_GROUP_ID_GPON_ONU_MEMI, BCMOLT_GROUP_ID_GPON_ONU_OMCI_PORT_ID_CONFIGURATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_ONU_ACTIVATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_ONU_ACTIVATION_STANDBY_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_ONU_ALARM, BCMOLT_GROUP_ID_GPON_ONU_ONU_DEACTIVATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_ONU_DISABLE_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_ONU_ENABLE_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_OPTICAL_REFLECTION, BCMOLT_GROUP_ID_GPON_ONU_PASSWORD_AUTHENTICATION_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_PEE, BCMOLT_GROUP_ID_GPON_ONU_POSSIBLE_DRIFT, BCMOLT_GROUP_ID_GPON_ONU_POWER_MANAGEMENT_STATE_CHANGE, BCMOLT_GROUP_ID_GPON_ONU_PST, BCMOLT_GROUP_ID_GPON_ONU_RANGING_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_REI, BCMOLT_GROUP_ID_GPON_ONU_RSSI_MEASUREMENT_COMPLETED, BCMOLT_GROUP_ID_GPON_ONU_SDI, BCMOLT_GROUP_ID_GPON_ONU_SFI, BCMOLT_GROUP_ID_GPON_ONU_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_GPON_ONU_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_GPON_ONU_SUFI, BCMOLT_GROUP_ID_GPON_ONU_TIWI };
+static bcmolt_group_id group_ids_gpon_onu_auto_cfg[] = { BCMOLT_GROUP_ID_GPON_ONU_AUTO_CFG };
+static bcmolt_group_id group_ids_gpon_onu_oper[] = { BCMOLT_GROUP_ID_GPON_ONU_CHANGE_POWER_LEVEL, BCMOLT_GROUP_ID_GPON_ONU_RSSI_MEASUREMENT, BCMOLT_GROUP_ID_GPON_ONU_SET_ONU_STATE };
+static bcmolt_group_id group_ids_gpon_onu_proxy[] = { BCMOLT_GROUP_ID_GPON_ONU_CPU_PACKETS, BCMOLT_GROUP_ID_GPON_ONU_PLOAM_PACKET };
+static bcmolt_group_id group_ids_gpon_onu_proxy_rx[] = { BCMOLT_GROUP_ID_GPON_ONU_CPU_PACKET, BCMOLT_GROUP_ID_GPON_ONU_OMCI_PACKET };
+static bcmolt_group_id group_ids_gpon_trx_key[] = { BCMOLT_GROUP_ID_GPON_TRX_KEY };
+static bcmolt_group_id group_ids_gpon_trx_cfg[] = { BCMOLT_GROUP_ID_GPON_TRX_CFG };
+static bcmolt_group_id group_ids_log_entry_key[] = { BCMOLT_GROUP_ID_LOG_ENTRY_KEY };
+static bcmolt_group_id group_ids_log_entry_cfg[] = { BCMOLT_GROUP_ID_LOG_ENTRY_CFG };
+static bcmolt_group_id group_ids_log_entry_stat[] = { BCMOLT_GROUP_ID_LOG_ENTRY_STAT };
+static bcmolt_group_id group_ids_log_entry_stat_cfg[] = { BCMOLT_GROUP_ID_LOG_ENTRY_STAT_CFG_MSG_COUNT, BCMOLT_GROUP_ID_LOG_ENTRY_STAT_CFG_LOST_MSG_COUNT };
+static bcmolt_group_id group_ids_log_entry_auto[] = { BCMOLT_GROUP_ID_LOG_ENTRY_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_LOG_ENTRY_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_log_entry_auto_cfg[] = { BCMOLT_GROUP_ID_LOG_ENTRY_AUTO_CFG };
+static bcmolt_group_id group_ids_logger_key[] = { BCMOLT_GROUP_ID_LOGGER_KEY };
+static bcmolt_group_id group_ids_logger_cfg[] = { BCMOLT_GROUP_ID_LOGGER_CFG };
+static bcmolt_group_id group_ids_logger_stat[] = { BCMOLT_GROUP_ID_LOGGER_STAT };
+static bcmolt_group_id group_ids_logger_stat_cfg[] = { BCMOLT_GROUP_ID_LOGGER_STAT_CFG_LINES_IN_LOG };
+static bcmolt_group_id group_ids_logger_auto[] = { BCMOLT_GROUP_ID_LOGGER_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_LOGGER_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_logger_auto_cfg[] = { BCMOLT_GROUP_ID_LOGGER_AUTO_CFG };
+static bcmolt_group_id group_ids_logger_oper[] = { BCMOLT_GROUP_ID_LOGGER_CLEAR_LOG };
+static bcmolt_group_id group_ids_nni_key[] = { BCMOLT_GROUP_ID_NNI_KEY };
+static bcmolt_group_id group_ids_nni_cfg[] = { BCMOLT_GROUP_ID_NNI_CFG };
+static bcmolt_group_id group_ids_nni_stat[] = { BCMOLT_GROUP_ID_NNI_STAT };
+static bcmolt_group_id group_ids_nni_stat_cfg[] = { BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_64, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_65_127, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_128_255, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_256_511, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_512_1023, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_1024_1518, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_1519_2047, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_2048_4095, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_4096_9216, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES_9217_16383, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_BYTES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_GOOD_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNICAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_MULTICAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_BROADCAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FCS_ERRORS, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_CONTROL_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PAUSE_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PFC_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNSUPPORTED_OPCODE, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNSUPPORTED_DA, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_ALIGNMENT_ERRORS, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_LENGTH_OUT_OF_RANGE, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_CODE_ERRORS, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_OVERSIZED_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_JABBER_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_MTU_CHECK_ERRORS, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_PROMISCUOUS_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_VLAN_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_DOUBLE_VLAN_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_TRUNCATED_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_UNDERSIZE_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_FRAGMENTED_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_RX_RUNT_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_64, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_65_127, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_128_255, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_256_511, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_512_1023, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_1024_1518, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_1519_2047, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_2048_4095, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_4096_9216, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES_9217_16383, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_BYTES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_GOOD_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_UNICAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_MULTICAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_BROADCAST_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_PAUSE_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_PFC_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_JABBER_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FCS_ERRORS, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_CONTROL_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_OVERSIZE_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_FRAGMENTED_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_ERROR_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_VLAN_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_DOUBLE_VLAN_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_RUNT_FRAMES, BCMOLT_GROUP_ID_NNI_STAT_CFG_TX_UNDERRUN_FRAMES };
+static bcmolt_group_id group_ids_nni_auto[] = { BCMOLT_GROUP_ID_NNI_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_NNI_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_NNI_STATUS_CHANGED };
+static bcmolt_group_id group_ids_nni_auto_cfg[] = { BCMOLT_GROUP_ID_NNI_AUTO_CFG };
+static bcmolt_group_id group_ids_nni_serdes_key[] = { BCMOLT_GROUP_ID_NNI_SERDES_KEY };
+static bcmolt_group_id group_ids_nni_serdes_cfg[] = { BCMOLT_GROUP_ID_NNI_SERDES_CFG };
+static bcmolt_group_id group_ids_software_error_key[] = { BCMOLT_GROUP_ID_SOFTWARE_ERROR_KEY };
+static bcmolt_group_id group_ids_software_error_cfg[] = { BCMOLT_GROUP_ID_SOFTWARE_ERROR_CFG };
+static bcmolt_group_id group_ids_trx_calibration_key[] = { BCMOLT_GROUP_ID_TRX_CALIBRATION_KEY };
+static bcmolt_group_id group_ids_trx_calibration_auto[] = { BCMOLT_GROUP_ID_TRX_CALIBRATION_CAPTURE_WINDOW_AND_STATISTIC_COMPLETED };
+static bcmolt_group_id group_ids_trx_calibration_auto_cfg[] = { BCMOLT_GROUP_ID_TRX_CALIBRATION_AUTO_CFG };
+static bcmolt_group_id group_ids_trx_calibration_oper[] = { BCMOLT_GROUP_ID_TRX_CALIBRATION_START_CAPTURE_WINDOW, BCMOLT_GROUP_ID_TRX_CALIBRATION_STOP_CAPTURE_WINDOW };
+static bcmolt_group_id group_ids_xgpon_alloc_key[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_KEY };
+static bcmolt_group_id group_ids_xgpon_alloc_cfg[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_CFG };
+static bcmolt_group_id group_ids_xgpon_alloc_stat[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_STAT };
+static bcmolt_group_id group_ids_xgpon_alloc_stat_cfg[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_CFG_RX_BYTES };
+static bcmolt_group_id group_ids_xgpon_alloc_auto[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_CONFIGURATION_COMPLETED, BCMOLT_GROUP_ID_XGPON_ALLOC_GET_ALLOC_STATS_COMPLETED, BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_XGPON_ALLOC_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_xgpon_alloc_auto_cfg[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_AUTO_CFG };
+static bcmolt_group_id group_ids_xgpon_alloc_oper[] = { BCMOLT_GROUP_ID_XGPON_ALLOC_GET_STATS, BCMOLT_GROUP_ID_XGPON_ALLOC_SET_STATE };
+static bcmolt_group_id group_ids_xgpon_gem_port_key[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_KEY };
+static bcmolt_group_id group_ids_xgpon_gem_port_cfg[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_CFG };
+static bcmolt_group_id group_ids_xgpon_gem_port_stat[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT };
+static bcmolt_group_id group_ids_xgpon_gem_port_stat_cfg[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_TX_BYTES, BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_TX_PACKETS, BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_RX_PACKETS, BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_CFG_RX_BYTES };
+static bcmolt_group_id group_ids_xgpon_gem_port_auto[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_XGPON_GEM_PORT_STAT_ALARM_RAISED };
+static bcmolt_group_id group_ids_xgpon_gem_port_auto_cfg[] = { BCMOLT_GROUP_ID_XGPON_GEM_PORT_AUTO_CFG };
+static bcmolt_group_id group_ids_xgpon_iwf_key[] = { BCMOLT_GROUP_ID_XGPON_IWF_KEY };
+static bcmolt_group_id group_ids_xgpon_iwf_cfg[] = { BCMOLT_GROUP_ID_XGPON_IWF_CFG };
+static bcmolt_group_id group_ids_xgpon_ni_key[] = { BCMOLT_GROUP_ID_XGPON_NI_KEY };
+static bcmolt_group_id group_ids_xgpon_ni_cfg[] = { BCMOLT_GROUP_ID_XGPON_NI_CFG };
+static bcmolt_group_id group_ids_xgpon_ni_stat[] = { BCMOLT_GROUP_ID_XGPON_NI_STAT };
+static bcmolt_group_id group_ids_xgpon_ni_stat_cfg[] = { BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_FEC_CODEWORDS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_BIP32_BYTES, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_BIP32_ERRORS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_HEADERS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_CORRECTED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGTC_UNCORRECTED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_DROPPED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_IDLE, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_XGEM_CORRECTED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_CRC_ERROR, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_FRAGMENT_ERROR, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PACKETS_DROPPED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_DROPPED_TOO_SHORT, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_DROPPED_TOO_LONG, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_KEY_ERROR, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_PLOAMS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_DROPPED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_VALID, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_INVALID, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_ALLOCATIONS_DISABLED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_NON_IDLE, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_PLOAMS_ERROR, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_CPU, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_OMCI, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_PACKETS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_XGEM, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_CPU, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_OMCI, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_CPU_OMCI_PACKETS_DROPPED, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_ILLEGAL_LENGTH, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_TPID_MISS, BCMOLT_GROUP_ID_XGPON_NI_STAT_CFG_TX_DROPPED_VID_MISS };
+static bcmolt_group_id group_ids_xgpon_ni_auto[] = { BCMOLT_GROUP_ID_XGPON_NI_ACTIVATE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_CPU_PACKETS_FAILURE, BCMOLT_GROUP_ID_XGPON_NI_DEACTIVATE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_DISABLE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_ENABLE_ALL_ONUS_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_LOS, BCMOLT_GROUP_ID_XGPON_NI_ONU_DISCOVERED, BCMOLT_GROUP_ID_XGPON_NI_ONU_UPGRADE_COMPLETE, BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_ONUS_RANGED, BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_SWITCHOVER_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_PROTECTION_SWITCHING_TRAFFIC_RESUME, BCMOLT_GROUP_ID_XGPON_NI_ROGUE_DETECTION_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_ROGUE_ONU_SPECIAL_MAP_CYCLE_START, BCMOLT_GROUP_ID_XGPON_NI_SERIAL_NUMBER_ACQUISITION_CYCLE_START, BCMOLT_GROUP_ID_XGPON_NI_STANDBY_PON_MONITORING_CYCLE_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_XGPON_NI_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_XGPON_NI_STATE_CHANGE_COMPLETED, BCMOLT_GROUP_ID_XGPON_NI_TOD_REQUEST_COMPLETED };
+static bcmolt_group_id group_ids_xgpon_ni_auto_cfg[] = { BCMOLT_GROUP_ID_XGPON_NI_AUTO_CFG };
+static bcmolt_group_id group_ids_xgpon_ni_oper[] = { BCMOLT_GROUP_ID_XGPON_NI_ADJUST_TX_WAVELENGTH, BCMOLT_GROUP_ID_XGPON_NI_DISABLE_SERIAL_NUMBER, BCMOLT_GROUP_ID_XGPON_NI_RESET, BCMOLT_GROUP_ID_XGPON_NI_ROGUE_DETECTION_WINDOW, BCMOLT_GROUP_ID_XGPON_NI_RUN_SPECIAL_BW_MAP, BCMOLT_GROUP_ID_XGPON_NI_SET_ONU_STATE, BCMOLT_GROUP_ID_XGPON_NI_SET_PON_STATE, BCMOLT_GROUP_ID_XGPON_NI_SINGLE_REQUEST_STANDBY_PON_MONITORING, BCMOLT_GROUP_ID_XGPON_NI_START_ONU_UPGRADE, BCMOLT_GROUP_ID_XGPON_NI_TOD_REQUEST };
+static bcmolt_group_id group_ids_xgpon_ni_proxy[] = { BCMOLT_GROUP_ID_XGPON_NI_BROADCAST_PLOAM_PACKET, BCMOLT_GROUP_ID_XGPON_NI_CPU_PACKETS };
+static bcmolt_group_id group_ids_xgpon_onu_key[] = { BCMOLT_GROUP_ID_XGPON_ONU_KEY };
+static bcmolt_group_id group_ids_xgpon_onu_cfg[] = { BCMOLT_GROUP_ID_XGPON_ONU_CFG };
+static bcmolt_group_id group_ids_xgpon_onu_stat[] = { BCMOLT_GROUP_ID_XGPON_ONU_STAT };
+static bcmolt_group_id group_ids_xgpon_onu_stat_cfg[] = { BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_POSITIVE_DRIFT, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_NEGATIVE_DRIFT, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_DELIMITER_MISS_DETECTION, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_BIP32_ERRORS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_WORDS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_SYMBOLS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_CODEWORDS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_UNCORRECTABLE_CODEWORDS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CODEWORDS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_FEC_CORRECTED_BITS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_XGEM_KEY_ERRORS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_XGEM_LOSS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PLOAMS_MIC_ERROR, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PLOAMS_NON_IDLE, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_OMCI, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_OMCI_PACKETS_CRC_ERROR, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_BYTES, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_RX_PACKETS, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_TX_BYTES, BCMOLT_GROUP_ID_XGPON_ONU_STAT_CFG_TX_PACKETS };
+static bcmolt_group_id group_ids_xgpon_onu_auto[] = { BCMOLT_GROUP_ID_XGPON_ONU_DFI, BCMOLT_GROUP_ID_XGPON_ONU_DGI, BCMOLT_GROUP_ID_XGPON_ONU_DOWI, BCMOLT_GROUP_ID_XGPON_ONU_INVALID_DBRU_REPORT, BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_CYCLE_SKIPPED, BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_KEY_MISMATCH, BCMOLT_GROUP_ID_XGPON_ONU_KEY_EXCHANGE_KEY_REQUEST_TIMEOUT, BCMOLT_GROUP_ID_XGPON_ONU_LOOCI, BCMOLT_GROUP_ID_XGPON_ONU_ONU_ACTIVATION_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_ONU_ALARM, BCMOLT_GROUP_ID_XGPON_ONU_ONU_DEACTIVATION_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_ONU_DISABLE_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_ONU_ENABLE_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_IN_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_OUT_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_OPTICAL_REFLECTION, BCMOLT_GROUP_ID_XGPON_ONU_POSSIBLE_DRIFT, BCMOLT_GROUP_ID_XGPON_ONU_POWER_CONSUMPTION_REPORT, BCMOLT_GROUP_ID_XGPON_ONU_POWER_LEVEL_REPORT, BCMOLT_GROUP_ID_XGPON_ONU_POWER_MANAGEMENT_STATE_CHANGE, BCMOLT_GROUP_ID_XGPON_ONU_PQSI, BCMOLT_GROUP_ID_XGPON_ONU_RANGING_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_REGISTRATION_ID, BCMOLT_GROUP_ID_XGPON_ONU_RSSI_MEASUREMENT_COMPLETED, BCMOLT_GROUP_ID_XGPON_ONU_SDI, BCMOLT_GROUP_ID_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION_FAILURE, BCMOLT_GROUP_ID_XGPON_ONU_SFI, BCMOLT_GROUP_ID_XGPON_ONU_STAT_ALARM_CLEARED, BCMOLT_GROUP_ID_XGPON_ONU_STAT_ALARM_RAISED, BCMOLT_GROUP_ID_XGPON_ONU_SUFI, BCMOLT_GROUP_ID_XGPON_ONU_TIWI, BCMOLT_GROUP_ID_XGPON_ONU_TUNING_RESPONSE };
+static bcmolt_group_id group_ids_xgpon_onu_auto_cfg[] = { BCMOLT_GROUP_ID_XGPON_ONU_AUTO_CFG };
+static bcmolt_group_id group_ids_xgpon_onu_oper[] = { BCMOLT_GROUP_ID_XGPON_ONU_ADJUST_TX_WAVELENGTH, BCMOLT_GROUP_ID_XGPON_ONU_CHANGE_POWER_LEVELLING, BCMOLT_GROUP_ID_XGPON_ONU_GET_POWER_CONSUMPTION, BCMOLT_GROUP_ID_XGPON_ONU_GET_POWER_LEVEL, BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_IN, BCMOLT_GROUP_ID_XGPON_ONU_ONU_TUNING_OUT, BCMOLT_GROUP_ID_XGPON_ONU_REQUEST_REGISTRATION, BCMOLT_GROUP_ID_XGPON_ONU_RSSI_MEASUREMENT, BCMOLT_GROUP_ID_XGPON_ONU_SECURE_MUTUAL_AUTHENTICATION, BCMOLT_GROUP_ID_XGPON_ONU_SET_ONU_STATE };
+static bcmolt_group_id group_ids_xgpon_onu_proxy[] = { BCMOLT_GROUP_ID_XGPON_ONU_CPU_PACKETS, BCMOLT_GROUP_ID_XGPON_ONU_PLOAM_PACKET };
+static bcmolt_group_id group_ids_xgpon_onu_proxy_rx[] = { BCMOLT_GROUP_ID_XGPON_ONU_CPU_PACKET, BCMOLT_GROUP_ID_XGPON_ONU_OMCI_PACKET };
+static bcmolt_group_id group_ids_xgpon_trx_key[] = { BCMOLT_GROUP_ID_XGPON_TRX_KEY };
+static bcmolt_group_id group_ids_xgpon_trx_cfg[] = { BCMOLT_GROUP_ID_XGPON_TRX_CFG };
+static bcmolt_group_id group_ids_xpon_serdes_key[] = { BCMOLT_GROUP_ID_XPON_SERDES_KEY };
+static bcmolt_group_id group_ids_xpon_serdes_cfg[] = { BCMOLT_GROUP_ID_XPON_SERDES_CFG };
+static bcmolt_group_ids group_ids_obj_ae_ni[] = { { 1, group_ids_ae_ni_key }, { 1, group_ids_ae_ni_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 1, group_ids_ae_ni_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_ae_path_ds[] = { { 1, group_ids_ae_path_ds_key }, { 0, NULL }, { 1, group_ids_ae_path_ds_stat }, { 17, group_ids_ae_path_ds_stat_cfg }, { 2, group_ids_ae_path_ds_auto }, { 1, group_ids_ae_path_ds_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_ae_path_us[] = { { 1, group_ids_ae_path_us_key }, { 0, NULL }, { 1, group_ids_ae_path_us_stat }, { 20, group_ids_ae_path_us_stat_cfg }, { 2, group_ids_ae_path_us_auto }, { 1, group_ids_ae_path_us_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_channel[] = { { 1, group_ids_channel_key }, { 1, group_ids_channel_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_debug[] = { { 1, group_ids_debug_key }, { 1, group_ids_debug_cfg }, { 0, NULL }, { 0, NULL }, { 2, group_ids_debug_auto }, { 1, group_ids_debug_auto_cfg }, { 4, group_ids_debug_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_device[] = { { 1, group_ids_device_key }, { 1, group_ids_device_cfg }, { 0, NULL }, { 0, NULL }, { 11, group_ids_device_auto }, { 1, group_ids_device_auto_cfg }, { 8, group_ids_device_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_denied_link[] = { { 1, group_ids_epon_denied_link_key }, { 1, group_ids_epon_denied_link_cfg }, { 0, NULL }, { 0, NULL }, { 10, group_ids_epon_denied_link_auto }, { 1, group_ids_epon_denied_link_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_link[] = { { 1, group_ids_epon_link_key }, { 1, group_ids_epon_link_cfg }, { 1, group_ids_epon_link_stat }, { 43, group_ids_epon_link_stat_cfg }, { 21, group_ids_epon_link_auto }, { 1, group_ids_epon_link_auto_cfg }, { 7, group_ids_epon_link_oper }, { 1, group_ids_epon_link_proxy }, { 1, group_ids_epon_link_proxy_rx } };
+static bcmolt_group_ids group_ids_obj_epon_ni[] = { { 1, group_ids_epon_ni_key }, { 1, group_ids_epon_ni_cfg }, { 0, NULL }, { 0, NULL }, { 10, group_ids_epon_ni_auto }, { 1, group_ids_epon_ni_auto_cfg }, { 8, group_ids_epon_ni_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_onu_10g_us[] = { { 1, group_ids_epon_onu_10g_us_key }, { 1, group_ids_epon_onu_10g_us_cfg }, { 1, group_ids_epon_onu_10g_us_stat }, { 4, group_ids_epon_onu_10g_us_stat_cfg }, { 2, group_ids_epon_onu_10g_us_auto }, { 1, group_ids_epon_onu_10g_us_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_onu_1g_us[] = { { 1, group_ids_epon_onu_1g_us_key }, { 1, group_ids_epon_onu_1g_us_cfg }, { 1, group_ids_epon_onu_1g_us_stat }, { 16, group_ids_epon_onu_1g_us_stat_cfg }, { 2, group_ids_epon_onu_1g_us_auto }, { 1, group_ids_epon_onu_1g_us_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_path_10g_ds[] = { { 1, group_ids_epon_path_10g_ds_key }, { 1, group_ids_epon_path_10g_ds_cfg }, { 1, group_ids_epon_path_10g_ds_stat }, { 21, group_ids_epon_path_10g_ds_stat_cfg }, { 2, group_ids_epon_path_10g_ds_auto }, { 1, group_ids_epon_path_10g_ds_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_path_10g_us[] = { { 1, group_ids_epon_path_10g_us_key }, { 1, group_ids_epon_path_10g_us_cfg }, { 1, group_ids_epon_path_10g_us_stat }, { 26, group_ids_epon_path_10g_us_stat_cfg }, { 2, group_ids_epon_path_10g_us_auto }, { 1, group_ids_epon_path_10g_us_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_path_1g_ds[] = { { 1, group_ids_epon_path_1g_ds_key }, { 1, group_ids_epon_path_1g_ds_cfg }, { 1, group_ids_epon_path_1g_ds_stat }, { 21, group_ids_epon_path_1g_ds_stat_cfg }, { 2, group_ids_epon_path_1g_ds_auto }, { 1, group_ids_epon_path_1g_ds_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_path_1g_us[] = { { 1, group_ids_epon_path_1g_us_key }, { 1, group_ids_epon_path_1g_us_cfg }, { 1, group_ids_epon_path_1g_us_stat }, { 26, group_ids_epon_path_1g_us_stat_cfg }, { 2, group_ids_epon_path_1g_us_auto }, { 1, group_ids_epon_path_1g_us_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_epon_rp[] = { { 1, group_ids_epon_rp_key }, { 1, group_ids_epon_rp_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpio[] = { { 1, group_ids_gpio_key }, { 1, group_ids_gpio_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_alloc[] = { { 1, group_ids_gpon_alloc_key }, { 1, group_ids_gpon_alloc_cfg }, { 1, group_ids_gpon_alloc_stat }, { 1, group_ids_gpon_alloc_stat_cfg }, { 4, group_ids_gpon_alloc_auto }, { 1, group_ids_gpon_alloc_auto_cfg }, { 2, group_ids_gpon_alloc_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_gem_port[] = { { 1, group_ids_gpon_gem_port_key }, { 1, group_ids_gpon_gem_port_cfg }, { 1, group_ids_gpon_gem_port_stat }, { 4, group_ids_gpon_gem_port_stat_cfg }, { 3, group_ids_gpon_gem_port_auto }, { 1, group_ids_gpon_gem_port_auto_cfg }, { 1, group_ids_gpon_gem_port_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_iwf[] = { { 1, group_ids_gpon_iwf_key }, { 1, group_ids_gpon_iwf_cfg }, { 1, group_ids_gpon_iwf_stat }, { 8, group_ids_gpon_iwf_stat_cfg }, { 4, group_ids_gpon_iwf_auto }, { 1, group_ids_gpon_iwf_auto_cfg }, { 2, group_ids_gpon_iwf_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_iwf_ds_egress_flow[] = { { 1, group_ids_gpon_iwf_ds_egress_flow_key }, { 1, group_ids_gpon_iwf_ds_egress_flow_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_iwf_ds_ingress_flow[] = { { 1, group_ids_gpon_iwf_ds_ingress_flow_key }, { 1, group_ids_gpon_iwf_ds_ingress_flow_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_iwf_mac_table[] = { { 1, group_ids_gpon_iwf_mac_table_key }, { 1, group_ids_gpon_iwf_mac_table_cfg }, { 0, NULL }, { 0, NULL }, { 4, group_ids_gpon_iwf_mac_table_auto }, { 1, group_ids_gpon_iwf_mac_table_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_iwf_us_flow[] = { { 1, group_ids_gpon_iwf_us_flow_key }, { 1, group_ids_gpon_iwf_us_flow_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_ni[] = { { 1, group_ids_gpon_ni_key }, { 1, group_ids_gpon_ni_cfg }, { 1, group_ids_gpon_ni_stat }, { 34, group_ids_gpon_ni_stat_cfg }, { 19, group_ids_gpon_ni_auto }, { 1, group_ids_gpon_ni_auto_cfg }, { 9, group_ids_gpon_ni_oper }, { 2, group_ids_gpon_ni_proxy }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_gpon_onu[] = { { 1, group_ids_gpon_onu_key }, { 1, group_ids_gpon_onu_cfg }, { 1, group_ids_gpon_onu_stat }, { 20, group_ids_gpon_onu_stat_cfg }, { 37, group_ids_gpon_onu_auto }, { 1, group_ids_gpon_onu_auto_cfg }, { 3, group_ids_gpon_onu_oper }, { 2, group_ids_gpon_onu_proxy }, { 2, group_ids_gpon_onu_proxy_rx } };
+static bcmolt_group_ids group_ids_obj_gpon_trx[] = { { 1, group_ids_gpon_trx_key }, { 1, group_ids_gpon_trx_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_log_entry[] = { { 1, group_ids_log_entry_key }, { 1, group_ids_log_entry_cfg }, { 1, group_ids_log_entry_stat }, { 2, group_ids_log_entry_stat_cfg }, { 2, group_ids_log_entry_auto }, { 1, group_ids_log_entry_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_logger[] = { { 1, group_ids_logger_key }, { 1, group_ids_logger_cfg }, { 1, group_ids_logger_stat }, { 1, group_ids_logger_stat_cfg }, { 2, group_ids_logger_auto }, { 1, group_ids_logger_auto_cfg }, { 1, group_ids_logger_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_nni[] = { { 1, group_ids_nni_key }, { 1, group_ids_nni_cfg }, { 1, group_ids_nni_stat }, { 63, group_ids_nni_stat_cfg }, { 3, group_ids_nni_auto }, { 1, group_ids_nni_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_nni_serdes[] = { { 1, group_ids_nni_serdes_key }, { 1, group_ids_nni_serdes_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_software_error[] = { { 1, group_ids_software_error_key }, { 1, group_ids_software_error_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_trx_calibration[] = { { 1, group_ids_trx_calibration_key }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 1, group_ids_trx_calibration_auto }, { 1, group_ids_trx_calibration_auto_cfg }, { 2, group_ids_trx_calibration_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xgpon_alloc[] = { { 1, group_ids_xgpon_alloc_key }, { 1, group_ids_xgpon_alloc_cfg }, { 1, group_ids_xgpon_alloc_stat }, { 1, group_ids_xgpon_alloc_stat_cfg }, { 4, group_ids_xgpon_alloc_auto }, { 1, group_ids_xgpon_alloc_auto_cfg }, { 2, group_ids_xgpon_alloc_oper }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xgpon_gem_port[] = { { 1, group_ids_xgpon_gem_port_key }, { 1, group_ids_xgpon_gem_port_cfg }, { 1, group_ids_xgpon_gem_port_stat }, { 4, group_ids_xgpon_gem_port_stat_cfg }, { 2, group_ids_xgpon_gem_port_auto }, { 1, group_ids_xgpon_gem_port_auto_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xgpon_iwf[] = { { 1, group_ids_xgpon_iwf_key }, { 1, group_ids_xgpon_iwf_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xgpon_ni[] = { { 1, group_ids_xgpon_ni_key }, { 1, group_ids_xgpon_ni_cfg }, { 1, group_ids_xgpon_ni_stat }, { 35, group_ids_xgpon_ni_stat_cfg }, { 19, group_ids_xgpon_ni_auto }, { 1, group_ids_xgpon_ni_auto_cfg }, { 10, group_ids_xgpon_ni_oper }, { 2, group_ids_xgpon_ni_proxy }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xgpon_onu[] = { { 1, group_ids_xgpon_onu_key }, { 1, group_ids_xgpon_onu_cfg }, { 1, group_ids_xgpon_onu_stat }, { 20, group_ids_xgpon_onu_stat_cfg }, { 33, group_ids_xgpon_onu_auto }, { 1, group_ids_xgpon_onu_auto_cfg }, { 10, group_ids_xgpon_onu_oper }, { 2, group_ids_xgpon_onu_proxy }, { 2, group_ids_xgpon_onu_proxy_rx } };
+static bcmolt_group_ids group_ids_obj_xgpon_trx[] = { { 1, group_ids_xgpon_trx_key }, { 1, group_ids_xgpon_trx_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids group_ids_obj_xpon_serdes[] = { { 1, group_ids_xpon_serdes_key }, { 1, group_ids_xpon_serdes_cfg }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL } };
+static bcmolt_group_ids *group_ids[] = { group_ids_obj_ae_ni, group_ids_obj_ae_path_ds, group_ids_obj_ae_path_us, group_ids_obj_channel, group_ids_obj_debug, group_ids_obj_device, group_ids_obj_epon_denied_link, group_ids_obj_epon_link, group_ids_obj_epon_ni, group_ids_obj_epon_onu_10g_us, group_ids_obj_epon_onu_1g_us, group_ids_obj_epon_path_10g_ds, group_ids_obj_epon_path_10g_us, group_ids_obj_epon_path_1g_ds, group_ids_obj_epon_path_1g_us, group_ids_obj_epon_rp, group_ids_obj_gpio, group_ids_obj_gpon_alloc, group_ids_obj_gpon_gem_port, group_ids_obj_gpon_iwf, group_ids_obj_gpon_iwf_ds_egress_flow, group_ids_obj_gpon_iwf_ds_ingress_flow, group_ids_obj_gpon_iwf_mac_table, group_ids_obj_gpon_iwf_us_flow, group_ids_obj_gpon_ni, group_ids_obj_gpon_onu, group_ids_obj_gpon_trx, group_ids_obj_log_entry, group_ids_obj_logger, group_ids_obj_nni, group_ids_obj_nni_serdes, group_ids_obj_software_error, group_ids_obj_trx_calibration, group_ids_obj_xgpon_alloc, group_ids_obj_xgpon_gem_port, group_ids_obj_xgpon_iwf, group_ids_obj_xgpon_ni, group_ids_obj_xgpon_onu, group_ids_obj_xgpon_trx, group_ids_obj_xpon_serdes };
+static bcmolt_presence_mask readonly_prop_mask[] = { (1ULL << BCMOLT_AE_NI_CFG_ID_AE_NI_EN) | (1ULL << BCMOLT_AE_NI_CFG_ID_PRBS_STATUS), 0, 0, 0, (((1ULL << BCMOLT_DEBUG_CFG_ID_INDICATIONS_DROPPED) | (1ULL << BCMOLT_DEBUG_CFG_ID_FILE_USED_PERCENT)) | (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_STATS)) | (1ULL << BCMOLT_DEBUG_CFG_ID_API_CAPTURE_BUFFER), ((((((1ULL << BCMOLT_DEVICE_CFG_ID_FIRMWARE_SW_VERSION) | (1ULL << BCMOLT_DEVICE_CFG_ID_HOST_SW_VERSION)) | (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_REVISION)) | (1ULL << BCMOLT_DEVICE_CFG_ID_STATE)) | (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_TEMPERATURE)) | (1ULL << BCMOLT_DEVICE_CFG_ID_EMBEDDED_IMAGE_LIST)) | (1ULL << BCMOLT_DEVICE_CFG_ID_CHIP_VOLTAGE), 1ULL << BCMOLT_EPON_DENIED_LINK_CFG_ID_ALARM_STATE, ((((((((((1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_RATE) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_STATE_FLAGS)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_LLID)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_ON_TIME_TQ)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_LASER_OFF_TIME_TQ)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_RANGE_VALUE_TQ)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_DISTANCE)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_ALARM_STATE)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_UBD_INFO)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_PENDING_GRANTS)) | (1ULL << BCMOLT_EPON_LINK_CFG_ID_LINK_TYPE), (((((1ULL << BCMOLT_EPON_NI_CFG_ID_EPON_NI_EN) | (1ULL << BCMOLT_EPON_NI_CFG_ID_ALARM_STATE)) | (1ULL << BCMOLT_EPON_NI_CFG_ID_ALL_LINKS)) | (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_SOLICITED_USAGE)) | (1ULL << BCMOLT_EPON_NI_CFG_ID_APPROXIMATE_TDM_USAGE)) | (1ULL << BCMOLT_EPON_NI_CFG_ID_ESTIMATED_PON_LATENCY_TQ), 1ULL << BCMOLT_EPON_ONU_10G_US_CFG_ID_ALL_LINKS, 1ULL << BCMOLT_EPON_ONU_1G_US_CFG_ID_ALL_LINKS, 0, 1ULL << BCMOLT_EPON_PATH_10G_US_CFG_ID_PRBS_STATUS, 0, 1ULL << BCMOLT_EPON_PATH_1G_US_CFG_ID_PRBS_STATUS, 0, 0, 1ULL << BCMOLT_GPON_ALLOC_CFG_ID_STATE, 1ULL << BCMOLT_GPON_GEM_PORT_CFG_ID_GEM_PORT_STATE, 1ULL << BCMOLT_GPON_IWF_CFG_ID_MAC_TABLE_COUNT, 0, 0, (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_GEM_PORT_ID) | (1ULL << BCMOLT_GPON_IWF_MAC_TABLE_CFG_ID_ONU_ID), 0, (((((((1ULL << BCMOLT_GPON_NI_CFG_ID_PON_STATUS) | (1ULL << BCMOLT_GPON_NI_CFG_ID_AVAILABLE_BANDWIDTH)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_NUMBER_OF_ACTIVE_STANDBY_ONUS)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_PRBS_STATUS)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_ONUS)) | (1ULL << BCMOLT_GPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS), ((((1ULL << BCMOLT_GPON_ONU_CFG_ID_ONU_STATE) | (1ULL << BCMOLT_GPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) | (1ULL << BCMOLT_GPON_ONU_CFG_ID_DEACTIVATION_REASON)) | (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_GEM_PORTS)) | (1ULL << BCMOLT_GPON_ONU_CFG_ID_ALL_ALLOCS), (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_RANGING) | (1ULL << BCMOLT_GPON_TRX_CFG_ID_PLO_DATA), ((1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_LEVEL) | (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_DEFAULT_LOG_TYPE)) | (1ULL << BCMOLT_LOG_ENTRY_CFG_ID_LOG_NAME), (1ULL << BCMOLT_LOGGER_CFG_ID_BUFFER) | (1ULL << BCMOLT_LOGGER_CFG_ID_LOG_NAMES), (1ULL << BCMOLT_NNI_CFG_ID_NNI_STATUS) | (1ULL << BCMOLT_NNI_CFG_ID_NNI_BACKUP_STATUS), 0, 1ULL << BCMOLT_SOFTWARE_ERROR_CFG_ID_ENTRY, 0, 1ULL << BCMOLT_XGPON_ALLOC_CFG_ID_STATE, 1ULL << BCMOLT_XGPON_GEM_PORT_CFG_ID_GEM_PORT_STATE, 0, ((((((1ULL << BCMOLT_XGPON_NI_CFG_ID_AVAILABLE_BANDWIDTH) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_NUMBER_OF_ACTIVE_ONUS)) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_PON_STATUS)) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_RANGING_WINDOW_SIZE)) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_PRBS_STATUS)) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_ONUS)) | (1ULL << BCMOLT_XGPON_NI_CFG_ID_ALL_MCAST_GEM_PORTS), (((((1ULL << BCMOLT_XGPON_ONU_CFG_ID_ONU_OLD_STATE) | (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DISABLED_AFTER_DISCOVERY)) | (1ULL << BCMOLT_XGPON_ONU_CFG_ID_DEACTIVATION_REASON)) | (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_GEM_PORTS)) | (1ULL << BCMOLT_XGPON_ONU_CFG_ID_ALL_ALLOCS)) | (1ULL << BCMOLT_XGPON_ONU_CFG_ID_REQUEST_REGISTRATION_STATUS), 0, 0 };
+static bcmolt_instance_info instance_info[] = { { offsetof(bcmolt_ae_ni_key, ae_ni), sizeof(bcmolt_ae_ni) }, { offsetof(bcmolt_ae_path_ds_key, ae_ni), sizeof(bcmolt_ae_ni) }, { offsetof(bcmolt_ae_path_us_key, ae_ni), sizeof(bcmolt_ae_ni) }, { offsetof(bcmolt_channel_key, pon_ni), sizeof(bcmolt_pon_ni) }, { offsetof(bcmolt_debug_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_device_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_epon_denied_link_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_link_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_ni_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_onu_10g_us_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_onu_1g_us_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_path_10g_ds_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_path_10g_us_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_path_1g_ds_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_path_1g_us_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_epon_rp_key, epon_ni), sizeof(bcmolt_epon_ni) }, { offsetof(bcmolt_gpio_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_gpon_alloc_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_gem_port_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_iwf_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_iwf_ds_egress_flow_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_iwf_ds_ingress_flow_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_iwf_mac_table_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_iwf_us_flow_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_ni_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_onu_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_gpon_trx_key, pon_ni), sizeof(bcmolt_gpon_ni) }, { offsetof(bcmolt_log_entry_key, reserved), sizeof(uint8_t) }, { offsetof(bcmolt_logger_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_nni_key, pon_ni), sizeof(bcmolt_pon_ni) }, { offsetof(bcmolt_nni_serdes_key, pon_ni), sizeof(bcmolt_pon_ni) }, { offsetof(bcmolt_software_error_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_trx_calibration_key, reserved), sizeof(uint32_t) }, { offsetof(bcmolt_xgpon_alloc_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xgpon_gem_port_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xgpon_iwf_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xgpon_ni_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xgpon_onu_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xgpon_trx_key, pon_ni), sizeof(bcmolt_xgpon_ni) }, { offsetof(bcmolt_xpon_serdes_key, pon_ni), sizeof(bcmolt_pon_ni) } };
+
+/******************************************************************************/
+static bcmos_bool bcmolt_get_group_info(const bcmolt_msg *msg, bcmolt_group_info **group, bcmolt_group_info **key)
+{
+    bcmolt_group_id group_id;
+    bcmolt_group_id key_id;
+    bcmos_errno err;
+
+    err = bcmolt_group_id_combine(msg->obj_type, msg->group, msg->subgroup, &group_id);
+    if (err != BCM_ERR_OK)
+    {
+        return BCMOS_FALSE;
+    }
+
+    err = bcmolt_group_id_combine(msg->obj_type, BCMOLT_MGT_GROUP_KEY, 0, &key_id);
+    if (err != BCM_ERR_OK)
+    {
+        return BCMOS_FALSE;
+    }
+
+    *group = group_info[group_id];
+    *key = group_info[key_id];
+    return BCMOS_TRUE;
+}
+
+/******************************************************************************/
+int32_t bcmolt_msg_get_packed_length(bcmolt_msg *msg)
+{
+    uint8_t *key_ptr;
+    bcmolt_group_info *group;
+    bcmolt_group_info *key;
+
+    int32_t ret = bcmolt_msg_hdr_get_packed_length(msg);
+    if (ret < 0)
+    {
+        return ret;
+    }
+
+    if (!bcmolt_get_group_info(msg, &group, &key))
+    {
+        return (int32_t) BCM_ERR_MSG_ERROR;
+    }
+
+    key_ptr = (uint8_t *) (msg + 1);
+    ret += key->get_packed_length(key_ptr, BCMOLT_PRESENCE_MASK_ALL);
+
+    if (bcmolt_msg_should_pack_data(msg) && (group->get_packed_length != NULL))
+    {
+        uint8_t *data_ptr = (uint8_t *) ((long)msg + group->data_offset);
+        ret += group->get_packed_length(data_ptr, msg->presence_mask);
+    }
+
+    if (msg->type & BCMOLT_MSG_TYPE_MULTI)
+    {
+        if (msg->msg_set == NULL)
+        {
+            return (int32_t) BCM_ERR_NULL;
+        }
+
+        if (msg->dir == BCMOLT_MSG_DIR_REQUEST)
+        {
+            ret += 19;  /* group: 1, max_instances: 2, presence_mask: 8, filter_flags: 8 */
+        }
+        else
+        {
+            int i;
+            int32_t sub_msg_ret;
+
+            ret += 3;   /* group: num_instances: 2, more: 1 */
+            ret += key->get_packed_length(key_ptr, BCMOLT_PRESENCE_MASK_ALL);   /* next key */
+            for (i = 0; i < msg->msg_set->num_instances; i++)
+            {
+                if (msg->msg_set->msg[i] == NULL)
+                {
+                    return (int32_t) BCM_ERR_INTERNAL;
+                }
+
+                sub_msg_ret = bcmolt_msg_get_packed_length(msg->msg_set->msg[i]);
+                if (sub_msg_ret < 0)
+                {
+                    return sub_msg_ret;
+                }
+
+                ret += sub_msg_ret;
+            }
+        }
+    }
+
+    return ret;
+}
+
+/* Create message set */
+bcmos_errno bcmolt_msg_set_alloc(bcmolt_obj_id obj, bcmolt_mgt_group group, uint32_t max_instances, bcmolt_msg_set **msg_set)
+{
+    bcmolt_msg hdr = { };
+    uint32_t size;
+    bcmolt_group_info *grp;
+    bcmolt_group_info *key;
+
+    if (msg_set == NULL)
+    {
+        BCMOS_TRACE_RETURN(BCM_ERR_PARM, "msg_set parameter must be set\n");
+    }
+
+    if (group != BCMOLT_MGT_GROUP_CFG && group != BCMOLT_MGT_GROUP_STAT)
+    {
+        BCMOS_TRACE_RETURN(BCM_ERR_NOT_SUPPORTED, "group must be BCMOLT_MGT_GROUP_CFG or BCMOLT_MGT_GROUP_STAT\n");
+    }
+
+    /* Calculate message set size */
+    hdr.obj_type = obj;
+    hdr.group = group;
+    hdr.dir = BCMOLT_MSG_DIR_REQUEST;
+    if (!bcmolt_get_group_info(&hdr, &grp, &key))
+    {
+        BCMOS_TRACE_RETURN(BCM_ERR_NOT_SUPPORTED, "Not supported for the object\n");
+    }
+
+    size = sizeof(bcmolt_msg_set) + key->size + max_instances * sizeof(bcmolt_msg *);
+    *msg_set = bcmos_calloc(size);
+    if (*msg_set == NULL)
+    {
+        BCMOS_TRACE_RETURN(BCM_ERR_NOMEM, "Can't allocate message set\n");
+    }
+    (*msg_set)->group = group;
+    (*msg_set)->max_instances = max_instances;
+    (*msg_set)->next_key = (void *)(&((*msg_set)->msg[max_instances]));
+
+    return BCM_ERR_OK;
+}
+
+/* Release message set
+ * \param[in]   msg_set
+ */
+void bcmolt_msg_set_free(bcmolt_msg_set *msg_set)
+{
+    uint32_t i;
+
+    for (i = 0; i < msg_set->max_instances && msg_set->msg[i] != NULL; i++)
+    {
+        bcmolt_msg_free(msg_set->msg[i]);
+    }
+
+    bcmos_free(msg_set);
+}
+
+/* Pack message set, excluding the filter-header which is already packed */
+static bcmos_errno bcmolt_msg_set_pack(const bcmolt_msg *msg, bcmolt_buf *buf, const bcmolt_group_info *key_info)
+{
+    bcmolt_msg_set *msg_set = msg->msg_set;
+    int i;
+    bcmos_bool ret;
+    bcmos_errno err = BCM_ERR_OK;
+
+    if (!msg_set)
+    {
+        BCMOS_TRACE_RETURN(BCM_ERR_INTERNAL, "msh->msg_set == NULL\n");
+    }
+
+    /* REQUEST:
+     * - filter (already packed at this point, contains first key to check)
+     * - group (FFU)
+     * - max_instances
+     * - presence_mask
+     * - filter_flags
+     *
+     * RESPONSE:
+     * - filter (already packed at this point)
+     * - num_instances
+     * - more
+     * - next_key
+     * - num_instances * msg
+     */
+    if (msg->dir == BCMOLT_MSG_DIR_REQUEST)
+    {
+        ret = bcmolt_buf_write_u8(buf, (uint8_t) msg_set->group);
+        ret = ret && bcmolt_buf_write_u16(buf, msg_set->max_instances);
+        ret = ret && bcmolt_buf_write_u64(buf, msg_set->presence_mask);
+        ret = ret && bcmolt_buf_write_u64(buf, msg_set->filter_flags);
+        if (!ret) err = BCM_ERR_OVERFLOW;
+    }
+    else
+    {
+        ret = bcmolt_buf_write_u16(buf, msg_set->num_instances);
+        ret = ret && bcmolt_buf_write_u8(buf, (uint8_t) msg_set->more);
+        ret = ret && key_info->pack(msg_set->next_key, buf, BCMOLT_PRESENCE_MASK_ALL);
+        if (!ret) return BCM_ERR_OVERFLOW;
+
+        for (i = 0; i < msg_set->num_instances && err == BCM_ERR_OK; i++)
+        {
+            if (msg_set->msg[i] == NULL)
+            {
+                err = BCM_ERR_INTERNAL;
+                break;
+            }
+
+            err = bcmolt_msg_pack(msg_set->msg[i], buf);
+        }
+    }
+
+    return err;
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_msg_pack(bcmolt_msg *msg, bcmolt_buf *buf)
+{
+    uint8_t *key_ptr;
+    bcmos_errno err;
+    bcmolt_group_info *group;
+    bcmolt_group_info *key;
+
+    if (!bcmolt_get_group_info(msg, &group, &key))
+    {
+        return BCM_ERR_MSG_ERROR;
+    }
+
+    err = bcmolt_msg_hdr_pack(msg, buf);
+    if (err != BCM_ERR_OK)
+    {
+        return err;
+    }
+
+    key_ptr = (uint8_t *) (msg + 1);
+    if (!key->pack(key_ptr, buf, BCMOLT_PRESENCE_MASK_ALL))
+    {
+        return BCM_ERR_OVERFLOW;
+    }
+
+    if (bcmolt_msg_should_pack_data(msg) && (group->pack != NULL))
+    {
+        uint8_t *data_ptr = (uint8_t *) ((long)msg + group->data_offset);
+        if (!group->pack(data_ptr, buf, msg->presence_mask))
+        {
+            return BCM_ERR_OVERFLOW;
+        }
+    }
+
+    /* If it is a multi-message pack what follows the rest of the set */
+    if (msg->type & BCMOLT_MSG_TYPE_MULTI)
+    {
+        err = bcmolt_msg_set_pack(msg, buf, key);
+    }
+
+    return err;
+}
+
+/* scan the input buffer to determine how much memory will be required to unpack variable-sized lists */
+static bcmos_errno bcmolt_msg_list_mem_scan(bcmolt_buf *buf, const bcmolt_msg *hdr, const bcmolt_group_info *group, const bcmolt_group_info *key, uint32_t *size)
+{
+    uint32_t pos_before_scan = bcmolt_buf_get_used(buf);
+
+    if (!key->mem_scan(buf, size, BCMOLT_PRESENCE_MASK_ALL))
+    {
+        return BCM_ERR_OVERFLOW;
+    }
+
+    if (bcmolt_msg_should_pack_data(hdr) && (group->mem_scan != NULL) && !group->mem_scan(buf, size, hdr->presence_mask))
+    {
+        return BCM_ERR_OVERFLOW;
+    }
+
+    if (!bcmolt_buf_rewind(buf, bcmolt_buf_get_used(buf) - pos_before_scan))
+    {
+        return BCM_ERR_OVERFLOW;
+    }
+
+    return BCM_ERR_OK;
+}
+
+/* Pack message set, excluding the filter-header which is already packed */
+static bcmos_errno bcmolt_msg_set_unpack(bcmolt_msg *msg, bcmolt_buf *buf, const bcmolt_group_info *key_info)
+{
+    bcmolt_msg_set *msg_set;
+    int i;
+    bcmos_bool ret;
+    bcmos_errno err = BCM_ERR_OK;
+
+    /*
+     * See encoding in bcmolt_msg_set_pack()
+     */
+    if (msg->dir == BCMOLT_MSG_DIR_REQUEST)
+    {
+        uint8_t group;
+        uint16_t max_instances;
+        uint64_t filter_flags;
+
+        ret = bcmolt_buf_read_u8(buf, &group);
+        ret = ret && bcmolt_buf_read_u16(buf, &max_instances);
+        if (!ret)
+        {
+            return BCM_ERR_OVERFLOW;
+        }
+
+        err = bcmolt_msg_set_alloc(msg->obj_type, group, max_instances, &msg_set);
+        if (err) return err;
+
+        ret = ret && bcmolt_buf_read_u64(buf, &msg_set->presence_mask);
+        ret = ret && bcmolt_buf_read_u64(buf, &filter_flags);
+        if (!ret)
+        {
+            bcmolt_msg_set_free(msg_set);
+            return BCM_ERR_OVERFLOW;
+        }
+
+        msg_set->filter_flags = filter_flags;
+        msg->msg_set = msg_set;
+    }
+    else
+    {
+        uint8_t is_more;
+        uint16_t num_instances;
+
+        ret = bcmolt_buf_read_u16(buf, &num_instances);
+        if (!ret)
+        {
+            return BCM_ERR_OVERFLOW;
+        }
+
+        if (msg->msg_set == NULL)
+        {
+            err = bcmolt_msg_set_alloc(msg->obj_type, msg->group, num_instances, &msg->msg_set);
+            if (BCM_ERR_OK != err)
+            {
+                return err;
+            }
+        }
+
+        msg_set = msg->msg_set;
+        msg_set->num_instances = num_instances;
+        ret = ret && bcmolt_buf_read_u8(buf, &is_more);
+        ret = ret && key_info->unpack(msg_set->next_key, buf, NULL, BCMOLT_PRESENCE_MASK_ALL);
+        if (!ret)
+        {
+            return BCM_ERR_OVERFLOW;
+        }
+
+        msg_set->more = (bcmos_bool) is_more;
+        if (msg_set->num_instances > msg_set->max_instances)
+        {
+            BCMOS_TRACE_RETURN(BCM_ERR_INTERNAL, "msg_set unpack: num_instances %u > max_instances %u\n", msg_set->num_instances, msg_set->max_instances);
+        }
+
+        for (i = 0; i < msg_set->num_instances && err == BCM_ERR_OK; i++)
+        {
+            err = bcmolt_msg_unpack(buf, &msg_set->msg[i]);
+        }
+    }
+
+    return err;
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_msg_unpack(bcmolt_buf *buf, bcmolt_msg **unpacked)
+{
+    bcmolt_msg hdr = { };
+    bcmos_errno err;
+    bcmolt_group_info *group;
+    bcmolt_group_info *key;
+    bcmos_bool did_malloc = BCMOS_FALSE;
+    uint8_t *key_ptr;
+    void *list_mem = NULL;
+    void **list_mem_ptr = NULL;
+
+    err = bcmolt_msg_hdr_unpack(&hdr, buf);
+    if (err != BCM_ERR_OK)
+    {
+        return err;
+    }
+
+    if (!bcmolt_get_group_info(&hdr, &group, &key))
+    {
+        return BCM_ERR_MSG_ERROR;
+    }
+
+    if (*unpacked == NULL)
+    {
+        uint32_t size = group->container_size == 0 ? sizeof(bcmolt_msg) + key->size : group->container_size;
+        err = bcmolt_msg_list_mem_scan(buf, &hdr, group, key, &size);
+        if (err != BCM_ERR_OK)
+        {
+            return err;
+        }
+
+        *unpacked = bcmos_calloc(size);
+        if (*unpacked == NULL)
+        {
+            return BCM_ERR_NOMEM;
+        }
+
+        list_mem = (uint8_t *) (*unpacked) + group->container_size;
+        list_mem_ptr = &list_mem;
+        did_malloc = BCMOS_TRUE;
+    }
+    else
+    {
+        if ((*unpacked)->list_buf != NULL)
+        {
+            uint32_t size = 0;
+            err = bcmolt_msg_list_mem_scan(buf, &hdr, group, key, &size);
+            if (err != BCM_ERR_OK)
+            {
+                return err;
+            }
+
+            if (size > (*unpacked)->list_buf_size)
+            {
+                return BCM_ERR_INSUFFICIENT_LIST_MEM;
+            }
+
+            list_mem = (*unpacked)->list_buf;
+            list_mem_ptr = &list_mem;
+        }
+    }
+
+    hdr.msg_set = (*unpacked)->msg_set;
+    **unpacked = hdr;
+
+    key_ptr = (uint8_t *) (*unpacked + 1);
+    if (!key->unpack(key_ptr, buf, list_mem_ptr, BCMOLT_PRESENCE_MASK_ALL))
+    {
+        if (did_malloc)
+        {
+            bcmos_free(*unpacked);
+        }
+
+        return BCM_ERR_OVERFLOW;
+    }
+
+    if (bcmolt_msg_should_pack_data(&hdr))
+    {
+        uint8_t *data_ptr = (uint8_t *) (*unpacked) + group->data_offset;
+        if ((group->unpack != NULL) && !group->unpack(data_ptr, buf, list_mem_ptr, hdr.presence_mask))
+        {
+            if (did_malloc)
+            {
+                bcmos_free(*unpacked);
+            }
+
+            return BCM_ERR_OVERFLOW;
+        }
+    }
+
+    /* If it is a multi-message pack what follows the rest of the set */
+    if (hdr.type & BCMOLT_MSG_TYPE_MULTI)
+    {
+        err = bcmolt_msg_set_unpack(*unpacked, buf, key);
+        if (err != BCM_ERR_OK)
+        {
+            if (did_malloc)
+            {
+                bcmos_free(*unpacked);
+            }
+
+            return err;
+        }
+    }
+
+    return BCM_ERR_OK;
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_group_id_split(bcmolt_group_id group_id, bcmolt_obj_id *obj, bcmolt_mgt_group *group, uint16_t *subgroup)
+{
+    if ((group_id >= BCMOLT_GROUP_ID__NUM_OF) || (group_info[group_id] == NULL))
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    *obj = group_info[group_id]->obj_type;
+    *group = group_info[group_id]->group;
+    *subgroup = group_info[group_id]->subgroup;
+    return BCM_ERR_OK;
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_group_id_combine(bcmolt_obj_id obj, bcmolt_mgt_group group, uint16_t subgroup, bcmolt_group_id *group_id)
+{
+    if ((obj >= BCMOLT_OBJ_ID__NUM_OF) || (group >= BCMOLT_MGT_GROUP__NUM_OF) || (group_ids[obj] == NULL) || (subgroup >= group_ids[obj][group].subgroup_count))
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    *group_id = group_ids[obj][group].subgroup_ids[subgroup];
+    return BCM_ERR_OK;
+}
+
+/******************************************************************************/
+uint8_t bcmolt_msg_instance(const bcmolt_msg *msg)
+{
+    const void *val_ptr;
+
+    if (msg->obj_type >= BCMOLT_OBJ_ID__NUM_OF)
+    {
+        return 0;
+    }
+
+    if (instance_info[msg->obj_type].offset < 0)
+    {
+        return 0;
+    }
+
+    val_ptr = ((const uint8_t *)(msg + 1)) + instance_info[msg->obj_type].offset;
+
+    /** This is probably not the smartest way to do this... TODO: revisit */
+    switch (instance_info[msg->obj_type].size)
+    {
+        case 1:
+            return *((const uint8_t *)val_ptr);
+        case 2:
+            return (uint8_t) (*((const uint16_t *)val_ptr));
+        case 4:
+            return (uint8_t) (*((const uint32_t *)val_ptr));
+        case 8:
+            return (uint8_t) (*((const uint64_t *)val_ptr));
+        default:
+            return 0;
+    }
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_msg_clone(bcmolt_msg **dest, bcmolt_msg *src)
+{
+    bcmos_errno err;
+    int32_t packed_len;
+    uint8_t *mem;
+    bcmolt_buf buf;
+
+    packed_len = bcmolt_msg_get_packed_length(src);
+    if (packed_len < 0)
+    {
+        return (bcmos_errno) packed_len;
+    }
+
+    mem = bcmos_calloc((uint32_t) packed_len);
+    if (mem == NULL)
+    {
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmolt_buf_init(&buf, (uint32_t) packed_len, mem, BCMOLT_BUF_ENDIAN_FIXED);
+    err = bcmolt_msg_pack(src, &buf);
+    if (err != BCM_ERR_OK)
+    {
+        bcmos_free(mem);
+        return err;
+    }
+
+    buf.curr = buf.start;
+    err = bcmolt_msg_unpack(&buf, dest);
+    bcmos_free(mem);
+    return err;
+}
+
+/******************************************************************************/
+bcmos_errno bcmolt_get_prop_readonly_mask(bcmolt_obj_id obj, bcmolt_presence_mask *mask)
+{
+    if (obj >= BCMOLT_OBJ_ID__NUM_OF)
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    *mask = readonly_prop_mask[obj];
+    return BCM_ERR_OK;
+}
+
+#ifdef __KERNEL__
+EXPORT_SYMBOL(bcmolt_msg_get_packed_length);
+EXPORT_SYMBOL(bcmolt_msg_pack);
+EXPORT_SYMBOL(bcmolt_msg_unpack);
+EXPORT_SYMBOL(bcmolt_group_id_split);
+EXPORT_SYMBOL(bcmolt_group_id_combine);
+EXPORT_SYMBOL(bcmolt_msg_instance);
+EXPORT_SYMBOL(bcmolt_get_prop_readonly_mask);
+EXPORT_SYMBOL(bcmolt_msg_set_alloc);
+EXPORT_SYMBOL(bcmolt_msg_set_free);
+
+MODULE_LICENSE("Dual BSD/GPL");
+#endif
diff --git a/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.h b/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.h
new file mode 100644
index 0000000..bc01bff
--- /dev/null
+++ b/bcm68620_release/release/host_driver/model/bcmolt_msg_pack.h
@@ -0,0 +1,143 @@
+/*
+<: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.
+:>
+*/
+
+#ifndef BCMOLT_MSG_PACK_H_
+#define BCMOLT_MSG_PACK_H_
+
+#include "bcmos_system.h"
+#include "bcmos_common.h"
+#include "bcmos_errno.h"
+#include "bcmolt_buf.h"
+#include "bcmolt_msg.h"
+#include "bcmolt_model_types.h"
+
+/** Gets the number of bytes a message would occupy when packed.
+ *
+ * \param this The message to scan.
+ * \return The size in bytes if > 0, or an error as defined in bcmos_errno.
+ */
+int32_t bcmolt_msg_get_packed_length(bcmolt_msg *this);
+
+/** Packs a message to a byte stream.
+ *
+ * \param this The message to pack.
+ * \param buf The stream to pack into.
+ * \return An error code or BCM_ERR_OK for success.
+ */
+bcmos_errno bcmolt_msg_pack(bcmolt_msg *this, bcmolt_buf *buf);
+
+/** Unpacks a message from a byte stream.
+ *
+ * This unpacks the message from the packed form into the struct following the "unpacked" pointer.  There are several
+ * special cases:
+ *
+ * if *unpacked == NULL:
+ *   *unpacked will be allocated dynamically via bcmos_calloc, in a contiguous block of memory with the struct
+ *   itself followed by the memory required for all variable-sized lists.
+ *
+ * if (*unpacked)->list_buf != NULL:
+ *   When a variable-length list is encountered in the input stream, and the array field we're unpacking into is NULL,
+ *   memory will be allocated starting from (*unpacked)->list_buf.  If multiple such lists exist, they will share this
+ *   buffer.  If the (*unpacked)->list_buf_size is not large enough, this will return BCM_ERR_INSUFFICIENT_LIST_MEM.
+ *
+ * \param buf           The stream to unpack from.
+ * \param unpacked      A pointer to the message to unpack.
+ * \return An error as defined in bcmos_errno.
+ */
+bcmos_errno bcmolt_msg_unpack(bcmolt_buf *buf, bcmolt_msg **unpacked);
+
+/** Converts a generic group ID into a specific object type, group and subgroup.
+ *
+ * \param group_id The generic group ID.
+ * \param obj The object type that corresponds to the group ID.
+ * \param group The group type that corresponds to the group ID.
+ * \param subgroup The subgroup index that corresponds to the group ID.
+ * \return An error code or BCM_ERR_OK for success.
+ */
+bcmos_errno bcmolt_group_id_split(bcmolt_group_id group_id,
+                                  bcmolt_obj_id *obj,
+                                  bcmolt_mgt_group *group,
+                                  uint16_t *subgroup);
+
+/** Converts a specific object type, group and subgroup into a generic group ID.
+ *
+ * \param obj The object type that corresponds to the group ID.
+ * \param group The group type that corresponds to the group ID.
+ * \param subgroup The subgroup index that corresponds to the group ID.
+ * \param group_id The generic group ID.
+ * \return An error code or BCM_ERR_OK for success.
+ */
+bcmos_errno bcmolt_group_id_combine(bcmolt_obj_id obj,
+                                    bcmolt_mgt_group group,
+                                    uint16_t subgroup,
+                                    bcmolt_group_id *group_id);
+
+/** Returns the instance number of a given message, as determined by the object key.
+ *
+ * \param msg The message to check.
+ * \return The instance number of the message.
+ */
+uint8_t bcmolt_msg_instance(const bcmolt_msg *msg);
+
+/** Gets a mask of all readonly properties for an object's cfg group.
+ *
+ * \param obj The objecct to check.
+ * \param mask A mask of bits set to 1 per read-only property.
+ * \return An error code or BCM_ERR_OK for success.
+ */
+bcmos_errno bcmolt_get_prop_readonly_mask(bcmolt_obj_id obj, bcmolt_presence_mask *mask);
+
+/** Clones a message by packing it to a buffer then unpacking it into the destination message.
+ * This uses bcmolt_msg_unpack, so if *dest is NULL, memory will by allocated dynamically using bcmos_calloc.
+ *
+ * \param dest A pointer to the location in memory that will hold the cloned message.
+ * \param src The message that should be copied.
+ * \return An error code or BCM_ERR_OK for success.
+ */
+bcmos_errno bcmolt_msg_clone(bcmolt_msg **dest, bcmolt_msg *src);
+
+#endif /* BCMOLT_MSG_PACK_H_ */
