/*
 <: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.

 :>
 */

#ifndef OAM_DEFS_H_
#define OAM_DEFS_H_

#include "bcmolt_model_types.h"

#define ETHERTYPE_SLOWPROTOCOLS 0x8809
#define OAM_TIMEOUT_GRACE_PERIOD_US 100000
#define HDE_ENABLE_OAM_WAIT_US 3e6 // 3 seconds#define OAM_MAX_PACKET_SIZE 1518
#define OAM_MAX_TLV_LENGTH 128

/* Common OAMPDU Structure */
typedef enum
{
    SLOW_PROTOCOL_SUBTYPE_LACP     = 0x01, /* Link Agregation Control Protocol */
    SLOW_PROTOCOL_SUBTYPE_LAMP     = 0x02, /* Link Agregation Marker Protocol */
    SLOW_PROTOCOL_SUBTYPE_OAM      = 0x03, /* OAM */
    SLOW_PROTOCOL_SUBTYPE_ORG_SPEC = 0x0A  /* Organization Specific Subtype */
} slow_protocol_subtype;

/* Standard OAM Flags field.  IEEE802.3-2008_section5, ch.57.4.2.1 */
typedef enum
{
    OAM_PDU_FLAG_LINK_FAULT     = (1 << 0), /* 0x0001 */
    OAM_PDU_FLAG_DYING_GASP     = (1 << 1), /* 0x0002 */
    OAM_PDU_FLAG_CRITICAL_EVENT = (1 << 2), /* 0x0004 */
    OAM_PDU_FLAG_LOCAL_EVAL     = (1 << 3), /* 0x0008 */
    OAM_PDU_FLAG_LOCAL_STABLE   = (1 << 4), /* 0x0010 */
    OAM_PDU_FLAG_REMOTE_EVAL    = (1 << 5), /* 0x0020 */
    OAM_PDU_FLAG_REMOTE_STABLE  = (1 << 6), /* 0x0040 */
    OAM_PDU_FLAG_SEND_ANY       = (OAM_PDU_FLAG_LOCAL_STABLE | OAM_PDU_FLAG_REMOTE_STABLE)
} oam_pdu_flag;

/* Standard OAM Code field.  IEEE802.3-2008_section5, ch.57.4.2.2 */
typedef enum
{
    OAM_PDU_CODE_INFO              = 0x0,
    OAM_PDU_CODE_EVENTNOTIFICATION = 0x01,
    OAM_PDU_CODE_VARREQUEST        = 0x02,
    OAM_PDU_CODE_VARRESPONSE       = 0x03,
    OAM_PDU_CODE_LOOPBACK          = 0x04,
    OAM_PDU_CODE_ORG_EXT           = 0xfe
} oam_pdu_code;

/* IEEE Organization Unique Identifier */
typedef struct
{
    uint8_t byte[3];
} ieee_oui;

/* Branch types */
typedef enum
{
    OAM_VAR_BRANCH_TERMINATION    = 0x00,
    OAM_VAR_BRANCH_ATTRIBUTE      = 0x07,
    OAM_VAR_BRANCH_ACTION         = 0x09,
    OAM_VAR_BRANCH_DPOE_OBJECT    = 0xD6,
    OAM_VAR_BRANCH_DPOE_ATTRIBUTE = 0xD7,
    OAM_VAR_BRANCH_DPOE_PROG_CTR  = 0xD8,
    OAM_VAR_BRANCH_DPOE_ACT       = 0xD9
} oam_var_branch;

typedef enum
{
    OAM_DPOE_OPCODE_RESERVED       = 0,
    OAM_DPOE_OPCODE_GET_REQUEST    = 1,
    OAM_DPOE_OPCODE_GET_RESPONSE   = 2,
    OAM_DPOE_OPCODE_SET_REQUEST    = 3,
    OAM_DPOE_OPCODE_SET_RESPONSE   = 4,
    OAM_DPOE_OPCODE_IPMC_CTRL      = 5,
    OAM_DPOE_OPCODE_MCAST_REG      = 6,
    OAM_DPOE_OPCODE_MCAST_REG_RESP = 7,
    OAM_DPOE_OPCODE_KEY_EXCHANGE   = 8,
    OAM_DPOE_OPCODE_FILE_TRANSFER  = 9,
    OAM_DPOE_OPCODE_IPMC_CTRL_RESP = 0x0a /* DPoE 2.0 */
} oam_dpoe_opcode;

typedef enum
{
    OAM_DPOE_ATTR_KEY_EXPIRY_TIME = 0x0401,
    OAM_DPOE_ATTR_ENCRYPT_MODE = 0x0402
} oam_dpoe_attr;

/* DPoE Key Exchange OAM TLV encryption mode */
typedef enum
{
    DPOE_ENCRYPT_MODE_NONE,
    DPOE_ENCRYPT_MODE_1DOWN,
    DPOE_ENCRYPT_MODE_10DOWN,
    DPOE_ENCRYPT_MODE_10BI
} dpoe_encrypt_mode;

/* generic OAM Variable format */
typedef struct
{
    oam_var_branch branch;
    uint16_t leaf;
    uint8_t width;
    uint8_t *value;
} oam_var_generic;

/** In the OAM protocol length 0 tlv is encoded as 0x80 (no error).
 *  Length (1-127) are encoded with no change and 128 is encoded as 0.
 *
 * \param   width   TLV width field value
 * \return  encoded value for the width field
 * \ref     IEEE802.3-2008_section5, Ch. 57.6.2.1
 */
static inline uint8_t oam_var_tlv_length_encode(uint8_t width)
{
    if (width == 0)
    {
        return OAM_MAX_TLV_LENGTH; /* 0x00 equals 128 octets. */
    }
    else if (width == OAM_MAX_TLV_LENGTH)
    {
        return 0; /* 0x80 represents 'no error'. No 'Value' field. */
    }
    else
    {
        return width; /* represents the length of 'Value'. */
    }
}

#endif /* OAM_DEFS_H_ */
