/*
<:copyright-BRCM:2016:DUAL/GPL:standard

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

Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:

   As a special exception, the copyright holders of this software give
   you permission to link this software with independent modules, and
   to copy and distribute the resulting executable under terms of your
   choice, provided that you also meet, for each linked independent
   module, the terms and conditions of the license of that module.
   An independent module is a module which is not derived from this
   software.  The special exception does not apply to any modifications
   of the software.

Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.

:>
*/

/* This file contains the pieces of the OAM negotiation state machine that are common to all OAM. */

#ifndef _OAM_COMMON_H_
#define _OAM_COMMON_H_

#include "bcmolt_eon_private.h"

#define LOCAL_EVAL_REMOTE_EVAL\
    (BCMOLT_EPON_OAM_OAM_FLAGS_LOCAL_EVALUATING | BCMOLT_EPON_OAM_OAM_FLAGS_REMOTE_EVALUATING)
#define LOCAL_STABLE_REMOTE_EVAL\
    (BCMOLT_EPON_OAM_OAM_FLAGS_LOCAL_STABLE | BCMOLT_EPON_OAM_OAM_FLAGS_REMOTE_EVALUATING)
#define LOCAL_STABLE_REMOTE_STABLE\
    (BCMOLT_EPON_OAM_OAM_FLAGS_LOCAL_STABLE | BCMOLT_EPON_OAM_OAM_FLAGS_REMOTE_STABLE)

typedef void (*oam_info_add_tlv)(eon_link_state *link_state, bcmolt_epon_oam_oam_pdu_content *oam);

typedef void (*oam_rx_org_spec_tlv)(
    eon_link_state *link_state,
    bcmolt_epon_oam_organization_specific_info *org_spec,
    bcmos_errno *rc);

bcmos_errno build_tx_info_frame(eon_link_state *link_state, eon_frame_data *frame_data);

bcmos_errno handle_rx_info_frame(eon_link_state *link_state, uint16_t rx_length, uint8_t *rx_payload);

#endif // _OAM_COMMON_H

