#ifndef RTL867x_8367b_ACL_H
#define RTL867x_8367b_ACL_H


#include <linux/list.h>
#include "../../rtl8367b/rtk_api_acl.h"


#define RL6000_ACL_CHAIN_QOS			-30000


//#define DBG_8367B_ACL
#ifdef DBG_8367B_ACL
#define DBG_8367B_ACL_PRK printk
#else
#define DBG_8367B_ACL_PRK(format, args...)
#endif

typedef struct rtl867x_8367b_acl_chain_s
{
	int ruleCnt;
	int priority;
	struct list_head chain_list;
	struct list_head aclrule_list_head;
	int force;
}rtl867x_8367b_acl_chain_t;

typedef struct rtl867x_8367b_acl_chain_rule_s
{
	rtk_filter_cfg_t*	cfg;
	rtk_filter_action_t*	act;
	int 						asic_used_rulenum;
	struct list_head aclrule_list;
}rtl867x_8367b_acl_chain_rule_t;

int rtl867x_rtl8367b_register_aclchain(int priority, int force);
int rtl867x_rtl8367b_unregister_aclchain(int priority);
int rtl867x_rtl8367b_addacl(rtk_filter_cfg_t* cfg,rtk_filter_action_t* act, int chain_priority);
int rtl867x_rtl8367b_delacl(rtk_filter_cfg_t* input_cfg,rtk_filter_action_t* input_act, int chain_priority);
int rtl867x_rtl8367b_flushacl(int chain_priority);
void rtl867x_rtl8367b_show_aclrule_Datafiled(rtk_filter_cfg_t* pFilter_cfg);
void rtl867x_rtl8367b_show_aclrule_raw_Datafiled(rtk_filter_cfg_raw_t* pFilter_cfg);
void rtl867x_rtl8367b_show_aclrule(rtk_filter_cfg_t* pFilter_cfg,rtk_filter_action_t* pAction);
void rtl867x_rtl8367b_show_aclrule_raw(rtk_filter_cfg_raw_t* pFilter_cfg, rtk_filter_action_t* pAction);
void rtl867x_rtl8367b_show_aclchain(void);


/* APIs for manipulating cfg's field_data */
void rtl867x_rtl8367b_acl_fieldData_free(rtk_filter_field_t **fieldDataHead);

#endif