/*
 * Copyright (c) 2016-2018, 2021, The Linux Foundation. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/**
 * @defgroup fal_policer FAL_POLICER
 * @{
 */
#ifndef _FAL_POLICER_H_
#define _FAL_POLICER_H_

#ifdef __cplusplus
extern "C" {
#endif                          /* __cplusplus */

#include "sw.h"
#include "fal/fal_type.h"

typedef struct
{
	a_bool_t		meter_en;	/* meter enable or disable */
	a_bool_t		couple_en;	/*  two buckets coupling enable or disable*/
	a_uint32_t	color_mode;	/* color aware or color blind */
	a_uint32_t	frame_type;	/* frame type, bit0:unicast;bit1: unkown unicast;bit2:multicast;bit3: unknown multicast; bit4:broadcast */
	a_uint32_t 	meter_mode;
	a_uint32_t	meter_unit; /* 0:byte based; 1:packet based*/
	a_uint32_t	cir;	/* committed information rate */
	a_uint32_t	cbs;	/* committed burst size */
	a_uint32_t	eir; /* excess information rate */
	a_uint32_t	ebs; /* excess burst size */
} fal_policer_config_t;

typedef struct
{
	a_bool_t yellow_priority_en; /* yellow traffic internal priority change enable*/
	a_bool_t yellow_drop_priority_en; /* yellow traffic internal drop priority change enable*/
	a_bool_t yellow_pcp_en; /* yellow traffic pcp change enable*/
	a_bool_t yellow_dei_en; /* yellow traffic dei change enable*/
	a_uint32_t yellow_priority; /* yellow traffic internal priority value*/
	a_uint32_t yellow_drop_priority; /* yellow traffic internal drop priority value*/
	a_uint32_t yellow_pcp; /* yellow traffic pcp value*/
	a_uint32_t yellow_dei; /* yellow traffic dei value*/
	fal_fwd_cmd_t red_action; /* red traffic drop or forward*/
	a_bool_t red_priority_en; /* red traffic internal priority change enable*/
	a_bool_t red_drop_priority_en; /* red traffic internal drop priority change enable*/
	a_bool_t red_pcp_en; /* red traffic pcp change enable*/
	a_bool_t red_dei_en; /* red traffic dei change enable*/
	a_uint32_t red_priority; /* red traffic internal priority value*/
	a_uint32_t red_drop_priority; /* red traffic internal drop priority value*/
	a_uint32_t red_pcp; /* red traffic pcp value*/
	a_uint32_t red_dei;  /* red traffic dei value*/
}fal_policer_action_t;

typedef struct
{
    a_uint32_t green_packet_counter; /*green packet counter */
    a_uint64_t green_byte_counter; /*green byte counter */
    a_uint32_t yellow_packet_counter; /*yellow packet counter */
    a_uint64_t yellow_byte_counter; /*yellow byte counter */
    a_uint32_t red_packet_counter; /*red packet counter */
    a_uint64_t red_byte_counter; /*red byte counter */
} fal_policer_counter_t;

typedef struct
{
    a_uint32_t policer_drop_packet_counter; /*drop packet counter by policer*/
    a_uint64_t policer_drop_byte_counter; /*drop byte counter by policer */
    a_uint32_t policer_forward_packet_counter; /*forward packet counter by policer*/
    a_uint64_t policer_forward_byte_counter; /*forward byte counter by policer*/
    a_uint32_t policer_bypass_packet_counter; /*bypass packet counter by policer*/
    a_uint64_t policer_bypass_byte_counter; /*bypass byte counter by policer */
} fal_policer_global_counter_t;

enum
{
	FUNC_ADPT_ACL_POLICER_COUNTER_GET = 0,
	FUNC_ADPT_PORT_POLICER_COUNTER_GET,
	FUNC_ADPT_PORT_COMPENSATION_BYTE_GET,
	FUNC_ADPT_PORT_POLICER_ENTRY_GET,
	FUNC_ADPT_PORT_POLICER_ENTRY_SET,
	FUNC_ADPT_ACL_POLICER_ENTRY_GET,
	FUNC_ADPT_ACL_POLICER_ENTRY_SET,
	FUNC_ADPT_POLICER_TIME_SLOT_GET,
	FUNC_ADPT_PORT_COMPENSATION_BYTE_SET,
	FUNC_ADPT_POLICER_TIME_SLOT_SET,
	FUNC_ADPT_POLICER_GLOBAL_COUNTER_GET,
	FUNC_ADPT_POLICER_BYPASS_EN_SET,
	FUNC_ADPT_POLICER_BYPASS_EN_GET,
};


typedef enum {
	FAL_FRAME_DROPPED = 0,
} fal_policer_frame_type_t;

#ifndef IN_POLICER_MINI
sw_error_t
fal_port_policer_entry_set(a_uint32_t dev_id, fal_port_t port_id,
		fal_policer_config_t *policer, fal_policer_action_t *action);

sw_error_t
fal_port_policer_entry_get(a_uint32_t dev_id, fal_port_t port_id,
		fal_policer_config_t *policer, fal_policer_action_t *atcion);

sw_error_t
fal_acl_policer_entry_set(a_uint32_t dev_id, a_uint32_t index,
		fal_policer_config_t *policer, fal_policer_action_t *action);

sw_error_t
fal_acl_policer_entry_get(a_uint32_t dev_id, a_uint32_t index,
		fal_policer_config_t *policer, fal_policer_action_t *action);

sw_error_t
fal_port_policer_counter_get(a_uint32_t dev_id, fal_port_t port_id,
		fal_policer_counter_t *counter);

sw_error_t
fal_acl_policer_counter_get(a_uint32_t dev_id, a_uint32_t index,
		fal_policer_counter_t *counter);

sw_error_t
fal_port_policer_compensation_byte_get(a_uint32_t dev_id, fal_port_t port_id,
		a_uint32_t *length);

sw_error_t
fal_policer_timeslot_get(a_uint32_t dev_id, a_uint32_t *timeslot);

sw_error_t
fal_policer_global_counter_get(a_uint32_t dev_id,
		fal_policer_global_counter_t *counter);

sw_error_t
fal_policer_bypass_en_get(a_uint32_t dev_id, fal_policer_frame_type_t frame_type,
	a_bool_t *enable);
#endif

sw_error_t
fal_port_policer_compensation_byte_set(a_uint32_t dev_id, fal_port_t port_id,
		a_uint32_t length);

sw_error_t
fal_policer_timeslot_set(a_uint32_t dev_id, a_uint32_t timeslot);

sw_error_t
fal_policer_bypass_en_set(a_uint32_t dev_id, fal_policer_frame_type_t frame_type,
	a_bool_t enable);
#ifdef __cplusplus
}
#endif                          /* __cplusplus */
#endif                          /* _FAL_POLICER_H_ */
/**
 * @}
 */
