/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
	notice, this list of conditions and the following disclaimer in the
	documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

******************************************************************************/

/******************************************************************************
*
* tpm_db.c
*
* DESCRIPTION:
*               Traffic Processor Manager = TPM
*
* DEPENDENCIES:
*               None
*
* CREATED BY:   OctaviaP
*
* DATE CREATED:
*
* FILE REVISION NUMBER:
*               Revision: 1.4
*
*
*******************************************************************************/

#include "tpm_common.h"
#include "tpm_header.h"

#include <linux/vmalloc.h>

/* Local definitions */
#define PNC_RANGE_OPER(x)         tpm_db.pnc_range[x].pnc_range_oper
#define PNC_RANGE_CONF(x)         tpm_db.pnc_range[x].pnc_range_conf
#define TPM_DBVAL_CON(dbval)      ((dbval == TPM_DB_VALID) ? TPM_TRUE : TPM_FALSE)
#define TPM_DB_DIVIDED_BY_32(x)   (x >> 5)
#define TPM_DB_MOD_32(x)          (x & 0x1f)

#define MEM_MARGIN_PATTERN        (0xA3)
#define API_ENT_I(api_sec, i) tpm_db.api_ent_mem_area[(tpm_db.api_section[api_sec].table_start) + i]
#define IF_ERROR(ret) \
	if (ret != TPM_DB_OK) { \
		TPM_OS_ERROR(TPM_DB_MOD, " recvd ret_code(%d)\n", ret); \
		return(ret); \
	}
#define IF_ERROR_I(ret, i) \
	if (ret != TPM_DB_OK) { \
		TPM_OS_ERROR(TPM_DB_MOD, " For index(%d), recvd ret_code(%d)\n", i, ret); \
		return(ret); \
	}

/* TODO - change to static variable after updating print functions */
tpm_db_t tpm_db;
tpm_db_hot_swap_bak_db_t hot_swap_bak_db;

static uint32_t mem_alloc_start_ind;

const char *entry_state_str[TPM_MOD_ENTRY_STATUS_MAX] = { "F", "B", "O", "R", "S" };

uint32_t *tpm_db_mod2_jump_booked_entry_bm[TPM_MAX_NUM_GMACS];
uint32_t *tpm_db_mod2_jump_occupied_entry_bm[TPM_MAX_NUM_GMACS];
uint32_t *tpm_db_mod2_jump_split_mod_occupied_entry_bm[TPM_MAX_NUM_GMACS];
uint32_t *tpm_db_mod2_jump_split_mod_all_entry_bm[TPM_MAX_NUM_GMACS];

uint32_t tpm_db_mod2_jump_bm_group;

uint32_t *tpm_db_mod2_chain_booked_entry_bm[TPM_MAX_NUM_GMACS][TPM_CHAIN_TYPE_MAX];
uint32_t *tpm_db_mod2_chain_occupied_entry_bm[TPM_MAX_NUM_GMACS][TPM_CHAIN_TYPE_MAX];

uint32_t tpm_db_mod2_chain_bm_group[TPM_CHAIN_TYPE_MAX];

tpm_mod2_jump_pmt_info_t *tpm_db_mod2_jump_pmt_info[TPM_MAX_NUM_GMACS];
tpm_mod2_chain_pmt_info_t *tpm_db_mod2_chain_pmt_info[TPM_MAX_NUM_GMACS];

tpm_mod2_chain_info_t *tpm_db_mod2_chain_info[TPM_MAX_NUM_GMACS][TPM_CHAIN_TYPE_MAX];

tpm_mod2_jump_cfg_t tpm_db_mod2_jump_area_cfg;
tpm_mod2_chain_cfg_t tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAX];

uint16_t tpm_mod2_chain_area_base;
uint16_t tpm_mod2_total_chain_num;

uint8_t tpm_mod2_multicast_mh_enable;
uint8_t tpm_mod2_pppoe_add_mod_enable;
uint8_t tpm_mod2_double_tag_enable;
uint8_t tpm_mod2_udp_checksum_use_init_bm_enable;
uint8_t tpm_mod2_udp_checksum_enable;

tpm_db_mc_stream_entry_t *tpm_db_mc_stream_table[TPM_MC_MAX_STREAM_NUM];
tpm_db_mc_mac_entry_t *tpm_db_mc_mac_table[TPM_MC_MAX_MAC_NUM];

uint32_t tpm_db_mc_lpbk_entries_num;
tpm_db_mc_lpbk_entry_t *tpm_db_mc_lpbk_table[TPM_MC_MAX_LPBK_ENTRIES_NUM];
tpm_db_mc_vlan_entry_t *tpm_db_mc_vlan_xits_table[TPM_MC_MAX_MVLAN_XITS_NUM];

uint8_t tpm_db_mc_virt_uni_entry_state_table[TPM_MC_MAX_STREAM_NUM];

uint8_t tpm_db_mc_igmp_proxy_sa_mac[6];
uint8_t tpm_db_mc_igmp_proxy_sa_mac_valid;

static uint32_t tpm_db_global_rule_idx = 1000;

/* Function Declarations */
int32_t tpm_db_api_freeentry_get(tpm_api_sections_t api_section, int32_t *index);
int32_t tpm_db_api_entry_ind_get(tpm_api_sections_t api_section, uint32_t rule_num, int32_t *index);
int32_t tpm_db_mod_shdw_par_check(tpm_gmacs_enum_t gmac, uint32_t mod_entry);


/*******************************************************************************
* tpm_db_eth_port_conf_get()
*
* DESCRIPTION:      Function to get an ethernet port physical configuration from the DB
*
* INPUTS:
* ext_port         - External Port Identifier, can be any positive number
*
* OUTPUTS:
*                 - See explanation in tpm_db_eth_port_conf_t structure
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
bool tpm_db_eth_port_valid(tpm_src_port_type_t src_port_num)
{
	uint32_t i;

	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if ((tpm_db.eth_ports[i].port_src == src_port_num)
		    && (tpm_db.eth_ports[i].valid == TPM_DB_VALID))
			return (true);
	}

	return false;
}

/*******************************************************************************
* tpm_db_eth_port_conf_get()
*
* DESCRIPTION:      Function to get an ethernet port physical configuration from the DB
*
* INPUTS:
* ext_port         - External Port Identifier, can be any positive number
*
* OUTPUTS:
*                 - See explanation in tpm_db_eth_port_conf_t structure
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_eth_port_conf_get(tpm_src_port_type_t src_port_num,
				 tpm_db_chip_conn_t *chip_con,
				 tpm_db_int_conn_t *int_con,
				 uint32_t *switch_port)
{
	uint32_t i;

	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if ((tpm_db.eth_ports[i].port_src == src_port_num)
		    && (tpm_db.eth_ports[i].valid == TPM_DB_VALID)) {
			*chip_con = tpm_db.eth_ports[i].chip_connect;
			*int_con = tpm_db.eth_ports[i].int_connect;
			*switch_port = tpm_db.eth_ports[i].switch_port;
			return (TPM_DB_OK);
		}
	}

	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_eth_port_switch_port_get()
*
* DESCRIPTION:      Function to get an ethernet port physical configuration from the DB
*
* INPUTS:
* ext_port         - UNI Port Identifier, can be any positive number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns the switch port number.
* On error, TPM_DB_ERR_PORT_NUM = 0xFF is returned.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_eth_port_switch_port_get(tpm_src_port_type_t src_port)
{
	uint32_t i;

       if (TPM_SRC_PORT_UNI_VIRT == src_port) {
                if (TPM_DB_VALID == tpm_db.func_profile.virt_uni_info.enabled)
                        return tpm_db.func_profile.virt_uni_info.switch_port;
               else
                        return TPM_DB_ERR_PORT_NUM;
       } else if (TPM_SRC_PORT_WAN == src_port) {
               for (i = TPM_ENUM_GMAC_0; i < TPM_MAX_GMAC; i++) {
			/*  in case traffic from WAN, the dest is LAN,
			    so we search for switch port connected to GMAC LAN functionality */
                       if (TPM_GMAC_FUNC_LAN == tpm_db.gmac_func[i]){
                               if (TPM_GMAC_CON_SWITCH_4 == tpm_db.gmac_port_conf[i].conn)
                                       return TPM_GMAC0_AMBER_PORT_NUM;
                               else
                                       return TPM_GMAC1_AMBER_PORT_NUM;
                       }
               }
       } else {
               for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
                       if ((tpm_db.eth_ports[i].port_src == src_port) &&
                           (TPM_DB_VALID == tpm_db.eth_ports[i].valid))
                               return (tpm_db.eth_ports[i].switch_port);
		}

	}
	return (TPM_DB_ERR_PORT_NUM);
}
uint32_t tpm_db_rule_index_get(void)
{
	return tpm_db_global_rule_idx;
}
int32_t tpm_db_rule_index_set(uint32_t rule_index)
{
	tpm_db_global_rule_idx = rule_index;
	return TPM_DB_OK;
}
void tpm_db_rule_index_incrs(void)
{
	tpm_db_global_rule_idx++;
}
bool tpm_db_gmac1_lpbk_en_get(void)
{
	return tpm_db.func_profile.gmac1_loopback_en;
}
void tpm_db_gmac1_lpbk_en_set(bool en)
{
	tpm_db.func_profile.gmac1_loopback_en = en;
}
bool tpm_db_cpu_wan_lpbk_en_get(void)
{
	return tpm_db.func_profile.cpu_wan_loopback_en;
}
void tpm_db_cpu_wan_lpbk_en_set(bool en)
{
	tpm_db.func_profile.cpu_wan_loopback_en = en;
}
bool tpm_db_ds_load_bal_en_get(void)
{
	return tpm_db.func_profile.ds_load_bal_en;
}
void tpm_db_ds_load_bal_en_set(bool en)
{
	tpm_db.func_profile.ds_load_bal_en = en;
}
bool tpm_db_switch_active_wan_en_get(void)
{
	return tpm_db.func_profile.switch_active_wan_en;
}
void tpm_db_switch_active_wan_en_set(bool en)
{
	tpm_db.func_profile.switch_active_wan_en = en;
}

int32_t tpm_db_get_valid_uni_ports_num(uint32_t *num_ports)
{
	uint32_t i, _num_ports = 0;

	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (tpm_db.eth_ports[i].valid == TPM_DB_VALID) {
			if (tpm_db.eth_ports[i].port_src >= TPM_SRC_PORT_UNI_0 &&
				tpm_db.eth_ports[i].port_src <= TPM_SRC_PORT_UNI_7)
				_num_ports++;
		}
	}

    if (tpm_db.func_profile.virt_uni_info.enabled == TPM_DB_VALID)
		_num_ports++;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_phy_convert_port_index()
*
* DESCRIPTION:      Function to get an ethernet port physical configuration from the DB
*
* INPUTS:
* switch_port         - External Port Identifier, can be any positive number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns the switch port number.
* On error, TPM_DB_ERR_PORT_NUM = 0xFF is returned.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_phy_convert_port_index(int32_t switch_port)
{
	uint32_t i;

	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if ((tpm_db.eth_ports[i].switch_port == switch_port)
		    && (tpm_db.eth_ports[i].valid == TPM_DB_VALID))
			return (tpm_db.eth_ports[i].port_src);
	}

	return (TPM_DB_ERR_PORT_NUM);
}
EXPORT_SYMBOL(tpm_db_phy_convert_port_index);

/*******************************************************************************
* tpm_db_eth_cmplx_profile_set()
*
* DESCRIPTION:      Function to set the Ethernet Complex Profile in the DB
*
* INPUTS:
* eth_cmplx_profile	- the profile enumartion number
*
* OUTPUTS:
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_eth_cmplx_profile_set(tpm_eth_complex_profile_t eth_cmplx_profile)
{
	tpm_db.eth_cmplx_profile = eth_cmplx_profile;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_eth_cmplx_profile_get()
*
* DESCRIPTION:      Function returns the Ethernet Complex Profile from the DB
*
* INPUTS:
*
* OUTPUTS:
*		the profile enumartion number
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
tpm_eth_complex_profile_t tpm_db_eth_cmplx_profile_get(void)
{
	return tpm_db.eth_cmplx_profile;
}


/*******************************************************************************
* tpm_db_mac_func_set()
*
* DESCRIPTION:	Sets all gmacs functionality according to EthCmplx profile
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
*
* COMMENTS:
* 	On success, returns TPM_OK
* 	On error, returns tpm_db_gmac_func_set error
*******************************************************************************/
int32_t tpm_db_mac_func_set(void)
{
	tpm_db_gmac_func_t pon = 0,
			   gmac0 = 0,
			   gmac1 = 0;
	int32_t ret_code;
	tpm_db_ds_mac_based_trunk_enable_t ds_mac_based_trunk_enable;
#ifdef CONFIG_MV_INCLUDE_PON
	PON_SHUTDOWN_FUNC pon_callback_func = NULL;
#endif
	switch(tpm_db.eth_cmplx_profile)
	{
	case TPM_PON_WAN_DUAL_MAC_INT_SWITCH:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN;
       	if (0 != tpm_db.func_profile.virt_uni_info.enabled)
			gmac1 = TPM_GMAC_FUNC_VIRT_UNI;
       	else
			gmac1 = TPM_GMAC_FUNC_NONE;
		break;

	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
       	/* ofer: phase#2, diferentiate between gmacs */
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN;
		gmac1 = TPM_GMAC_FUNC_NONE;
		break;

	case TPM_PON_WAN_G1_LAN_G0_INT_SWITCH:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN;
		gmac1 = TPM_GMAC_FUNC_LAN_UNI;
		break;

	case TPM_PON_WAN_G0_INT_SWITCH:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN;
		gmac1 = TPM_GMAC_FUNC_NONE;
		break;

	case TPM_PON_WAN_G0_SINGLE_PORT:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN;
		gmac1 = TPM_GMAC_FUNC_NONE;
		break;

	case TPM_G0_WAN_G1_INT_SWITCH:
		pon = TPM_GMAC_FUNC_NONE;
		gmac0 = TPM_GMAC_FUNC_WAN;
		gmac1 = TPM_GMAC_FUNC_LAN;
		break;

	case TPM_G1_WAN_G0_INT_SWITCH:
		pon = TPM_GMAC_FUNC_NONE;
		gmac0 = TPM_GMAC_FUNC_LAN;
		gmac1 = TPM_GMAC_FUNC_WAN;
		break;

	case TPM_PON_G1_WAN_G0_INT_SWITCH:
       		if (TPM_ENUM_GMAC_1 == tpm_db.init_misc.active_wan) {
			pon = TPM_GMAC_FUNC_NONE;
			gmac1 = TPM_GMAC_FUNC_WAN;
		}else{
			gmac1 = TPM_GMAC_FUNC_NONE;
			pon = TPM_GMAC_FUNC_WAN;
		}
		gmac0 = TPM_GMAC_FUNC_LAN;
		break;

	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
       		if (TPM_ENUM_GMAC_1 == tpm_db.init_misc.active_wan) {
			pon = TPM_GMAC_FUNC_NONE;
			gmac1 = TPM_GMAC_FUNC_WAN;
		}else{
			gmac1 = TPM_GMAC_FUNC_NONE;
			pon = TPM_GMAC_FUNC_WAN;
       	}
		gmac0 = TPM_GMAC_FUNC_LAN_UNI;
		break;

	case TPM_PON_G0_WAN_G1_INT_SWITCH:
       		if (TPM_ENUM_GMAC_0 == tpm_db.init_misc.active_wan) {
			pon = TPM_GMAC_FUNC_NONE;
			gmac0 = TPM_GMAC_FUNC_WAN;
		}else{
			gmac0 = TPM_GMAC_FUNC_NONE;
			pon = TPM_GMAC_FUNC_WAN;
       	}
		gmac1 = TPM_GMAC_FUNC_LAN_UNI;
		break;

	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
		if (TPM_ENUM_GMAC_0 == tpm_db.init_misc.active_wan) {
			pon = TPM_GMAC_FUNC_NONE;
			gmac0 = TPM_GMAC_FUNC_WAN;
		}else{
			gmac0 = TPM_GMAC_FUNC_NONE;
			pon = TPM_GMAC_FUNC_WAN;
       	}
		gmac1 = TPM_GMAC_FUNC_LAN;
		break;

	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
	case TPM_PON_WAN_G1_SINGLE_PORT:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_NONE;
		gmac1 = TPM_GMAC_FUNC_LAN_UNI;
		break;

	case TPM_PON_WAN_G0_G1_LPBK:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_US_MAC_LEARN_DS_LAN_UNI;
		gmac1 = TPM_GMAC_FUNC_LAN;
		break;
	case TPM_PON_WAN_G0_G1_DUAL_LAN:
		pon = TPM_GMAC_FUNC_WAN;
		gmac0 = TPM_GMAC_FUNC_LAN_UNI;
		gmac1 = TPM_GMAC_FUNC_LAN_UNI;
		break;
	}

	/* when ds load balance on G0 and G1 is enabled, G0/1 are both LAN */
	tpm_db_ds_mac_based_trunk_enable_get(&ds_mac_based_trunk_enable);
	if (TPM_DS_MAC_BASED_TRUNK_ENABLED == ds_mac_based_trunk_enable)
		gmac1 = TPM_GMAC_FUNC_LAN;

	ret_code = tpm_db_gmac_func_set(TPM_ENUM_PMAC, pon);
	IF_ERROR(ret_code);
	ret_code = tpm_db_gmac_func_set(TPM_ENUM_GMAC_0, gmac0);
	IF_ERROR(ret_code);
	ret_code = tpm_db_gmac_func_set(TPM_ENUM_GMAC_1, gmac1);
	IF_ERROR(ret_code);

#ifdef CONFIG_MV_INCLUDE_PON
	/* shut down or enable PON */
	ret_code = tpm_db_get_pon_callback(&pon_callback_func);
	IF_ERROR(ret_code);
	if (pon_callback_func) {
		if (pon == TPM_GMAC_FUNC_WAN)
			pon_callback_func(1);
		else
			pon_callback_func(0);
	}
#endif

	return (TPM_OK);
}

/*******************************************************************************
* tpm_db_eth_max_uni_port_set()
*
* DESCRIPTION:	Sets the max_uni_port_nr according to EthCmplx profile
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
*
* COMMENTS:
* 	On success, returns TPM_OK
* 	On error, returns tpm_db_gmac_func_set error
*******************************************************************************/
int32_t tpm_db_eth_max_uni_port_set(void)
{
	switch (tpm_db.eth_cmplx_profile) {
	case TPM_PON_WAN_G0_SINGLE_PORT:
	case TPM_PON_WAN_G1_SINGLE_PORT:
	case TPM_PON_WAN_G0_G1_LPBK:
		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_0;
       	break;

	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
	case TPM_PON_WAN_G0_G1_DUAL_LAN:
		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_1;
       	break;

	case TPM_PON_WAN_G0_INT_SWITCH:
	case TPM_PON_WAN_G1_LAN_G0_INT_SWITCH:
	case TPM_PON_WAN_DUAL_MAC_INT_SWITCH:
       case TPM_G0_WAN_G1_INT_SWITCH:
	case TPM_G1_WAN_G0_INT_SWITCH:
	case TPM_PON_G1_WAN_G0_INT_SWITCH:
	case TPM_PON_G0_WAN_G1_INT_SWITCH:
		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_3;
		break;

	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_6;
       	break;

	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_7;
       	break;

	default:
		return TPM_DB_ERR_REC_EXIST;
	}

	/* increment the counter since UNI enumeration starts @ zero */
	tpm_db.max_uni_port_nr++;

	return (TPM_DB_OK);
}

tpm_src_port_type_t tpm_db_trg_port_uni_any_bmp_get(bool inc_virt_uni)
{
	uint32_t dst_port, trg_port_uni_any_bmp = 0;
	tpm_src_port_type_t src_port;

	for (dst_port = TPM_TRG_UNI_0, src_port = TPM_SRC_PORT_UNI_0;
	     dst_port <= TPM_TRG_UNI_7;
	     dst_port = (dst_port << 1), src_port += 1) {

		/* if port is valid */
		if(tpm_db_eth_port_valid(src_port))
			trg_port_uni_any_bmp |= dst_port;
	}

	if (tpm_db.func_profile.virt_uni_info.enabled != 0 && true == inc_virt_uni)
		trg_port_uni_any_bmp |= TPM_TRG_UNI_VIRT;

	return trg_port_uni_any_bmp;
}

bool tpm_db_gmac_valid(tpm_gmacs_enum_t gmac)
{
	if (((TPM_ENUM_PMAC == gmac) && (TPM_NONE != tpm_db.init_misc.pon_type)) ||
	    ((1 == tpm_db.gmac_port_conf[gmac].valid) && (TPM_GMAC_CON_DISC != tpm_db.gmac_port_conf[gmac].conn)))
	    return true;

	return false;
}

int32_t tpm_db_target_to_gmac(tpm_pnc_trg_t pnc_target, tpm_gmacs_enum_t *gmac)
{
	if (TPM_PNC_TRG_GMAC0 == pnc_target)
		*gmac = TPM_ENUM_GMAC_0;
	else if (TPM_PNC_TRG_GMAC1 == pnc_target)
		*gmac = TPM_ENUM_GMAC_1;
	else if (TPM_PNC_TRG_CPU == pnc_target) {
		TPM_OS_ERROR(TPM_DB_MOD, "target to CPU, no GMAC valid\n");
		return TPM_DB_ERR_INV_INPUT;
	} else
		*gmac = TPM_ENUM_PMAC;

	return TPM_DB_OK;
}

/*******************************************************************************
* tpm_db_to_lan_gmac_get()
*
* DESCRIPTION: returns the GMAC target for traffic to LAN according to target
*		port bitmap
* INPUTS:
* trg_port	target port bitmap
*
* OUTPUTS:
* pnc_target	gmac target
*
* RETURNS:
* On success, the function returns TPM_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_to_lan_gmac_get(tpm_trg_port_type_t trg_port, tpm_pnc_trg_t *pnc_target)
{
	uint32_t i;
	tpm_pnc_trg_t gmac_vec = 0;
	bool trg_port_on_switch = false;


	if (NULL == pnc_target)
		return (TPM_DB_ERR_INV_INPUT);

	*pnc_target = TPM_INVALID_PNC_TRG;

	/* for UNI_ANY we search the gmac_func for lan cababilities */
	if (TPM_TRG_PORT_UNI_ANY == trg_port) {
	       for (i = TPM_ENUM_GMAC_0; i < TPM_MAX_GMAC; i++) {
	       		if (!tpm_db_gmac_valid(i))
					continue;
			if (!tpm_db_gmac1_lpbk_en_get()) {
				if (TPM_GMAC_FUNC_LAN == tpm_db.gmac_func[i]      ||
				    TPM_GMAC_FUNC_LAN_UNI == tpm_db.gmac_func[i]) {
					gmac_vec |= (TPM_ENUM_GMAC_0 == i) ? TPM_PNC_TRG_GMAC0 : TPM_PNC_TRG_GMAC1;
					break;/* target only one, no others */
				}
			} else {
				gmac_vec |= TPM_PNC_TRG_GMAC0;
				break;
			}
		}
		TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "trg_port(%x) gmac_vec(%x)\n", trg_port, gmac_vec);
		*pnc_target = gmac_vec;
		return TPM_DB_OK;
	}

	/* if target is virt uni, search for the gmac that acts as LAN */
	if (TPM_TRG_UNI_VIRT & trg_port) {
		for (i = TPM_ENUM_GMAC_0; i < TPM_MAX_GMAC; i++) {
			if (!tpm_db_gmac_valid(i))
				continue;

			/* need only virt uni lan ports */
			if (TPM_GMAC_FUNC_LAN == tpm_db.gmac_func[i]){
				 gmac_vec |= (TPM_ENUM_GMAC_0 == i) ? TPM_PNC_TRG_GMAC0 : TPM_PNC_TRG_GMAC1;
				 break;
			}
		}
	}

	/* search ethernet ports */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_DB_VALID != tpm_db.eth_ports[i].valid ||
		    TPM_SRC_PORT_ILLEGAL == tpm_db.eth_ports[i].port_src ||
		    TPM_SRC_PORT_WAN == tpm_db.eth_ports[i].port_src)
       		continue;

		if ((1 << tpm_db.eth_ports[i].port_src) & (trg_port >> TPM_TRG_UNI_OFFSET)){
			if (TPM_INTCON_SWITCH == tpm_db.eth_ports[i].int_connect) {
				/* port on switch, set the flag */
				trg_port_on_switch = true;
			} else if (TPM_INTCON_GMAC0 == tpm_db.eth_ports[i].int_connect){
				/* port on GMAC0 */
				gmac_vec |= TPM_PNC_TRG_GMAC0;
			} else if (TPM_INTCON_GMAC1 == tpm_db.eth_ports[i].int_connect){
				/* port on GMAC1 */
				gmac_vec |= TPM_PNC_TRG_GMAC1;
			}
		}
       }

	/* if port connected to switch, search gmac_func for the connected GMAC */
	if (true == trg_port_on_switch) {
		for (i = TPM_ENUM_GMAC_0; i < TPM_MAX_GMAC; i++) {
			if (!tpm_db_gmac_valid(i))
				continue;

			/* need only LAN ports */
			if (TPM_GMAC_FUNC_LAN == tpm_db.gmac_func[i] ||
			    TPM_GMAC_FUNC_LAN_UNI == tpm_db.gmac_func[i]){
				if (TPM_GMAC_CON_SWITCH_4 == tpm_db.gmac_port_conf[i].conn ||
				    TPM_GMAC_CON_SWITCH_5 == tpm_db.gmac_port_conf[i].conn) {
					gmac_vec |= (TPM_ENUM_GMAC_0 == i) ? TPM_PNC_TRG_GMAC0 : TPM_PNC_TRG_GMAC1;
				}
			}
		}
	}

	if (TPM_INVALID_PNC_TRG == gmac_vec)
	      	return TPM_DB_ERR_REC_NOT_EXIST;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "trg_port(%x) gmac_vec(%x)\n", trg_port, gmac_vec);
	*pnc_target = gmac_vec;
	return TPM_DB_OK;
}

/*******************************************************************************
* tpm_db_src_gmac_func_get()
*
* DESCRIPTION: returns the GMAC target for traffic to LAN according to target
*		port bitmap
* INPUTS:
* trg_port	target port bitmap
*
* OUTPUTS:
* pnc_target	gmac target
*
* RETURNS:
* On success, the function returns TPM_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_src_gmac_func_get(tpm_src_port_type_t src_port, tpm_db_gmac_func_t *gmac_func)
{
	uint32_t i;

	if (NULL == gmac_func)
		return (TPM_DB_ERR_INV_INPUT);

	*gmac_func = TPM_GMAC_FUNC_NONE;

	if (TPM_SRC_PORT_WAN == src_port){
		*gmac_func = TPM_GMAC_FUNC_WAN;
		return TPM_DB_OK;
	}

	if (TPM_SRC_PORT_UNI_VIRT == src_port){
		if (TPM_FALSE == tpm_db.func_profile.virt_uni_info.enabled)
			return TPM_DB_ERR_REC_NOT_EXIST;

		tpm_db_gmac_func_get(TPM_ENUM_GMAC_1, gmac_func);
		return TPM_DB_OK;
	}

	/* start gmac ports */
	for (i = 0; i < TPM_NUM_GMACS; i++) {
		if (TPM_FALSE == tpm_db.gmac_port_conf[i].valid)
       		continue;

		if (tpm_db.gmac_port_conf[i].port_src == src_port){
			*gmac_func = tpm_db.gmac_func[i];
       		return TPM_DB_OK;
		}
	}

	/* search switch ports */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_DB_VALID != tpm_db.eth_ports[i].valid)
       		continue;

		/* port_src found on switch */
		if (tpm_db.eth_ports[i].port_src == src_port){
       		uint32_t j;

			/* now search gmac table to find connecting port */
			for (j = 0; j < TPM_NUM_GMACS-1; j++) {
				if (TPM_FALSE == tpm_db.gmac_port_conf[j].valid)
       				continue;

				if ((TPM_SRC_PORT_ILLEGAL == tpm_db.gmac_port_conf[j].port_src) &&
				    ((TPM_GMAC_CON_SWITCH_5 == tpm_db.gmac_port_conf[j].conn) ||
				     (TPM_GMAC_CON_SWITCH_4 == tpm_db.gmac_port_conf[j].conn))){
					*gmac_func = (TPM_ENUM_GMAC_0 == i) ? tpm_db.gmac_func[0] : tpm_db.gmac_func[1];
					return TPM_DB_OK;
				}
       		}

       	}
       }

	return TPM_DB_ERR_REC_NOT_EXIST;
}

int32_t tpm_db_src_port_on_switch(tpm_src_port_type_t src_port)
{
	uint32_t i;

	/* switch ports can not act as WAN source port */
	if (TPM_SRC_PORT_WAN == src_port)
		return TPM_FALSE;

	/* start gmac ports */
	for (i = 0; i < TPM_NUM_GMACS; i++) {
		if (TPM_FALSE == tpm_db.gmac_port_conf[i].valid)
       		continue;

		if (tpm_db.gmac_port_conf[i].port_src == src_port)
			return TPM_FALSE;
	}

	/* search switch ports */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_DB_VALID != tpm_db.eth_ports[i].valid)
       		continue;

		if (tpm_db.eth_ports[i].port_src == src_port)
			return TPM_TRUE;
	}
	return TPM_FALSE;
}

/*******************************************************************************
* tpm_db_trg_port_switch_port_get()
*
* DESCRIPTION:      Function to get the target port bitmap
*
* INPUTS:
* ext_port         - External Port Identifier, can be any positive number
*
* OUTPUTS:
*
* RETURNS:
* The function returns the target ports bitmap for an external port.
* In case of no matching - it returns empty bitmap 0x0.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_trg_port_switch_port_get(tpm_trg_port_type_t ext_port)
{
	uint32_t portVec = 0;

	if (ext_port & TPM_TRG_PORT_UNI_ANY) {
		ext_port |= (TPM_TRG_UNI_0 | TPM_TRG_UNI_1 | TPM_TRG_UNI_2 | TPM_TRG_UNI_3 |
		 	    TPM_TRG_UNI_4 | TPM_TRG_UNI_5 | TPM_TRG_UNI_6 | TPM_TRG_UNI_7);

		if (tpm_db.func_profile.virt_uni_info.enabled != 0)
			ext_port |= TPM_TRG_UNI_VIRT;
	}
	if (ext_port & TPM_TRG_UNI_0)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_0);

	if (ext_port & TPM_TRG_UNI_1)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_1);

	if (ext_port & TPM_TRG_UNI_2)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_2);

	if (ext_port & TPM_TRG_UNI_3)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_3);

	if (ext_port & TPM_TRG_UNI_4)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_4);

	if (ext_port & TPM_TRG_UNI_5)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_5);

	if (ext_port & TPM_TRG_UNI_6)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_6);

	if (ext_port & TPM_TRG_UNI_7)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_7);

	if (ext_port & TPM_TRG_UNI_VIRT)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_UNI_VIRT);

	if (ext_port & TPM_TRG_PORT_CPU)
		portVec |= 1 << tpm_db_eth_port_switch_port_get(TPM_SRC_PORT_WAN);

	return (portVec);
}

/*******************************************************************************
* tpm_db_eth_port_conf_set()
*
* DESCRIPTION:      Function to set an ethernet physical and internal configuration in the DB
*
* INPUTS:
* ext_port         - External Port Identifier, can be any positive number
* other inputs     - See explanation in tpm_db_eth_port_conf_t structure
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_eth_port_conf_set(tpm_init_eth_port_conf_t *eth_port_conf)
{
	uint32_t i;
	int32_t free_entry = -1;

	if (NULL == eth_port_conf)
		return (TPM_DB_ERR_INV_INPUT);

	TPM_OS_DEBUG(TPM_DB_MOD, "src_port (%d)\n", eth_port_conf->port_src);
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		/* Check entry does not exist */
       	if ((tpm_db.eth_ports[i].port_src == eth_port_conf->port_src)
		    && (tpm_db.eth_ports[i].valid == TPM_DB_VALID))
			return (TPM_DB_ERR_REC_EXIST);

		/* Find first invalid entry */
		if ((free_entry == -1) && (tpm_db.eth_ports[i].valid == TPM_DB_INVALID))
			free_entry = i;
	}
	/* No free Entry */
	if (free_entry == -1)
		return (TPM_DB_ERR_DB_TBL_FULL);

	/* Set entry */
	tpm_db.eth_ports[free_entry].port_src = eth_port_conf->port_src;
	tpm_db.eth_ports[free_entry].int_connect = eth_port_conf->int_connect;
	tpm_db.eth_ports[free_entry].chip_connect = eth_port_conf->chip_connect;
	tpm_db.eth_ports[free_entry].switch_port = eth_port_conf->switch_port;
	tpm_db.eth_ports[free_entry].valid = TPM_DB_VALID;

	return (TPM_DB_OK);

}

int32_t tpm_db_gmac_conn_conf_set(tpm_init_gmac_conn_conf_t *gmac_port_conf, uint32_t arr_size)
{
	uint32_t i;

	if (NULL == gmac_port_conf)
		return (TPM_DB_ERR_INV_INPUT);

	for (i = 0; i < arr_size; i++) {
		TPM_OS_DEBUG(TPM_DB_MOD, "gmac src_port (%d)\n", gmac_port_conf[i].port_src);

		/* Set entry */
		tpm_db.gmac_port_conf[i].port_src = gmac_port_conf[i].port_src;
		tpm_db.gmac_port_conf[i].conn = gmac_port_conf[i].conn;
		tpm_db.gmac_port_conf[i].valid = gmac_port_conf[i].valid;
	}
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_conn_conf_get()
*
* DESCRIPTION:      Function to get GMAC connection information from DB
*
* INPUTS:
* gmac                   - GMAC port
*
* OUTPUTS:
* gmac_port_conf         - connection info
*
* RETURNS:
* On success, the function returns TPM_DB_OK.
*
*******************************************************************************/
int32_t tpm_db_gmac_conn_conf_get(tpm_gmacs_enum_t gmac, tpm_init_gmac_conn_conf_t *gmac_port_conf)
{
	if (NULL == gmac_port_conf)
		return (TPM_DB_ERR_INV_INPUT);

	memcpy(gmac_port_conf, &tpm_db.gmac_port_conf[gmac], sizeof(tpm_init_gmac_conn_conf_t));

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_tcont_llid_set()
*
* DESCRIPTION:      Function to set the GMAC connection and T-CONTs  in the DB
*
* INPUTS:
* num_tcont_llid   - Number of T-CONTs/LLIDs
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_tcont_llid_set(uint32_t num_tcont_llid)
{
	tpm_db.num_valid_tcont_llid = num_tcont_llid;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_conn_get()
*
* DESCRIPTION:      Function to get the Connection of an Ethernet GMAC
*
* INPUTS:
* gmac             - GMAC number
* OUTPUTS:
* gmac_con         - GMAC internal Physical connection (see tpm_db_gmac_conn_t)
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_conn_get(tpm_gmacs_enum_t gmac, tpm_db_gmac_conn_t *gmac_con)
{
	if (gmac == TPM_ENUM_GMAC_0)
		*gmac_con = tpm_db.gmac_port_conf[0].conn;
	else if (gmac == TPM_ENUM_GMAC_1)
		*gmac_con = tpm_db.gmac_port_conf[1].conn;
	else
		return (TPM_DB_ERR_INV_INPUT);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_mh_en_conf_set()
*
* DESCRIPTION:      Function to set the GMAC connection and T-CONTs  in the DB
*
* INPUTS:
* gmac             - GMAC
* mh_en            - MH enable TRUE/FALSE
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_mh_en_conf_set(tpm_gmacs_enum_t gmac, uint32_t mh_en)
{

	tpm_db.gmac_mh_en[gmac] = mh_en;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_mh_en_conf_get()
*
* DESCRIPTION:      Function to set the GMAC connection and T-CONTs  in the DB
*
* INPUTS:
* gmac             - GMAC
*
* OUTPUTS:
* mh_en            - MH enable TRUE/FALSE
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_mh_en_conf_get(tpm_gmacs_enum_t gmac, uint32_t *mh_en)
{

	*mh_en = tpm_db.gmac_mh_en[gmac];

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_bm_bufs_conf_set()
*
* DESCRIPTION:      Function to set the GMAC number of Buffer Mngmt large_bufers, short_buffers
*
* INPUTS:
* gmac              - GMAC
* large_pkt_buffers - number of buffers in the GMAC long packets pool
* small_pkt_buffers - number of buffers in the GMAC short packets pool
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_bm_bufs_conf_set(tpm_gmacs_enum_t gmac, uint32_t large_pkt_buffers, uint32_t small_pkt_buffers)
{
	tpm_db.gmac_bp_bufs[gmac].valid = TPM_DB_VALID;
	tpm_db.gmac_bp_bufs[gmac].large_pkt_buffers = large_pkt_buffers;
	tpm_db.gmac_bp_bufs[gmac].small_pkt_buffers = small_pkt_buffers;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_bm_bufs_conf_get()
*
* DESCRIPTION:      Function to set the GMAC number of Buffer Mngmt large_bufers, short_buffers
*
* INPUTS:
* gmac              - GMAC
* valid             - Is the entry valid in the db
* large_pkt_buffers - number of buffers in the GMAC long packets pool
* small_pkt_buffers - number of buffers in the GMAC short packets pool
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_bm_bufs_conf_get(tpm_gmacs_enum_t gmac,
				     uint32_t *valid, uint32_t *large_pkt_buffers, uint32_t *small_pkt_buffers)
{
	if ((valid == NULL) || (gmac >= TPM_MAX_NUM_GMACS))
		return (TPM_DB_ERR_INV_INPUT);
	*valid = (tpm_db.gmac_bp_bufs[gmac].valid == TPM_DB_VALID ? 1 : 0);

	if (large_pkt_buffers != NULL)
		*large_pkt_buffers = tpm_db.gmac_bp_bufs[gmac].large_pkt_buffers;

	if (small_pkt_buffers != NULL)
		*small_pkt_buffers = tpm_db.gmac_bp_bufs[gmac].small_pkt_buffers;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_intport_int_con_get()
*
* DESCRIPTION:      Function returns internal connectivity of an internal port num
*
* INPUTS:
* int_port_num     - Internal Port Identifier, UNI#0..UNI#4 or WAN Port
*
* OUTPUTS:
* int_con          - Port internal L2 Connection (G0, G1, Amber switch)
* switch_port      - Amber Switch Port number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_intport_int_con_get(tpm_src_port_type_t int_port_num,
				   tpm_db_int_conn_t	*int_con,
				   uint32_t		*switch_port)
{
	int32_t ret_code;
	tpm_db_chip_conn_t dummy_chip_con;
	tpm_db_int_conn_t l_int_conn;
	uint32_t l_switch_port;

	if (int_port_num == TPM_SRC_PORT_UNI_VIRT) {
		*int_con = TPM_INTCON_SWITCH;
		*switch_port = tpm_db.func_profile.virt_uni_info.switch_port;
		return (TPM_DB_OK);
	}

	/* Get External Port Config */
	ret_code = tpm_db_eth_port_conf_get(int_port_num,
					    &dummy_chip_con,
					    &l_int_conn,
					    &l_switch_port);
	IF_ERROR(ret_code);

	/* Return data */
	*int_con = l_int_conn;
	*switch_port = l_switch_port;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_num_tcont_llid_get()
*
* DESCRIPTION:      Function to get the number of T-CONTs/LLIDs
*
* INPUTS:
* OUTPUTS:
* num_tcont_llid   - Number of GPON TCONTs or EPON LLIDs
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
*
*******************************************************************************/
int32_t tpm_db_num_tcont_llid_get(uint32_t *num_tcont_llid)
{
	*num_tcont_llid = tpm_db.num_valid_tcont_llid;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_tx_q_conf_set()
*
* DESCRIPTION:      Function to set the parameters of a Packet Processor Component Tx queue
*
* INPUTS:
* tx_mod           - Tx module (G0, G1, or TCONT/LLID0-7)
* OUTPUTS:
* gmac_con         - GMAC0 connection
* queue_num        - Queue number in this Tx
* sched_method     - The Tx Scheduler this queue is added to (the WRR or the Strict scheduler)
* queue_owner      - The single hardware owner, that is feeding this queue.
*                    Can be the CPU, or one of the PAcket Processor Rx components.
* owner_queue_num  - The relative queue number of the owner of this queue.
* queue_weight     - Weight, if the queue is added to the WRR Scheduler.
* queue_size       -
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_tx_q_conf_set(tpm_db_tx_mod_t tx_mod,
				  uint32_t queue_num,
				  tpm_db_sched_t sched_method,
				  tpm_db_txq_owner_t queue_owner,
				  uint32_t owner_queue_num, uint32_t queue_size, uint32_t queue_weight)
{
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_owner = queue_owner;
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].owner_queue_num = owner_queue_num;
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].sched_method = sched_method;
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_size = queue_size;
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_weight = queue_weight;
	tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].valid = TPM_DB_VALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_tx_q_conf_get()
*
* DESCRIPTION:      Function to set the parameters of a Packet Processor Tx Component
*
* INPUTS:
* tx_mod           - Tx module (G0, G1, or TCONT/LLID0-7)
* queue_num        - Queue number in this Tx
*
* OUTPUTS:
* valid             - Queue exists
* sched_method     - The Tx Scheduler this queue is added to (the WRR or the Strict scheduler)
* queue_owner      - The single hardware owner, that is feeding this queue.
*                    Can be the CPU, or one of the PAcket Processor Rx components.
* owner_queue_num  - The relative queue number of the owner of this queue.
* queue_weight     - Weight, if the queue is added to the WRR Scheduler.
* queue_size       -
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_tx_q_conf_get(tpm_db_tx_mod_t tx_mod,
				  uint32_t queue_num,
				  uint32_t *valid,
				  tpm_db_sched_t *sched_method,
				  tpm_db_txq_owner_t *queue_owner,
				  uint32_t *owner_queue_num, uint32_t *queue_size, uint32_t *queue_weight)
{
	if (valid == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if (tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].valid == TPM_DB_VALID) {
		*valid = TPM_TRUE;
		if (sched_method != NULL)
			*sched_method = tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].sched_method;
		if (queue_owner != NULL)
			*queue_owner = tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_owner;
		if (owner_queue_num != NULL)
			*owner_queue_num = tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].owner_queue_num;
		if (queue_size != NULL)
			*queue_size = tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_size;
		if (queue_weight != NULL)
			*queue_weight = tpm_db.gmac_tx[tx_mod].tx_queue[queue_num].queue_weight;
	} else {
		*valid = TPM_FALSE;
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_rx_q_conf_set()
*
* DESCRIPTION:      Function to set the parameters of a Packet Processor Tx Component
*
* INPUTS:
* gmac             - GMAC
* OUTPUTS:
* queue_num        - Queue number in this Tx
* queue_size       -
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_rx_q_conf_set(tpm_gmacs_enum_t gmac, uint32_t queue_num, uint32_t queue_size)
{
	if ((gmac >= TPM_MAX_NUM_GMACS) || (queue_num >= TPM_MAX_NUM_RX_QUEUE))
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.gmac_rx[gmac].rx_queue[queue_num].queue_size = queue_size;
	tpm_db.gmac_rx[gmac].rx_queue[queue_num].valid = TPM_DB_VALID;

	return (TPM_DB_OK);
}

int32_t tpm_db_gmac_rx_q_conf_get(tpm_gmacs_enum_t gmac, uint32_t queue_num, uint32_t *valid, uint32_t *queue_size)
{

	if ((valid == NULL) || (gmac >= TPM_MAX_NUM_GMACS) || (queue_num >= TPM_MAX_NUM_RX_QUEUE))
		return (TPM_DB_ERR_INV_INPUT);

	if (tpm_db.gmac_rx[gmac].rx_queue[queue_num].valid == TPM_DB_VALID) {
		*valid = TPM_TRUE;
		if (queue_size != NULL)
			*queue_size = tpm_db.gmac_rx[gmac].rx_queue[queue_num].queue_size;
	} else
		*valid = TPM_FALSE;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_tx_val_set()
*
* DESCRIPTION:      Function to set the parameters of a Tx module
*
* INPUTS:
* tx_mod           - Tx Module to validate
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_tx_val_set(tpm_db_tx_mod_t tx_mod)
{
	tpm_db.gmac_tx[tx_mod].valid = TPM_DB_VALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_rx_val_set()
*
* DESCRIPTION:      Function to set the parameters of a Tx module
*
* INPUTS:
* gmac           - GMAC to set active
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_rx_val_set(tpm_gmacs_enum_t gmac)
{
	tpm_db.gmac_rx[gmac].valid = TPM_DB_VALID;

	return (TPM_DB_OK);
}

uint32_t tpm_db_gmac_rx_val_get(tpm_gmacs_enum_t gmac)
{
	if (tpm_db.gmac_rx[gmac].valid == TPM_DB_VALID)
		return (TPM_TRUE);
	else
		return (TPM_FALSE);
}

/*******************************************************************************
* tpm_db_gmac_func_get()
*
* DESCRIPTION:      Check the Function of a GMAC (LAN, WAN or no function)
*
* INPUTS:
* gmac              - GMAC to check
* OUTPUTS:
* gfunc             - Functionality the GMAC is performing (None, LAN or WAN)
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_func_get(tpm_gmacs_enum_t gmac, tpm_db_gmac_func_t *gfunc)
{
	if (gmac > TPM_MAX_GMAC)
		return (TPM_DB_ERR_INV_INPUT);

	*gfunc = tpm_db.gmac_func[gmac];

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_func_set()
*
* DESCRIPTION:      Sets the Function of a GMAC (LAN, WAN or no function)
*
* INPUTS:
* gmac              - GMAC to set
* gfunc             - Functionality the GMAC is performing (None, LAN or WAN)
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_gmac_func_set(tpm_gmacs_enum_t gmac, tpm_db_gmac_func_t gfunc)
{
	if (gmac > TPM_MAX_GMAC)
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.gmac_func[gmac] = gfunc;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_tx_val_get()
*
* DESCRIPTION:      Function check the validity of a Tx module
*
* INPUTS:
* tx_mod           - Tx module to check
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
uint32_t tpm_db_gmac_tx_val_get(tpm_db_tx_mod_t tx_mod)
{
	if (tpm_db.gmac_tx[tx_mod].valid == TPM_DB_VALID)
		return (TPM_TRUE);
	else
		return (TPM_FALSE);
}

/*******************************************************************************
* tpm_db_gmac_lpk_queue_get()
*
* DESCRIPTION:      Function to get the queue id used to do gmac loopback on MC, min queue id for data traffic,
*                   max queue id for MAC learning
* INPUTS:
* queue_type     - queue type for GMAC1 loopback, for data traffic or for MAC learning
* OUTPUTS:
* gmac           - gmac on which loopback is done
* queue_idx      - queue index which do loopback
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*******************************************************************************/
uint32_t tpm_db_gmac_lpk_queue_get(tpm_gmacs_enum_t *gmac,
				   uint32_t *queue_idx,
				   tpm_db_gmac1_lpk_queue_type_t queue_type)
{
	uint32_t queue_id, q_valid, gmac_id;
	tpm_db_txq_owner_t queue_owner, lpk_queue_owner = TPM_Q_OWNER_GMAC0;
	tpm_db_gmac_func_t lpk_gmac_func;
	tpm_db_tx_mod_t tx_mod;
	uint32_t q_expected = TPM_MAX_NUM_TX_QUEUE;

	/*check input parameters*/
	if (NULL == gmac || NULL == queue_idx) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input \n");
		return TPM_DB_ERR_INV_INPUT;
	}

	/*check func profile*/
	if (!tpm_db_gmac1_lpbk_en_get()) {
		TPM_OS_ERROR(TPM_DB_MOD, "GMAC1 loopback has not been enabled!\n");
		return TPM_FALSE;
	}

	/*Find the GMAC used to do loopback*/
	for (gmac_id = TPM_ENUM_GMAC_0; gmac_id < TPM_MAX_NUM_GMACS; gmac_id ++) {
		if (TPM_DB_OK == tpm_db_gmac_func_get(gmac_id, &lpk_gmac_func)) {
			if (TPM_GMAC_FUNC_LAN == lpk_gmac_func)
				break;
		} else {
			continue;
		}
	}

	if (gmac_id == TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Loopback GMAC get failed \n");
		return TPM_FALSE;
	} else {
		tx_mod = (tpm_db_tx_mod_t)gmac_id;
		lpk_queue_owner = TPM_Q_OWNER_GMAC0;
	}

	/* get the Tx queue of GMAC1, if more than 1 queue belong to gmac0, lowest index is selected */
	for (queue_id = 0; queue_id < TPM_MAX_NUM_TX_QUEUE; queue_id++) {
		if (TPM_DB_OK != tpm_db_gmac_tx_q_conf_get(tx_mod, queue_id, &q_valid, NULL,
							   &queue_owner, NULL, NULL, NULL))
			continue;
		if (q_valid == TPM_TRUE && queue_owner == lpk_queue_owner) {
			q_expected = queue_id;
			if (TPM_GMAC1_QUEUE_DATA_TRAFFIC == queue_type)
				break;
			else if (TPM_GMAC1_QUEUE_MAC_LEARN_TRAFFIC == queue_type)
				continue;
		}
	}
	if (q_expected >= TPM_MAX_NUM_TX_QUEUE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid Tx queue %d of GMAC1 assigned to GMAC0 \n", q_expected);
		return ERR_SW_TM_QUEUE_INVALID;
	}

	*gmac = gmac_id;
	*queue_idx = q_expected;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_rng_create()
*
* DESCRIPTION:      Function to create a range in the DB
*
* INPUTS:
* pnc_range_conf      - Pointer to all config information needed for an entry
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:  Perfom only DB integrity checks, not data correctness checks
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_create(tpm_db_pnc_range_conf_t *pnc_range_conf)
{
	uint32_t i;
	int32_t free_entry = -1;

	/* Check NULL Pointer */
	if (pnc_range_conf == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	/* Check range_id is not already in DB, and that DB is not full */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID && PNC_RANGE_CONF(i).range_id == pnc_range_conf->range_id)
			return (TPM_DB_ERR_RANGE_EXIST);

		if ((tpm_db.pnc_range[i].valid == TPM_DB_INVALID) && (free_entry == -1))
			free_entry = i;
	}
	if (free_entry == -1)
		return (TPM_DB_ERR_DB_TBL_FULL);

	/* Copy Config Structure into DB */
	memcpy(&(tpm_db.pnc_range[free_entry].pnc_range_conf), pnc_range_conf, sizeof(tpm_db_pnc_range_conf_t));

	/* Init Operational Data */
	PNC_RANGE_OPER(free_entry).free_entries = (pnc_range_conf->api_end - pnc_range_conf->api_start + 1);
	PNC_RANGE_OPER(free_entry).num_resets = 0;

	tpm_db.pnc_range[free_entry].valid = TPM_DB_VALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_rng_delete()
*
* DESCRIPTION:      Initializes and invalidates PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range that is deleted
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_delete(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		/* Reset Operational values */
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID &&
		    tpm_db.pnc_range[i].pnc_range_conf.range_id == pnc_range) {
			memset(&(tpm_db.pnc_range[i]), 0, sizeof(tpm_pnc_ranges_t));
			tpm_db.pnc_range[i].valid = TPM_DB_INVALID;
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_reset()
*
* DESCRIPTION:      Resets PnC range, all entries are returned to free
*
* INPUTS:
* pnc_range         - The id of the pnc range that is reset
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_reset(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		/* reach the range to be reset */
		if (tpm_db.pnc_range[i].pnc_range_conf.range_id == pnc_range) {
			/* Reset Operational values */
			if (tpm_db.pnc_range[i].valid == TPM_DB_VALID) {
				/* both hardcoded and non-hardcoded entries will behave the same from free_entries point of view */
				PNC_RANGE_OPER(i).free_entries =
					PNC_RANGE_CONF(i).api_end - PNC_RANGE_CONF(i).api_start + 1;
				(PNC_RANGE_OPER(i).num_resets)++;
				return (TPM_DB_OK);
			}
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_free_ent_inc()
*
* DESCRIPTION:      Increases number of free entries for a PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range that it's free entries is increased
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_free_ent_inc(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == pnc_range) {
			/* Check number of free entries is not too big */
			if (PNC_RANGE_OPER(i).free_entries
			    < (PNC_RANGE_CONF(i).api_end - PNC_RANGE_CONF(i).api_start + 1)) {
				(PNC_RANGE_OPER(i).free_entries)++;
				return (TPM_DB_OK);
			} else
				return (TPM_DB_ERR_DB_INCONSISTENCY);
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_free_ent_dec()
*
* DESCRIPTION:      Decreases number of free entries for a PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range that it's free entries is decreased
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_free_ent_dec(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID && PNC_RANGE_CONF(i).range_id == pnc_range) {
			TPM_OS_DEBUG(TPM_DB_MOD, "range_id(%d), free_ent(%d)\n", pnc_range,
				     PNC_RANGE_OPER(i).free_entries);
			/* Check number of free entries is not zero */
			if (PNC_RANGE_OPER(i).free_entries > 0) {
				(PNC_RANGE_OPER(i).free_entries)--;
				return (TPM_DB_OK);
			} else {
				TPM_OS_ERROR(TPM_DB_MOD, "no free entries \n");
				return (TPM_DB_ERR_DB_INCONSISTENCY);
			}
		}
	}
	/* pnc_range not found */
	TPM_OS_ERROR(TPM_DB_MOD, "range_id(%d) not found\n", pnc_range);
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_get_lu_conf()
*
* DESCRIPTION:      Get PnC least used config for specific PnC range
*
* INPUTS:
* range_id         - The PnC range id
*
* OUTPUTS:
* lu_conf          - Least used configuration for PnC range

*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_get_lu_conf(tpm_pnc_ranges_t range_id, tpm_api_lu_conf_t *lu_conf)
{
	tpm_pnc_ranges_t l_range_idx;

	/* Check PnC range */
	if ((range_id < 0) || (range_id > (TPM_MAX_NUM_RANGES - 1))) {
		TPM_OS_ERROR(TPM_DB_MOD, "Error, range_id(%d) is illegal \n", range_id);
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Check input param */
	if (lu_conf == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Error, lu_conf is NULL \n");
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Get the config from TPM db */
	for (l_range_idx = 0; l_range_idx < TPM_MAX_RANGE; l_range_idx++) {
		if (tpm_db.pnc_range[l_range_idx].valid == TPM_DB_VALID
				&& (PNC_RANGE_CONF(l_range_idx).range_id == range_id)) {
			lu_conf->cntr_grp    = tpm_db.pnc_range[l_range_idx].pnc_range_conf.cntr_grp;
			lu_conf->lu_mask     = tpm_db.pnc_range[l_range_idx].pnc_range_conf.lu_mask;
			break;
		}
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_rng_api_start_inc()
*
* DESCRIPTION:      Increases number of free entries for a PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range that it's free entries is increased
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_api_start_inc(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == pnc_range) {
			/* Check number of free entries is not too big */
			if (PNC_RANGE_OPER(i).free_entries >= 1) {
				(PNC_RANGE_CONF(i).api_start)++;
				(PNC_RANGE_OPER(i).free_entries)--;
				return (TPM_DB_OK);
			} else
				return (TPM_DB_ERR_DB_INCONSISTENCY);
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_api_end_dec()
*
* DESCRIPTION:      Decrease number of api_end for a PnC range
*                   The reason might be addition of an entry at the end of the range.
*
* INPUTS:
* pnc_range         - The id of the pnc range that it's free entries is increased
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_api_end_dec(tpm_pnc_ranges_t pnc_range)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == pnc_range) {
			/* Check number of free entries is not too big */
			if (PNC_RANGE_OPER(i).free_entries >= 1) {
				(PNC_RANGE_CONF(i).api_end)--;
				(PNC_RANGE_OPER(i).free_entries)--;
				return (TPM_DB_OK);
			} else
				return (TPM_DB_ERR_DB_INCONSISTENCY);
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

int32_t tpm_db_api_section_get_from_api_type(tpm_api_type_t api_type, tpm_api_sections_t *api_section)
{
	int32_t error_code = TPM_DB_OK;

	/*TODO - replace this w/ conf structure */

	switch (api_type) {
	case TPM_API_MAC_LEARN:
		*api_section = TPM_PNC_MAC_LEARN_ACL;
		break;
	case TPM_API_CPU_LOOPBACK:
		*api_section = TPM_CPU_LOOPBACK_ACL;
		break;
	case TPM_API_DS_LOAD_BALANCE:
		*api_section = TPM_DS_LOAD_BALANCE_ACL;
		break;
	case TPM_API_L2_PRIM:
		*api_section = TPM_L2_PRIM_ACL;
		break;
	case TPM_API_L3_TYPE:
		*api_section = TPM_L3_TYPE_ACL;
		break;
	case TPM_API_IPV4:
		*api_section = TPM_IPV4_ACL;
		break;
	case TPM_API_IPV4_MC:
		*api_section = TPM_IPV4_MC;
		break;
	case TPM_API_IPV6_GEN:
		*api_section = TPM_IPV6_GEN_ACL;
		break;
	case TPM_API_IPV6_MC:
		*api_section = TPM_IPV6_MC_ACL;
		break;
	case TPM_API_IPV6_DIP:
		*api_section = TPM_IPV6_DIP_ACL;
		break;
	case TPM_API_IPV6_NH:
		*api_section = TPM_IPV6_NH_ACL;
		break;
	case TPM_API_IPV6_L4:
		*api_section = TPM_L4_ACL;
		break;
	case TPM_API_CNM:
		*api_section = TPM_CNM_MAIN_ACL;
		break;
	default:
		error_code = TPM_DB_ERR_REC_NOT_EXIST;
	}

	return (error_code);
}


int32_t tpm_db_api_type_get_from_api_section(tpm_api_sections_t api_section, tpm_api_type_t *api_type)
{
	int32_t error_code = TPM_DB_OK;

	/*TODO - replace this w/ conf structure */

	switch (api_section) {
	case TPM_PNC_MAC_LEARN_ACL:
		*api_type = TPM_API_MAC_LEARN;
		break;
	case TPM_CPU_LOOPBACK_ACL:
		*api_type = TPM_API_CPU_LOOPBACK;
		break;
	case TPM_DS_LOAD_BALANCE_ACL:
		*api_type = TPM_API_DS_LOAD_BALANCE;
		break;
	case TPM_L2_PRIM_ACL:
		*api_type = TPM_API_L2_PRIM;
		break;
	case TPM_L3_TYPE_ACL:
		*api_type = TPM_API_L3_TYPE;
		break;
	case TPM_IPV4_ACL:
		*api_type = TPM_API_IPV4;
		break;
	case TPM_IPV4_MC:
		*api_type = TPM_API_IPV4_MC;
		break;
	case TPM_IPV6_GEN_ACL:
		*api_type = TPM_API_IPV6_GEN;
		break;
	case TPM_IPV6_DIP_ACL:
		*api_type = TPM_API_IPV6_DIP;
		break;
	case TPM_IPV6_NH_ACL:
		*api_type = TPM_API_IPV6_NH;
		break;
	case TPM_L4_ACL:
		*api_type = TPM_API_IPV6_L4;
		break;
	default:
		error_code = TPM_DB_ERR_REC_NOT_EXIST;
	}

	return (error_code);
}

/*******************************************************************************
* tpm_db_pnc_rng_get()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range to get data for

* OUTPUTS:
* range_data       - Returned DB structure of returned entry.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_get(tpm_pnc_ranges_t pnc_range, tpm_db_pnc_range_t *range_data)
{
	uint32_t i;

	if ((pnc_range < 0) || (pnc_range > (TPM_MAX_NUM_RANGES - 1)))
		return (TPM_DB_ERR_INV_INPUT);

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID && PNC_RANGE_CONF(i).range_id == pnc_range) {
			memcpy(range_data, &(tpm_db.pnc_range[i]), sizeof(tpm_db_pnc_range_t));
			return (TPM_DB_OK);
		}
	}

	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_get_range_start_end()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* pnc_range         - The id of the pnc range to get data for

* OUTPUTS:
* range_start      - Returned the start of specific PnC range.
* range_end        - Returned the end of specific PnC range.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_get_range_start_end(tpm_pnc_ranges_t pnc_range, uint32_t *range_start, uint32_t *range_end)
{
	uint32_t i;

	if ((pnc_range < 0) || (pnc_range > (TPM_MAX_NUM_RANGES - 1)))
		return(TPM_DB_ERR_INV_INPUT);

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if ((tpm_db.pnc_range[i].valid == TPM_DB_VALID)
				&& (PNC_RANGE_CONF(i).range_id == pnc_range)) {
			*range_start = PNC_RANGE_CONF(i).range_start + PNC_RANGE_CONF(i).api_start;
			*range_end   = PNC_RANGE_CONF(i).range_end;
			return(TPM_DB_OK);
		}
	}

	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_tbl_val_get_next()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* cur_ind          - The current index (handle) to the pnc_range table. Function returns the next valid
*                    pnc range  entry > cur_index. cur_index < 0 indicates to return first valid entry in table,
*                    valid next_ind values are 0 or higher
* OUTPUTS:
* next_ind         - See cur_ind. If end of table was reached before valid entry, (-1) is returned in next_ind
* range_data       - Returned DB structure of returned entry. When entry is invalid, range_data filled with zero.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_tbl_val_get_next(int32_t cur_ind, int32_t *next_ind, tpm_db_pnc_range_t *range_data)
{
	int32_t i;

	/* Initialize first next_ind */
	if (cur_ind < 0)
		i = 0;
	else
		i = cur_ind + 1;

	/* Check PnC range exists in DB */
	for (; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID) {
			/* Return Data Structure */
			memcpy(range_data, &(tpm_db.pnc_range[i]), sizeof(tpm_db_pnc_range_t));
			*next_ind = i;
			return (TPM_DB_OK);
		}
	}
	*next_ind = -1;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_pnc_rng_val_get_next()
*
* DESCRIPTION:      Returns DB info of the next valid PnC range.
*                   Similar to "tpm_db_pnc_rng_tbl_val_get_next", but the handle is the range_id, not the table_index.
*
* INPUTS:
* cur_range        - The current pnc_range  in  the pnc_range table. Function returns the next valid
*                    pnc_range  > cur_range. cur_range < 0 indicates to return first valid entry in table,
*                    valid next_ind values are 0 or higher
* OUTPUTS:
* next_range       - See cur_range. If end of table was reached before valid entry, (-1) is returned in next_range
* range_data       - Returned DB structure of returned entry. When entry is invalid, range_data filled with zero.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_val_get_next(tpm_pnc_ranges_t cur_range,
				    tpm_pnc_ranges_t *next_range, tpm_db_pnc_range_t *range_data)
{
	uint32_t i;
	uint32_t l_min_index = 0;	/* oren - add init value, need to check */
	tpm_pnc_ranges_t l_min_range = TPM_MAX_RANGE + 1;

	/* Check  smallest valid next_PnC range in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		/*printf("i(%d) valid(%x) range_id(%d), cur_range(%d) l_min_range(%d)\n",
		   i,tpm_db.pnc_range[i].valid, PNC_RANGE_CONF(i).range_id, cur_range,l_min_range); */
		if ((tpm_db.pnc_range[i].valid == TPM_DB_VALID) && (PNC_RANGE_CONF(i).range_id > cur_range)
		    && (PNC_RANGE_CONF(i).range_id < l_min_range)) {
			l_min_range = PNC_RANGE_CONF(i).range_id;
			l_min_index = i;
		}
	}
	if (l_min_range <= TPM_MAX_RANGE) {
		/* Return Data Structure */
		memcpy(range_data, &(tpm_db.pnc_range[l_min_index]), sizeof(tpm_db_pnc_range_t));
		*next_range = l_min_range;
		return (TPM_DB_OK);
	}

	/* No valid next range found */
	*next_range = -1;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_rng_conf_get()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* range_id         - Range number to retrieve configuration for

* OUTPUTS:
* range_conf       - Structure for pnc_range Configuration Info
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_conf_get(tpm_pnc_ranges_t range_id, tpm_db_pnc_range_conf_t *range_conf)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == range_id) {
			/* Return Data Structure */
			memcpy(range_conf, &(tpm_db.pnc_range[i].pnc_range_conf), sizeof(tpm_db_pnc_range_conf_t));
			return (TPM_DB_OK);
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_oper_get()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* range_id         - Range number to retrieve configuration for

* OUTPUTS:
* range_oper       - Structure for pnc_range Operational Info
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_oper_get(tpm_pnc_ranges_t range_id, tpm_db_pnc_range_oper_t *range_oper)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == range_id) {
			/* Return Data Structure */
			memcpy(range_oper, &(tpm_db.pnc_range[i].pnc_range_oper), sizeof(tpm_db_pnc_range_oper_t));
			return (TPM_DB_OK);
		}
	}
	/* pnc_range not found */
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_pnc_rng_free_ent_get()
*
* DESCRIPTION:      Returns number of free entries of PnC range
*
* INPUTS:
* range_id         - Range number to retrieve number of free entries

* OUTPUTS:
* free_entries      - Number of free entries in Table
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_rng_free_ent_get(tpm_pnc_ranges_t range_id, uint32_t *free_entries)
{
	uint32_t i;

	/* Check PnC range exists in DB */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
		if (tpm_db.pnc_range[i].valid == TPM_DB_VALID
		    && tpm_db.pnc_range[i].pnc_range_conf.range_id == range_id) {
			/* Return Free Entries */
			*free_entries = PNC_RANGE_OPER(i).free_entries;
			return (TPM_DB_OK);
		}
	}
	/* pnc_range not found */
	*free_entries = 0;
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_owner_set()
*
* DESCRIPTION:      Creates an owner_id in the DB.
*
* INPUTS:
* owner_id         - Id of new owner

* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_owner_set(uint32_t owner_id)
{
	uint32_t i;
	int32_t free_ind = -1;

	/* Check owner was not already set */
	for (i = 0; i < TPM_MAX_API_TYPES; i++) {
		if ((tpm_db.owners[i].valid == TPM_DB_VALID) && (tpm_db.owners[i].owner_id == owner_id))
			return (TPM_DB_ERR_REC_EXIST);
		if ((free_ind == -1) && (tpm_db.owners[i].valid == TPM_DB_INVALID))
			free_ind = i;
	}
	if (free_ind == -1)
		return (TPM_DB_ERR_DB_TBL_FULL);

	/* Set on first free index */
	tpm_db.owners[free_ind].valid = TPM_DB_VALID;
	tpm_db.owners[free_ind].owner_id = owner_id;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_owner_get_next()
*
* DESCRIPTION:      Returns DB info of PnC range
*
* INPUTS:
* cur_ind          - The current index (handle) to the owner table. Function returns the next
*                    valid table entry > cur_index. cur_index < 0 indicates to return first valid entry in table,
*                    valid next_ind values are 0 or higher.
* OUTPUTS:
* next_ind         - See cur_ind. If end of table was reached before valid entry, (-1) is returned in next_ind
* owner            - Returns the owner of the next index.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t. No more owners is not considered error.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_owner_get_next(int32_t cur_ind, int32_t *next_ind, uint32_t *owner)
{
	uint32_t i;

	/* Initialize first next_ind */
	if (cur_ind < 0)
		i = 0;
	else
		i = cur_ind + 1;

	/* Check owner exists in DB */
	for (; i < TPM_MAX_API_TYPES; i++) {
		if (tpm_db.owners[i].valid == TPM_DB_VALID) {	/* oren - changed = to ==, need to check */
			/* Return Data Structure */
			*next_ind = i;
			*owner = tpm_db.owners[i].owner_id;
			return (TPM_DB_OK);
		}
	}
	/* No valid entry found */
	*next_ind = -1;

	return (TPM_DB_OK);
}

#if 0
/*******************************************************************************
* tpm_db_apig_set()
*
* DESCRIPTION:      Creates an API Group in the DB.
*
* INPUTS:
* owner_id         - owner of the API Group
* api_type        - API Group being created

* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/

int32_t tpm_db_apig_set(uint32_t owner_id, tpm_api_type_t api_type)
{
	uint32_t i;

	/* Check owner exists */
	for (i = 0; i < TPM_MAX_API_TYPES; i++) {
		if ((tpm_db.owners[i].valid == TPM_DB_VALID) && (tpm_db.owners[i].owner_id == owner_id))
			break;
	}
	if (i == TPM_MAX_API_TYPES)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	/* Check api_type does not exist */
	if (tpm_db.api_groups[api_type].valid == TPM_DB_VALID)
		return (TPM_DB_ERR_REC_EXIST);

	tpm_db.api_groups[api_type].valid = TPM_DB_VALID;
	tpm_db.api_groups[api_type].api_owner_id = owner_id;
	tpm_db.api_groups[api_type].api_type = api_type;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_apig_get_next()
*
* DESCRIPTION:      Returns DB info of API Group
*
* INPUTS:
* cur_ind          - The current index (handle) to the owner table. Function returns the next
*                    valid table entry > cur_index. cur_index < 0 indicates to return first valid entry in table,
*                    valid next_ind values are 0 or higher.
* OUTPUTS:
* next_ind         - See cur_ind. If end of table was reached before valid entry, (-1) is returned in next_ind
* api_type         - Returns the API Group.
* owner            - Returns the owner of the API Group.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_apig_get_next(int32_t cur_ind, int32_t *next_ind, uint32_t *owner, tpm_api_type_t *api_type)
{
	uint32_t i;

	/* Initialize first next_ind */
	if (cur_ind < 0)
		i = 0;
	else
		i = cur_ind + 1;

	/* Check API Group exists in DB */
	for (; i < TPM_MAX_API_TYPES; i++) {
		if (tpm_db.api_groups[i].valid == TPM_DB_VALID) {
			/* Return Data  */
			*next_ind = i;
			*api_type = tpm_db.api_groups[i].api_type;
			*owner = tpm_db.api_groups[i].api_owner_id;
			return (TPM_DB_OK);
		}
	}
	/* No valid entry found */
	*next_ind = -1;
	return (TPM_DB_OK);
}
#endif

/*******************************************************************************
* tpm_db_igmp_set_port_frwd_mode()
*
* DESCRIPTION:      Set the IGMP status of a UNI port or WAN port
*
* INPUTS:
* src_port          - source port to set
* igmp_state       - how to process IGMP packets
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_set_port_frwd_mode(uint32_t port, uint32_t mode)
{
	tpm_db.igmp_def.frwd_mode[port] = mode;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_igmp_get_port_frwd_mode()
*
* DESCRIPTION:      Get the IGMP status of a UNI port or WAN port
*
* INPUTS:
* src_port          - source port to get
*
* OUTPUTS:
* igmp_state       - how to process IGMP packets
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_get_port_frwd_mode(uint32_t port, uint32_t *mode)
{
	*mode = tpm_db.igmp_def.frwd_mode[port];
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_igmp_set_cpu_queue()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_set_cpu_queue(uint32_t queue)
{
	tpm_db.igmp_def.cpu_queue = queue;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_igmp_get_cpu_queue()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_get_cpu_queue(uint32_t *queue)
{
	*queue = tpm_db.igmp_def.cpu_queue;
	return (TPM_DB_OK);
}


/*******************************************************************************
* tpm_db_igmp_set_snoop_enable()
*
* DESCRIPTION:      Set IGMP snoop enable
*
* INPUTS:
* igmp_snoop_enable       - IGMP snoop enable
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_set_snoop_enable(uint32_t igmp_snoop_enable)
{
	tpm_db.igmp_def.igmp_snoop_enable = igmp_snoop_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_igmp_get_snoop_enable()
*
* DESCRIPTION:      Get IGMP snoop enable
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop_enable       - IGMP snoop enable
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_igmp_get_snoop_enable(uint32_t *igmp_snoop_enable)
{
	*igmp_snoop_enable = tpm_db.igmp_def.igmp_snoop_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_type_set()
*
* DESCRIPTION:      Set OMCI ethertype
*
* INPUTS:
* omci_etype       - OMCI Ethertype
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_omci_type_set(uint32_t omci_etype)
{
	tpm_db.init_misc.omci_etype = omci_etype;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_type_get()
*
* DESCRIPTION:      Get OMCI ethertype
*
* OUTPUTS:
* omci_etype       - OMCI Ethertype
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_omci_type_get(uint32_t *omci_etype)
{
	*omci_etype = tpm_db.init_misc.omci_etype;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_channel_set()
*
* DESCRIPTION:      Set OMCI channel parameters
*
* INPUTS:
* gemport       - OMCI GEM port ID
* cpu_rx_q      - OMCI cpu rx queue
* cpu_tx_q      - OMCI cpu tx queue
* tcont_id      - OMCI tcont ID
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_omci_channel_set(uint16_t gemport, uint32_t cpu_rx_q, uint32_t cpu_tx_q, uint32_t tcont_id)
{
	tpm_db.init_misc.omci_gemport = gemport;
	tpm_db.init_misc.oam_cpu_rx_q = cpu_rx_q;
	tpm_db.init_misc.oam_cpu_tx_q = cpu_tx_q;
	tpm_db.init_misc.oam_cpu_tx_port = tcont_id;
	tpm_db.init_misc.oam_channel_configured = 1;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_channel_remove()
*
* DESCRIPTION:      Remove OMCI channel parameters
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_omci_channel_remove(void)
{
	tpm_db.init_misc.omci_gemport = 0;
	tpm_db.init_misc.oam_cpu_rx_q = 0;
	tpm_db.init_misc.oam_cpu_tx_q = 0;
	tpm_db.init_misc.oam_cpu_tx_port = 0;
	tpm_db.init_misc.oam_channel_configured = 0;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_oam_loopback_state_get()
*
* DESCRIPTION:      Get OAM loopback configure state
*
* OUTPUTS:
* omci_etype       - OMCI Ethertype
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_loopback_state_get(uint32_t *loopback)
{
	*loopback = tpm_db.init_misc.oam_loopback_channel_configured;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_oam_loopback_channel_set()
*
* DESCRIPTION:      Set OAM loopback channel state
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_loopback_channel_set(void)
{
	tpm_db.init_misc.oam_loopback_channel_configured = 1;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_channel_remove()
*
* DESCRIPTION:      Remove OMCI channel parameters
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_loopback_channel_remove(void)
{
	tpm_db.init_misc.oam_loopback_channel_configured = 0;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_omci_channel_get()
*
* DESCRIPTION:      Get OMCI channel parameters
*
* INPUTS:
* gemport       - OMCI GEM port ID
* cpu_rx_q      - OMCI cpu rx queue
* cpu_tx_q      - OMCI cpu tx queue
* tcont_id      - OMCI tcont ID
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_omci_channel_get(uint32_t *valid, uint16_t *gemport, uint32_t *cpu_rx_q, uint32_t *cpu_tx_q,
				uint32_t *tcont_id)
{
	*gemport = tpm_db.init_misc.omci_gemport;
	*cpu_rx_q = tpm_db.init_misc.oam_cpu_rx_q;
	*cpu_tx_q = tpm_db.init_misc.oam_cpu_tx_q;
	*tcont_id = tpm_db.init_misc.oam_cpu_tx_port;
	*valid = tpm_db.init_misc.oam_channel_configured;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_oam_channel_set()
*
* DESCRIPTION:      Set OAM channel parameters
*
* INPUTS:
* cpu_rx_q      - OAM cpu rx queue
* cpu_tx_q      - OAM cpu tx queue
* llid          - OAM LLID
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_channel_set(uint32_t cpu_rx_q, uint32_t cpu_tx_q, uint32_t llid)
{
	tpm_db.init_misc.oam_cpu_rx_q = cpu_rx_q;
	tpm_db.init_misc.oam_cpu_tx_q = cpu_tx_q;
	tpm_db.init_misc.oam_cpu_tx_port = llid;
	tpm_db.init_misc.oam_channel_configured = 1;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_oam_channel_remove()
*
* DESCRIPTION:      Remove OAM channel parameters
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_channel_remove(void)
{
	tpm_db.init_misc.omci_gemport = 0;
	tpm_db.init_misc.oam_cpu_rx_q = 0;
	tpm_db.init_misc.oam_cpu_tx_q = 0;
	tpm_db.init_misc.oam_cpu_tx_port = 0;
	tpm_db.init_misc.oam_channel_configured = 0;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_oam_channel_get()
*
* DESCRIPTION:      Get OAM channel parameters
*
* INPUTS:
* cpu_rx_q      - OAM cpu rx queue
* cpu_tx_q      - OAM cpu tx queue
* tcont_id      - OAM llid
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_oam_channel_get(uint32_t *valid, uint32_t *cpu_rx_q, uint32_t *cpu_tx_q, uint32_t *llid)
{
	*cpu_rx_q = tpm_db.init_misc.oam_cpu_rx_q;
	*cpu_tx_q = tpm_db.init_misc.oam_cpu_tx_q;
	*llid = tpm_db.init_misc.oam_cpu_tx_port;
	*valid = tpm_db.init_misc.oam_channel_configured;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_init_deb_port_set()
*
* DESCRIPTION:      Set Init Debug Port
*
* INPUTS:
* pnc_init_debug_port       - Set the debug Port, which will be preconfigured to send
*                             all traffic to CPU (NFS port for development)
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
#if 0
int32_t tpm_db_pnc_init_deb_port_set(uint32_t pnc_init_debug_port)
{
	tpm_db.init_misc.pnc_init_debug_port = pnc_init_debug_port;

	return (TPM_DB_OK);

}
#endif

/*******************************************************************************
* tpm_db_pnc_init_deb_port_get()
*
* DESCRIPTION:      Get Debug Port
*
* OUTPUTS:
* pnc_init_debug_port  - Get the debug Port, which will be preconfigured to send all
*                        traffic to CPU (NFS port for development)
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
#if 0
int32_t tpm_db_pnc_init_deb_port_get(uint32_t *pnc_init_debug_port)
{
	*pnc_init_debug_port = tpm_db.init_misc.pnc_init_debug_port;

	return (TPM_DB_OK);
}
#endif

/*******************************************************************************
* tpm_db_init_done_set()
*
* DESCRIPTION:      Set TPM was successfully Initialized
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_init_done_set(void)
{
	tpm_db.init_misc.tpm_init_succeeded = TPM_DB_VALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_init_done_get()
*
* DESCRIPTION:      Get value if TPM was successfully Initialized
*
* OUTPUTS:
* tpm_init_succeeded  -
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_init_done_get(void)
{
	if (tpm_db.init_misc.tpm_init_succeeded == TPM_DB_VALID)
		return (1);
	return (0);
}

/*******************************************************************************
* tpm_db_pon_type_set()
*
* DESCRIPTION:      Set WAN technology
*
* INPUTS:
* pon_type          - GPON, EPON, Ethernet or None
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pon_type_set(tpm_db_pon_type_t pon_type)
{
	tpm_db.init_misc.pon_type = pon_type;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pon_type_get()
*
* DESCRIPTION:      Get WAN technology
*
* OUTPUTS:
* pon_type          - GPON, EPON, Ethernet or None
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pon_type_get(tpm_db_pon_type_t *pon_type)
{
	*pon_type = tpm_db.init_misc.pon_type;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_active_wan_set()
*
* DESCRIPTION:      Set WAN technology
*
* INPUTS:
* pon_type          - GPON, EPON, Ethernet or None
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_active_wan_set(tpm_gmacs_enum_t active_wan)
{
	tpm_db.init_misc.active_wan = active_wan;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_active_wan_get()
*
* DESCRIPTION:      Set WAN technology
*
* INPUTS:
* pon_type          - GPON, EPON, Ethernet or None
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
tpm_gmacs_enum_t tpm_db_active_wan_get()
{
	return tpm_db.init_misc.active_wan;
}

/*******************************************************************************
* tpm_db_pnc_mac_learn_enable_set()
*
* DESCRIPTION:
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_mac_learn_enable_set(tpm_init_pnc_mac_learn_enable_t pnc_mac_learn_enable)
{
	tpm_db.init_misc.pnc_mac_learn_enable = pnc_mac_learn_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_mac_learn_enable_get()
*
* DESCRIPTION:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_mac_learn_enable_get(tpm_init_pnc_mac_learn_enable_t *pnc_mac_learn_enable)
{
	*pnc_mac_learn_enable = tpm_db.init_misc.pnc_mac_learn_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_fc_conf_set()
*
* DESCRIPTION:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_fc_conf_set(tpm_init_fc_params_t *port_fc_conf)
{
	memcpy(&tpm_db.port_fc_conf, port_fc_conf, sizeof(tpm_db_fc_params_t));
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_fc_conf_get()
*
* DESCRIPTION:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_fc_conf_get(tpm_init_fc_params_t *port_fc_conf)
{
	memcpy(port_fc_conf, &tpm_db.port_fc_conf, sizeof(tpm_db_fc_params_t));
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_switch_init_set()
*
* DESCRIPTION: Set Amber Initialization
*
* INPUTS:
* switch_init
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_switch_init_set(uint32_t switch_init)
{
	tpm_db.func_profile.switch_init = switch_init;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_switch_init_get()
*
* DESCRIPTION: Get Amber Initialization
*
* INPUTS:
* switch_init
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_switch_init_get(uint32_t *switch_init)
{
	*switch_init = tpm_db.func_profile.switch_init;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_ds_mh_set_conf_set()
*
* DESCRIPTION:      Set downstream marvell header source select
*
* INPUTS:
* ds_mh_set_conf    - Allow set MH in Pnc or not
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ds_mh_set_conf_set(tpm_db_mh_src_t ds_mh_set_conf)
{
	tpm_db.init_misc.ds_mh_set_conf = ds_mh_set_conf;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_ds_mh_get_conf_set()
*
* DESCRIPTION:      Set downstream marvell header source select
*
* INPUTS:
*
* OUTPUTS:
* ds_mh_set_conf    - Allow set MH in Pnc or not
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ds_mh_get_conf_set(tpm_db_mh_src_t *ds_mh_set_conf)
{
	*ds_mh_set_conf = tpm_db.init_misc.ds_mh_set_conf;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_cfg_pnc_parse_set()
*
* DESCRIPTION:      Set config PNC parse enabled/disabled in DB
*
* INPUTS:
* cfg_pnc_parse          0=DISABLED  /  1=ENABLED
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_cfg_pnc_parse_set(tpm_init_cfg_pnc_parse_t cfg_pnc_parse)
{
	tpm_db.init_misc.cfg_pnc_parse = cfg_pnc_parse;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_cpu_loopback_set()
*
* DESCRIPTION:      Set cpu loopback enabled/disabled in DB
*
* INPUTS:
* cpu_loopback          0=DISABLED  /  1=ENABLED
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_cpu_loopback_set(tpm_init_cpu_loopback_t cpu_loopback)
{
	tpm_db.init_misc.cpu_loopback = cpu_loopback;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_cfg_pnc_parse_get()
*
* DESCRIPTION:      Get config PNC parse enabled/disabled in DB
*
* OUTPUTS:
* cfg_pnc_parse_val          0=DISABLED  /  1=ENABLED
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_cfg_pnc_parse_get(tpm_init_cfg_pnc_parse_t *cfg_pnc_parse_val)
{
	*cfg_pnc_parse_val = tpm_db.init_misc.cfg_pnc_parse;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_cpu_loopback_get()
*
* DESCRIPTION:      Get CPU loopback enabled/disabled in DB
*
* OUTPUTS:
* cpu_loopback_val          0=DISABLED  /  1=ENABLED
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_cpu_loopback_get(tpm_init_cpu_loopback_t *cpu_loopback_val)
{
	*cpu_loopback_val = tpm_db.init_misc.cpu_loopback;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_double_tag_support_set()
*
* DESCRIPTION:      Set config double tagged supported in DB
*
* INPUTS:
* dbl_tag          0=DISABLED  /  1=ENABLED
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_double_tag_support_set(tpm_init_double_tag_t dbl_tag)
{
	tpm_db.init_misc.dbl_tag = dbl_tag;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_double_tag_support_get()
*
* DESCRIPTION:      Get config double tagged supported in DB
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_double_tag_support_get(tpm_init_double_tag_t *dbl_tag)
{
	*dbl_tag = tpm_db.init_misc.dbl_tag;

	return (TPM_DB_OK);
}

#if 0
/*******************************************************************************
* tpm_db_default_tag_tpid_set()
*
* DESCRIPTION:      Set tpid of one/two vlan tag in DB
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_default_tag_tpid_set(uint16_t vlan1_tpid, uint16_t vlan2_tpid)
{
	tpm_db.init_misc.vlan1_tpid = vlan1_tpid;
	tpm_db.init_misc.vlan2_tpid = vlan2_tpid;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_default_tag_tpid_get()
*
* DESCRIPTION:      Get tpid of one/two vlan tag in DB
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_default_tag_tpid_get(uint16_t *vlan1_tpid, uint16_t *vlan2_tpid)
{
	*vlan1_tpid = tpm_db.init_misc.vlan1_tpid;
	*vlan2_tpid = tpm_db.init_misc.vlan2_tpid;

	return (TPM_DB_OK);
}
#endif

/*******************************************************************************
* tpm_db_default_tag_tpid_set()
*
* DESCRIPTION:      Set tpid of one/two vlan tag in DB
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_default_tag_tpid_set(tpm_init_tpid_opt_t *tag_tpid)
{
	memcpy(&tpm_db.init_misc.tag_tpid, tag_tpid, sizeof(tpm_init_tpid_opt_t));
	return(TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_default_tag_tpid_get()
*
* DESCRIPTION:      Get tpid of one/two vlan tag in DB
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_default_tag_tpid_get(tpm_init_tpid_opt_t *tag_tpid)
{
	memcpy(tag_tpid, &tpm_db.init_misc.tag_tpid, sizeof(tpm_init_tpid_opt_t));
	return(TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_virt_info_set()
*
* DESCRIPTION:      Set wifi via UNI in TPM DB
*
* INPUTS:
* virt_uni_info.enabled          0=DISABLED  /  1=ENABLED
* virt_uni_info.uni_port             port#
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_virt_info_set(tpm_init_virt_uni_t virt_uni_info)
{
	tpm_db.func_profile.virt_uni_info.enabled = virt_uni_info.enabled;
	tpm_db.func_profile.virt_uni_info.uni_port = virt_uni_info.uni_port;
	tpm_db.func_profile.virt_uni_info.switch_port = virt_uni_info.switch_port;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_virt_info_get()
*
* DESCRIPTION:      Get wifi via UNI in TPM DB
*
* OUTPUTS:
* virt_uni_info.enabled          0=DISABLED  /  1=ENABLED
* virt_uni_info.uni_port             port#
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_virt_info_get(tpm_init_virt_uni_t *virt_uni_info)
{
	virt_uni_info->enabled 		= tpm_db.func_profile.virt_uni_info.enabled;
	virt_uni_info->uni_port 	= tpm_db.func_profile.virt_uni_info.uni_port;
	virt_uni_info->switch_port 	= tpm_db.func_profile.virt_uni_info.switch_port;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_ipv6_5t_enable_set()
*
* DESCRIPTION:
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ipv6_5t_enable_set(tpm_init_ipv6_5t_enable_t ipv6_5t_enable)
{
	tpm_db.init_misc.ipv6_5t_enable = ipv6_5t_enable;
	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_ipv6_5t_enable_get()
*
* DESCRIPTION:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ipv6_5t_enable_get(tpm_init_ipv6_5t_enable_t *ipv6_5t_enable)
{
	*ipv6_5t_enable = tpm_db.init_misc.ipv6_5t_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_port_vector_tbl_info_set()
*
* DESCRIPTION:      Set MH port vector table in TPM DB.
*
* OUTPUTS:
* tpm_mh_port_vector_tbl_new
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_port_vector_tbl_info_set(uint32_t reg_num, uint32_t uni_vector, uint16_t amber_port_vector,
					uint32_t pnc_vector)
{
	if (TPM_TX_MAX_MH_REGS <= reg_num)
		return TPM_DB_ERR_REC_INV;

	tpm_db.tpm_mh_port_vector_tbl[reg_num].uni_vector = uni_vector;
	tpm_db.tpm_mh_port_vector_tbl[reg_num].pnc_vector = pnc_vector;
	tpm_db.tpm_mh_port_vector_tbl[reg_num].amber_port_vector = amber_port_vector;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_port_vector_tbl_info_get()
*
* DESCRIPTION:      Get MH port vector table in TPM DB.
*
* OUTPUTS:
* tpm_mh_port_vector_tbl_new
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_port_vector_tbl_info_get(uint32_t reg_num, uint32_t *uni_vector, uint16_t *amber_port_vector,
					uint32_t *pnc_vector)
{
	if (TPM_TX_MAX_MH_REGS <= reg_num)
		return TPM_DB_ERR_REC_INV;

	*uni_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].uni_vector;
	*pnc_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].pnc_vector;
	*amber_port_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].amber_port_vector;
	return (TPM_DB_OK);
}


/*******************************************************************************
* tpm_db_port_vector_tbl_info_search()
*
* DESCRIPTION:      Search in the MH port vector table in TPM DB for matching target port
*
* OUTPUTS:
* tpm_mh_port_vector_tbl_new
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_port_vector_tbl_info_search(tpm_trg_port_type_t  trg_port, uint32_t *uni_vector,
					    uint16_t *amber_port_vector, uint32_t *pnc_vector)
{
	uint32_t reg_num;

	for (reg_num = 0; reg_num < TPM_TX_MAX_MH_REGS; reg_num++) {
		if (trg_port == tpm_db.tpm_mh_port_vector_tbl[reg_num].uni_vector) {
			*uni_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].uni_vector;
			*pnc_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].pnc_vector;
			*amber_port_vector = tpm_db.tpm_mh_port_vector_tbl[reg_num].amber_port_vector;
			return TPM_DB_OK;
		}
	}

	return TPM_DB_ERR_REC_INV;
}



/*******************************************************************************
* tpm_db_api_section_ent_tbl_reset()
*
* DESCRIPTION:      Reset an API table/acl
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_ent_tbl_reset(uint32_t start_entry, uint32_t num_entries)
{
	uint32_t i;

	/*Init API Rng Entries */
	memset(&(tpm_db.api_ent_mem_area[mem_alloc_start_ind]), 0, (num_entries) * (sizeof(tpm_db_api_entry_t)));

	/* Invalidate API Rng Entries */
	for (i = start_entry; i < (start_entry + num_entries); i++)
		tpm_db.api_ent_mem_area[i].valid = TPM_DB_INVALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_ent_tbl_get()
*
* DESCRIPTION:      get an API table/acl entry
*
* INPUTS:
* api_sec      - Section of the API acl/table
* index        - rule index
* OUTPUTS:
* api_ent_mem_area - table/acl entry
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_ent_tbl_get(tpm_api_sections_t api_sec, tpm_db_api_entry_t *api_ent_mem_area, uint32_t index)
{
	if (ILLEGAL_API_SEC(api_sec))
		IF_ERROR_I(TPM_DB_ERR_REC_NOT_EXIST, api_sec);

	if (NULL == api_ent_mem_area)
		return (TPM_DB_ERR_INV_INPUT);

	memcpy(api_ent_mem_area, &tpm_db.api_ent_mem_area[(tpm_db.api_section[api_sec].table_start) + index], sizeof(tpm_db_api_entry_t));

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_init()
*
* DESCRIPTION:      Initialize an API table/acl
*
* INPUTS:
* api_section      - Section of the API acl/table
* api_rng_size     - Size of the table/acl
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_init(tpm_api_sections_t api_section, tpm_pnc_ranges_t prim_pnc_range, uint32_t api_rng_size)
{

	/* Check that new api_rng table does not cross allocation boundaries */
	if ((mem_alloc_start_ind + api_rng_size) > TPM_DB_API_ENTRIES_TBL_SIZE) {
		TPM_OS_ERROR(TPM_DB_MOD, " API Range not created, Entries Area overflow, "
			     "ind_start(%d), api_rng_size(%d), mem_area_size(%d) \n",
			     mem_alloc_start_ind, api_rng_size, TPM_DB_API_ENTRIES_TBL_SIZE);

		return (TPM_DB_ERR_DB_TBL_FULL);
	}
	if ((mem_alloc_start_ind + api_rng_size) > (TPM_DB_API_ENTRIES_TBL_SIZE - TPM_DB_API_SECTION_MARGIN_SIZE)) {
		TPM_OS_WARN(TPM_DB_MOD, "Entries Area has less than calculated end margin, "
			    "ind_start(%d), api_rng_size(%d), mem_area_size(%d)\n",
			    mem_alloc_start_ind, api_rng_size, TPM_DB_API_ENTRIES_TBL_SIZE);
	}

	/*Init API Range */
	memset(&(tpm_db.api_section[api_section]), 0, sizeof(tpm_db_api_section_t));

	tpm_db_api_section_ent_tbl_reset(mem_alloc_start_ind, api_rng_size);

	tpm_db.api_section[api_section].table_size = api_rng_size;
	tpm_db.api_section[api_section].table_start = mem_alloc_start_ind;
	tpm_db.api_section[api_section].valid = TPM_DB_VALID;
	tpm_db.api_section[api_section].prim_pnc_range = prim_pnc_range;
	tpm_db.api_section[api_section].last_valid_entry = -1;
	tpm_db.api_section[api_section].last_valid_index = -1;
	tpm_db.api_section[api_section].num_valid_entries = 0;

	/* Forward to next 'API Entries table' start_index.
	 * This also inserts 'margin_size' between subsequent 'API Entries table' */
	mem_alloc_start_ind += (api_rng_size + TPM_DB_API_SECTION_MARGIN_SIZE);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entries_area_reset()
*
* DESCRIPTION:      Reset an API table/acl
*
* INPUTS:
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entries_area_reset(void)
{
	/* Stripe API Entries Area */
	memset(tpm_db.api_ent_mem_area, MEM_MARGIN_PATTERN, sizeof(tpm_db.api_ent_mem_area));

	/* Reset Area Index, Start Area offset at margin_size */
	mem_alloc_start_ind = TPM_DB_API_SECTION_MARGIN_SIZE;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_invalidate()
*
* DESCRIPTION:      Reset an API table/acl
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_invalidate(tpm_api_sections_t api_section)
{
	/*Init API Range */
	memset(&(tpm_db.api_section[api_section]), 0, sizeof(tpm_db_api_section_t));

	/* Invalidate Range */
	tpm_db.api_section[api_section].valid = TPM_DB_INVALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_reset()
*
* DESCRIPTION:      Initialize an API table/acl
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_reset(tpm_api_sections_t api_section)
{
	/* prim_pnc_range, table_size, table_start attributes are retained from init */

	tpm_db.api_section[api_section].num_valid_entries = 0;
	tpm_db.api_section[api_section].last_valid_entry = -1;
	tpm_db.api_section[api_section].last_valid_index = -1;

	/* Invalidate all API entries */
	tpm_db_api_section_ent_tbl_reset(tpm_db.api_section[api_section].table_start,
					 tpm_db.api_section[api_section].table_size);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_get()
*
* DESCRIPTION:      Get
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
* api_rng_size      - API range size
* num_valid_entries- Number of valid entries
* last_valid - Last valid entry
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_get(tpm_api_sections_t api_section,
			       uint32_t 	*api_rng_size,
			       uint32_t 	*num_valid_entries,
			       tpm_pnc_ranges_t	*prim_pnc_range,
			       int32_t 		*last_valid_entry,
			       uint32_t 	*tbl_start)
{
	if (ILLEGAL_API_SEC(api_section))
		IF_ERROR_I(TPM_DB_ERR_REC_NOT_EXIST, api_section);

	if (tpm_db.api_section[api_section].valid == TPM_DB_INVALID)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	*api_rng_size = tpm_db.api_section[api_section].table_size;
	*num_valid_entries = tpm_db.api_section[api_section].num_valid_entries;
	*prim_pnc_range = tpm_db.api_section[api_section].prim_pnc_range;
	*last_valid_entry = tpm_db.api_section[api_section].last_valid_entry;
	*tbl_start = tpm_db.api_section[api_section].table_start;

	TPM_OS_DEBUG(TPM_DB_MOD,
		     "returned size(%d), num_entries(%d), prim_pnc_range(%d), last_valid_entry (%d) tbl_start(%d)\n",
		     *api_rng_size, *num_valid_entries, *prim_pnc_range, *last_valid_entry, *tbl_start);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_lastentry_get()
*
* DESCRIPTION:      Get
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
* last_valid - Last valid entry
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_lastentry_get(tpm_api_sections_t api_section, int32_t *last_valid_entry)
{
	if (tpm_db.api_section[api_section].valid == TPM_DB_INVALID)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	*last_valid_entry = tpm_db.api_section[api_section].last_valid_entry;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_main_pnc_get()
*
* DESCRIPTION:      Get
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
* prim_pnc_range - Primary PNC Range for this API ACL/Table
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_main_pnc_get(tpm_api_sections_t api_section, tpm_pnc_ranges_t *prim_pnc_range)
{
	if (tpm_db.api_section[api_section].valid == TPM_DB_INVALID)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	*prim_pnc_range = tpm_db.api_section[api_section].prim_pnc_range;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_num_entries_get()
*
* DESCRIPTION:      Get
*
* INPUTS:
* api_section      - Section of the API acl/table
* OUTPUTS:
* num_entries - Number of valid entries
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_num_entries_get(tpm_api_sections_t api_section, uint32_t *num_entries)
{
	if (tpm_db.api_section[api_section].valid == TPM_DB_INVALID)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	*num_entries = tpm_db.api_section[api_section].num_valid_entries;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_section_val_get_next()
*
* DESCRIPTION:      Get next valid API range
*
* INPUTS:
* cur_api_section      - Section of the API acl/table
* OUTPUTS:
* api_rng_size      - API range size
* num_valid_entries- Number of valid entries
* last_valid - Last valid entry
* next_section
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_val_get_next(int32_t cur_api_section,
					int32_t *next_section,
					uint32_t *api_rng_size,
					uint32_t *num_valid_entries, int32_t *last_valid_entry, uint32_t *tbl_start)
{
	uint32_t x;

	/* Check Params */
	if (cur_api_section < -1 || cur_api_section >= TPM_MAX_NUM_API_SECTIONS)
		return (TPM_DB_ERR_INV_INPUT);

	/* Initialize next section  */
	x = (uint32_t) (cur_api_section + 1);

	/* Check PnC range exists in DB */
	for (; x < TPM_MAX_NUM_API_SECTIONS; x++) {
		if (tpm_db.api_section[x].valid == TPM_DB_VALID) {
			/* Return Data */
			*api_rng_size = tpm_db.api_section[x].table_size;
			*num_valid_entries = tpm_db.api_section[x].num_valid_entries;
			*last_valid_entry = tpm_db.api_section[x].last_valid_entry;
			*tbl_start = tpm_db.api_section[x].table_start;
			*next_section = x;
			return (TPM_DB_OK);
		}
	}
	/* No valid entry found */
	*next_section = -1;

	return (TPM_DB_OK);
}

#if 0	/* YUVAL_OK */
void tpm_db_api_area_bubble_sort(tpm_db_api_check_t *array, uint8_t num_elements)
{
	int32_t i, j;
	tpm_db_api_check_t temp_var;

	if (num_elements <= 1)
		return;

	for (i = 0; i < num_elements; i++) {
		/* back through the area bringing smallest remaining element to position i */
		for (j = num_elements - 1; j > i; j--) {
			if (array[j - 1].table_start > array[j].table_start) {
				memcpy(&temp_var, &(array[j]), sizeof(tpm_db_api_check_t));
				memcpy(&(array[j]), &(array[j - 1]), sizeof(tpm_db_api_check_t));
				memcpy(&(array[j - 1]), &temp_var, sizeof(tpm_db_api_check_t));

			}
		}
	}

	return;
}

/*******************************************************************************
* tpm_db_api_section_margins_check()
*
* DESCRIPTION:      Get next valid API range
*
* INPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_rng_margins_self_check(void)
{

	tpm_api_sections_t cur_section = -1, next_section = 0;
	int32_t last_valid;
	int32_t ret_code, margin_area;
	uint32_t margin_entry, api_rng_size = 0, num_valid_entries;
	uint32_t tbl_start_ind = 0, table_size, margin_start_ind, area_num, num_ranges;
	uint32_t i = 0, k = 0;
	uint8_t *margin_p;
	tpm_db_api_check_t api_sections_areas[TPM_MAX_NUM_API_SECTIONS];

	/* Loop through valid API ranges read them into local array */
	ret_code = tpm_db_api_section_val_get_next(cur_section, &next_section, &api_rng_size,
						   &num_valid_entries, &last_valid, &tbl_start_ind);
	IF_ERROR(ret_code);

	while (next_section != TPM_INVALID_SECTION) {
		api_sections_areas[i].table_size = api_rng_size;
		api_sections_areas[i].table_start = tbl_start_ind;

		cur_section = next_section;
		i++;

		ret_code = tpm_db_api_section_val_get_next(cur_section, &next_section, &api_rng_size,
							   &num_valid_entries, &last_valid, &tbl_start_ind);
		IF_ERROR(ret_code);
	}

	num_ranges = i;

	/* Simple Ordering */
	tpm_db_api_area_bubble_sort(api_sections_areas, num_ranges);
	if (1) {
		printk("%s (%d)\n", __func__, __LINE__);
		for (k = 0; k < num_ranges; k++) {
			printk("entry(%d) table_start(%d) table_size(%d)\n", k, api_sections_areas[k].table_start,
			       api_sections_areas[k].table_size);
		}
	}

	/* Check margins */
	margin_start_ind = 0;
	i = 0;

	for (area_num = 0; area_num < num_ranges; area_num++) {
		tbl_start_ind = api_sections_areas[area_num].table_start;
		table_size = api_sections_areas[area_num].table_size;

		margin_p = (uint8_t *) &(tpm_db.api_ent_mem_area[margin_start_ind]);
		margin_area = (tbl_start_ind - margin_start_ind) * (sizeof(tpm_db_api_entry_t));
		i = 0;

		while (i < margin_area) {
			if (*(margin_p + i) != MEM_MARGIN_PATTERN) {
				/* Print complete tpm_db_api_entry_t from start to end, and also skips checking the rest of it */
				margin_entry = i / (sizeof(tpm_db_api_entry_t));

				printk("margin entry(%d):\n", margin_entry);
				for (i = margin_entry * sizeof(tpm_db_api_entry_t);
				     i < (margin_entry + 1) * sizeof(tpm_db_api_entry_t); i++) {
					printk("%x ", *(margin_p + i));
				}

				/* i now points to start of next entry */
			} else {
				i++;
			}
		}
		margin_start_ind = tbl_start_ind + api_sections_areas[area_num].table_size;
	}

	printk("===========================================\n");
	return (TPM_OK);

}
#endif

/*******************************************************************************
* tpm_db_api_section_entry_add()
*
* DESCRIPTION:      Update Range params to add new entry
*
* INPUTS:
* api_section       - Section of the API acl/table
* new_last_valid    - Update the last valid entry with this value
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_section_entry_add(tpm_api_sections_t api_section, int32_t new_last_valid)
{
	if (tpm_db.api_section[api_section].valid == TPM_DB_INVALID)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	(tpm_db.api_section[api_section].num_valid_entries)++;
	tpm_db.api_section[api_section].last_valid_entry = new_last_valid;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_freeentry_get()
*
* DESCRIPTION:      Get free API entry
*
* INPUTS:
* api_section       - Section of the API acl/table
* OUTPUTS:
* ind               - Return Free Index
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_freeentry_get(tpm_api_sections_t api_section, int32_t *index)
{
	uint32_t i;

	/* Find Empty Index */
	for (i = 0; i < tpm_db.api_section[api_section].table_size; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_INVALID)
			break;
	}
	if (i == tpm_db.api_section[api_section].table_size) {
		*index = -1;
		return (TPM_DB_ERR_DB_TBL_FULL);
	}

	*index = i;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_ind_get()
*
* DESCRIPTION:      Get Index (handle) of a rulenum
*
* INPUTS:
* api_section       - Section of the API acl/table
* rulenum           - Rulenum of the API acl/table
* OUTPUTS:
* index             - Return rule number's index
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_ind_get(tpm_api_sections_t api_section, uint32_t rule_num, int32_t *index)
{
	int32_t i;

	/* Find the rulenum index */
	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID && API_ENT_I(api_section, i).rule_num == rule_num)
			break;
	}

	if (i > tpm_db.api_section[api_section].last_valid_index) {
		*index = -1;
		return (TPM_DB_ERR_REC_NOT_EXIST);
	}

	*index = i;
	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_api_tcam_rule_idx_get()
*
* DESCRIPTION:      Get PnC rule index by API section and TCAM number
*
* INPUTS:
* api_section       - Section of the API acl/table
* tcam_num          - TCAM number of the API acl/table
* OUTPUTS:
* rule_idx          - Return rule index for PnC rule
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_tcam_rule_idx_get(tpm_api_sections_t api_section, uint32_t tcam_num, uint32_t *rule_idx)
{
	int32_t i;

	/* Find the rule index */
	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		/*
		   printk("tpm_db_api_tcam_rule_idx_get index[%d], valid[%d], num_pnc_ranges[%d], pnc_index[%d] \n",
		   i, API_ENT_I(api_section, i).valid, API_ENT_I(api_section, i).pnc_tbl_conn.num_pnc_ranges,
		   API_ENT_I(api_section, i).pnc_tbl_conn.pnc_conn_tbl[0].pnc_index);
		 */
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID
		    && API_ENT_I(api_section, i).pnc_tbl_conn.num_pnc_ranges > 0
		    && API_ENT_I(api_section, i).pnc_tbl_conn.pnc_conn_tbl[0].pnc_index == tcam_num)
			break;
	}

	if (i > tpm_db.api_section[api_section].last_valid_index) {
		*rule_idx = 0;
		return (TPM_DB_ERR_REC_NOT_EXIST);
	}

	*rule_idx = API_ENT_I(api_section, i).rule_idx;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_set()
*
* DESCRIPTION:      Set an API Entry
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_num         - Rule number in the API range
* bi_dir           - Is this rule Bi-directional
* api_data         - The API key data for this entry
* mod_con          - Definition of connection to modification tables
* pnc_con          - Definition of connection to PNC tables
* OUTPUTS:
* rule_idx         - Unique Rule Identifier, that does not change over the life span of the rule.
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_set(tpm_api_sections_t api_section,
			     uint32_t rule_num,
			     uint32_t bi_dir,
			     tpm_rule_entry_t *api_data,
			     tpm_db_mod_conn_t *mod_con, tpm_db_pnc_conn_t *pnc_con, uint32_t *rule_idx)
{
	int32_t ind;
	tpm_pnc_ranges_t range_id = 0;
	tpm_db_pnc_range_conf_t rangConf;
	int32_t ret_code;
	uint32_t l_rule_idx;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d), - rule_num(%d)\n", api_section, rule_num);

	/* Find Empty Index */
	tpm_db_api_freeentry_get(api_section, &ind);
	if (ind == -1)
		return (TPM_DB_ERR_DB_TBL_FULL);

	/* Get Range_Id, rang configuration, to get range type */
	ret_code = tpm_db_api_section_main_pnc_get(api_section, &range_id);
	IF_ERROR(ret_code);
	ret_code = tpm_db_pnc_rng_conf_get(range_id, &rangConf);
	IF_ERROR(ret_code);

	/* Fill in API entry */
	memcpy(&(API_ENT_I(api_section, ind).api_rule_data), api_data, sizeof(tpm_rule_entry_t));
	if (mod_con)
		memcpy(&(API_ENT_I(api_section, ind).mod_tbl_conn), mod_con, sizeof(tpm_db_mod_conn_t));

	memcpy(&(API_ENT_I(api_section, ind).pnc_tbl_conn), pnc_con, sizeof(tpm_db_pnc_conn_t));

	API_ENT_I(api_section, ind).bi_dir = bi_dir;
	l_rule_idx = tpm_db_rule_index_get();
	if (TPM_RANGE_TYPE_ACL == rangConf.range_type)
		API_ENT_I(api_section, ind).rule_idx = l_rule_idx;
	else
		API_ENT_I(api_section, ind).rule_idx = rule_num;

	API_ENT_I(api_section, ind).rule_num = rule_num;
	API_ENT_I(api_section, ind).valid = TPM_DB_VALID;

	/* Increase highest tbl_index if needed */
	if (ind > tpm_db.api_section[api_section].last_valid_index)
		tpm_db.api_section[api_section].last_valid_index = ind;


	/* Set last_valid to rule_num if needed */
	if ((tpm_db.api_section[api_section].last_valid_entry < 0)
	    || ((int32_t) rule_num > tpm_db.api_section[api_section].last_valid_entry))
		tpm_db.api_section[api_section].last_valid_entry = (int32_t) rule_num;

	(tpm_db.api_section[api_section].num_valid_entries)++;

	if (TPM_RANGE_TYPE_ACL == rangConf.range_type) {
		*rule_idx = l_rule_idx;
		tpm_db_rule_index_incrs();
	} else
		*rule_idx = rule_num;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_invalidate()
*
* DESCRIPTION:      Invalidate an API Entry
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_num         - Rule number in the API range
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_invalidate(tpm_api_sections_t api_section, uint32_t rule_num)
{
	int32_t ind;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d), - rule_num(%d)\n", api_section, rule_num);

	/* Find rule_num Index */
	tpm_db_api_entry_ind_get(api_section, rule_num, &ind);
	if (ind == -1)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	TPM_OS_DEBUG(TPM_DB_MOD, " ind(%d), \n", ind);

	/* Invalidate the entry on the api_table */
	memset(&(API_ENT_I(api_section, ind)), 0, sizeof(tpm_db_api_entry_t));
	API_ENT_I(api_section, ind).valid = TPM_DB_INVALID;

	/* Decrease highest tbl_index if needed */
	if (ind == tpm_db.api_section[api_section].last_valid_index)
		tpm_db.api_section[api_section].last_valid_index--;

	/* Decrease last_valid if needed */
	if ((int32_t) rule_num == tpm_db.api_section[api_section].last_valid_entry)
		tpm_db.api_section[api_section].last_valid_entry--;

	/* Decrease the number of valid entries */
	(tpm_db.api_section[api_section].num_valid_entries)--;

	TPM_OS_DEBUG(TPM_DB_MOD, " last_valid_entry(%d), num_valid_entries(%d), \n",
		     tpm_db.api_section[api_section].last_valid_entry,
		     tpm_db.api_section[api_section].num_valid_entries);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_rulenum_inc()
*
* DESCRIPTION:      Increase rulenum of a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_inc_start   - Start of Range of API entries to increase the rule_num
* rule_inc_end     - End of Range of API entries to increase the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_rulenum_inc(tpm_api_sections_t api_section, uint32_t rule_inc_start, uint32_t rule_inc_end)
{
	int32_t i;
	int32_t ind, ret_code;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d) - range_inc_start(%d) range_inc_end(%d) \n",
		     api_section, rule_inc_start, rule_inc_end);

	if (rule_inc_end >= (tpm_db.api_section[api_section].table_size - 1)) {
		TPM_OS_ERROR(TPM_DB_MOD, " for api_section(%d), - range_inc_end(%d) too large \n",
			     api_section, rule_inc_end);
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Increase all entries */
	for (i = rule_inc_end; i >= (int32_t) (rule_inc_start); i--) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);
		(API_ENT_I(api_section, ind).rule_num)++;
	}

	/* Increase last_valid rule_num, if necessary */
	if (tpm_db.api_section[api_section].last_valid_entry == (int32_t) rule_inc_end)
		(tpm_db.api_section[api_section].last_valid_entry)++;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_rulenum_dec()
*
* DESCRIPTION:      Decrease rulenum of a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_dec_start   - Start of Range of API entries to decrease the rule_num
* rule_dec_end     - End of Range of API entries to decrease the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_rulenum_dec(tpm_api_sections_t api_section, uint32_t rule_dec_start, uint32_t rule_dec_end)
{

	uint32_t i;
	int32_t ind, ret_code;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d) - rule_dec_start(%d) rule_dec_end(%d) \n",
		     api_section, rule_dec_start, rule_dec_end);

	if (rule_dec_start == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "for api_section(%d) -  rule_dec_start cannot be 0\n", api_section);
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Decrease all entries */
	for (i = rule_dec_start; i <= rule_dec_end; i++) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);
		(API_ENT_I(api_section, ind).rule_num)--;
	}

	/* Decrease last_valid, if it equaled last in range */
	if (tpm_db.api_section[api_section].last_valid_entry == (int32_t) rule_dec_end)
		(tpm_db.api_section[api_section].last_valid_entry)--;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_specific_pnc_dec()
*
* DESCRIPTION:      Decrease the connected PCN entry of a specific pnc range
*                   for a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* range_id         - Pnc range id
* rule_inc_start   - Start of Range of API entries to decrease the rule_num
* rule_inc_end     - End of Range of API entries to decrease the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_specific_pnc_dec(tpm_api_sections_t api_section,
				    tpm_pnc_ranges_t range_id, uint32_t rule_inc_start, uint32_t rule_inc_end)
{
	uint32_t i, j;
	int32_t ret_code, ind;
	tpm_db_pnc_conn_t *pnc_tbl_conn;
	tpm_db_pnc_range_conf_t range_conf;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d), range(%d) - rule_inc_start(%d) rule_inc_end(%d) \n",
		     api_section, range_id, rule_inc_start, rule_inc_end);

	ret_code = tpm_db_pnc_rng_conf_get(range_id, &range_conf);
	IF_ERROR(ret_code);

	/* Increase pnc_entries of all rule_nums in the range */
	for (i = rule_inc_start; i <= rule_inc_end; i++) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);
		if (API_ENT_I(api_section, ind).valid == TPM_DB_INVALID)
			continue;

		pnc_tbl_conn = &(API_ENT_I(api_section, ind).pnc_tbl_conn);

		/* Loop over all then pnc_entries of this api_entry */
		for (j = 0; j < (pnc_tbl_conn->num_pnc_ranges); j++) {

			if (pnc_tbl_conn->pnc_conn_tbl[j].pnc_range == (uint32_t) range_id)
				pnc_tbl_conn->pnc_conn_tbl[j].pnc_index--;
		}
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_specific_pnc_inc()
*
* DESCRIPTION:      Increase the connected PCN entry of a specific pnc range
*                   for a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* range_id         - Pnc range id
* rule_inc_start   - Start of Range of API entries to decrease the rule_num
* rule_inc_end     - End of Range of API entries to decrease the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_specific_pnc_inc(tpm_api_sections_t api_section,
				    tpm_pnc_ranges_t range_id, uint32_t rule_inc_start, uint32_t rule_inc_end)
{
	uint32_t i, j;
	int32_t ret_code, ind;
	tpm_db_pnc_conn_t *pnc_tbl_conn;
	tpm_db_pnc_range_conf_t range_conf;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d), range(%d) - rule_inc_start(%d) rule_inc_end(%d) \n",
		     api_section, range_id, rule_inc_start, rule_inc_end);

	ret_code = tpm_db_pnc_rng_conf_get(range_id, &range_conf);
	IF_ERROR(ret_code);

	/* Increase pnc_entries of all rule_nums in the range */
	for (i = rule_inc_start; i <= rule_inc_end; i++) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);

		pnc_tbl_conn = &(API_ENT_I(api_section, ind).pnc_tbl_conn);

		/* Loop over all then pnc_entries of this api_entry */
		for (j = 0; j < (pnc_tbl_conn->num_pnc_ranges); j++) {

			if (pnc_tbl_conn->pnc_conn_tbl[j].pnc_range == (uint32_t) range_id)
				pnc_tbl_conn->pnc_conn_tbl[j].pnc_index++;
		}
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_conn_inc()
*
* DESCRIPTION:      Increase the connected PCN entry for a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_inc_start   - Start of Range of API entries to decrease the rule_num
* rule_inc_end     - End of Range of API entries to decrease the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_conn_inc(tpm_api_sections_t api_section, uint32_t rule_inc_start, uint32_t rule_inc_end)
{
	int32_t i;
	uint32_t j;
	int32_t ind, ret_code;
	tpm_db_pnc_conn_t *pnc_tbl_conn;
	tpm_db_pnc_range_conf_t range_conf;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d) - rule_inc_start(%d) rule_inc_end(%d) \n",
		     api_section, rule_inc_start, rule_inc_end);

	if (rule_inc_end >= (tpm_db.api_section[api_section].table_size - 1)) {
		TPM_OS_ERROR(TPM_DB_MOD, " for api_section(%d)- range_inc_end(%d) too large \n",
			     api_section, rule_inc_end);
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Increase pnc_entries of all rule_nums in the range */
	for (i = rule_inc_end; i >= (int32_t) (rule_inc_start); i--) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);
		pnc_tbl_conn = &(API_ENT_I(api_section, ind).pnc_tbl_conn);

		/* Loop over all then pnc_entries of this api_entry */
		for (j = 0; j < (pnc_tbl_conn->num_pnc_ranges); j++) {
			/* INcrease only the entries of the PNC Ranges that are TYPE_ACL */
			ret_code = tpm_db_pnc_rng_conf_get(pnc_tbl_conn->pnc_conn_tbl[j].pnc_range, &range_conf);
			IF_ERROR_I(ret_code, i);
			if (range_conf.range_type == TPM_RANGE_TYPE_ACL)
				pnc_tbl_conn->pnc_conn_tbl[j].pnc_index++;
		}
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_conn_dec()
*
* DESCRIPTION:      Decrease the connected PCN entry for a range of API entries
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_dec_start   - Start of Range of API entries to decrease the rule_num
* rule_dec_end     - End of Range of API entries to decrease the rule_num
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_conn_dec(tpm_api_sections_t api_section, uint32_t rule_dec_start, uint32_t rule_dec_end)
{
	uint32_t i, j;
	int32_t ind, ret_code;
	tpm_db_pnc_conn_t *pnc_tbl_conn;
	tpm_db_pnc_range_conf_t range_conf;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d) - rule_dec_start(%d) rule_dec_end(%d) \n",
		     api_section, rule_dec_start, rule_dec_end);

	if (rule_dec_start == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, " for api_section(%d) - rule_dec_start is zero \n", api_section);
		return (TPM_DB_ERR_INV_INPUT);
	}

	/* Decrease pnc_entries of all rule_nums in the range */
	for (i = rule_dec_start; i <= rule_dec_end; i++) {
		ret_code = tpm_db_api_entry_ind_get(api_section, i, &ind);
		IF_ERROR_I(ret_code, i);
		pnc_tbl_conn = &(API_ENT_I(api_section, ind).pnc_tbl_conn);

		/* Loop over all then pnc_entries of this api_entry */
		for (j = 0; j < (pnc_tbl_conn->num_pnc_ranges); j++) {
			/* Decrease only the entries of the PNC Ranges that are TYPE_ACL */
			ret_code = tpm_db_pnc_rng_conf_get(pnc_tbl_conn->pnc_conn_tbl[j].pnc_range, &range_conf);
			IF_ERROR_I(ret_code, i);
			if (range_conf.range_type == TPM_RANGE_TYPE_ACL)
				pnc_tbl_conn->pnc_conn_tbl[j].pnc_index--;
		}
	}

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_tcam_num_get()
*
* DESCRIPTION:      Get API TCAM number according to API section and rule index
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_idx         - Unique Rule Identifier, that does not change over the life span of the rule.
*
* OUTPUTS:
* tcam_num         - PnC TCAM number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_tcam_num_get(tpm_api_sections_t api_section, uint32_t rule_idx, uint32_t *tcam_num)
{
	int32_t ret_code;
	uint32_t rule_num;
	uint32_t dummy_idx;
	uint32_t bi_dir;
	tpm_rule_entry_t api_data;
	tpm_db_mod_conn_t mod_con = { 0, 0 };
	tpm_db_pnc_conn_t pnc_con;

	/* Get rule number */
	ret_code = tpm_db_api_rulenum_get(api_section, rule_idx, &rule_num);
	IF_ERROR(ret_code);

	/* Get API entry */
	ret_code = tpm_db_api_entry_get(api_section, rule_num, &dummy_idx, &bi_dir, &api_data, &mod_con, &pnc_con);
	IF_ERROR(ret_code);

	/* Get TCAM number, always return the first TCAM number even there are multiple  */
	/* TCAM entries to one rule index                                                */
	*tcam_num = pnc_con.pnc_conn_tbl[0].pnc_index;

	return (TPM_DB_OK);
}

int32_t tpm_db_api_entry_update_rule_idx(tpm_api_sections_t api_section,
			     			uint32_t rule_idx_pre,
			     			uint32_t rule_idx_new)
{
	int32_t ind;
	int32_t ret_code;
	uint32_t rule_num = 0;

	TPM_OS_DEBUG(TPM_DB_MOD, " api_section(%d), - rule_num(%d)\n", api_section, rule_num);

	/* Get the rule_num */
	ret_code = tpm_db_api_rulenum_get(api_section, rule_idx_pre, &rule_num);
	if (ret_code == TPM_DB_ERR_REC_NOT_EXIST) {
		TPM_OS_ERROR(TPM_DB_MOD, " The rule non-exist!\n");
		return ERR_RULE_IDX_INVALID;
	}
	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "with rule_num(%d)\n", rule_num);

	tpm_db_api_entry_ind_get(api_section, rule_num, &ind);
	if (ind == -1)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	/* update rule_index */
	API_ENT_I(api_section, ind).rule_idx = rule_idx_new;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_rulenum_get()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_idx         - Unique Rule Identifier, that does not change over the life span of the rule.
*
* OUTPUTS:
* rule_num         - The API entry number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_rulenum_get(tpm_api_sections_t api_section, uint32_t rule_idx, uint32_t *rule_num)
{
	int32_t i;

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID && API_ENT_I(api_section, i).rule_idx == rule_idx) {
			*rule_num = API_ENT_I(api_section, i).rule_num;
			return (TPM_DB_OK);
		}
	}
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_api_rulenum_get_from_l2_key()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* parse_bm         - fields to be parsed in the key.
* l2_key           - structure of l2_key
*
* OUTPUTS:
* rule_num         - The API entry number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_rulenum_get_from_l2_key(tpm_api_sections_t api_section, tpm_parse_fields_t parse_rule_bm,
					   tpm_l2_acl_key_t *l2_key, uint32_t *rule_num)
{
	int32_t i, cmp_res;

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID) {
			cmp_res = memcmp(&(API_ENT_I(api_section, i).api_rule_data.l2_prim_key.l2_key),
					 l2_key, sizeof(tpm_l2_acl_key_t));
			if (cmp_res == 0) {	/* found entry */
				/* check the parse_bm */
				if (parse_rule_bm == API_ENT_I(api_section, i).api_rule_data.l2_prim_key.parse_rule_bm) {
					*rule_num = API_ENT_I(api_section, i).rule_num;
					return (TPM_DB_OK);
				}
			}
		}
	}
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_api_rulenum_get_from_l3_key()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* parse_bm         - fields to be parsed in the key.
* l3_key           - structure of l3_key
*
* OUTPUTS:
* rule_num         - The API entry number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_rulenum_get_from_l3_key(tpm_api_sections_t api_section, tpm_parse_fields_t parse_rule_bm,
					   tpm_l3_type_key_t *l3_key, uint32_t *rule_num)
{
	int32_t i, cmp_res;

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID) {
			cmp_res = memcmp(&API_ENT_I(api_section, i).api_rule_data.l3_type_key.l3_key,
					 l3_key, sizeof(tpm_l3_type_key_t));
			if (cmp_res == 0) {	/* found entry */
				/* check the parse_bm */
				if (parse_rule_bm == API_ENT_I(api_section, i).api_rule_data.l3_type_key.parse_rule_bm) {
					*rule_num = API_ENT_I(api_section, i).rule_num;
					return (TPM_DB_OK);
				}
			}
		}
	}
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_api_rulenum_get_from_ipv4_key()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* parse_bm         - fields to be parsed in the key.
* ipv4_key         - structure of ipv4_key
*
* OUTPUTS:
* rule_num         - The API entry number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_rulenum_get_from_ipv4_key(tpm_api_sections_t api_section, tpm_parse_fields_t parse_rule_bm,
					     tpm_ipv4_acl_key_t *ipv4_key, uint32_t *rule_num)
{
	int32_t i, cmp_res;

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID) {
			cmp_res = memcmp(&API_ENT_I(api_section, i).api_rule_data.ipv4_key.ipv4_key,
					 ipv4_key, sizeof(tpm_ipv4_acl_key_t));
			if (cmp_res == 0) {	/* found entry */
				/* check the parse_bm */
				if (parse_rule_bm == API_ENT_I(api_section, i).api_rule_data.ipv4_key.parse_rule_bm) {
					*rule_num = API_ENT_I(api_section, i).rule_num;
					return (TPM_DB_OK);
				}
			}
		}
	}
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_api_rulenum_get_from_ipv6_key()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* parse_bm         - fields to be parsed in the key.
* ipv6_key         - structure of ipv6_key
*
* OUTPUTS:
* rule_num         - The API entry number
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_rulenum_get_from_ipv6_key(tpm_api_sections_t api_section, tpm_parse_fields_t parse_rule_bm,
					     tpm_ipv6_acl_key_t *ipv6_key, uint32_t *rule_num)
{
	int32_t i, cmp_res;

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (API_ENT_I(api_section, i).valid == TPM_DB_VALID) {
			cmp_res = memcmp(&API_ENT_I(api_section, i).api_rule_data.ipv6_key.ipv6_key,
					 ipv6_key, sizeof(tpm_ipv6_acl_key_t));
			if (cmp_res == 0) {	/* found entry */
				/* check the parse_bm */
				if (parse_rule_bm == API_ENT_I(api_section, i).api_rule_data.ipv6_key.parse_rule_bm) {
					*rule_num = API_ENT_I(api_section, i).rule_num;
					return (TPM_DB_OK);
				}
			}
		}
	}
	return (TPM_DB_ERR_REC_NOT_EXIST);
}

/*******************************************************************************
* tpm_db_api_entry_get()
*
* DESCRIPTION:      Get  API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* rule_num         - The API entry number
*
* OUTPUTS:
* rule_idx         - Unique Rule Identifier, that does not change over the life span of the rule.
* bi_dir           - Is this rule bi-directional (currently not used)
* api_data         - All config information received for this API call
* mod_con          - Connection to modification tables
* pnc_con          - Connection to PNC
*
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_get(tpm_api_sections_t api_section,
			     uint32_t rule_num,
			     uint32_t *rule_idx,
			     uint32_t *bi_dir,
			     tpm_rule_entry_t *api_data, tpm_db_mod_conn_t *mod_con, tpm_db_pnc_conn_t *pnc_con)
{
	int32_t ind;

	tpm_db_api_entry_ind_get(api_section, rule_num, &ind);
	if (ind == -1)
		return (TPM_DB_ERR_REC_NOT_EXIST);

	memcpy(api_data, &(API_ENT_I(api_section, ind).api_rule_data), sizeof(tpm_rule_entry_t));
	memcpy(mod_con, &(API_ENT_I(api_section, ind).mod_tbl_conn), sizeof(tpm_db_mod_conn_t));
	memcpy(pnc_con, &(API_ENT_I(api_section, ind).pnc_tbl_conn), sizeof(tpm_db_pnc_conn_t));
	*bi_dir = API_ENT_I(api_section, ind).bi_dir;
	*rule_idx = API_ENT_I(api_section, ind).rule_idx;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_api_entry_valid_get_next()
*
* DESCRIPTION:      Get  Next API Entry  Data
*
* INPUTS:
* api_section      - Section of the API acl/table
* cur_rule          - The current rule_num in  the API Range.
*                     Function returns the next valid rule number next_rule  > cur_rule
*
* OUTPUTS:
* next_rule        - See cur_rule. If end of table was reached before valid entry, (-1) is returned in next_rule
*                    All of the following outputs relate to rule_num=next_rule.
* rule_idx         - See tpm_db_api_entry_get
* bi_dir           - See tpm_db_api_entry_get
* api_data         - See tpm_db_api_entry_get
* mod_con          - See tpm_db_api_entry_get
* pnc_con          - See tpm_db_api_entry_get
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_api_entry_val_get_next(tpm_api_sections_t api_section,
				      int32_t cur_rule,
				      int32_t *next_rule,
				      uint32_t *rule_idx,
				      uint32_t *bi_dir,
				      tpm_rule_entry_t *api_data,
				      tpm_db_mod_conn_t *mod_con, tpm_db_pnc_conn_t *pnc_con)
{
	int32_t ind = -1;
	int32_t i;
	uint32_t min_rule, l_next_rule = ~0;
	tpm_db_api_entry_t *api_tbl = &(API_ENT_I(api_section, 0));

	/*TPM_OS_DEBUG(TPM_DB_MOD, "api_section(%d) cur_rule(%d)\n", api_section, cur_rule); */

	if (cur_rule <= -1)
		min_rule = 0;
	else
		min_rule = cur_rule + 1;

	/*TPM_OS_DEBUG(TPM_DB_MOD, "min_rule(%d) \n", min_rule); */

	for (i = 0; i <= tpm_db.api_section[api_section].last_valid_index; i++) {
		if (((api_tbl + i)->valid == TPM_DB_VALID) &&
		    ((api_tbl + i)->rule_num >= min_rule) && ((api_tbl + i)->rule_num < l_next_rule)) {
			l_next_rule = (api_tbl + i)->rule_num;
			ind = i;
		}
	}

	/*TPM_OS_DEBUG(TPM_DB_MOD, "l_next_rule(%d) ind(%d) \n", l_next_rule, ind); */

	if ((l_next_rule < (uint32_t) (~0)) && (ind != -1)) {
		memcpy(api_data, &(API_ENT_I(api_section, ind).api_rule_data), sizeof(tpm_rule_entry_t));
		memcpy(mod_con, &(API_ENT_I(api_section, ind).mod_tbl_conn), sizeof(tpm_db_mod_conn_t));
		memcpy(pnc_con, &(API_ENT_I(api_section, ind).pnc_tbl_conn), sizeof(tpm_db_pnc_conn_t));
		*bi_dir = API_ENT_I(api_section, ind).bi_dir;
		*rule_idx = API_ENT_I(api_section, ind).rule_idx;

		*next_rule = l_next_rule;
	} else		/* Not found */
		*next_rule = -1;

	/*TPM_OS_DEBUG(TPM_DB_MOD, "next_rule(%d) \n", *next_rule); */
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_shdw_ent_set()
*
* DESCRIPTION:      Set PNC  Entry in Shadow Table
*
* INPUTS:
* pnc_entry       - PnC Entry
*
* OUTPUTS:
* pnc_data        - PnC Data
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_shdw_ent_set(uint32_t pnc_entry, tpm_pnc_all_t *pnc_data)
{

	TPM_OS_DEBUG(TPM_DB_MOD, "pnc_entry(%d)\n", pnc_entry);
	if (pnc_entry >= TPM_PNC_SIZE)
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.pnc_shadow[pnc_entry].valid = TPM_DB_VALID;
	memcpy(&(tpm_db.pnc_shadow[pnc_entry].pnc_data), pnc_data, sizeof(tpm_pnc_all_t));

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_shdw_ent_inv()
*
* DESCRIPTION:      Invalidate PNC  Entry in Shadow Table
*
* INPUTS:
* pnc_entry       - PnC Entry
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_shdw_ent_inv(uint32_t pnc_entry)
{
	if (pnc_entry >= TPM_PNC_SIZE)
		return (TPM_DB_ERR_INV_INPUT);

	memset(&(tpm_db.pnc_shadow[pnc_entry].pnc_data), 0, sizeof(tpm_pnc_all_t));
	tpm_db.pnc_shadow[pnc_entry].valid = TPM_DB_INVALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_shdw_ent_get()
*
* DESCRIPTION:      Get PNC Entry from Shadow Table
*
* INPUTS:
* pnc_entry       - PnC Entry
*
* OUTPUTS:
* valid           - Is the PNC Entry valid in Shadow
* pnc_data        - PnC Data
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_shdw_ent_get(uint32_t pnc_entry, uint32_t *valid, tpm_pnc_all_t *pnc_data)
{
	if (pnc_entry >= TPM_PNC_SIZE)
		return (TPM_DB_ERR_INV_INPUT);

	memcpy(pnc_data, &(tpm_db.pnc_shadow[pnc_entry].pnc_data), sizeof(tpm_pnc_all_t));
	if (tpm_db.pnc_shadow[pnc_entry].valid == TPM_DB_VALID)
		*valid = TPM_TRUE;
	else
		*valid = TPM_FALSE;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mod_shdw_par_check()
*
* DESCRIPTION:      Function checks legality of modification table params
*
* INPUTS:
* gmac            - GMAC In
* entry           - modification entry
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mod_shdw_par_check(tpm_gmacs_enum_t gmac, uint32_t mod_entry)
{
	if ((mod_entry >= TPM_MOD_TABL_SIZE)
	    || /*(gmac < TPM_ENUM_GMAC_0) || */ (gmac >= TPM_MAX_NUM_GMACS))
		return (TPM_DB_ERR_INV_INPUT);

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_pnc_shdw_ent_del()
*
* DESCRIPTION:      Function deletes a PNC entry and "pushes up" the PNC Range
*
* INPUTS:
* pnc_start_entry   -
* pnc_stop_entry    -
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_shdw_ent_del(uint32_t pnc_start_entry, uint32_t pnc_stop_entry)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_DB_MOD, "pnc_start_entry(%d) pnc_stop_entry(%d)\n", pnc_start_entry, pnc_stop_entry);

	if ((pnc_start_entry >= TPM_PNC_SIZE) || (pnc_stop_entry >= TPM_PNC_SIZE))
		return (TPM_DB_ERR_INV_INPUT);

	/* Push up the existing range, except for the first one that is deleted */
	for (i = pnc_start_entry; i < pnc_stop_entry; i++)
		memcpy(&(tpm_db.pnc_shadow[i]), &(tpm_db.pnc_shadow[i + 1]), sizeof(tpm_db_pnc_shadow_t));

	/* Set last entry in range to invalid */
	memset(&(tpm_db.pnc_shadow[pnc_stop_entry].pnc_data), 0, sizeof(tpm_pnc_all_t));
	tpm_db.pnc_shadow[pnc_stop_entry].valid = TPM_DB_INVALID;

	return (TPM_DB_OK);

}

/*******************************************************************************
* tpm_db_pnc_shdw_ent_ins()
*
* DESCRIPTION:      Function inserts an empty entry into a PNC Range ("pushes down the range")
*
* INPUTS:
* pnc_start_entry   -
* pnc_stop_entry    -
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_pnc_shdw_ent_ins(uint32_t pnc_start_entry, uint32_t pnc_stop_entry)
{
	int32_t i;

	TPM_OS_DEBUG(TPM_DB_MOD, "pnc_start_entry(%d) pnc_stop_entry(%d)\n", pnc_start_entry, pnc_stop_entry);

	if ((pnc_start_entry >= (TPM_PNC_SIZE - 1)) || (pnc_stop_entry >= (TPM_PNC_SIZE - 1)))
		return (TPM_DB_ERR_INV_INPUT);

	/* Push down the existing range */
	for (i = (int32_t) pnc_stop_entry; i >= (int32_t) pnc_start_entry; i--)
		memcpy(&(tpm_db.pnc_shadow[i + 1]), &(tpm_db.pnc_shadow[i]), sizeof(tpm_db_pnc_shadow_t));

	/* Set empty (invalid) entry */
	memset(&(tpm_db.pnc_shadow[pnc_start_entry].pnc_data), 0, sizeof(tpm_pnc_all_t));
	tpm_db.pnc_shadow[pnc_start_entry].valid = TPM_DB_INVALID;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mod_etype_sel_get()
*
* DESCRIPTION:      Get select of Vlan Ethertype
*
* INPUTS:
* tpid            - Requested Vlan tpid
*
*
* OUTPUTS:
* etype_sel       - selector that matches this tpid
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mod_etype_sel_get(uint32_t tpid, uint32_t *etype_sel)
{
	uint32_t i;

	if (etype_sel == NULL) {
		TPM_OS_DEBUG(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	for (i = 0; i < TPM_NUM_VLAN_ETYPE_REGS; i++) {
		if (tpm_db.vlan_etype[i].tpid_ether_type == tpid && tpm_db.vlan_etype[i].valid == TPM_DB_VALID) {
			*etype_sel = i;
			return (TPM_DB_OK);
		}
	}
	return (TPM_DB_ERR_REC_EXIST);
}

/*******************************************************************************
* tpm_db_mod_etype_sel_free_get()
*
* DESCRIPTION:      Get an unused tpid selector
*
* INPUTS:
*
* OUTPUTS:
* etype_sel       - selector
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mod_etype_sel_free_get(uint32_t *etype_sel)
{
	uint32_t i;

	if (etype_sel == NULL) {
		TPM_OS_DEBUG(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	for (i = 0; i < TPM_NUM_VLAN_ETYPE_REGS; i++) {
		if (tpm_db.vlan_etype[i].valid == TPM_DB_INVALID) {
			*etype_sel = i;
			return (TPM_DB_OK);
		}
	}

	return (TPM_DB_ERR_DB_TBL_FULL);
}

/*******************************************************************************
* tpm_db_mod_etype_sel_set()
*
* DESCRIPTION:      Set a tpid in a selector
*
* INPUTS:
* tpid            - Requested Vlan tpid
* etype_sel       - selector that matches this tpid
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mod_etype_sel_set(uint32_t tpid, uint32_t etype_sel)
{
	if (etype_sel >= TPM_NUM_VLAN_ETYPE_REGS) {
		TPM_OS_DEBUG(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	tpm_db.vlan_etype[etype_sel].valid = TPM_DB_VALID;
	tpm_db.vlan_etype[etype_sel].tpid_ether_type = tpid;

	return (TPM_DB_OK);
}

void tpm_db_set_mc_filter_mode(uint32_t mode)
{
	tpm_db.igmp_def.filter_mode = mode;
}

uint32_t tpm_db_get_mc_filter_mode(void)
{
	return tpm_db.igmp_def.filter_mode;
}

void tpm_db_set_mc_pppoe_enable(uint32_t enable)
{
	tpm_db.igmp_def.mc_pppoe_enable = enable;
}

uint8_t tpm_db_get_mc_pppoe_enable(void)
{
	return tpm_db.igmp_def.mc_pppoe_enable;
}
void tpm_db_split_mod_set_enable(tpm_db_split_mod_enable_t enable)
{
	tpm_db.split_mod_conf.split_mod_enable = enable;
}

tpm_db_split_mod_enable_t tpm_db_split_mod_get_enable(void)
{
	return tpm_db.split_mod_conf.split_mod_enable;
}

void tpm_db_split_mod_set_num_vlans(uint32_t num_vlans)
{
	/* as default, vlan 0 is added during Init */
	tpm_db.split_mod_conf.num_vlans = (num_vlans + TPM_DB_SPLIT_MOD_INIT_VLANS_NUM);
}

uint32_t tpm_db_split_mod_get_num_vlans(void)
{
	return tpm_db.split_mod_conf.num_vlans;
}
void tpm_db_split_mod_set_mode(tpm_db_split_mod_mode_t mode)
{
	tpm_db.split_mod_conf.split_mod_mode = mode;
}

tpm_db_split_mod_mode_t tpm_db_split_mod_get_mode(void)
{
	return tpm_db.split_mod_conf.split_mod_mode;
}
void tpm_db_split_mod_set_num_p_bits(uint32_t num_p_bits, uint8_t  p_bits[TPM_DB_SPLIT_MOD_P_BIT_NUM_MAX])
{
	tpm_db.split_mod_conf.num_p_bits = num_p_bits;
	memcpy(&(tpm_db.split_mod_conf.p_bits), p_bits, TPM_DB_SPLIT_MOD_P_BIT_NUM_MAX);
}

uint32_t tpm_db_split_mod_get_num_p_bits(void)
{
	return tpm_db.split_mod_conf.num_p_bits;
}
int32_t tpm_db_split_mod_get_p_bits_by_index(uint8_t  index, uint8_t  *p_bits)
{
	if (p_bits == NULL)
		return TPM_DB_ERR_INV_INPUT;

	*p_bits = index;
	return TPM_DB_OK;
}
int32_t tpm_db_split_mod_get_index_by_p_bits(uint8_t  p_bits, uint32_t *index)
{
	uint32_t i;
	for(i = 0; i < tpm_db.split_mod_conf.num_p_bits; i++)
		if (p_bits == tpm_db.split_mod_conf.p_bits[i]) {
			*index = p_bits;
			return TPM_DB_OK;
		}

	return TPM_DB_ERR_REC_NOT_EXIST;
}

#if 0
void tpm_db_set_mc_igmp_mode(uint32_t mode)
{
   tpm_db.igmp_def.igmp_mode = mode;
}

uint32_t tpm_db_get_mc_igmp_mode(void)
{
   return tpm_db.igmp_def.igmp_mode;
}
#endif
void tpm_db_set_mc_per_uni_vlan_xlate(uint32_t enable)
{
	tpm_db.igmp_def.per_uni_vlan_xlat = enable;
}

uint8_t tpm_db_get_mc_per_uni_vlan_xlate(void)
{
	return tpm_db.igmp_def.per_uni_vlan_xlat;
}

void tpm_db_set_mc_hwf_queue(uint8_t hwf_queue)
{
	tpm_db.igmp_def.mc_hwf_queue = hwf_queue;
}

uint8_t tpm_db_get_mc_hwf_queue(void)
{
	return tpm_db.igmp_def.mc_hwf_queue;
}

void tpm_db_set_mc_cpu_queue(uint8_t cpu_queue)
{
	tpm_db.igmp_def.mc_cpu_queue = cpu_queue;
}

uint8_t tpm_db_get_mc_cpu_queue(void)
{
	return tpm_db.igmp_def.mc_cpu_queue;
}

void tpm_db_set_mc_igmp_proxy_sa_mac(uint8_t *sa_mac)
{
	memcpy(tpm_db_mc_igmp_proxy_sa_mac, sa_mac, 6 * sizeof(uint8_t));
	tpm_db_mc_igmp_proxy_sa_mac_valid = 1;
}

void tpm_db_get_mc_igmp_proxy_sa_mac(uint8_t *sa_mac, uint8_t *valid)
{
	*valid = tpm_db_mc_igmp_proxy_sa_mac_valid;
	if (tpm_db_mc_igmp_proxy_sa_mac_valid)
		memcpy(sa_mac, tpm_db_mc_igmp_proxy_sa_mac, 6 * sizeof(uint8_t));
}

void tpm_db_set_mc_lpbk_enable(tpm_ip_ver_t ver, uint8_t enable)
{
	if (ver < TPM_IP_VER_MAX)
		tpm_db.igmp_def.mc_lpbk_enable[ver] = enable;
}

void tpm_db_get_mc_lpbk_enable(tpm_ip_ver_t ver, uint8_t *enable)
{
	if (ver < TPM_IP_VER_MAX)
		*enable = tpm_db.igmp_def.mc_lpbk_enable[ver];
}

int32_t tpm_db_set_mc_stream_entry(uint32_t stream_num, tpm_db_mc_stream_entry_t *mc_stream)
{
	if (tpm_db_mc_stream_table[stream_num] == NULL) {
		tpm_db_mc_stream_table[stream_num] =
		/*(tpm_db_mc_stream_entry_t *)*/ kmalloc(sizeof(tpm_db_mc_stream_entry_t), GFP_KERNEL);
		if (tpm_db_mc_stream_table[stream_num] == NULL)
			return TPM_DB_ERR_MEM_ALLOC_FAIL;

		memcpy(tpm_db_mc_stream_table[stream_num], mc_stream, sizeof(tpm_db_mc_stream_entry_t));
	} else {
		if (tpm_db_mc_stream_table[stream_num]->igmp_mode == mc_stream->igmp_mode &&
		    tpm_db_mc_stream_table[stream_num]->mc_stream_pppoe == mc_stream->mc_stream_pppoe &&
		    tpm_db_mc_stream_table[stream_num]->vid == mc_stream->vid &&
		    tpm_db_mc_stream_table[stream_num]->src_valid == mc_stream->src_valid &&
		    !memcmp(tpm_db_mc_stream_table[stream_num]->src_addr, mc_stream->src_addr, 4 * sizeof(uint8_t)) &&
		    !memcmp(tpm_db_mc_stream_table[stream_num]->group_addr, mc_stream->group_addr, 4 * sizeof(uint8_t))) {
			tpm_db_mc_stream_table[stream_num]->dest_port_bm = mc_stream->dest_port_bm;
			tpm_db_mc_stream_table[stream_num]->u4_entry = mc_stream->u4_entry;
		} else
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_get_mc_stream_entry(uint32_t stream_num, tpm_db_mc_stream_entry_t *mc_stream)
{
	if (tpm_db_mc_stream_table[stream_num] == NULL)
		return TPM_DB_ERR_REC_NOT_EXIST;

	memcpy(mc_stream, tpm_db_mc_stream_table[stream_num], sizeof(tpm_db_mc_stream_entry_t));
	return TPM_DB_OK;
}

void tpm_db_reset_mc_stream_entry(uint32_t stream_num)
{
	if (tpm_db_mc_stream_table[stream_num] != NULL) {
		kfree(tpm_db_mc_stream_table[stream_num]);
		tpm_db_mc_stream_table[stream_num] = NULL;
	}
}

int32_t tpm_db_set_ipv6_mc_stream_entry(uint32_t stream_num, tpm_db_ipv6_mc_stream_entry_t *mc_stream)
{
	if (0 == tpm_db.ipv6_mc_stream[stream_num].valid) {
		memcpy(&(tpm_db.ipv6_mc_stream[stream_num]), mc_stream, sizeof(tpm_db_ipv6_mc_stream_entry_t));
		tpm_db.ipv6_mc_stream[stream_num].valid = 1;
	} else {
		if (tpm_db.ipv6_mc_stream[stream_num].igmp_mode == mc_stream->igmp_mode &&
			tpm_db.ipv6_mc_stream[stream_num].mc_stream_pppoe == mc_stream->mc_stream_pppoe &&
			tpm_db.ipv6_mc_stream[stream_num].vid == mc_stream->vid &&
			!memcmp(tpm_db.ipv6_mc_stream[stream_num].group_addr, mc_stream->group_addr, 16 * sizeof(uint8_t))) {
			tpm_db.ipv6_mc_stream[stream_num].dest_port_bm = mc_stream->dest_port_bm;
			tpm_db.ipv6_mc_stream[stream_num].u4_entry = mc_stream->u4_entry;
		} else
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv6_mc_stream_entry(uint32_t stream_num, tpm_db_ipv6_mc_stream_entry_t *mc_stream)
{
	if (0 == tpm_db.ipv6_mc_stream[stream_num].valid)
		return TPM_DB_ERR_REC_NOT_EXIST;

	memcpy(mc_stream, &(tpm_db.ipv6_mc_stream[stream_num]), sizeof(tpm_db_ipv6_mc_stream_entry_t));
	return TPM_DB_OK;
}

void tpm_db_reset_ipv6_mc_stream_entry(uint32_t stream_num)
{
	memset(&(tpm_db.ipv6_mc_stream[stream_num]), 0, sizeof(tpm_db_ipv6_mc_stream_entry_t));
}

int32_t tpm_db_get_mc_mac_port_bm(uint8_t *mac_addr, uint32_t *uni_port_bm)
{
	uint32_t entry_id;
	uint32_t port_nr;

	*uni_port_bm = 0;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MAC_NUM; entry_id++) {
		if (tpm_db_mc_mac_table[entry_id] != NULL)
			if (!memcmp(tpm_db_mc_mac_table[entry_id]->mac_addr, mac_addr, 6 * sizeof(uint8_t)))
				break;
	}

	if (entry_id == TPM_MC_MAX_MAC_NUM) {
		/* no entry for this MAC */
		*uni_port_bm = 0;
		return TPM_DB_OK;
	}

	for (port_nr = TPM_SRC_PORT_UNI_0; port_nr <= TPM_SRC_PORT_UNI_VIRT; port_nr++)
		if (tpm_db_mc_mac_table[entry_id]->user_num[port_nr])
			*uni_port_bm |= (TPM_TRG_UNI_0 << port_nr);

	return TPM_DB_OK;
}

int32_t tpm_db_increase_mc_mac_port_user_num(uint8_t *mac_addr, uint32_t uni_port)
{
	uint32_t entry_id, first_free = TPM_MC_MAX_MAC_NUM;
	uint32_t port_nr;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MAC_NUM; entry_id++) {
		if (tpm_db_mc_mac_table[entry_id] != NULL) {
			if (!memcmp(tpm_db_mc_mac_table[entry_id]->mac_addr, mac_addr, 6 * sizeof(uint8_t)))
				break;
		} else if (first_free == TPM_MC_MAX_MAC_NUM)
			first_free = entry_id;
	}

	if (entry_id == TPM_MC_MAX_MAC_NUM) {
		if (first_free == TPM_MC_MAX_MAC_NUM)
			return TPM_DB_ERR_DB_TBL_FULL;

		tpm_db_mc_mac_table[first_free] =
		/*(tpm_db_mc_mac_entry_t *)*/ kmalloc(sizeof(tpm_db_mc_mac_entry_t), GFP_KERNEL);
		if (tpm_db_mc_mac_table[first_free] == NULL)
			return TPM_DB_ERR_MEM_ALLOC_FAIL;

		memset(tpm_db_mc_mac_table[first_free], 0, sizeof(tpm_db_mc_mac_entry_t));
		memcpy(tpm_db_mc_mac_table[first_free]->mac_addr, mac_addr, 6 * sizeof(uint8_t));
		entry_id = first_free;
	}

	switch (uni_port) {
	case TPM_TRG_UNI_0:	port_nr = TPM_SRC_PORT_UNI_0;	break;
	case TPM_TRG_UNI_1:	port_nr = TPM_SRC_PORT_UNI_1;	break;
	case TPM_TRG_UNI_2:	port_nr = TPM_SRC_PORT_UNI_2;	break;
	case TPM_TRG_UNI_3:	port_nr = TPM_SRC_PORT_UNI_3;	break;
	case TPM_TRG_UNI_4:	port_nr = TPM_SRC_PORT_UNI_4;	break;
	case TPM_TRG_UNI_5:	port_nr = TPM_SRC_PORT_UNI_5;	break;
	case TPM_TRG_UNI_6:	port_nr = TPM_SRC_PORT_UNI_6;	break;
	case TPM_TRG_UNI_7:	port_nr = TPM_SRC_PORT_UNI_7;	break;
	case TPM_TRG_UNI_VIRT:	port_nr = TPM_SRC_PORT_UNI_VIRT;break;
	default:
		return TPM_DB_ERR_INV_INPUT;
	}
	tpm_db_mc_mac_table[entry_id]->user_num[port_nr] += 1;

	return TPM_DB_OK;
}

int32_t tpm_db_decrease_mc_mac_port_user_num(uint8_t *mac_addr, uint32_t uni_port)
{
	uint32_t entry_id;
	uint32_t port_nr;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MAC_NUM; entry_id++) {
		if (tpm_db_mc_mac_table[entry_id] != NULL) {
			if (!memcmp(tpm_db_mc_mac_table[entry_id]->mac_addr, mac_addr, 6 * sizeof(uint8_t)))
				break;
		}
	}

	if (entry_id == TPM_MC_MAX_MAC_NUM)
		return TPM_DB_ERR_REC_NOT_EXIST;

	switch (uni_port) {
	case TPM_TRG_UNI_0:	port_nr = TPM_SRC_PORT_UNI_0;	break;
	case TPM_TRG_UNI_1:	port_nr = TPM_SRC_PORT_UNI_1;	break;
	case TPM_TRG_UNI_2:	port_nr = TPM_SRC_PORT_UNI_2;	break;
	case TPM_TRG_UNI_3:	port_nr = TPM_SRC_PORT_UNI_3;	break;
	case TPM_TRG_UNI_4:	port_nr = TPM_SRC_PORT_UNI_4;	break;
	case TPM_TRG_UNI_5:	port_nr = TPM_SRC_PORT_UNI_5;	break;
	case TPM_TRG_UNI_6:	port_nr = TPM_SRC_PORT_UNI_6;	break;
	case TPM_TRG_UNI_7:	port_nr = TPM_SRC_PORT_UNI_7;	break;
	case TPM_TRG_UNI_VIRT:	port_nr = TPM_SRC_PORT_UNI_VIRT;break;
	default:
		return TPM_DB_ERR_INV_INPUT;
	}
	tpm_db_mc_mac_table[entry_id]->user_num[port_nr] -= 1;

	return TPM_DB_OK;
}

uint8_t tpm_db_get_mc_mac_port_user_num(uint8_t *mac_addr, uint32_t uni_port)
{
	uint32_t entry_id;
	uint32_t port_nr;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MAC_NUM; entry_id++) {
		if (tpm_db_mc_mac_table[entry_id] != NULL) {
			if (!memcmp(tpm_db_mc_mac_table[entry_id]->mac_addr, mac_addr, 6 * sizeof(uint8_t)))
				break;
		}
	}

	if (entry_id == TPM_MC_MAX_MAC_NUM)
		return TPM_DB_ERR_REC_NOT_EXIST;

	switch (uni_port) {
	case TPM_TRG_UNI_0:	port_nr = TPM_SRC_PORT_UNI_0;	break;
	case TPM_TRG_UNI_1:	port_nr = TPM_SRC_PORT_UNI_1;	break;
	case TPM_TRG_UNI_2:	port_nr = TPM_SRC_PORT_UNI_2;	break;
	case TPM_TRG_UNI_3:	port_nr = TPM_SRC_PORT_UNI_3;	break;
	case TPM_TRG_UNI_4:	port_nr = TPM_SRC_PORT_UNI_4;	break;
	case TPM_TRG_UNI_5:	port_nr = TPM_SRC_PORT_UNI_5;	break;
	case TPM_TRG_UNI_6:	port_nr = TPM_SRC_PORT_UNI_6;	break;
	case TPM_TRG_UNI_7:	port_nr = TPM_SRC_PORT_UNI_7;	break;
	case TPM_TRG_UNI_VIRT:	port_nr = TPM_SRC_PORT_UNI_VIRT;break;
	default:
		return 0;
	}

	if (TRG_UNI(uni_port)) {
		if (port_nr < TPM_MAX_NUM_UNI_PORTS)
			return tpm_db_mc_mac_table[entry_id]->user_num[port_nr];
	}

	return 0;
}

void tpm_db_reset_mc_mac_entry(uint8_t *mac_addr)
{
	uint32_t entry_id;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MAC_NUM; entry_id++) {
		if (tpm_db_mc_mac_table[entry_id] != NULL) {
			if (!memcmp(tpm_db_mc_mac_table[entry_id]->mac_addr, mac_addr, 6 * sizeof(uint8_t))) {
				kfree(tpm_db_mc_mac_table[entry_id]);
				tpm_db_mc_mac_table[entry_id] = NULL;
				return;
			}
		}
	}
}

uint32_t tpm_db_mc_lpbk_entries_num_get(void)
{
	return tpm_db_mc_lpbk_entries_num;
}

int32_t tpm_db_mc_lpbk_entry_set(uint32_t ip_ver, uint16_t mvlan, uint16_t in_vid, uint16_t out_vid, uint32_t rule_num,
				 uint32_t mod_entry)
{
	static uint32_t _rule_index = 1000;
	uint32_t entry_id, first_free = TPM_MC_MAX_MVLAN_XITS_NUM;
	tpm_db_mc_lpbk_entry_t *lpbk_entry = NULL;
	tpm_db_mc_vlan_entry_t *mvlan_entry = NULL;

	if (rule_num >= TPM_MC_MAX_LPBK_ENTRIES_NUM)
		return TPM_DB_ERR_DB_TBL_FULL;

	if (rule_num > tpm_db_mc_lpbk_entries_num)
		return TPM_DB_ERR_INV_INPUT;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MVLAN_XITS_NUM; entry_id++) {
		if (tpm_db_mc_vlan_xits_table[entry_id] != NULL) {
			if (mvlan == tpm_db_mc_vlan_xits_table[entry_id]->mvlan &&
				ip_ver == tpm_db_mc_vlan_xits_table[entry_id]->ip_ver) {
				mvlan_entry = tpm_db_mc_vlan_xits_table[entry_id];
				break;
			}
		} else if (first_free == TPM_MC_MAX_MVLAN_XITS_NUM)
			first_free = entry_id;
	}

	if (entry_id == TPM_MC_MAX_MVLAN_XITS_NUM) {
		if (first_free == TPM_MC_MAX_MVLAN_XITS_NUM)
			return TPM_DB_ERR_DB_TBL_FULL;

		mvlan_entry = /*(tpm_db_mc_vlan_entry_t *)*/ kmalloc(sizeof(tpm_db_mc_vlan_entry_t), GFP_KERNEL);
		if (mvlan_entry == NULL)
			return TPM_DB_ERR_MEM_ALLOC_FAIL;

		memset(mvlan_entry, 0, sizeof(tpm_db_mc_vlan_entry_t));
		mvlan_entry->mvlan = mvlan;
		mvlan_entry->ip_ver = ip_ver;

		tpm_db_mc_vlan_xits_table[first_free] = mvlan_entry;
	}

	first_free = TPM_DB_MAX_TRANSITION_NUM;

	for (entry_id = 0; entry_id < TPM_DB_MAX_TRANSITION_NUM; entry_id++) {
		if (mvlan_entry->xits[entry_id].valid == 0) {
			first_free = entry_id;
			break;
		}
	}

	if (first_free == TPM_DB_MAX_TRANSITION_NUM)
		return TPM_DB_ERR_DB_TBL_FULL;

	lpbk_entry = /*(tpm_db_mc_lpbk_entry_t *)*/ kmalloc(sizeof(tpm_db_mc_lpbk_entry_t), GFP_KERNEL);
	if (lpbk_entry == NULL)
		return TPM_DB_ERR_MEM_ALLOC_FAIL;

	memset(lpbk_entry, 0, sizeof(tpm_db_mc_lpbk_entry_t));

	mvlan_entry->xits[first_free].valid = 1;
	mvlan_entry->xits[first_free].in_vid = in_vid;
	mvlan_entry->xits[first_free].out_vid = out_vid;
	mvlan_entry->xits[first_free].lpbk_entry = lpbk_entry;
	mvlan_entry->xits_num++;

	_rule_index++;

	lpbk_entry->rule_index = _rule_index;
	lpbk_entry->mod_cmd = mod_entry;

	for (entry_id = tpm_db_mc_lpbk_entries_num; entry_id > rule_num; entry_id--)
		tpm_db_mc_lpbk_table[entry_id] = tpm_db_mc_lpbk_table[entry_id - 1];

	tpm_db_mc_lpbk_table[rule_num] = lpbk_entry;
	tpm_db_mc_lpbk_entries_num++;

	return TPM_DB_OK;
}

int32_t tpm_db_mc_vlan_xits_num_get(uint32_t ip_ver, uint16_t mvlan, uint32_t *xits_num)
{
	uint32_t entry_id;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MVLAN_XITS_NUM; entry_id++) {
		if (tpm_db_mc_vlan_xits_table[entry_id] != NULL) {
			if (tpm_db_mc_vlan_xits_table[entry_id]->mvlan == mvlan &&
				tpm_db_mc_vlan_xits_table[entry_id]->ip_ver == ip_ver) {
				*xits_num = tpm_db_mc_vlan_xits_table[entry_id]->xits_num;
				return TPM_DB_OK;
			}
		}
	}

	return TPM_DB_ERR_REC_NOT_EXIST;
}

int32_t tpm_db_mc_vlan_xit_entry_get(uint32_t ip_ver, uint16_t mvlan, uint32_t xit_id, uint32_t *rule_index, uint32_t *mod_entry)
{
	uint32_t entry_id, xit_cnt = 0;
	uint8_t found;
	tpm_db_mc_vlan_entry_t *mvlan_entry = NULL;
	tpm_db_mc_lpbk_entry_t *lpbk_entry = NULL;

	for (entry_id = 0; entry_id < TPM_MC_MAX_MVLAN_XITS_NUM; entry_id++) {
		if (tpm_db_mc_vlan_xits_table[entry_id] != NULL) {
			if (tpm_db_mc_vlan_xits_table[entry_id]->mvlan == mvlan &&
				tpm_db_mc_vlan_xits_table[entry_id]->ip_ver == ip_ver) {
				mvlan_entry = tpm_db_mc_vlan_xits_table[entry_id];
				break;
			}
		}
	}

	if (mvlan_entry == NULL)
		return TPM_DB_ERR_REC_NOT_EXIST;

	found = 0;
	for (entry_id = 0; entry_id < TPM_DB_MAX_TRANSITION_NUM; entry_id++) {
		if (xit_cnt == xit_id) {
			found = 1;
			break;
		}
		xit_cnt++;
	}

	if (found == 0)
		return TPM_DB_ERR_REC_NOT_EXIST;

	lpbk_entry = mvlan_entry->xits[entry_id].lpbk_entry;

	*rule_index = lpbk_entry->rule_index;
	*mod_entry = lpbk_entry->mod_cmd;

	return TPM_DB_OK;
}

int32_t tpm_db_mc_lpbk_rule_num_get(uint32_t rule_index, uint32_t *rule_num)
{
	uint32_t entry_id;

	for (entry_id = 0; entry_id < tpm_db_mc_lpbk_entries_num; entry_id++) {
		if (tpm_db_mc_lpbk_table[entry_id] != NULL) {
			if (tpm_db_mc_lpbk_table[entry_id]->rule_index == rule_index) {
				*rule_num = entry_id;
				return TPM_DB_OK;
			}
		}
	}

	return TPM_DB_ERR_REC_NOT_EXIST;
}

int32_t tpm_db_mc_lpbk_entry_invalidate(uint32_t rule_num)
{
	uint32_t entry_id, xit_id;
	uint8_t found;
	tpm_db_mc_lpbk_entry_t *lpbk_entry = NULL;
	tpm_db_mc_vlan_entry_t *mvlan_entry = NULL;

	if (rule_num > tpm_db_mc_lpbk_entries_num)
		return TPM_DB_ERR_INV_INPUT;

	lpbk_entry = tpm_db_mc_lpbk_table[rule_num];

	for (entry_id = rule_num; entry_id < (tpm_db_mc_lpbk_entries_num - 1); entry_id++)
		tpm_db_mc_lpbk_table[entry_id] = tpm_db_mc_lpbk_table[entry_id + 1];

	kfree(lpbk_entry);
	tpm_db_mc_lpbk_table[tpm_db_mc_lpbk_entries_num - 1] = NULL;
	tpm_db_mc_lpbk_entries_num--;

	found = 0;
	for (entry_id = 0; entry_id < TPM_MC_MAX_MVLAN_XITS_NUM; entry_id++) {
		mvlan_entry = tpm_db_mc_vlan_xits_table[entry_id];
		if (mvlan_entry != NULL) {
			if (mvlan_entry->xits_num > 0) {
				for (xit_id = 0; xit_id < TPM_DB_MAX_TRANSITION_NUM; xit_id++) {
					if (mvlan_entry->xits[xit_id].valid) {
						if (lpbk_entry == mvlan_entry->xits[xit_id].lpbk_entry) {
							mvlan_entry->xits[xit_id].valid = 0;
							found = 1;
							break;
						}
					}
				}

				if (found) {
					mvlan_entry->xits_num--;
					if (mvlan_entry->xits_num == 0) {
						kfree(mvlan_entry);
						tpm_db_mc_vlan_xits_table[entry_id] = NULL;
					}
					break;
				}
			}
		}
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mc_alloc_virt_uni_entry(uint32_t *entry_id)
{
	uint32_t free;

	for (free = 0; free < TPM_MC_MAX_STREAM_NUM; free++) {
		if (tpm_db_mc_virt_uni_entry_state_table[free] == 0) {
			tpm_db_mc_virt_uni_entry_state_table[free] = 1;
			*entry_id = free;
			return TPM_DB_OK;
		}
	}

	return TPM_DB_ERR_DB_TBL_FULL;
}

int32_t tpm_db_mc_free_virt_uni_entry(uint32_t entry_id)
{
	if (entry_id >= TPM_MC_MAX_STREAM_NUM)
		return TPM_DB_ERR_REC_INV;

	tpm_db_mc_virt_uni_entry_state_table[entry_id] = 0;
	return TPM_DB_OK;
}

void tpm_db_mc_rule_reset(void)
{
	uint32_t i;

	/* Reset multicast stream table */
	for (i = 0; i < TPM_MC_MAX_STREAM_NUM; i++) {
		if (tpm_db_mc_stream_table[i] != NULL) {
			kfree(tpm_db_mc_stream_table[i]);
			tpm_db_mc_stream_table[i] = NULL;
		}
	}

	/* Reset multicast mac table */
	for (i = 0; i < TPM_MC_MAX_MAC_NUM; i++) {
		if (tpm_db_mc_mac_table[i] != NULL) {
			kfree(tpm_db_mc_mac_table[i]);
			tpm_db_mc_mac_table[i] = NULL;
		}
	}

	/* Reset multicast loopback tables */
	tpm_db_mc_lpbk_entries_num = 0;
	for (i = 0; i < TPM_MC_MAX_LPBK_ENTRIES_NUM; i++) {
		if (tpm_db_mc_lpbk_table[i] != NULL) {
			kfree(tpm_db_mc_lpbk_table[i]);
			tpm_db_mc_lpbk_table[i] = NULL;
		}
	}

	for (i = 0; i < TPM_MC_MAX_MVLAN_XITS_NUM; i++) {
		if (tpm_db_mc_vlan_xits_table[i] != NULL) {
			kfree(tpm_db_mc_vlan_xits_table[i]);
			tpm_db_mc_vlan_xits_table[i] = NULL;
		}
	}

	/* Reset state table of virt_uni entries */
	memset(tpm_db_mc_virt_uni_entry_state_table, 0, TPM_MC_MAX_STREAM_NUM * sizeof(uint8_t));

	/* reset IPv6 MC rule */
	memset(tpm_db.ipv6_mc_stream, 0, sizeof(tpm_db.ipv6_mc_stream));

}
int32_t tpm_db_mc_vlan_get_ai_bit_by_vid(uint32_t mc_vlan, uint32_t *ai_bit)
{
	uint32_t i;
	int32_t ret_val;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vlan(%d) \n", mc_vlan);

	/* first, get ai bits if mc vlan already exists */
	ret_val = tpm_db_mc_vlan_get_ai_bit(mc_vlan, ai_bit);
	if (TPM_DB_OK == ret_val) {
		TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc vlan already exists, ai bits(%d)\n", *ai_bit);
		return TPM_DB_OK;
	}

	/* alloc a new ai bits */
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if (!tpm_db.mc_ai_bits_table[i].valid) {
			tpm_db.mc_ai_bits_table[i].valid = true;
			tpm_db.mc_ai_bits_table[i].mc_vlan = mc_vlan;
			tpm_db.mc_ai_bits_table[i].pnc_index_num = 0;
			memset(tpm_db.mc_ai_bits_table[i].pnc_index, 0xff,
			       sizeof(tpm_db.mc_ai_bits_table[i].pnc_index));
			*ai_bit = i;
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " alloc a new ai bits(%d)\n", i);
			return TPM_DB_OK;
		}
	}
	return (TPM_DB_ERR_DB_TBL_FULL);
}

bool tpm_db_mc_vlan_l2_rule_exist(uint32_t mc_vlan, uint32_t rule_num)
{
	uint32_t loop_in;
	uint32_t i;
	uint32_t ret_code;
	tpm_pnc_ranges_t range_id = 0;
	tpm_db_pnc_range_conf_t rangConf;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vlan(%d), rule_num(%d) \n", mc_vlan, rule_num);

	/* Get Range_Id */
	tpm_db_api_section_main_pnc_get(TPM_L2_PRIM_ACL, &range_id);

	/* Get Range Conf */
	ret_code = tpm_db_pnc_rng_conf_get(range_id, &rangConf);
	if (TPM_OK != ret_code) {
		TPM_OS_ERROR(TPM_DB_MOD, " recvd ret_code(%d)\n", ret_code);
		return false;
	}

	if (TPM_RANGE_TYPE_TABLE != rangConf.range_type) {
		/* not TABLE mode */
		return false;
	}

	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((mc_vlan == tpm_db.mc_ai_bits_table[i].mc_vlan) && (tpm_db.mc_ai_bits_table[i].valid)) {
			for (loop_in = 0; loop_in < TPM_MC_VLAN_MAX_PNC_RULE_NUM; loop_in++) {
				if (rule_num == tpm_db.mc_ai_bits_table[i].pnc_index[loop_in])
					return true;
			}
		}
	}
	return false;
}

int32_t tpm_db_mc_vlan_set_ai_bit_pnc_index(uint32_t mc_vlan, uint32_t l2_pnc_rule_index)
{
	uint32_t i;
	uint32_t loop_in;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vlan(%d) l2_pnc_rule_index(%d)\n", mc_vlan, l2_pnc_rule_index);

	/* in table mode, and rule_num already exist, do not record again */
	if (tpm_db_mc_vlan_l2_rule_exist(mc_vlan, l2_pnc_rule_index))
		return TPM_DB_OK;

	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((mc_vlan == tpm_db.mc_ai_bits_table[i].mc_vlan) && (tpm_db.mc_ai_bits_table[i].valid)) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " ai_index(%d)\n", i);
			for (loop_in = 0; loop_in < TPM_MC_VLAN_MAX_PNC_RULE_NUM; loop_in++) {
				if (~0 == tpm_db.mc_ai_bits_table[i].pnc_index[loop_in]) {
					tpm_db.mc_ai_bits_table[i].pnc_index[loop_in] = l2_pnc_rule_index;
					tpm_db.mc_ai_bits_table[i].pnc_index_num++;
					return TPM_DB_OK;
				}
			}
			return TPM_DB_ERR_DB_TBL_FULL;
		}
	}
	return (TPM_DB_ERR_DB_TBL_FULL);
}

int32_t tpm_db_mc_vlan_get_pnc_index_free_slot(uint32_t mc_vlan, uint32_t rule_num)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vlan(%d) \n", mc_vlan);

	/* in table mode, and rule_num already exist, always has free slot */
	if (tpm_db_mc_vlan_l2_rule_exist(mc_vlan, rule_num))
		return 1;

	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((mc_vlan == tpm_db.mc_ai_bits_table[i].mc_vlan) && (tpm_db.mc_ai_bits_table[i].valid)) {

			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " ai_index(%d), pnc_index_num(%d)\n",
				i, tpm_db.mc_ai_bits_table[i].pnc_index_num);
			/* ACL mode */
			if (TPM_MC_VLAN_MAX_PNC_RULE_NUM <= tpm_db.mc_ai_bits_table[i].pnc_index_num)
				return 0;
			return (TPM_MC_VLAN_MAX_PNC_RULE_NUM - tpm_db.mc_ai_bits_table[i].pnc_index_num);
		}
	}
	return TPM_MC_VLAN_MAX_PNC_RULE_NUM;
}

int32_t tpm_db_mc_vlan_reset_ai_bit(uint32_t l2_pnc_rule_index)
{
	uint32_t i;
	uint32_t loop_in;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "l2_pnc_rule_index(%d)\n", l2_pnc_rule_index);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if (!tpm_db.mc_ai_bits_table[i].valid)
			continue;

		for (loop_in = 0; loop_in < TPM_MC_VLAN_MAX_PNC_RULE_NUM; loop_in++) {
			if (l2_pnc_rule_index == tpm_db.mc_ai_bits_table[i].pnc_index[loop_in]) {
				tpm_db.mc_ai_bits_table[i].pnc_index_num--;
				tpm_db.mc_ai_bits_table[i].pnc_index[loop_in] = ~0;

				if (0 == tpm_db.mc_ai_bits_table[i].pnc_index_num) {
					TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " remove this mc vlan(%d), ai_bits(%d)\n",
						     tpm_db.mc_ai_bits_table[i].mc_vlan, i);
					tpm_db.mc_ai_bits_table[i].valid = false;
					tpm_db.mc_ai_bits_table[i].mc_vlan = 0;
					memset(tpm_db.mc_ai_bits_table[i].pnc_index, 0xff,
					       sizeof(tpm_db.mc_ai_bits_table[i].pnc_index));
				} else {
					TPM_OS_DEBUG(TPM_TPM_LOG_MOD,
						     " decrease pnc_index_num of this mc vlan(%d), pnc_index_num(%d)\n",
						     tpm_db.mc_ai_bits_table[i].mc_vlan,
						     tpm_db.mc_ai_bits_table[i].pnc_index_num);
				}

				return TPM_DB_OK;
			}
		}
		continue;
	}
	return (TPM_DB_ERR_DB_TBL_FULL);
}

int32_t tpm_db_mc_vlan_reset_mc_vlan(uint32_t mc_vlan)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vlan);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((tpm_db.mc_ai_bits_table[i].valid) && (mc_vlan == tpm_db.mc_ai_bits_table[i].mc_vlan)) {
			if (0 == tpm_db.mc_ai_bits_table[i].pnc_index_num) {
				tpm_db.mc_ai_bits_table[i].valid = false;
				tpm_db.mc_ai_bits_table[i].mc_vlan = 0;
				TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " reset this vlan(%d)\n", mc_vlan);
			}
			return TPM_DB_OK;
		}
	}
	return (TPM_DB_ERR_DB_TBL_FULL);
}

int32_t tpm_db_mc_vlan_get_ai_bit(uint32_t mc_vlan, uint32_t *ai_bit)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vlan);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if (mc_vlan == tpm_db.mc_ai_bits_table[i].mc_vlan) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " ai_index(%d)\n", i);
			*ai_bit = i;
			return TPM_DB_OK;
		}
	}
	return (TPM_DB_ERR_INV_INPUT);
}

int32_t tpm_db_set_mc_vid_cfg(uint32_t mc_vid, tpm_mc_vid_port_vid_set_t *mc_vid_uniports_config)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vid);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if (false == tpm_db.mc_vid_port_cfg[i].valid) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vid_index(%d)\n", i);
			tpm_db.mc_vid_port_cfg[i].valid = true;
			tpm_db.mc_vid_port_cfg[i].mc_vid = mc_vid;
			memcpy(&tpm_db.mc_vid_port_cfg[i].mc_vid_port_vids, mc_vid_uniports_config,
			       sizeof(tpm_mc_vid_port_vid_set_t));
			return TPM_DB_OK;
		}
	}
	return (TPM_DB_ERR_INV_INPUT);
}

int32_t tpm_db_get_mc_vid_cfg(uint32_t mc_vid, tpm_mc_vid_port_cfg_t **mc_vid_uniports_config)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vid);

	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((true == tpm_db.mc_vid_port_cfg[i].valid) && (mc_vid == tpm_db.mc_vid_port_cfg[i].mc_vid)) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vid_index(%d)\n", i);
			*mc_vid_uniports_config = &(tpm_db.mc_vid_port_cfg[i].mc_vid_port_vids[0]);
			return TPM_DB_OK;
		}
	}

	return (TPM_DB_ERR_INV_INPUT);
}

bool tpm_db_mc_vid_exist(uint32_t mc_vid)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vid);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((true == tpm_db.mc_vid_port_cfg[i].valid) && (mc_vid == tpm_db.mc_vid_port_cfg[i].mc_vid)) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vid_index(%d)\n", i);
			return true;
		}
	}
	return (false);
}

uint32_t tpm_db_remove_mc_vid_cfg(uint32_t mc_vid)
{
	uint32_t i;

	TPM_OS_DEBUG(TPM_TPM_LOG_MOD, "mc_vlan(%d)\n", mc_vid);
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if ((true == tpm_db.mc_vid_port_cfg[i].valid) && (mc_vid == tpm_db.mc_vid_port_cfg[i].mc_vid)) {
			TPM_OS_DEBUG(TPM_TPM_LOG_MOD, " mc_vid_index(%d)\n", i);
			tpm_db.mc_vid_port_cfg[i].valid = false;
			tpm_db.mc_vid_port_cfg[i].mc_vid = 0;
			return TPM_DB_OK;
		}
	}
	return (TPM_DB_ERR_INV_INPUT);
}
/*******************************************************************************
* tpm_db_mc_cfg_reset()
*
* DESCRIPTION:      Reset MC configuration part in DB. Set all structures to 0,
*                   and all valid fields to false
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_db_mc_cfg_reset(void)
{
    memset(&tpm_db.mc_ai_bits_table, 0, sizeof(tpm_db.mc_ai_bits_table));
    memset(&tpm_db.mc_vid_port_cfg, 0, sizeof(tpm_db.mc_vid_port_cfg));

    tpm_db_mc_igmp_proxy_sa_mac_valid = 0;
    memset(tpm_db_mc_igmp_proxy_sa_mac, 0, 6 * sizeof(uint8_t));

    return;
}

void tpm_db_mod2_init_jump_area_cfg(void)
{
	tpm_db_mod2_jump_area_cfg.base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.total_num = 0;
	tpm_db_mod2_jump_area_cfg.split_num = 0;

	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_PMAC] = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_GMAC_0] = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_GMAC_1] = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_PMAC] = TPM_MOD2_NULL_ENT_IDX;

	tpm_db_mod2_jump_area_cfg.split_pbit_num = 0;
}

void tpm_db_mod2_init_chain_cfg(void)
{
	tpm_mod2_multicast_mh_enable = 1;
	tpm_mod2_pppoe_add_mod_enable = 1;
	tpm_mod2_double_tag_enable = 1;
	tpm_mod2_udp_checksum_use_init_bm_enable = 0;
	tpm_mod2_udp_checksum_enable = 1;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].subr_chain = 1;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].max_size = TPM_MOD2_MAX_MH_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].subr_chain = 1;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].max_size = TPM_MOD2_MAX_MAC_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].subr_chain = 1;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].max_size = TPM_MOD2_MAX_VLAN_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].subr_chain = 1;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].max_size = TPM_MOD2_MAX_PPPOE_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].subr_chain = 1;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].max_size = TPM_MOD2_MAX_IPV6_PPPOE_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].subr_chain = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].max_size = TPM_MOD2_MAX_L2_TWO_TAG_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].subr_chain = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].max_size = TPM_MOD2_MAX_IPV4_NAPT_W_PPPOE_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].subr_chain = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].max_size = TPM_MOD2_MAX_IPV4_MC_W_MH_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].subr_chain = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].max_size = TPM_MOD2_MAX_ROUTE_W_PPPOE_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].base_entry = TPM_MOD2_NULL_ENT_IDX;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].subr_chain = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].max_size = TPM_MOD2_MAX_IPV6_MC_W_MH_CHAIN_SIZE;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num = 0;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].next_free[TPM_ENUM_GMAC_0] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].next_free[TPM_ENUM_GMAC_1] = TPM_MOD2_INVALID_CHAIN_ID;
	tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].next_free[TPM_ENUM_PMAC] = TPM_MOD2_INVALID_CHAIN_ID;

}

void tpm_db_mod2_init_pmt_info(void)
{
	tpm_mod2_chain_area_base = TPM_MOD2_NULL_ENT_IDX;
	tpm_mod2_total_chain_num = 0;

	memset(tpm_db_mod2_jump_pmt_info, 0, TPM_MAX_NUM_GMACS * sizeof(tpm_mod2_jump_pmt_info_t *));
	memset(tpm_db_mod2_chain_pmt_info, 0, TPM_MAX_NUM_GMACS * sizeof(tpm_mod2_jump_pmt_info_t *));
}

void tpm_db_mod2_init_chain_info(void)
{
	memset(tpm_db_mod2_jump_booked_entry_bm, 0, TPM_MAX_NUM_GMACS * sizeof(uint32_t *));
	memset(tpm_db_mod2_jump_occupied_entry_bm, 0, TPM_MAX_NUM_GMACS * sizeof(uint32_t *));

	tpm_db_mod2_jump_bm_group = 0;

	memset(tpm_db_mod2_chain_booked_entry_bm, 0, TPM_MAX_NUM_GMACS * TPM_CHAIN_TYPE_MAX * sizeof(uint32_t *));
	memset(tpm_db_mod2_chain_occupied_entry_bm, 0, TPM_MAX_NUM_GMACS * TPM_CHAIN_TYPE_MAX * sizeof(uint32_t *));

	memset(tpm_db_mod2_chain_bm_group, 0, TPM_CHAIN_TYPE_MAX * sizeof(uint32_t));

	memset(tpm_db_mod2_chain_info, 0, TPM_MAX_NUM_GMACS * TPM_CHAIN_TYPE_MAX * sizeof(tpm_mod2_chain_info_t *));
}

void tpm_db_mod2_set_chain_num(tpm_chain_type_t chain_type, uint16_t chain_num)
{
	if (chain_type < TPM_CHAIN_TYPE_MAX && chain_type != TPM_CHAIN_TYPE_NONE)
		tpm_db_mod2_chain_cfg[chain_type].total_num = chain_num;
}

uint16_t tpm_db_mod2_get_chain_max_size(tpm_chain_type_t chain_type)
{
	if (chain_type < TPM_CHAIN_TYPE_MAX && chain_type != TPM_CHAIN_TYPE_NONE)
		return tpm_db_mod2_chain_cfg[chain_type].max_size;

	return 0;
}

void tpm_db_mod2_set_multicast_mh_state(uint8_t enable)
{
	if (enable) {
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].max_size = TPM_MOD2_MAX_IPV4_MC_W_MH_CHAIN_SIZE;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].max_size = TPM_MOD2_MAX_IPV6_MC_W_MH_CHAIN_SIZE;
	} else {
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].max_size = TPM_MOD2_MAX_IPV4_MC_WO_MH_CHAIN_SIZE;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].max_size = TPM_MOD2_MAX_IPV6_MC_WO_MH_CHAIN_SIZE;
	}

	tpm_mod2_multicast_mh_enable = enable;
}

uint8_t tpm_db_mod2_get_multicast_mh_state(void)
{
	return tpm_mod2_multicast_mh_enable;
}

void tpm_db_mod2_set_pppoe_add_mod_state(uint8_t enable)
{
	if (enable) {
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].max_size = TPM_MOD2_MAX_IPV4_NAPT_W_PPPOE_CHAIN_SIZE;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].max_size = TPM_MOD2_MAX_ROUTE_W_PPPOE_CHAIN_SIZE;
	} else {
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].max_size = TPM_MOD2_MAX_IPV4_NAPT_WO_PPPOE_CHAIN_SIZE;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].max_size = TPM_MOD2_MAX_ROUTE_WO_PPPOE_CHAIN_SIZE;
	}

	tpm_mod2_pppoe_add_mod_enable = enable;
}

uint8_t tpm_db_mod2_get_pppoe_add_mod_state(void)
{
	return tpm_mod2_pppoe_add_mod_enable;
}

void tpm_db_mod2_set_double_tag_state(uint8_t enable)
{
	if (enable)
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].max_size = TPM_MOD2_MAX_L2_TWO_TAG_CHAIN_SIZE;
	else
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].max_size = TPM_MOD2_MAX_L2_ONE_TAG_CHAIN_SIZE;

	tpm_mod2_double_tag_enable = enable;
}

uint8_t tpm_db_mod2_get_double_tag_state(void)
{
	return tpm_mod2_double_tag_enable;
}

void tpm_db_mod2_set_udp_checksum_use_init_bm_state(uint8_t enable)
{
	tpm_mod2_udp_checksum_use_init_bm_enable = enable;
}

uint8_t tpm_db_mod2_get_udp_checksum_init_bm_state(void)
{
	return tpm_mod2_udp_checksum_use_init_bm_enable;
}

void tpm_db_mod2_set_udp_checksum_state(uint8_t enable)
{
	tpm_mod2_udp_checksum_enable = enable;
}

uint8_t tpm_db_mod2_get_udp_checksum_state(void)
{
	return tpm_mod2_udp_checksum_enable;
}

int32_t tpm_db_mod2_set_jump_entry(tpm_gmacs_enum_t gmac_port, uint16_t entry_id, tpm_mod2_entry_t *pattern)
{
	tpm_mod2_jump_pmt_info_t *info_p = NULL;

	if (pattern == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (entry_id >= tpm_db_mod2_jump_area_cfg.total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	info_p = &tpm_db_mod2_jump_pmt_info[gmac_port][entry_id];

	if (info_p->status != TPM_MOD_ENTRY_BOOKED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	memcpy(&(info_p->pattern), pattern, sizeof(tpm_mod2_entry_t));

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_activate_jump_entry(tpm_gmacs_enum_t gmac_port, uint16_t entry_id)
{
	tpm_mod2_jump_pmt_info_t *info_p = NULL;
	uint32_t i, j, mask;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (entry_id >= tpm_db_mod2_jump_area_cfg.total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	info_p = &tpm_db_mod2_jump_pmt_info[gmac_port][entry_id];

	if (info_p->status != TPM_MOD_ENTRY_BOOKED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}
	/* TODO: Check if the entry is split mod entry */

	i = j = 0;
	j = entry_id & 0x1f;
	i = entry_id >> 5;
	mask = 1 << j;

	tpm_db_mod2_jump_booked_entry_bm[gmac_port][i] &= ~mask;

	if (tpm_db_mod2_jump_split_mod_all_entry_bm[gmac_port][i] & mask) {
		/* this is a split mod entry */
		info_p->status = TPM_MOD_ENTRY_SPLIT_MOD;
		tpm_db_mod2_jump_split_mod_occupied_entry_bm[gmac_port][i] |= mask;
	}
	else {
		info_p->status = TPM_MOD_ENTRY_OCCUPIED;
		tpm_db_mod2_jump_occupied_entry_bm[gmac_port][i] |= mask;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_get_jump_entry_pattern_data(tpm_gmacs_enum_t gmac_port, uint16_t entry_id,
						tpm_mod2_entry_t *pattern)
{
	tpm_mod2_jump_pmt_info_t *info_p = NULL;

	if (pattern == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (entry_id >= tpm_db_mod2_jump_area_cfg.total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	info_p = &tpm_db_mod2_jump_pmt_info[gmac_port][entry_id];

	if (    (info_p->status != TPM_MOD_ENTRY_OCCUPIED)
		 && (info_p->status != TPM_MOD_ENTRY_SPLIT_MOD)) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	memcpy(pattern, &(info_p->pattern), sizeof(tpm_mod2_entry_t));

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_del_jump_entry(tpm_gmacs_enum_t gmac_port, uint16_t entry_id)
{
	tpm_mod2_jump_pmt_info_t *info_p = NULL;
	uint32_t i, j, mask;
	/*uint16_t jump_to; */

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (entry_id >= tpm_db_mod2_jump_area_cfg.total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	info_p = &tpm_db_mod2_jump_pmt_info[gmac_port][entry_id];

	if (   info_p->status != TPM_MOD_ENTRY_OCCUPIED
		&& info_p->status != TPM_MOD_ENTRY_SPLIT_MOD) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	/* delete jump entry in db */
	memset(info_p, 0, sizeof(tpm_mod2_jump_pmt_info_t));

	/* TODO: Check if the entry is split mod entry */

	info_p->status = TPM_MOD_ENTRY_FREE;

	i = j = 0;
	j = entry_id & 0x1f;
	i = entry_id >> 5;
	mask = 1 << j;

	if (tpm_db_mod2_jump_split_mod_all_entry_bm[gmac_port][i] & mask) {
		/* this is a split mod pmt entry */
		tpm_db_mod2_jump_split_mod_occupied_entry_bm[gmac_port][i] &= ~mask;
	}
	else {
		tpm_db_mod2_jump_occupied_entry_bm[gmac_port][i] &= ~mask;
	}

    tpm_db_mod2_flush_jump_area(gmac_port, entry_id, 1, 0);

	return TPM_DB_OK;
}

uint16_t tpm_db_mod2_find_matched_chain(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t total_num,
					tpm_mod2_chain_info_t *chains, tpm_mod2_chain_pmt_info_t *pmt_data,
					uint16_t entry_num, tpm_mod2_entry_t *pattern)
{
	uint16_t chain_id, entry_id;
	uint32_t bm_idx, data;
	uint32_t *booked_bm = NULL, *occupied_bm = NULL;
	tpm_mod2_chain_pmt_info_t *pmt_ptr = NULL;

	booked_bm = tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type];
	occupied_bm = tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type];

	for (bm_idx = 0; bm_idx < tpm_db_mod2_chain_bm_group[chain_type]; bm_idx++) {
		data = (booked_bm[bm_idx] | occupied_bm[bm_idx]);
		if (data) {
			chain_id = bm_idx << 5;	/* multiply 32 */
			while (data) {
				if (data & 0x1) {
					if (entry_num == chains[chain_id].entry_num) {
						pmt_ptr = &pmt_data[chains[chain_id].base_entry];
						for (entry_id = 0; entry_id < entry_num; entry_id++) {
							if (memcmp
							    (&(pmt_ptr[entry_id].pattern), &pattern[entry_id],
							     sizeof(tpm_mod2_entry_t))) {
								break;
							}
						}

						if (entry_id == entry_num)
							return chain_id;
					}
				}
				chain_id++;
				data = data >> 1;
			}
		}
	}

	return TPM_MOD2_INVALID_CHAIN_ID;
}

void tpm_db_mod2_increase_chain_user(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num++;
}

void tpm_db_mod2_decrease_chain_user(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	if (tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num != 0)
		tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num--;
}

uint16_t tpm_db_mod2_chain_user_num(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	return tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num;
}

uint16_t tpm_db_mod2_get_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t entry_num,
				     tpm_mod2_entry_t *pattern)
{
	if (pattern == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_MOD2_INVALID_CHAIN_ID;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_MOD2_INVALID_CHAIN_ID;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_MOD2_INVALID_CHAIN_ID;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (tpm_db_mod2_chain_pmt_info[gmac_port] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid pmt data\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	return tpm_db_mod2_find_matched_chain(gmac_port, chain_type,
					      tpm_db_mod2_chain_cfg[chain_type].total_num,
					      tpm_db_mod2_chain_info[gmac_port][chain_type],
					      tpm_db_mod2_chain_pmt_info[gmac_port], entry_num, pattern);
}

int32_t tpm_db_mod2_set_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id,
				    uint16_t entry_num, tpm_mod2_entry_t *pattern)
{
	uint16_t /*match_chain, */ base_offset, entry_idx;
	tpm_mod2_chain_info_t *info_p;
	tpm_mod2_chain_pmt_info_t *pmt_array;

	if (pattern == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];
	if (info_p->status == TPM_MOD_ENTRY_OCCUPIED) {
		tpm_db_mod2_increase_chain_user(gmac_port, chain_type, chain_id);
	} else if (info_p->status == TPM_MOD_ENTRY_BOOKED) {
		if (tpm_db_mod2_chain_user_num(gmac_port, chain_type, chain_id) == 0) {
			base_offset = tpm_db_mod2_chain_cfg[chain_type].base_entry - tpm_mod2_chain_area_base
			    + chain_id * tpm_db_mod2_chain_cfg[chain_type].max_size;

			pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][base_offset];

			for (entry_idx = 0; entry_idx < entry_num; entry_idx++) {
				if (pmt_array[entry_idx].status != TPM_MOD_ENTRY_FREE) {
					TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain status\n");
					return TPM_DB_ERR_REC_STATUS_ERR;
				}

				pmt_array[entry_idx].status = TPM_MOD_ENTRY_BOOKED;
				pmt_array[entry_idx].chain_type = chain_type;
				pmt_array[entry_idx].chain_id = chain_id;
				memcpy(&pmt_array[entry_idx].pattern, &pattern[entry_idx], sizeof(tpm_mod2_entry_t));
			}

			info_p->base_entry = base_offset;
			info_p->entry_num = entry_num;
		}

		tpm_db_mod2_increase_chain_user(gmac_port, chain_type, chain_id);
	} else {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_activate_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	tpm_mod2_chain_info_t *info_p;
	uint32_t i, j, mask;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];

	if (info_p->status == TPM_MOD_ENTRY_BOOKED) {
		info_p->status = TPM_MOD_ENTRY_OCCUPIED;

		i = j = 0;
		j = chain_id & 0x1f;
		i = chain_id >> 5;
		mask = 1 << j;

		tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type][i] &= ~mask;
		tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type][i] |= mask;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_activate_chain_pmt_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	uint16_t base_offset, entry_idx, entry_num;
	tpm_mod2_chain_info_t *info_p = NULL;
	tpm_mod2_chain_pmt_info_t *pmt_array = NULL;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];

	if (info_p->status != TPM_MOD_ENTRY_BOOKED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	base_offset = info_p->base_entry;
	entry_num = info_p->entry_num;

	pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][base_offset];

	for (entry_idx = 0; entry_idx < entry_num; entry_idx++)
		pmt_array[entry_idx].status = TPM_MOD_ENTRY_OCCUPIED;

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_if_chain_pmt_entries_exist(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type,
					       uint16_t chain_id, uint8_t *exist)
{
	uint16_t base_offset, entry_idx, entry_num;
	tpm_mod2_chain_info_t *info_p = NULL;
	tpm_mod2_chain_pmt_info_t *pmt_array = NULL;

	if (exist == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];

	*exist = 0;

	if (info_p->status == TPM_MOD_ENTRY_BOOKED) {
		base_offset = info_p->base_entry;
		entry_num = info_p->entry_num;

		pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][base_offset];

		for (entry_idx = 0; entry_idx < entry_num; entry_idx++) {
			if (pmt_array[entry_idx].status != TPM_MOD_ENTRY_OCCUPIED)
				break;
		}

		if (entry_idx == entry_num)
			*exist = 1;

	} else if (info_p->status == TPM_MOD_ENTRY_OCCUPIED)
		*exist = 1;
	else {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_get_chain_entry_num(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type,
					uint16_t chain_id, uint16_t *entry_num)
{
	tpm_mod2_chain_info_t *info_p;

	if (entry_num == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	*entry_num = 0;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];
	if (info_p->status != TPM_MOD_ENTRY_OCCUPIED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	*entry_num = info_p->entry_num;

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_get_chain_entry_pattern_data(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type,
						 uint16_t chain_id, uint16_t pattern_id, tpm_mod2_entry_t *pattern)
{
	tpm_mod2_chain_info_t *info_p;
	tpm_mod2_chain_pmt_info_t *entry_p;

	if (pattern == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero chain\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	if (chain_id >= tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain index\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain info\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];
	if (info_p->status != TPM_MOD_ENTRY_OCCUPIED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}

	if (pattern_id >= info_p->entry_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid pattern index\n");
		return TPM_DB_ERR_DB_TBL_INV;
	}

	entry_p = &tpm_db_mod2_chain_pmt_info[gmac_port][info_p->base_entry + pattern_id];
	if (entry_p->status != TPM_MOD_ENTRY_OCCUPIED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid entry status\n");
		return TPM_DB_ERR_REC_STATUS_ERR;
	}
	memcpy(pattern, &(entry_p->pattern), sizeof(tpm_mod2_entry_t));

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_del_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
	uint16_t /*entry_offset, chain_type, chain_id, */ entry_num, /*jump_to, */ entry_index;
	uint8_t remove_it;
	tpm_mod2_chain_info_t *info_p = NULL;
	tpm_mod2_chain_pmt_info_t *pmt_array = NULL;
	uint32_t i, j, mask;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain type \n");
		return TPM_DB_ERR_REC_INV;
	}

	if (chain_id > tpm_db_mod2_chain_cfg[chain_type].total_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain id \n");
		return TPM_DB_ERR_REC_INV;
	}

	info_p = &tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id];

	if (info_p->status != TPM_MOD_ENTRY_OCCUPIED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid chain entry \n");
		return TPM_DB_ERR_REC_INV;
	}

	pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][info_p->base_entry];

	tpm_db_mod2_decrease_chain_user(gmac_port, chain_type, chain_id);

	remove_it = 0;
	if (tpm_db_mod2_chain_user_num(gmac_port, chain_type, chain_id) == 0)
		remove_it = 1;

	entry_num = info_p->entry_num;

	for (entry_index = 0; entry_index < entry_num; entry_index++) {
		if (remove_it) {
			memset(&pmt_array[entry_index], 0, sizeof(tpm_mod2_chain_pmt_info_t));
			pmt_array[entry_index].status = TPM_MOD_ENTRY_FREE;
		}
	}

	if (remove_it) {
		memset(info_p, 0, sizeof(tpm_mod2_chain_info_t));
		info_p->status = TPM_MOD_ENTRY_FREE;

		i = j = 0;
		j = chain_id & 0x1f;
		i = chain_id >> 5;
		mask = 1 << j;

		tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type][i] &= ~mask;

		tpm_db_mod2_flush_chain_entry(gmac_port, chain_type, chain_id, 1, 0);
	}

	return TPM_DB_OK;
}

void tpm_db_mod2_update_next_free_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type)
{
	uint16_t chain_id;
	uint32_t bm_idx, bit_idx, data;
	uint32_t *booked_bm = NULL, *occupied_bm = NULL;

	booked_bm = tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type];
	occupied_bm = tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type];

	for (bm_idx = 0; bm_idx < tpm_db_mod2_chain_bm_group[chain_type]; bm_idx++) {
		data = ((booked_bm[bm_idx] | occupied_bm[bm_idx]) ^ 0xffffffff);
		if (data) {
			chain_id = bm_idx << 5;	/* multiply 32 */
			bit_idx = 0;
			while (data) {
				if (data & 0x1) {
					chain_id += bit_idx;
					if (chain_id < tpm_db_mod2_chain_cfg[chain_type].total_num) {
						tpm_db_mod2_chain_cfg[chain_type].next_free[gmac_port] = chain_id;
						return;
					}
					break;
				}
				bit_idx++;
				data = data >> 1;
			}
		}
	}

	tpm_db_mod2_chain_cfg[chain_type].next_free[gmac_port] = TPM_MOD2_INVALID_CHAIN_ID;
	return;
}

uint16_t tpm_db_mod2_get_next_free_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type)
{
	uint16_t next_free;
	uint32_t i, j, mask;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return TPM_MOD2_INVALID_CHAIN_ID;

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE)
		return TPM_MOD2_INVALID_CHAIN_ID;

	next_free = tpm_db_mod2_chain_cfg[chain_type].next_free[gmac_port];
	if (next_free != TPM_MOD2_INVALID_CHAIN_ID) {
		tpm_db_mod2_chain_info[gmac_port][chain_type][next_free].status = TPM_MOD_ENTRY_BOOKED;

		i = j = 0;
		j = TPM_DB_MOD_32(next_free);
		i = TPM_DB_DIVIDED_BY_32(next_free);
		mask = 1 << j;

		tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type][i] |= mask;
	}

	tpm_db_mod2_update_next_free_chain_entry(gmac_port, chain_type);

	return next_free;
}

uint16_t tpm_db_mod2_convert_chain_to_pmt_entry(tpm_chain_type_t chain_type, uint16_t chain_id)
{
	tpm_mod2_chain_cfg_t *cfg_p = NULL;

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE)
		return TPM_MOD2_NULL_ENT_IDX;

	cfg_p = &tpm_db_mod2_chain_cfg[chain_type];

	if (chain_id >= cfg_p->total_num)
		return TPM_MOD2_NULL_ENT_IDX;

	return (chain_id * cfg_p->max_size + cfg_p->base_entry);
}

int32_t tpm_db_mod2_get_chain_id_by_pmt_entry(tpm_gmacs_enum_t gmac_port, uint16_t entry_id,
					      tpm_chain_type_t *chain_type, uint16_t *chain_id)
{
	uint16_t entry_offset;
	tpm_mod2_chain_pmt_info_t *pmt_array = NULL;

	if (chain_type == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_id == NULL) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (entry_id >= TPM_MOD2_TOTAL_PMT_SIZE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	entry_offset = entry_id - tpm_mod2_chain_area_base;
	if (entry_offset >= tpm_mod2_total_chain_num) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][entry_offset];

	if (pmt_array->status != TPM_MOD_ENTRY_OCCUPIED) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid pmt entry \n");
		return TPM_DB_ERR_REC_INV;
	}

	*chain_type = pmt_array->chain_type;
	*chain_id = pmt_array->chain_id;

	return TPM_DB_OK;
}

void tpm_db_mod2_update_next_free_jump_entry(tpm_gmacs_enum_t gmac_port)
{
	uint16_t entry_id /*, total_num */ ;
	/*tpm_mod2_jump_pmt_info_t *info_array = NULL; */
	uint32_t bm_idx, bit_idx, data;
	uint32_t *booked_bm = NULL, *occupied_bm = NULL, *split_mod_occupied_bm = NULL;

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return;
	}

	booked_bm = tpm_db_mod2_jump_booked_entry_bm[gmac_port];
	occupied_bm = tpm_db_mod2_jump_occupied_entry_bm[gmac_port];
	split_mod_occupied_bm = tpm_db_mod2_jump_split_mod_all_entry_bm[gmac_port];
#if 0
	info_array = tpm_db_mod2_jump_pmt_info[gmac_port];
	total_num  = tpm_db_mod2_jump_area_cfg.total_num;

	for (entry_id = 0; entry_id < total_num; entry_id++)
#endif
	for (bm_idx = 0; bm_idx < tpm_db_mod2_jump_bm_group; bm_idx++) {
		/*if (info_array[entry_id].status == TPM_MOD_ENTRY_FREE) */
		data = ((booked_bm[bm_idx] | occupied_bm[bm_idx] | split_mod_occupied_bm[bm_idx]) ^ 0xffffffff);
		if (data) {
			entry_id = bm_idx << 5;	/* multiply 32 */
			bit_idx = 0;
			while (data) {
				if (data & 0x1) {
					entry_id += bit_idx;
					if (entry_id < tpm_db_mod2_jump_area_cfg.total_num) {
						tpm_db_mod2_jump_area_cfg.next_free[gmac_port] = entry_id;
						return;
					}
					break;
				}
				bit_idx++;
				data = data >> 1;
			}
		}
	}

	tpm_db_mod2_jump_area_cfg.next_free[gmac_port] = TPM_MOD2_NULL_ENT_IDX;
	return;
}

uint16_t tpm_db_mod2_get_next_free_jump_entry(tpm_gmacs_enum_t gmac_port)
{
	uint16_t next_free;
	uint32_t i, j, mask;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return TPM_MOD2_NULL_ENT_IDX;

	next_free = tpm_db_mod2_jump_area_cfg.next_free[gmac_port];
	if (next_free != TPM_MOD2_NULL_ENT_IDX) {
		tpm_db_mod2_jump_pmt_info[gmac_port][next_free].status = TPM_MOD_ENTRY_BOOKED;

		i = j = 0;
		j = TPM_DB_MOD_32(next_free);
		i = TPM_DB_DIVIDED_BY_32(next_free);
		mask = 1 << j;

		tpm_db_mod2_jump_booked_entry_bm[gmac_port][i] |= mask;
	}

	tpm_db_mod2_update_next_free_jump_entry(gmac_port);

	return next_free;
}

uint32_t tpm_db_mod2_split_mod_get_vlan_num_in_use(tpm_gmacs_enum_t gmac_port)
{
	uint32_t i;
	uint32_t vlan_num = 0;

	for (i = 0; i < TPM_DB_SPLIT_MOD_NUM_VLANS_MAX; i++) {
		if (tpm_db.split_mod_conf.gmac_vlan_conf[gmac_port].split_mod_vlan[i].valid)
			vlan_num++;
	}

	return vlan_num;
}

uint16_t tpm_db_mod2_get_next_split_mod_free_jump_entry(tpm_gmacs_enum_t gmac_port, tpm_pkt_mod_t *mod_data)
{
	uint16_t next_free;
	uint32_t i, j, mask;
	uint32_t vlan_index, db_ret;
	uint32_t  pbit_index = 0;
	tpm_vlan_key_t  *vlan_out;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return TPM_MOD2_NULL_ENT_IDX;

	db_ret = tpm_db_mod2_split_mod_get_vlan_index(gmac_port, mod_data, &vlan_index);
	if (TPM_DB_OK != db_ret)
		return TPM_MOD2_NULL_ENT_IDX;

	/* get next_free pmt index from vid index */
	if (0 == vlan_index)
		/* first vlan, means vlan 0, default */
		next_free = 1;
	else
		next_free = (16 * vlan_index);

	if (VLANOP_EXT_TAG_MOD_INS == mod_data->vlan_mod.vlan_op)
		vlan_out = &mod_data->vlan_mod.vlan2_out;
	else
		vlan_out = &mod_data->vlan_mod.vlan1_out;

	if (0 == vlan_out->pbit_mask)
		/* pbit AS_IS */
		pbit_index = 0;
	else {
		pbit_index = vlan_out->pbit;
		if (next_free != 1)
			pbit_index++;
	}

	next_free += pbit_index;

	if (next_free != TPM_MOD2_NULL_ENT_IDX) {
		tpm_db_mod2_jump_pmt_info[gmac_port][next_free].status = TPM_MOD_ENTRY_BOOKED;

		i = j = 0;
		j = TPM_DB_MOD_32(next_free);
		i = TPM_DB_DIVIDED_BY_32(next_free);
		mask = 1 << j;

		tpm_db_mod2_jump_booked_entry_bm[gmac_port][i] |= mask;
	}

	return next_free;
}
int32_t tpm_db_mod2_split_mod_insert_vlan(tpm_gmacs_enum_t port, tpm_pkt_mod_t *mod_data)
{
	uint32_t i;
	uint32_t vlan_num;

	/* check vlan num right now */
	vlan_num = tpm_db_mod2_split_mod_get_vlan_num_in_use(port);
	if (vlan_num >= tpm_db_split_mod_get_num_vlans()){
		TPM_OS_ERROR(TPM_DB_MOD, "already has %d num_vlans\n", vlan_num - TPM_DB_SPLIT_MOD_INIT_VLANS_NUM);
		return TPM_DB_ERR_DB_TBL_FULL;
	}

	for (i = 0; i < TPM_DB_SPLIT_MOD_NUM_VLANS_MAX; i++) {
		if (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].valid)
			continue;

		//here finds a spot
		tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].valid = 1;

		if (mod_data->vlan_mod.vlan1_out.vid_mask)
			tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_1 = mod_data->vlan_mod.vlan1_out.vid;

		if (mod_data->vlan_mod.vlan2_out.vid_mask)
			tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_2 = mod_data->vlan_mod.vlan2_out.vid;

		if (mod_data->vlan_mod.vlan1_out.tpid_mask)
			tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_1 = mod_data->vlan_mod.vlan1_out.tpid;

		if (mod_data->vlan_mod.vlan2_out.tpid_mask)
			tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_2 = mod_data->vlan_mod.vlan2_out.tpid;

		tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_op = mod_data->vlan_mod.vlan_op;
		tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].user_num = 1;

		return TPM_DB_OK;
	}

	return TPM_DB_ERR_DB_TBL_FULL;
}
int32_t tpm_db_mod2_split_mod_get_vlan_index(tpm_gmacs_enum_t port, tpm_pkt_mod_t *mod_data, uint32_t *index)
{
	uint32_t i;
	//printk("input: port: %d, vlan_op: %d, vlan1: %d(%d), vlan2: %d(%d)\n",
		//port, mod_data->vlan_mod.vlan_op, mod_data->vlan_mod.vlan1_out.vid, mod_data->vlan_mod.vlan1_out.vid_mask,
		//mod_data->vlan_mod.vlan2_out.vid, mod_data->vlan_mod.vlan2_out.vid_mask);
	for (i = 0; i < TPM_DB_SPLIT_MOD_NUM_VLANS_MAX; i++) {
		//printk("output: port: %d, vlan_op: %d, vlan1: %d, vlan2: %d\n",
			//tpm_db.split_mod_conf.gmac_vlan_conf[i].gmac_port, tpm_db.split_mod_conf.gmac_vlan_conf[i].vlan_op,
			//tpm_db.split_mod_conf.gmac_vlan_conf[i].vlan_1, tpm_db.split_mod_conf.gmac_vlan_conf[i].vlan_2);
		if (!tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].valid)
			continue;

		if (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_op != mod_data->vlan_mod.vlan_op)
			continue;

		if (    (mod_data->vlan_mod.vlan1_out.vid_mask)
			 && (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_1 != mod_data->vlan_mod.vlan1_out.vid))
			continue;

		if (    (mod_data->vlan_mod.vlan2_out.vid_mask)
			 && (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_2 != mod_data->vlan_mod.vlan2_out.vid))
			continue;

		if (    (mod_data->vlan_mod.vlan1_out.tpid_mask)
			 && (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_1 != mod_data->vlan_mod.vlan1_out.tpid))
			continue;

		if (    (mod_data->vlan_mod.vlan2_out.tpid_mask)
			 && (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_2 != mod_data->vlan_mod.vlan2_out.tpid))
			continue;

		if (    (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_1)
			 && (!mod_data->vlan_mod.vlan1_out.vid_mask))
			continue;

		if (    (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].vlan_2)
			 && (!mod_data->vlan_mod.vlan2_out.vid_mask))
			continue;

		if (    (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_1)
			 && (!mod_data->vlan_mod.vlan1_out.tpid_mask))
			continue;

		if (    (tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[i].tpid_2)
			 && (!mod_data->vlan_mod.vlan2_out.tpid_mask))
			continue;

		//here finds the vlan
		*index = i;
		return TPM_DB_OK;
	}

	return TPM_DB_ERR_REC_NOT_EXIST;
}

int32_t tpm_db_mod2_split_mod_increase_vlan_user_num(tpm_gmacs_enum_t port, tpm_pkt_mod_t *mod_data)
{
	uint32_t index;
	int32_t int_ret_code;

	int_ret_code = tpm_db_mod2_split_mod_get_vlan_index(port, mod_data, &index);
	if (TPM_DB_OK != int_ret_code) {
		TPM_OS_ERROR(TPM_TPM_LOG_MOD, "failed to get split mod vlan index\n");
		return TPM_DB_ERR_REC_NOT_EXIST;
	}

	tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[index].user_num++;
	return TPM_DB_OK;
}

int32_t tpm_db_mod2_split_mod_decrease_vlan_user_num(tpm_gmacs_enum_t port,
						     uint32_t       vlan_index,
						     uint32_t      *user_num)
{
	if (port > TPM_MAX_GMAC) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid port: %d\n", port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (vlan_index >= TPM_DB_SPLIT_MOD_NUM_VLANS_MAX) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid vlan_index: %d\n", vlan_index);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (!tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[vlan_index].valid) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid vlan entry: %d\n", vlan_index);
		return TPM_DB_ERR_INV_INPUT;
	}

	tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[vlan_index].user_num--;
	*user_num = tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[vlan_index].user_num;

	if (!tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[vlan_index].user_num) {
		TPM_OS_INFO(TPM_DB_MOD, "user num is 0, remove this vlan\n");
		memset(&(tpm_db.split_mod_conf.gmac_vlan_conf[port].split_mod_vlan[vlan_index]), 0, sizeof(tpm_db_split_mod_vlan_t));
	}

	return TPM_DB_OK;
}

uint8_t tpm_db_mod2_rollback_jump_area(tpm_gmacs_enum_t gmac_port, uint16_t entry_id, uint8_t on_failure)
{
	/*uint16_t entry_idx, total_num; */
	uint8_t dirty = 0;
	tpm_mod2_jump_pmt_info_t *info_array = NULL;
	uint32_t i, j, mask;

	if (tpm_db_mod2_jump_pmt_info[gmac_port] == NULL)
		return 0;

	info_array = tpm_db_mod2_jump_pmt_info[gmac_port];
	if (info_array[entry_id].status == TPM_MOD_ENTRY_BOOKED) {
		/* TODO: check if the pmt entry is for split mod */
		i = j = 0;
		j = entry_id & 0x1f;
		i = entry_id >> 5;
		mask = 1 << j;

		tpm_db_mod2_jump_booked_entry_bm[gmac_port][i] &= ~mask;

		info_array[entry_id].status = TPM_MOD_ENTRY_FREE;
		dirty = 1;
	} else if (info_array[entry_id].status == TPM_MOD_ENTRY_OCCUPIED) {
		if (on_failure) {
			/* TODO: check if the pmt entry is for split mod */
			i = j = 0;
			j = entry_id & 0x1f;
			i = entry_id >> 5;
			mask = 1 << j;

			tpm_db_mod2_jump_occupied_entry_bm[gmac_port][i] &= ~mask;

			info_array[entry_id].status = TPM_MOD_ENTRY_FREE;
			dirty = 1;
		}
	}

	return dirty;
}

uint8_t tpm_db_mod2_rollback_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type,
					 uint16_t chain_id, uint8_t on_failure)
{
	uint8_t dirty = 0;
	uint16_t entry_index, entry_num;
	tpm_mod2_chain_info_t *info_array = NULL;
	tpm_mod2_chain_pmt_info_t *pmt_array = NULL;
	uint32_t i, j, mask;

	if (tpm_db_mod2_chain_info[gmac_port][chain_type] == NULL)
		return 0;

	info_array = tpm_db_mod2_chain_info[gmac_port][chain_type];
	if (info_array[chain_id].status == TPM_MOD_ENTRY_BOOKED) {
		tpm_db_mod2_decrease_chain_user(gmac_port, chain_type, chain_id);

		if (tpm_db_mod2_chain_user_num(gmac_port, chain_type, chain_id) == 0) {
			pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][info_array[chain_id].base_entry];

			entry_num = info_array[chain_id].entry_num;

			for (entry_index = 0; entry_index < entry_num; entry_index++) {
				memset(&pmt_array[entry_index], 0, sizeof(tpm_mod2_chain_pmt_info_t));
				pmt_array[entry_index].status = TPM_MOD_ENTRY_FREE;
			}

			i = j = 0;
			j = chain_id & 0x1f;
			i = chain_id >> 5;
			mask = 1 << j;

			tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type][i] &= ~mask;
			info_array[chain_id].status = TPM_MOD_ENTRY_FREE;
			dirty = 1;
		}
	} else if (info_array[chain_id].status == TPM_MOD_ENTRY_OCCUPIED) {
		if (on_failure)
			tpm_db_mod2_decrease_chain_user(gmac_port, chain_type, chain_id);

		if (tpm_db_mod2_chain_user_num(gmac_port, chain_type, chain_id) == 0) {
			pmt_array = &tpm_db_mod2_chain_pmt_info[gmac_port][info_array[chain_id].base_entry];

			entry_num = info_array[chain_id].entry_num;

			for (entry_index = 0; entry_index < entry_num; entry_index++) {
				memset(&pmt_array[entry_index], 0, sizeof(tpm_mod2_chain_pmt_info_t));
				pmt_array[entry_index].status = TPM_MOD_ENTRY_FREE;
			}

			i = j = 0;
			j = chain_id & 0x1f;
			i = chain_id >> 5;
			mask = 1 << j;

			tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type][i] &= ~mask;

			info_array[chain_id].status = TPM_MOD_ENTRY_FREE;
			dirty = 1;
		}
	}
	return dirty;
}

int32_t tpm_db_mod2_flush_jump_area(tpm_gmacs_enum_t gmac_port, uint16_t entry_id,
				    uint8_t updt_next_free, uint8_t on_failure)
{
	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_rollback_jump_area(gmac_port, entry_id, on_failure) || updt_next_free)
		tpm_db_mod2_update_next_free_jump_entry(gmac_port);

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_flush_chain_entry(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type,
				      uint16_t chain_id, uint8_t updt_next_free, uint8_t on_failure)
{

	if (gmac_port >= TPM_MAX_NUM_GMACS) {
		TPM_OS_ERROR(TPM_DB_MOD, "Invalid input\n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE)
		return TPM_DB_ERR_INV_INPUT;

    if (tpm_db_mod2_rollback_chain_entry(gmac_port, chain_type, chain_id, on_failure) || updt_next_free)
		tpm_db_mod2_update_next_free_chain_entry(gmac_port, chain_type);

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_validate_chain_config(void)
{
	uint16_t chain_type, total_entries, jump_entries, napt_chains, l2_chains, free_entries;
	uint16_t split_jump_entries, split_jump_free_entries, least_jump_entries;
	uint8_t naptv4_unlimited, l2_unlimited, main_chain_empty, subr_chain_empty;
	uint32_t split_vlan_num, split_pbit_num;

	main_chain_empty = subr_chain_empty = 1;
	/* check subroutine chain size */
	if (tpm_db_mod2_get_multicast_mh_state()) {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num == 0) {
			TPM_OS_WARN(TPM_DB_MOD, "Zero mh chain \n");
		} else {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num == TPM_CHAIN_NUM_UNLIMITED) {
				TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", TPM_CHAIN_TYPE_MH);
				return TPM_DB_ERR_INV_INPUT;
			}
			subr_chain_empty = 0;
		}
	} else {
		TPM_OS_WARN(TPM_DB_MOD, "multicast mh is disabled, mh chain size should be zero \n");
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num = 0;
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero mac chain \n");
	} else {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num == TPM_CHAIN_NUM_UNLIMITED) {
			TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", TPM_CHAIN_TYPE_MAC);
			return TPM_DB_ERR_INV_INPUT;
		}
		subr_chain_empty = 0;
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero vlan chain \n");
	} else {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num == TPM_CHAIN_NUM_UNLIMITED) {
			TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", TPM_CHAIN_TYPE_VLAN);
			return TPM_DB_ERR_INV_INPUT;
		}
		subr_chain_empty = 0;
	}

	if (tpm_db_mod2_get_pppoe_add_mod_state()) {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num != 0 ||
			tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num != 0) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD, "Zero pppoev4 chain \n");
			} else {
				if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num == TPM_CHAIN_NUM_UNLIMITED) {
					TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", TPM_CHAIN_TYPE_PPPOE);
					return TPM_DB_ERR_INV_INPUT;
				}
				subr_chain_empty = 0;
			}
		}
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num != 0 ||
			tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD, "Zero pppoev6 chain \n");
			} else {
				if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].total_num == TPM_CHAIN_NUM_UNLIMITED) {
					TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", TPM_CHAIN_TYPE_IPV6_PPPOE);
					return TPM_DB_ERR_INV_INPUT;
				}
				subr_chain_empty = 0;
			}
		}
	} else {
		TPM_OS_WARN(TPM_DB_MOD, "pppoe mod is disabled, pppoe chain size should be zero \n");
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num = 0;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].total_num = 0;
	}

	if (subr_chain_empty) {
		TPM_OS_ERROR(TPM_DB_MOD, "All subr chain is zero \n");
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero l2 main chain \n");
	} else {
		main_chain_empty = 0;
	}
	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero naptv4 main chain \n");
	} else {
		main_chain_empty = 0;
	}
	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero mcv4 main chain \n");
	} else {
		main_chain_empty = 0;
	}
	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero routev6 main chain \n");
	} else {
		main_chain_empty = 0;
	}
	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num == 0) {
		TPM_OS_WARN(TPM_DB_MOD, "Zero mcv6 main chain \n");
	} else {
		main_chain_empty = 0;
	}
	if (main_chain_empty) {
		TPM_OS_ERROR(TPM_DB_MOD, "All main chain is zero \n");
		return TPM_DB_ERR_INV_INPUT;
	}

	/* check total pmt entries for all the chains */
	total_entries = 0;
	naptv4_unlimited = l2_unlimited = 0;
	for (chain_type = TPM_CHAIN_TYPE_MH; chain_type < TPM_CHAIN_TYPE_MAX; chain_type++) {
		if (tpm_db_mod2_chain_cfg[chain_type].total_num == TPM_CHAIN_NUM_UNLIMITED) {
			if (naptv4_unlimited || l2_unlimited) {
				TPM_OS_ERROR(TPM_DB_MOD, "Only one chain type could be assigned unlimited size \n");
				return TPM_DB_ERR_INV_INPUT;
			}

			if (chain_type == TPM_CHAIN_TYPE_IPV4_NAPT) {
				naptv4_unlimited = 1;
				continue;
			} else if (chain_type == TPM_CHAIN_TYPE_L2) {
				l2_unlimited = 1;
				continue;
			} else {
				TPM_OS_ERROR(TPM_DB_MOD, "Invalid unlimited chain type %d \n", chain_type);
				return TPM_DB_ERR_INV_INPUT;
			}
		}
		total_entries +=
		    tpm_db_mod2_chain_cfg[chain_type].max_size * tpm_db_mod2_chain_cfg[chain_type].total_num;
		if (total_entries >= TPM_MOD2_TOTAL_PMT_SIZE) {
			TPM_OS_ERROR(TPM_DB_MOD, "Not enough chain area space \n");
			return TPM_DB_ERR_INV_INPUT;
		}
	}

	/*the jump entries need at least without split mod*/
	if (l2_unlimited)
		least_jump_entries = tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num;
	else if (naptv4_unlimited)
		least_jump_entries = tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num;
	else
		least_jump_entries = tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num +
				tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num;

	/*take split mod in consider*/
	split_jump_entries = 0;
	split_jump_free_entries = 0;
	if (TPM_SPLIT_MOD_ENABLED == tpm_db_split_mod_get_enable()) {
		split_vlan_num = tpm_db_split_mod_get_num_vlans() - TPM_DB_SPLIT_MOD_INIT_VLANS_NUM;
		split_pbit_num = TPM_DB_SPLIT_MOD_P_BIT_NUM_MAX;
		split_jump_entries = 16 * 2/*init added*/ +
					(split_vlan_num - 1) * 16/*internal VLAN*/ +
					split_pbit_num + 1/*last VLAN*/;
		split_jump_free_entries = 2 * (15 - split_pbit_num)/*init occupy*/ +
					(split_vlan_num - 1) * (16 - split_pbit_num - 1)/*internal VLAN*/;
	}

	if (l2_unlimited) {
		if (split_jump_free_entries >= least_jump_entries)
			free_entries = TPM_MOD2_TOTAL_PMT_SIZE - total_entries - split_jump_entries;
		else
			free_entries = TPM_MOD2_TOTAL_PMT_SIZE - total_entries - split_jump_entries -
				(least_jump_entries - split_jump_free_entries);
		l2_chains = free_entries / (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].max_size + 1);
		if (l2_chains == 0) {
			TPM_OS_ERROR(TPM_DB_MOD, "Zero naptv4 main chain \n");
			return TPM_DB_ERR_INV_INPUT;
		}
		total_entries += l2_chains * tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].max_size;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num = l2_chains;
	} else if (naptv4_unlimited) {
		if (split_jump_free_entries >= least_jump_entries)
			free_entries = TPM_MOD2_TOTAL_PMT_SIZE - total_entries - split_jump_entries;
		else
			free_entries = TPM_MOD2_TOTAL_PMT_SIZE - total_entries - split_jump_entries -
				(least_jump_entries - split_jump_free_entries);
		napt_chains = free_entries / (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].max_size + 1);
		if (napt_chains == 0) {
			TPM_OS_ERROR(TPM_DB_MOD, "Zero naptv4 main chain \n");
			return TPM_DB_ERR_INV_INPUT;
		}
		total_entries += napt_chains * tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].max_size;
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num = napt_chains;
	}

	if (total_entries >= TPM_MOD2_TOTAL_PMT_SIZE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Zero jump area \n");
		return TPM_DB_ERR_INV_INPUT;
	}

	jump_entries = TPM_MOD2_TOTAL_PMT_SIZE - total_entries;
	if (jump_entries > TPM_MOD2_MAX_JUMP_ENTRIES_NUM)
		jump_entries = TPM_MOD2_MAX_JUMP_ENTRIES_NUM;

	if ((tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num +
	     tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num +
	     tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num +
	     tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num +
	     tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num) > jump_entries - (split_jump_entries - split_jump_free_entries))
		TPM_OS_WARN(TPM_DB_MOD, "jump entries are not enough for main chain \n");

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num > 32)
		TPM_OS_WARN(TPM_DB_MOD, "mh sub chain is too large \n");

	if ((tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num < tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num)
	    && (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num <
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num))
		TPM_OS_WARN(TPM_DB_MOD, "mac sub chain is too large \n");

	if (((tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num + (split_jump_entries - split_jump_free_entries) <
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num))
	    && ((tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num + (split_jump_entries - split_jump_free_entries) <
		tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num)))
		TPM_OS_WARN(TPM_DB_MOD, "vlan sub chain is too large \n");

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num <
	    tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num)
		TPM_OS_WARN(TPM_DB_MOD, "pppoe sub chain is too large \n");

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_L2].total_num > 0) {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num == 0) {
			TPM_OS_ERROR(TPM_DB_MOD, "Zero vlan subr chain while naptv4 main chain is activated \n");
			return TPM_DB_ERR_INV_INPUT;
		}
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_NAPT].total_num > 0) {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num == 0) {
			TPM_OS_ERROR(TPM_DB_MOD, "Zero mac subr chain while naptv4 main chain is activated \n");
			return TPM_DB_ERR_INV_INPUT;
		}

		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num == 0) {
			TPM_OS_WARN(TPM_DB_MOD, "Zero vlan subr chain while naptv4 main chain is activated \n");
		}

		if (tpm_db_mod2_get_pppoe_add_mod_state()) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_PPPOE].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD,
					     "Zero pppoe subr chain while naptv4 main chain is activated \n");
			}
		}
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_ROUTE].total_num > 0) {
		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MAC].total_num == 0) {
			TPM_OS_ERROR(TPM_DB_MOD, "Zero mac subr chain while routev6 main chain is activated \n");
			return TPM_DB_ERR_INV_INPUT;
		}

		if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_VLAN].total_num == 0) {
			TPM_OS_WARN(TPM_DB_MOD, "Zero vlan subr chain while routev6 main chain is activated \n");
		}

		if (tpm_db_mod2_get_pppoe_add_mod_state()) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_PPPOE].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD,
					     "Zero pppoe subr chain while routev6 main chain is activated \n");
			}
		}
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV4_MC].total_num > 0) {
		if (tpm_db_mod2_get_multicast_mh_state()) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD, "Zero mh subr chain while mcv4 main chain is activated \n");
			}
		}
	}

	if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_IPV6_MC].total_num > 0) {
		if (tpm_db_mod2_get_multicast_mh_state()) {
			if (tpm_db_mod2_chain_cfg[TPM_CHAIN_TYPE_MH].total_num == 0) {
				TPM_OS_WARN(TPM_DB_MOD, "Zero mh subr chain while mcv6 main chain is activated \n");
			}
		}
	}

	if (jump_entries < split_jump_entries)
		TPM_OS_WARN(TPM_DB_MOD, "jump entries are not enough for split mod \n");

	/* TODO: Check if jump entries are  enough for split modification */

	tpm_mod2_chain_area_base = jump_entries + 1;
	tpm_mod2_total_chain_num = total_entries;

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_setup_jump_area(tpm_gmacs_enum_t port)
{
	uint32_t info_size, bm_size /*, port */ ;
	uint32_t	vlan_nums;
	uint32_t	p_bits_nums;
	uint32_t	i, j;
	uint32_t	loop;
	uint32_t	loop_in;
	uint32_t	cur_entry, mask;

	tpm_db_mod2_jump_area_cfg.base_entry = 0;
	tpm_db_mod2_jump_area_cfg.total_num = tpm_mod2_chain_area_base;
#if 0
	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_0] = 1;
	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_1] = 1;
	tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_PMAC]   = 1;
#endif
	tpm_db_mod2_jump_area_cfg.next_free[port] = 1;

	info_size = tpm_db_mod2_jump_area_cfg.total_num * sizeof(tpm_mod2_jump_pmt_info_t);
	if (tpm_db_mod2_jump_area_cfg.total_num % 32) {
		bm_size = (tpm_db_mod2_jump_area_cfg.total_num / 32 + 1) * sizeof(uint32_t);
		tpm_db_mod2_jump_bm_group = tpm_db_mod2_jump_area_cfg.total_num / 32 + 1;
	} else {
		bm_size = (tpm_db_mod2_jump_area_cfg.total_num / 32) * sizeof(uint32_t);
		tpm_db_mod2_jump_bm_group = tpm_db_mod2_jump_area_cfg.total_num / 32;
	}

	/*for (port = TPM_ENUM_GMAC_0; port < TPM_MAX_NUM_GMACS; port++) */
	{
		if (tpm_db_mod2_jump_pmt_info[port] != NULL) {
			vfree(tpm_db_mod2_jump_pmt_info[port]);
			tpm_db_mod2_jump_pmt_info[port] = NULL;
		}
		tpm_db_mod2_jump_pmt_info[port] = (tpm_mod2_jump_pmt_info_t *) vmalloc(info_size);
		if (tpm_db_mod2_jump_pmt_info[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_jump_pmt_info[port], 0, info_size);
		tpm_db_mod2_jump_pmt_info[port][0].status = TPM_MOD_ENTRY_OCCUPIED;

		if (tpm_db_mod2_jump_booked_entry_bm[port] != NULL) {
			vfree(tpm_db_mod2_jump_booked_entry_bm[port]);
			tpm_db_mod2_jump_booked_entry_bm[port] = NULL;
		}
		tpm_db_mod2_jump_booked_entry_bm[port] = (uint32_t *) vmalloc(bm_size);
		if (tpm_db_mod2_jump_booked_entry_bm[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_jump_booked_entry_bm[port], 0, bm_size);

		if (tpm_db_mod2_jump_occupied_entry_bm[port] != NULL) {
			vfree(tpm_db_mod2_jump_occupied_entry_bm[port]);
			tpm_db_mod2_jump_occupied_entry_bm[port] = NULL;
		}
		tpm_db_mod2_jump_occupied_entry_bm[port] = (uint32_t *) vmalloc(bm_size);
		if (tpm_db_mod2_jump_occupied_entry_bm[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_jump_occupied_entry_bm[port], 0, bm_size);
		tpm_db_mod2_jump_occupied_entry_bm[port][0] |= 0x1;

		if (tpm_db_mod2_jump_split_mod_occupied_entry_bm[port] != NULL) {
			vfree(tpm_db_mod2_jump_split_mod_occupied_entry_bm[port]);
			tpm_db_mod2_jump_split_mod_occupied_entry_bm[port] = NULL;
		}
		tpm_db_mod2_jump_split_mod_occupied_entry_bm[port] = (uint32_t *) vmalloc(bm_size);
		if (tpm_db_mod2_jump_split_mod_occupied_entry_bm[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_jump_split_mod_occupied_entry_bm[port], 0xff, bm_size);
		tpm_db_mod2_jump_split_mod_occupied_entry_bm[port][0] |= 0x1;

		if (tpm_db_mod2_jump_split_mod_all_entry_bm[port] != NULL) {
			vfree(tpm_db_mod2_jump_split_mod_all_entry_bm[port]);
			tpm_db_mod2_jump_split_mod_all_entry_bm[port] = NULL;
		}
		tpm_db_mod2_jump_split_mod_all_entry_bm[port] = (uint32_t *) vmalloc(bm_size);
		if (tpm_db_mod2_jump_split_mod_all_entry_bm[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_jump_split_mod_all_entry_bm[port], 0, bm_size);
	}

	/* split mod init */
	if (TPM_SPLIT_MOD_DISABLED == tpm_db_split_mod_get_enable())
	{
		TPM_OS_DEBUG(TPM_MODZ2_HM_MOD, "SPLIT_MOD_DISABLED\n");
		return(TPM_OK);
	}

	vlan_nums = tpm_db_split_mod_get_num_vlans();
	p_bits_nums = TPM_DB_SPLIT_MOD_P_BIT_NUM_MAX;


	tpm_db_mod2_jump_area_cfg.next_free[port] = p_bits_nums + 1;
	//tpm_db_mod2_jump_area_cfg.next_split[port] = 16;

	for (loop = 0; loop <= vlan_nums; loop++) {
		for (loop_in = 0; loop_in <= p_bits_nums; loop_in++) {
			cur_entry = (loop * 16) + loop_in;
			i = j = 0;
			j = cur_entry & 0x1f;
			i = cur_entry >> 5;
			mask = 1 << j;
			tpm_db_mod2_jump_split_mod_all_entry_bm[port][i] |= mask;
			//tpm_db_mod2_jump_occupied_entry_bm[port][i] |= mask;
			//tpm_db_mod2_jump_split_mod_occupied_entry_bm[port][i] &= (~mask);
		}
	}
	//tpm_db_mod2_jump_split_mod_occupied_entry_bm[port][0] |= (0x1);

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_setup_chain_area(tpm_gmacs_enum_t port)
{
	uint32_t size, /* port, */ chain;
	uint16_t base;

	printk(" ===== chain_area: base entry 0x%0x ===== \r\n", tpm_mod2_chain_area_base);

	/*for (port = TPM_ENUM_GMAC_0; port < TPM_MAX_NUM_GMACS; port++) */
	{
		printk("[GMAC%d]:\r\n", port);
		base = tpm_mod2_chain_area_base;
		for (chain = TPM_CHAIN_TYPE_MH; chain < TPM_CHAIN_TYPE_MAX; chain++) {
			if (tpm_db_mod2_chain_cfg[chain].total_num != 0) {
				tpm_db_mod2_chain_cfg[chain].base_entry = base;
				tpm_db_mod2_chain_cfg[chain].next_free[TPM_ENUM_GMAC_0] = 0;
				tpm_db_mod2_chain_cfg[chain].next_free[TPM_ENUM_GMAC_1] = 0;
				tpm_db_mod2_chain_cfg[chain].next_free[TPM_ENUM_PMAC] = 0;

				size = tpm_db_mod2_chain_cfg[chain].total_num * sizeof(tpm_mod2_chain_info_t);

				printk("\t chain-%d, 0x%0x - 0x%0x, chain_num: %d\r\n",
				       chain, base,
				       base +
				       tpm_db_mod2_chain_cfg[chain].total_num * tpm_db_mod2_chain_cfg[chain].max_size -
				       1, tpm_db_mod2_chain_cfg[chain].total_num);

				if (tpm_db_mod2_chain_info[port][chain] != NULL) {
					vfree(tpm_db_mod2_chain_info[port][chain]);
					tpm_db_mod2_chain_info[port][chain] = NULL;
				}
				tpm_db_mod2_chain_info[port][chain] = (tpm_mod2_chain_info_t *) vmalloc(size);
				if (tpm_db_mod2_chain_info[port][chain] == NULL) {
					TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
					return TPM_DB_ERR_MEM_ALLOC_FAIL;
				}
				memset(tpm_db_mod2_chain_info[port][chain], 0, size);

				if (tpm_db_mod2_chain_cfg[chain].total_num % 32) {
					size = (tpm_db_mod2_chain_cfg[chain].total_num / 32 + 1) * sizeof(uint32_t);
					tpm_db_mod2_chain_bm_group[chain] =
					    tpm_db_mod2_chain_cfg[chain].total_num / 32 + 1;
				} else {
					size = (tpm_db_mod2_chain_cfg[chain].total_num / 32) * sizeof(uint32_t);
					tpm_db_mod2_chain_bm_group[chain] = tpm_db_mod2_chain_cfg[chain].total_num / 32;
				}

				if (tpm_db_mod2_chain_booked_entry_bm[port][chain] != NULL) {
					vfree(tpm_db_mod2_chain_booked_entry_bm[port][chain]);
					tpm_db_mod2_chain_booked_entry_bm[port][chain] = NULL;
				}
				tpm_db_mod2_chain_booked_entry_bm[port][chain] = (uint32_t *) vmalloc(size);
				if (tpm_db_mod2_chain_booked_entry_bm[port][chain] == NULL) {
					TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
					return TPM_DB_ERR_MEM_ALLOC_FAIL;
				}
				memset(tpm_db_mod2_chain_booked_entry_bm[port][chain], 0, size);

				if (tpm_db_mod2_chain_occupied_entry_bm[port][chain] != NULL) {
					vfree(tpm_db_mod2_chain_occupied_entry_bm[port][chain]);
					tpm_db_mod2_chain_occupied_entry_bm[port][chain] = NULL;
				}
				tpm_db_mod2_chain_occupied_entry_bm[port][chain] = (uint32_t *) vmalloc(size);
				if (tpm_db_mod2_chain_occupied_entry_bm[port][chain] == NULL) {
					TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
					return TPM_DB_ERR_MEM_ALLOC_FAIL;
				}
				memset(tpm_db_mod2_chain_occupied_entry_bm[port][chain], 0, size);

				base += tpm_db_mod2_chain_cfg[chain].total_num * tpm_db_mod2_chain_cfg[chain].max_size;
			}
		}

		if (tpm_db_mod2_chain_pmt_info[port] != NULL) {
			vfree(tpm_db_mod2_chain_pmt_info[port]);
			tpm_db_mod2_chain_pmt_info[port] = NULL;
		}
		size = tpm_mod2_total_chain_num * sizeof(tpm_mod2_chain_pmt_info_t);
		tpm_db_mod2_chain_pmt_info[port] = (tpm_mod2_chain_pmt_info_t *) vmalloc(size);
		if (tpm_db_mod2_chain_pmt_info[port] == NULL) {
			TPM_OS_ERROR(TPM_DB_MOD, "Memory allocation failure \n");
			return TPM_DB_ERR_MEM_ALLOC_FAIL;
		}
		memset(tpm_db_mod2_chain_pmt_info[port], 0, size);
	}

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_setup(void)
{
	uint32_t port;

	if (tpm_db_mod2_validate_chain_config() != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "Chain config validation failure \n");
		return TPM_FAIL;
	}

	for (port = TPM_ENUM_GMAC_0; port < TPM_MAX_NUM_GMACS; port++) {
		if (tpm_db_mod2_setup_jump_area(port) != TPM_DB_OK) {
			TPM_OS_ERROR(TPM_DB_MOD, "Failed to setup jump area \n");
			return TPM_FAIL;
		}
		if (tpm_db_mod2_setup_chain_area(port) != TPM_DB_OK) {
			TPM_OS_ERROR(TPM_DB_MOD, "Failed to setup chain area \n");
			return TPM_FAIL;
		}
	}

	/* init split mod data */
	memset(&(tpm_db.split_mod_conf.gmac_vlan_conf), 0, sizeof(tpm_db.split_mod_conf.gmac_vlan_conf));

	return TPM_DB_OK;
}

int32_t tpm_db_mod2_inv_mac_entries(tpm_gmacs_enum_t gmac_port)
{
	if (tpm_db_mod2_setup_jump_area(gmac_port) != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "Failed to setup jump area \n");
		return TPM_FAIL;
	}
	if (tpm_db_mod2_setup_chain_area(gmac_port) != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "Failed to setup chain area \n");
		return TPM_FAIL;
	}

	return TPM_DB_OK;
}

void tpm_db_mod2_show_jump_pmt_entries(tpm_gmacs_enum_t gmac_port)
{
	uint16_t entry_idx;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return;

	printk("              STATUS        OPCODE | DATA | LAST | UPDT_IP | UPDT_CHK \r\n");
	for (entry_idx = 0; entry_idx < tpm_db_mod2_jump_area_cfg.total_num; entry_idx++) {
		if (tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].status != TPM_MOD_ENTRY_FREE) {
			printk("[PMT 0x%04x]: %s             0x%04x | 0x%04x | %d | %d | %d \r\n", entry_idx,
			       entry_state_str[tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].status],
			       tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].pattern.opcode,
			       tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].pattern.data,
			       tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].pattern.last,
			       tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].pattern.updt_ipv4,
			       tpm_db_mod2_jump_pmt_info[gmac_port][entry_idx].pattern.updt_tcp);
		}
	}
}

void tpm_db_mod2_show_jump_cfg_data(void)
{
	uint32_t i;
	printk("[JUMP AREA]: base_entry 0x%04x, total_num %d, split_mod_num %d, split_mod_pbit_num %d\r\n",
	       tpm_db_mod2_jump_area_cfg.base_entry, tpm_db_mod2_jump_area_cfg.total_num,
	       tpm_db_mod2_jump_area_cfg.split_num, tpm_db_mod2_jump_area_cfg.split_pbit_num);

	printk("[NEXT FREE]: GMAC0(G/S)       GMAC1(G/S)       PMAC(G/S)    \r\n");
	printk("[NEXT FREE]: 0x%04x/0x%04x    0x%04x/0x%04x    0x%04x/0x%04x    \r\n",
	       tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_0],
	       tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_GMAC_0],
	       tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_GMAC_1],
	       tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_GMAC_1],
	       tpm_db_mod2_jump_area_cfg.next_free[TPM_ENUM_PMAC], tpm_db_mod2_jump_area_cfg.next_split[TPM_ENUM_PMAC]);
#if 1
	printk("[BOOKED_MAP]:\r\n");

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		 printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_booked_entry_bm[TPM_ENUM_GMAC_0][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_booked_entry_bm[TPM_ENUM_GMAC_1][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_booked_entry_bm[TPM_ENUM_PMAC][i]);

	printk("[OCCUPIED_MAP]:\r\n");

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_occupied_entry_bm[TPM_ENUM_GMAC_0][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_occupied_entry_bm[TPM_ENUM_GMAC_1][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_occupied_entry_bm[TPM_ENUM_PMAC][i]);

	printk("[SPLIT MOD OCCUPIED_MAP]:\r\n");

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_split_mod_occupied_entry_bm[TPM_ENUM_GMAC_0][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_split_mod_occupied_entry_bm[TPM_ENUM_GMAC_1][i]);

	for (i = 0; i < tpm_db_mod2_jump_bm_group; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_jump_split_mod_occupied_entry_bm[TPM_ENUM_PMAC][i]);
#endif
}

void tpm_db_mod2_show_chain_pmt_entries(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type)
{
	uint16_t entry_idx, pmt_idx, entry_num;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return;

	if (chain_type >= TPM_CHAIN_TYPE_MAX)
		return;

	printk("              STATUS  CHAIN/ID     OPCODE | DATA | LAST | UPDT_IP | UPDT_CHK \r\n");
	if (chain_type == TPM_CHAIN_TYPE_NONE) {
		for (chain_type = TPM_CHAIN_TYPE_MH; chain_type < TPM_CHAIN_TYPE_MAX; chain_type++) {
			if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0)
				continue;

			entry_num = tpm_db_mod2_chain_cfg[chain_type].total_num * tpm_db_mod2_chain_cfg[chain_type].max_size;

			for (entry_idx = 0; entry_idx < entry_num; entry_idx++) {
				pmt_idx = entry_idx + tpm_db_mod2_chain_cfg[chain_type].base_entry - tpm_mod2_chain_area_base;
				if (tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].status != TPM_MOD_ENTRY_FREE) {
					printk("[PMT 0x%04x]: %s       %d/%d          0x%04x | 0x%04x | %d | %d | %d \r\n",
					       tpm_mod2_chain_area_base + pmt_idx,
					       entry_state_str[tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].status],
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].chain_type,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].chain_id,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.opcode,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.data,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.last,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.updt_ipv4,
					       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.updt_tcp);
				}
			}
		}
	} else {
		if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0)
			return;

		entry_num = tpm_db_mod2_chain_cfg[chain_type].total_num * tpm_db_mod2_chain_cfg[chain_type].max_size;

		for (entry_idx = 0; entry_idx < entry_num; entry_idx++) {
			pmt_idx = entry_idx + tpm_db_mod2_chain_cfg[chain_type].base_entry - tpm_mod2_chain_area_base;
			if (tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].status != TPM_MOD_ENTRY_FREE) {
				printk("[PMT 0x%04x]: %s       %d/%d          0x%04x | 0x%04x | %d | %d | %d \r\n",
				       tpm_mod2_chain_area_base + pmt_idx,
				       entry_state_str[tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].status],
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].chain_type,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].chain_id,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.opcode,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.data,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.last,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.updt_ipv4,
				       tpm_db_mod2_chain_pmt_info[gmac_port][pmt_idx].pattern.updt_tcp);
			}
		}
	}
}

void tpm_db_mod2_show_chain_info_entries(tpm_gmacs_enum_t gmac_port, tpm_chain_type_t chain_type, uint16_t chain_id)
{
    uint32_t i;

	if (gmac_port >= TPM_MAX_NUM_GMACS)
		return;

	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE)
		return;

	if (tpm_db_mod2_chain_cfg[chain_type].total_num == 0)
		return;

	printk("[CHAIN-%d Valid Entries]:\r\n", chain_type);

	if (chain_id == TPM_MOD2_INVALID_CHAIN_ID) {
		for (chain_id = 0; chain_id < tpm_db_mod2_chain_cfg[chain_type].total_num; chain_id++) {
			if (tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].status != TPM_MOD_ENTRY_FREE) {
				if (chain_id < tpm_db_mod2_chain_cfg[chain_type].total_num) {
					printk("                   STATUS   BASE_ENTR   ENTR_NUM USER_NUM\r\n");
					printk("[CHAIN-%d  0x%04x]: %s        0x%04x      %d        %d \r\n",
					       chain_type, chain_id,
					       entry_state_str[tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].
							       status],
					       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].base_entry +
					       tpm_mod2_chain_area_base,
					       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].entry_num,
					       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num);
				}
			}
		}
	} else {
		if (tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].status != TPM_MOD_ENTRY_FREE) {
			if (chain_id < tpm_db_mod2_chain_cfg[chain_type].total_num) {
				printk("[CHAIN-%d  0x%04x]: %s        0x%04x     %d      %d \r\n", chain_type, chain_id,
				       entry_state_str[tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].status],
				       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].base_entry +
				       tpm_mod2_chain_area_base,
				       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].entry_num,
				       tpm_db_mod2_chain_info[gmac_port][chain_type][chain_id].user_num);
			}
		}
	}
#if 1
	printk("[CHAIN-%d BOOKED_MAP]:\r\n", chain_type);

	for (i = 0; i < tpm_db_mod2_chain_bm_group[chain_type]; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_chain_booked_entry_bm[gmac_port][chain_type][i]);

	printk("[CHAIN-%d OCCUPIED_MAP]:\r\n", chain_type);

	for (i = 0; i < tpm_db_mod2_chain_bm_group[chain_type]; i++)
		printk("%02d - 0x%08x\r\n", i, tpm_db_mod2_chain_occupied_entry_bm[gmac_port][chain_type][i]);
#endif
	printk("\r\n");
}

void tpm_db_mod2_show_all_chain(tpm_gmacs_enum_t gmac_port)
{
	uint16_t chain_idx;

	for (chain_idx = TPM_CHAIN_TYPE_MH; chain_idx < TPM_CHAIN_TYPE_MAX; chain_idx++)
		tpm_db_mod2_show_chain_info_entries(gmac_port, chain_idx, TPM_MOD2_INVALID_CHAIN_ID);
}

void tpm_db_mod2_show_chain_cfg_data(tpm_chain_type_t chain_type)
{
	if (chain_type >= TPM_CHAIN_TYPE_MAX || chain_type == TPM_CHAIN_TYPE_NONE)
		return;

	printk("[CHAIN   %d]: base_entry 0x%04x, total_num %d, max_size %d, subr_chain %d\r\n", chain_type,
	       tpm_db_mod2_chain_cfg[chain_type].base_entry, tpm_db_mod2_chain_cfg[chain_type].total_num,
	       tpm_db_mod2_chain_cfg[chain_type].max_size, tpm_db_mod2_chain_cfg[chain_type].subr_chain);
	printk("[NEXT FREE]: GMAC0     GMAC1     PMAC    \r\n");
	printk("[NEXT FREE]: 0x%04x    0x%04x    0x%04x    \r\n",
	       tpm_db_mod2_chain_cfg[chain_type].next_free[TPM_ENUM_GMAC_0],
	       tpm_db_mod2_chain_cfg[chain_type].next_free[TPM_ENUM_GMAC_1],
	       tpm_db_mod2_chain_cfg[chain_type].next_free[TPM_ENUM_PMAC]);
}

/*******************************************************************************
* tpm_db_mod2_init()
*
* DESCRIPTION: The API initializes shadow DB and modification patterns
*
* INPUTS:   None
*
* OUTPUTS:
*           None
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*           None
*
*******************************************************************************/
int32_t tpm_db_mod2_init(void)
{
	tpm_db_mod2_init_jump_area_cfg();
	tpm_db_mod2_init_chain_cfg();

	tpm_db_mod2_init_pmt_info();
	tpm_db_mod2_init_chain_info();

	return TPM_DB_OK;
}

/*******************************************************************************
* tpm_db_mtu_set_ipv4_us()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv4_mtu_us(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv4_mtu_us = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv4_mtu_us()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv4_mtu_us(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv4_mtu_us;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv4_pppoe_mtu_us()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv4_pppoe_mtu_us(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv4_pppoe_mtu_us = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv4_pppoe_mtu_us()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv4_pppoe_mtu_us(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv4_pppoe_mtu_us;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_mtu_us()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv6_mtu_us(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv6_mtu_us = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_mtu_us()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv6_mtu_us(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv6_mtu_us;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_pppoe_mtu_us()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv6_pppoe_mtu_us(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv6_pppoe_mtu_us = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_pppoe_mtu_us()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv6_pppoe_mtu_us(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv6_pppoe_mtu_us;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv4_mtu_ds()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv4_mtu_ds(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv4_mtu_ds = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv4_mtu_ds()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv4_mtu_ds(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv4_mtu_ds;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_mtu_ds()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_set_ipv6_mtu_ds(uint32_t mtu)
{
	tpm_db.tpm_mtu_cfg.ipv6_mtu_ds = mtu;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_mtu_ds()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mtu_get_ipv6_mtu_ds(uint32_t *mtu)
{
	*mtu = tpm_db.tpm_mtu_cfg.ipv6_mtu_ds;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_mtu_ds()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_set_num_vlan_tags(uint32_t number)
{
	tpm_db.num_vlan_tags = number;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_mtu_ds()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_get_num_vlan_tags(uint32_t *number)
{
	*number = tpm_db.num_vlan_tags;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_mtu_ds()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_set_pppoe_add_enable(tpm_db_pppoe_add_enable_t enable)
{
	tpm_db.tpm_pppoe_add_enable = enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_mtu_ds()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_get_pppoe_add_enable(tpm_db_pppoe_add_enable_t *enable)
{
	*enable = tpm_db.tpm_pppoe_add_enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_set_ipv6_mtu_ds()
*
* DESCRIPTION:      Set queue number which IGMP packets are forwarded to
*
* INPUTS:
* igmp_snoop       - queue number
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_set_mtu_enable(tpm_db_mtu_setting_enable_t enable)
{
	tpm_db.tpm_mtu_cfg.mtu_enable = enable;
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mtu_get_ipv6_mtu_ds()
*
* DESCRIPTION:      Get queue number which IGMP packets are forwarded to
*
* INPUTS:
*
* OUTPUTS:
* igmp_snoop       - queue number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_get_mtu_enable(tpm_db_mtu_setting_enable_t *enable)
{
	*enable = tpm_db.tpm_mtu_cfg.mtu_enable;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_cpu_rx_queue(uint32_t cpu_rx_queue)
{
	tpm_db.cpu_rx_queue = cpu_rx_queue;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_cpu_rx_queue(uint32_t *cpu_rx_queue)
{
	*cpu_rx_queue = tpm_db.cpu_rx_queue;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_ttl_illegal_action(uint32_t ttl_illegal_action)
{
	tpm_db.ttl_illegal_action = ttl_illegal_action;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_ttl_illegal_action(uint32_t *ttl_illegal_action)
{
	*ttl_illegal_action = tpm_db.ttl_illegal_action;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_tcp_flag_check(uint32_t tcp_flag_check)
{
	tpm_db.tcp_flag_check = tcp_flag_check;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_tcp_flag_check(uint32_t *tcp_flag_check)
{
	*tcp_flag_check = tpm_db.tcp_flag_check;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_mru(uint32_t mru)
{
	tpm_db.tpm_mtu_cfg.mru = mru;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_mru(uint32_t *mru)
{
	*mru = tpm_db.tpm_mtu_cfg.mru;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_catch_all_pkt_action(tpm_init_pnc_last_init_t catch_all_pkt_action)
{
	tpm_db.catch_all_pkt_action = catch_all_pkt_action;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_catch_all_pkt_action(tpm_init_pnc_last_init_t *catch_all_pkt_action)
{
	*catch_all_pkt_action = tpm_db.catch_all_pkt_action;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_switch_dev_num(int32_t switch_dev_num)
{
	tpm_db.switch_dev_num = switch_dev_num;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_switch_dev_num(int32_t *switch_dev_num)
{
	*switch_dev_num = tpm_db.switch_dev_num;
	return (TPM_DB_OK);
}

int32_t tpm_db_set_ety_dsa_enable(tpm_db_ety_dsa_enable_t ety_dsa_enable)
{
	tpm_db.func_profile.ety_dsa_enable = ety_dsa_enable;
	return (TPM_DB_OK);
}

int32_t tpm_db_get_ety_dsa_enable(tpm_db_ety_dsa_enable_t *ety_dsa_enable)
{
	*ety_dsa_enable = tpm_db.func_profile.ety_dsa_enable;
	return (TPM_DB_OK);
}

void tpm_db_show_mtu_cfg(void)
{
	tpm_db_mtu_setting_enable_t mtu_setting_enable;
	uint32_t mtu, mru;
	uint32_t num_vlan_tags;
	tpm_db_pppoe_add_enable_t pppoe_add_enable;

	tpm_db_get_mtu_enable(&mtu_setting_enable);
	printk("mtu_config: %d, \n", mtu_setting_enable);

	tpm_db_mtu_get_ipv4_mtu_us(&mtu);
	printk("ipv4_mtu_us: %d, \n", mtu);

	tpm_db_mtu_get_ipv4_pppoe_mtu_us(&mtu);
	printk("ipv4_pppoe_mtu_us: %d, \n", mtu);

	tpm_db_mtu_get_ipv6_mtu_us(&mtu);
	printk("ipv6_mtu_us: %d, \n", mtu);

	tpm_db_mtu_get_ipv6_pppoe_mtu_us(&mtu);
	printk("ipv6_pppoe_mtu_us: %d, \n", mtu);

	tpm_db_mtu_get_ipv4_mtu_ds(&mtu);
	printk("ipv4_mtu_ds: %d, \n", mtu);

	tpm_db_mtu_get_ipv6_mtu_ds(&mtu);
	printk("ipv6_mtu_ds: %d, \n", mtu);

	tpm_db_get_pppoe_add_enable(&pppoe_add_enable);
	printk("pppoe_add_enable: %d, \n", pppoe_add_enable);

	tpm_db_get_num_vlan_tags(&num_vlan_tags);
	printk("num_vlan_tags: %d, \n", num_vlan_tags);

	tpm_db_get_mru(&mru);
	printk("mru: %d, \n", mru);
}

void tpm_db_api_busy_init(void)
{
	memset(tpm_db.tpm_busy_apis, TPM_DB_API_NOT_BUSY, sizeof(tpm_db.tpm_busy_apis));
}

uint32_t tpm_db_get_api_busy(tpm_api_type_t api_type)
{
	uint32_t i;

	for (i=0;i<TPM_MAX_PARALLEL_API_CALLS;i++) {
		if (tpm_db.tpm_busy_apis[api_type][i] != TPM_DB_API_NOT_BUSY)
			return(TPM_TRUE);
	}
	return(TPM_FALSE);
}

uint32_t tpm_db_get_api_rule_num_busy(tpm_api_type_t api_type, uint32_t rule_num)
{
	uint32_t i;

	for (i=0;i<TPM_MAX_PARALLEL_API_CALLS;i++) {
		if ( tpm_db.tpm_busy_apis[api_type][i] == rule_num)
			return(TPM_TRUE);
	}
	return(TPM_FALSE);
}


void tpm_db_get_api_all_busy(tpm_api_type_t api_type, uint32_t *num_busy, uint32_t *rule_num_list)
{
	uint32_t i, l_num_busy=0;

	for (i=0;i<TPM_MAX_PARALLEL_API_CALLS;i++) {
		if ( tpm_db.tpm_busy_apis[api_type][i] != TPM_DB_API_NOT_BUSY) {
			rule_num_list[l_num_busy] = tpm_db.tpm_busy_apis[api_type][i];
			l_num_busy++;
		}
	}
	*num_busy = l_num_busy;
	return;
}



uint32_t tpm_db_set_api_busy(tpm_api_type_t api_type, uint32_t rule_num)
{
	uint32_t i;

	for (i=0;i<TPM_MAX_PARALLEL_API_CALLS;i++) {
		if ( tpm_db.tpm_busy_apis[api_type][i] == TPM_DB_API_NOT_BUSY){
			tpm_db.tpm_busy_apis[api_type][i] = rule_num;
			return (TPM_DB_OK);
		}
	}
	return(TPM_DB_ERR_DB_TBL_FULL);
}


uint32_t tpm_db_set_api_free(tpm_api_type_t api_type, uint32_t rule_num)
{
	uint32_t i;

	for (i=0;i<TPM_MAX_PARALLEL_API_CALLS;i++) {
		if ( tpm_db.tpm_busy_apis[api_type][i] == rule_num){
			tpm_db.tpm_busy_apis[api_type][i] = -1;
			return (TPM_DB_OK);
		}
	}
	return(TPM_DB_ERR_REC_NOT_EXIST);
}



uint32_t tpm_db_find_matched_ipv6_gen_key(tpm_ipv6_gen_acl_key_t *gen_key)
{
	uint32_t i;
	tpm_db_ipv6_gen_key_t *key_array = &tpm_db.ipv6_key_shadow.gen_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE)
			continue;
		if (!memcmp(&key_array[i].gen_key, gen_key, sizeof(tpm_ipv6_gen_acl_key_t)))
			return i;
	}

	return TPM_DB_INVALID_IPV6_KEY_ID;
}

uint32_t tpm_db_get_ipv6_gen_key_user_num(uint32_t key_id)
{
	return tpm_db.ipv6_key_shadow.gen_key[key_id].user_num;
}

void tpm_db_increase_ipv6_gen_key_user_num(uint32_t key_id)
{
	tpm_db.ipv6_key_shadow.gen_key[key_id].user_num++;
}

void tpm_db_decrease_ipv6_gen_key_user_num(uint32_t key_id)
{
	if (tpm_db.ipv6_key_shadow.gen_key[key_id].user_num > 0)
		tpm_db.ipv6_key_shadow.gen_key[key_id].user_num--;
}

uint32_t tpm_db_set_ipv6_gen_key(tpm_ipv6_gen_acl_key_t *gen_key)
{
	uint32_t i, key_id = TPM_DB_INVALID_IPV6_KEY_ID;
	tpm_db_ipv6_gen_key_t *key_array = &tpm_db.ipv6_key_shadow.gen_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE) {
			key_id = i;
			break;
		}
	}

	if (key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
		return TPM_DB_INVALID_IPV6_KEY_ID;
	}

	memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_gen_key_t));

	key_array[key_id].valid = TPM_TRUE;
	memcpy(&key_array[i].gen_key, gen_key, sizeof(tpm_ipv6_gen_acl_key_t));

	return key_id;
}

int32_t tpm_db_get_ipv6_gen_key(uint32_t key_id, tpm_ipv6_gen_acl_key_t *gen_key)
{
	tpm_db_ipv6_gen_key_t *key_array = &tpm_db.ipv6_key_shadow.gen_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	memcpy(gen_key, &key_array[key_id].gen_key, sizeof(tpm_ipv6_gen_acl_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_gen_key(uint32_t key_id)
{
	uint32_t user_num;
	tpm_db_ipv6_gen_key_t *key_array = &tpm_db.ipv6_key_shadow.gen_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	user_num = tpm_db_get_ipv6_gen_key_user_num(key_id);

	if (user_num == 0)
		memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_gen_key_t));

	return TPM_DB_OK;
}

uint32_t tpm_db_find_matched_ipv6_dip_key(tpm_ipv6_addr_key_t *dip_key)
{
	uint32_t i;
	tpm_db_ipv6_dip_key_t *key_array = &tpm_db.ipv6_key_shadow.dip_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE)
			continue;
		if (!memcmp(&key_array[i].dip_key, dip_key, sizeof(tpm_ipv6_addr_key_t)))
			return i;
	}

	return TPM_DB_INVALID_IPV6_KEY_ID;
}

uint32_t tpm_db_get_ipv6_dip_key_user_num(uint32_t key_id)
{
	return tpm_db.ipv6_key_shadow.dip_key[key_id].user_num;
}

void tpm_db_increase_ipv6_dip_key_user_num(uint32_t key_id)
{
	tpm_db.ipv6_key_shadow.dip_key[key_id].user_num++;
}

void tpm_db_decrease_ipv6_dip_key_user_num(uint32_t key_id)
{
	if (tpm_db.ipv6_key_shadow.dip_key[key_id].user_num > 0)
		tpm_db.ipv6_key_shadow.dip_key[key_id].user_num--;
}

uint32_t tpm_db_set_ipv6_dip_key(tpm_ipv6_addr_key_t *dip_key)
{
	uint32_t i, key_id = TPM_DB_INVALID_IPV6_KEY_ID;
	tpm_db_ipv6_dip_key_t *key_array = &tpm_db.ipv6_key_shadow.dip_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE) {
			key_id = i;
			break;
		}
	}

	if (key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
		return TPM_DB_INVALID_IPV6_KEY_ID;
	}

	memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_dip_key_t));

	key_array[key_id].valid = TPM_TRUE;
	memcpy(&key_array[i].dip_key, dip_key, sizeof(tpm_ipv6_addr_key_t));

	return key_id;
}

int32_t tpm_db_get_ipv6_dip_key(uint32_t key_id, tpm_ipv6_addr_key_t *dip_key)
{
	tpm_db_ipv6_dip_key_t *key_array = &tpm_db.ipv6_key_shadow.dip_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	memcpy(dip_key, &key_array[key_id].dip_key, sizeof(tpm_ipv6_addr_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_dip_key(uint32_t key_id)
{
	uint32_t user_num;
	tpm_db_ipv6_dip_key_t *key_array = &tpm_db.ipv6_key_shadow.dip_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	user_num = tpm_db_get_ipv6_dip_key_user_num(key_id);

	if (user_num == 0)
		memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_dip_key_t));

	return TPM_DB_OK;
}

uint32_t tpm_db_find_matched_ipv6_l4_key(uint32_t protocol, tpm_l4_ports_key_t *l4_key)
{
	uint32_t i;
	tpm_db_ipv6_l4_key_t *key_array = &tpm_db.ipv6_key_shadow.l4_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE)
			continue;
		if (!memcmp(&key_array[i].l4_key, l4_key, sizeof(tpm_l4_ports_key_t)) &&
			key_array[i].protocol == protocol)
			return i;
	}

	return TPM_DB_INVALID_IPV6_KEY_ID;
}

uint32_t tpm_db_get_ipv6_l4_key_user_num(uint32_t key_id)
{
	return tpm_db.ipv6_key_shadow.l4_key[key_id].user_num;
}

void tpm_db_increase_ipv6_l4_key_user_num(uint32_t key_id)
{
	tpm_db.ipv6_key_shadow.l4_key[key_id].user_num++;
}

void tpm_db_decrease_ipv6_l4_key_user_num(uint32_t key_id)
{
	if (tpm_db.ipv6_key_shadow.l4_key[key_id].user_num > 0)
		tpm_db.ipv6_key_shadow.l4_key[key_id].user_num--;
}

uint32_t tpm_db_set_ipv6_l4_key(uint32_t protocol, tpm_l4_ports_key_t *l4_key)
{
	uint32_t i, key_id = TPM_DB_INVALID_IPV6_KEY_ID;
	tpm_db_ipv6_l4_key_t *key_array = &tpm_db.ipv6_key_shadow.l4_key[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_KEY_NUM; i++) {
		if (key_array[i].valid == TPM_FALSE) {
			key_id = i;
			break;
		}
	}

	if (key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
		return TPM_DB_INVALID_IPV6_KEY_ID;
	}

	memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_l4_key_t));

	key_array[key_id].valid = TPM_TRUE;
	memcpy(&key_array[i].l4_key, l4_key, sizeof(tpm_l4_ports_key_t));
	key_array[key_id].protocol = protocol;

	return key_id;
}

int32_t tpm_db_get_ipv6_l4_key(uint32_t key_id, uint32_t *protocol, tpm_l4_ports_key_t *l4_key)
{
	tpm_db_ipv6_l4_key_t *key_array = &tpm_db.ipv6_key_shadow.l4_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	memcpy(l4_key, &key_array[key_id].l4_key, sizeof(tpm_l4_ports_key_t));
	*protocol = key_array[key_id].protocol;

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_l4_key(uint32_t key_id)
{
	uint32_t user_num;
	tpm_db_ipv6_l4_key_t *key_array = &tpm_db.ipv6_key_shadow.l4_key[0];

	if (key_id >= TPM_DB_IPV6_MAX_KEY_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (key_array[key_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	user_num = tpm_db_get_ipv6_l4_key_user_num(key_id);

	if (user_num == 0)
		memset(&key_array[key_id], 0, sizeof(tpm_db_ipv6_l4_key_t));

	return TPM_DB_OK;
}

uint32_t tpm_db_find_matched_ipv6_l4_subflow(uint32_t src_dir, uint32_t parse_bm, uint32_t protocol, tpm_l4_ports_key_t *l4_key)
{
	int32_t ret;
	uint32_t i, _protocol;
	tpm_db_ipv6_l4_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[0];
	tpm_l4_ports_key_t _l4_key;

	for (i = 0; i < TPM_DB_IPV6_MAX_SUBFLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE)
			continue;

		if (parse_bm == flow_array[i].parse_bm) {
			memset(&_l4_key, 0, sizeof(tpm_l4_ports_key_t));
			ret = tpm_db_get_ipv6_l4_key(flow_array[i].l4_key, &_protocol, &_l4_key);
			if (ret != TPM_DB_OK)
				break;

			if (_protocol != protocol)
				continue;

			if (parse_bm & TPM_PARSE_L4_SRC) {
				if (_l4_key.l4_src_port != l4_key->l4_src_port)
					continue;
			}

			if (parse_bm & TPM_PARSE_L4_DST) {
				if (_l4_key.l4_dst_port != l4_key->l4_dst_port)
					continue;
			}

			return i;
		}
	}

	if (i < TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		TPM_OS_WARN(TPM_DB_MOD, "Warning: DB inconsistency\n");

	return TPM_DB_INVALID_IPV6_FLOW_ID;
}

uint32_t tpm_db_get_ipv6_l4_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	return tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[flow_id].user_num;
}

void tpm_db_increase_ipv6_l4_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[flow_id].user_num++;
}

void tpm_db_decrease_ipv6_l4_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	if (tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[flow_id].user_num > 0)
		tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[flow_id].user_num--;
}

uint32_t tpm_db_get_free_ipv6_l4_subflow(uint32_t src_dir)
{
	uint32_t i;
	tpm_db_ipv6_l4_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_SUBFLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE)
			return i;
	}

	return TPM_DB_INVALID_IPV6_FLOW_ID;
}

int32_t tpm_db_set_ipv6_l4_subflow(uint32_t src_dir, uint32_t flow_id, uint32_t parse_bm, uint32_t protocol, tpm_l4_ports_key_t *l4_key)
{
	uint32_t l4_key_id;
	tpm_db_ipv6_l4_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[0];

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid != TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	l4_key_id = tpm_db_find_matched_ipv6_l4_key(protocol, l4_key);

	if (l4_key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
		l4_key_id = tpm_db_set_ipv6_l4_key(protocol, l4_key);
		if (l4_key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
			return TPM_DB_ERR_DB_TBL_FULL;
		}
	}

	tpm_db_increase_ipv6_l4_key_user_num(l4_key_id);

	memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_l4_flow_t));

	flow_array[flow_id].valid = TPM_TRUE;
	flow_array[flow_id].parse_bm = parse_bm;
	flow_array[flow_id].l4_key = l4_key_id;

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv6_l4_subflow(uint32_t src_dir, uint32_t flow_id, uint32_t *parse_bm, uint32_t *protocol, tpm_l4_ports_key_t *l4_key)
{
	int32_t ret;
	tpm_db_ipv6_l4_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[0];
	uint32_t _protocol;
	tpm_l4_ports_key_t _l4_key;

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	memset(&_l4_key, 0, sizeof(tpm_l4_ports_key_t));
	ret = tpm_db_get_ipv6_l4_key(flow_array[flow_id].l4_key, &_protocol, &_l4_key);

	if (ret != TPM_DB_OK)
		return TPM_DB_ERR_REC_STATUS_ERR;

	*parse_bm = flow_array[flow_id].parse_bm;
	*protocol = _protocol;
	memcpy(l4_key, &_l4_key, sizeof(tpm_l4_ports_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_l4_subflow(uint32_t src_dir, uint32_t flow_id)
{
	uint32_t user_num;
	tpm_db_ipv6_l4_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[0];

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;


	user_num = tpm_db_get_ipv6_l4_subflow_user_num(src_dir, flow_id);
	if (user_num == 0) {
		tpm_db_decrease_ipv6_l4_key_user_num(flow_array[flow_id].l4_key);
		tpm_db_del_ipv6_l4_key(flow_array[flow_id].l4_key);
		memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_l4_flow_t));
	}

	return TPM_DB_OK;
}

uint32_t tpm_db_find_matched_ipv6_gen_subflow(uint32_t src_dir, uint32_t parse_bm, uint32_t protocol,
											tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key)
{
	uint32_t i, l4_key_id, gen_key_id;
	tpm_db_ipv6_gen_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_SUBFLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE)
			continue;

		if (parse_bm == flow_array[i].parse_bm) {
			if (flow_array[i].l4_key != TPM_DB_INVALID_IPV6_KEY_ID) {
				l4_key_id = tpm_db_find_matched_ipv6_l4_key(protocol, l4_key);
				if (l4_key_id == TPM_DB_INVALID_IPV6_KEY_ID)
					continue;
				if (l4_key_id != flow_array[i].l4_key)
					continue;
			}

			if (flow_array[i].gen_key != TPM_DB_INVALID_IPV6_KEY_ID) {
				gen_key_id = tpm_db_find_matched_ipv6_gen_key(gen_key);
				if (gen_key_id == TPM_DB_INVALID_IPV6_KEY_ID)
					continue;
				if (gen_key_id != flow_array[i].gen_key)
					continue;
			}

			return i;
		}
	}

	return TPM_DB_INVALID_IPV6_FLOW_ID;
}

uint32_t tpm_db_get_ipv6_gen_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	return tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[flow_id].user_num;
}

void tpm_db_increase_ipv6_gen_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[flow_id].user_num++;
}

void tpm_db_decrease_ipv6_gen_subflow_user_num(uint32_t src_dir, uint32_t flow_id)
{
	if (tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[flow_id].user_num > 0)
		tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[flow_id].user_num--;
}

uint32_t tpm_db_get_free_ipv6_gen_subflow(uint32_t src_dir)
{
	uint32_t i;
	tpm_db_ipv6_gen_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_SUBFLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE)
			return i;
	}

	return TPM_DB_INVALID_IPV6_FLOW_ID;
}

int32_t tpm_db_set_ipv6_gen_subflow(uint32_t src_dir, uint32_t flow_id, uint32_t parse_bm, uint32_t protocol,
									tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key)
{
	uint32_t l4_parse_bm, gen_parse_bm, l4_flow_id, l4_key_id, gen_key_id;
	tpm_db_ipv6_gen_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[0];

	l4_key_id = gen_key_id = TPM_DB_INVALID_IPV6_KEY_ID;
	l4_flow_id = TPM_DB_INVALID_IPV6_FLOW_ID;

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid != TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	l4_parse_bm = parse_bm & TPM_DB_IPV6_L4_SUBFLOW_PARSE_BM_MASK;

	if (l4_parse_bm != 0) {
		l4_flow_id = tpm_db_find_matched_ipv6_l4_subflow(src_dir, l4_parse_bm, protocol, l4_key);

		if (l4_flow_id == TPM_DB_INVALID_IPV6_FLOW_ID)
			return TPM_DB_ERR_DB_INCONSISTENCY;

		l4_key_id = tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[l4_flow_id].l4_key;
	}

	gen_parse_bm = parse_bm & ~TPM_DB_IPV6_L4_SUBFLOW_PARSE_BM_MASK;

	if (gen_parse_bm != 0) {
		gen_key_id = tpm_db_find_matched_ipv6_gen_key(gen_key);

		if (gen_key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
			gen_key_id = tpm_db_set_ipv6_gen_key(gen_key);
			if (gen_key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
				return TPM_DB_ERR_DB_TBL_FULL;
			}
		}
	}

	if (l4_flow_id != TPM_DB_INVALID_IPV6_FLOW_ID)
		tpm_db_increase_ipv6_l4_subflow_user_num(src_dir, l4_flow_id);

	if (gen_key_id != TPM_DB_INVALID_IPV6_KEY_ID)
		tpm_db_increase_ipv6_gen_key_user_num(gen_key_id);

	memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_gen_flow_t));

	flow_array[flow_id].valid = TPM_TRUE;
	flow_array[flow_id].parse_bm = parse_bm;
	flow_array[flow_id].l4_key = l4_key_id;
	flow_array[flow_id].gen_key = gen_key_id;

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv6_gen_subflow(uint32_t src_dir, uint32_t flow_id, uint32_t *parse_bm, uint32_t *protocol,
				    tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key)
{
	int32_t ret;
	tpm_db_ipv6_gen_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[0];
	uint32_t _protocol = 0;
	tpm_l4_ports_key_t _l4_key;
	tpm_ipv6_gen_acl_key_t _gen_key;

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	if (flow_array[flow_id].l4_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		memset(&_l4_key, 0, sizeof(tpm_l4_ports_key_t));
		ret = tpm_db_get_ipv6_l4_key(flow_array[flow_id].l4_key, &_protocol, &_l4_key);

		if (ret != TPM_DB_OK)
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	if (flow_array[flow_id].gen_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		memset(&_gen_key, 0, sizeof(tpm_ipv6_gen_acl_key_t));
		ret = tpm_db_get_ipv6_gen_key(flow_array[flow_id].gen_key, &_gen_key);

		if (ret != TPM_DB_OK)
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	*parse_bm = flow_array[flow_id].parse_bm;
	*protocol = _protocol;
	memcpy(l4_key, &_l4_key, sizeof(tpm_l4_ports_key_t));
	memcpy(gen_key, &_gen_key, sizeof(tpm_ipv6_gen_acl_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_gen_subflow(uint32_t src_dir, uint32_t flow_id)
{
	int32_t ret;
	uint32_t user_num, l4_flow_id, l4_parse_bm, protocol;
	tpm_db_ipv6_gen_flow_t *flow_array = &tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[0];
	tpm_l4_ports_key_t l4_key;

	if (flow_id >= TPM_DB_IPV6_MAX_SUBFLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_STATUS_ERR;

	user_num = tpm_db_get_ipv6_gen_subflow_user_num(src_dir, flow_id);
	if (user_num == 0) {
		if (flow_array[flow_id].gen_key != TPM_DB_INVALID_IPV6_KEY_ID)
			tpm_db_decrease_ipv6_gen_key_user_num(flow_array[flow_id].gen_key);

		tpm_db_del_ipv6_gen_key(flow_array[flow_id].gen_key);

		if (flow_array[flow_id].l4_key != TPM_DB_INVALID_IPV6_KEY_ID) {
			memset(&l4_key, 0, sizeof(tpm_l4_ports_key_t));
			ret = tpm_db_get_ipv6_l4_key(flow_array[flow_id].l4_key, &protocol, &l4_key);

			if (ret != TPM_DB_OK)
				return TPM_DB_ERR_DB_INCONSISTENCY;

			l4_parse_bm = flow_array[flow_id].parse_bm & TPM_DB_IPV6_L4_SUBFLOW_PARSE_BM_MASK;
			l4_flow_id = tpm_db_find_matched_ipv6_l4_subflow(src_dir, l4_parse_bm, protocol, &l4_key);

			if (l4_flow_id == TPM_DB_INVALID_IPV6_FLOW_ID)
				return TPM_DB_ERR_DB_INCONSISTENCY;

			tpm_db_decrease_ipv6_l4_subflow_user_num(src_dir, l4_flow_id);
		}

		memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_gen_flow_t));
	}
	return TPM_DB_OK;
}

uint32_t tpm_db_find_matched_ipv6_5t_flow(uint32_t src_dir, uint32_t parse_bm, uint32_t is_pppoe, uint32_t protocol,
							tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key, tpm_ipv6_addr_key_t *dip_key)
{
	uint32_t i, key_id;
	tpm_db_ipv6_5t_flow_shadow_t *flow_array = &tpm_db.ipv6_5t_flow_shadow[0];

	for (i = 0; i < TPM_DB_IPV6_MAX_5T_FLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE)
			continue;

		if (parse_bm == flow_array[i].parse_bm &&
			src_dir == flow_array[i].src_dir &&
			is_pppoe == flow_array[i].is_pppoe) {
			if (flow_array[i].l4_key != TPM_DB_INVALID_IPV6_KEY_ID) {
				key_id = tpm_db_find_matched_ipv6_l4_key(protocol, l4_key);
				if (key_id == TPM_DB_INVALID_IPV6_KEY_ID)
					continue;
				if (key_id != flow_array[i].l4_key)
					continue;
			}

			if (flow_array[i].gen_key != TPM_DB_INVALID_IPV6_KEY_ID) {
				key_id = tpm_db_find_matched_ipv6_gen_key(gen_key);
				if (key_id == TPM_DB_INVALID_IPV6_KEY_ID)
					continue;
				if (key_id != flow_array[i].gen_key)
					continue;
			}

			if (flow_array[i].dip_key != TPM_DB_INVALID_IPV6_KEY_ID) {
				key_id = tpm_db_find_matched_ipv6_dip_key(dip_key);
				if (key_id == TPM_DB_INVALID_IPV6_KEY_ID)
					continue;
				if (key_id != flow_array[i].dip_key)
					continue;
			}

			return i;
		}
	}

	return TPM_DB_INVALID_IPV6_FLOW_ID;
}

int32_t tpm_db_set_ipv6_5t_flow(uint32_t src_dir, uint32_t parse_bm,  uint32_t is_pppoe, uint32_t protocol,
							tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key, tpm_ipv6_addr_key_t *dip_key)
{
	uint32_t i, _parse_bm, subflow_id, l4_key_id, gen_key_id, dip_key_id, flow_id = TPM_DB_INVALID_IPV6_FLOW_ID;
	tpm_db_ipv6_5t_flow_shadow_t *flow_array = &tpm_db.ipv6_5t_flow_shadow[0];

	l4_key_id = gen_key_id = dip_key_id = TPM_DB_INVALID_IPV6_KEY_ID;

	for (i = 0; i < TPM_DB_IPV6_MAX_5T_FLOW_NUM; i++) {
		if (flow_array[i].valid == TPM_FALSE) {
			flow_id = i;
			break;
		}
	}

	if (flow_id == TPM_DB_INVALID_IPV6_FLOW_ID)
		return TPM_DB_ERR_DB_TBL_FULL;

	_parse_bm = parse_bm & ~TPM_DB_IPV6_GEN_SUBFLOW_PARSE_BM_MASK;
	if (_parse_bm != 0) {
		dip_key_id = tpm_db_find_matched_ipv6_dip_key(dip_key);
		if (dip_key_id == TPM_DB_INVALID_IPV6_KEY_ID) {
			dip_key_id = tpm_db_set_ipv6_dip_key(dip_key);
			if (dip_key_id == TPM_DB_INVALID_IPV6_KEY_ID)
				return TPM_DB_ERR_DB_INCONSISTENCY;
		}
	}

	_parse_bm = parse_bm & TPM_DB_IPV6_GEN_SUBFLOW_PARSE_BM_MASK;
	if (_parse_bm != 0) {
		subflow_id = tpm_db_find_matched_ipv6_gen_subflow(src_dir, _parse_bm, protocol, l4_key, gen_key);
		if (subflow_id != TPM_DB_INVALID_IPV6_FLOW_ID) {
			tpm_db_increase_ipv6_gen_subflow_user_num(src_dir, subflow_id);
			gen_key_id = tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[subflow_id].gen_key;
			l4_key_id = tpm_db.ipv6_subflow_shadow[src_dir].gen_flow[subflow_id].l4_key;
		} else {
			_parse_bm = parse_bm & TPM_DB_IPV6_L4_SUBFLOW_PARSE_BM_MASK;
			if (_parse_bm != 0) {
				subflow_id = tpm_db_find_matched_ipv6_l4_subflow(src_dir, _parse_bm, protocol, l4_key);
				if (subflow_id != TPM_DB_INVALID_IPV6_FLOW_ID) {
					tpm_db_increase_ipv6_l4_subflow_user_num(src_dir, subflow_id);
					l4_key_id = tpm_db.ipv6_subflow_shadow[src_dir].l4_flow[subflow_id].l4_key;
				}
			}
		}
	}

	if (dip_key_id != TPM_DB_INVALID_IPV6_KEY_ID)
		tpm_db_increase_ipv6_dip_key_user_num(dip_key_id);

	memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_5t_flow_shadow_t));

	flow_array[flow_id].valid = TPM_TRUE;
	flow_array[flow_id].src_dir = src_dir;
	flow_array[flow_id].parse_bm = parse_bm;
	flow_array[flow_id].is_pppoe = is_pppoe;
	flow_array[flow_id].gen_key = gen_key_id;
	flow_array[flow_id].dip_key = dip_key_id;
	flow_array[flow_id].l4_key = l4_key_id;

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv6_5t_flow(uint32_t flow_id, uint32_t *src_dir, uint32_t *parse_bm, uint32_t *is_pppoe, uint32_t *protocol,
							tpm_l4_ports_key_t *l4_key, tpm_ipv6_gen_acl_key_t *gen_key, tpm_ipv6_addr_key_t *dip_key)
{
	int32_t ret;
	tpm_db_ipv6_5t_flow_shadow_t *flow_array = &tpm_db.ipv6_5t_flow_shadow[0];
	tpm_l4_ports_key_t _l4_key;
	tpm_ipv6_gen_acl_key_t _gen_key;
	tpm_ipv6_addr_key_t _dip_key;
	uint32_t _protocol = 0;

	memset(&_l4_key, 0, sizeof(tpm_l4_ports_key_t));
	memset(&_gen_key, 0, sizeof(tpm_ipv6_gen_acl_key_t));
	memset(&_dip_key, 0, sizeof(tpm_ipv6_addr_key_t));

	if (flow_id >= TPM_DB_IPV6_MAX_5T_FLOW_NUM)
		return TPM_DB_ERR_INV_INPUT;

	if (flow_array[flow_id].valid == TPM_FALSE)
		return TPM_DB_ERR_REC_INV;

	if (flow_array[flow_id].l4_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		ret = tpm_db_get_ipv6_l4_key(flow_array[flow_id].l4_key, &_protocol, &_l4_key);
		if (ret != TPM_DB_OK)
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	if (flow_array[flow_id].gen_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		ret = tpm_db_get_ipv6_gen_key(flow_array[flow_id].gen_key, &_gen_key);
		if (ret != TPM_DB_OK)
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	if (flow_array[flow_id].dip_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		ret = tpm_db_get_ipv6_dip_key(flow_array[flow_id].dip_key, &_dip_key);
		if (ret != TPM_DB_OK)
			return TPM_DB_ERR_DB_INCONSISTENCY;
	}

	*src_dir = flow_array[flow_id].src_dir;
	*parse_bm = flow_array[flow_id].parse_bm;
	*is_pppoe = flow_array[flow_id].is_pppoe;
	*protocol = _protocol;
	memcpy(l4_key, &_l4_key, sizeof(tpm_l4_ports_key_t));
	memcpy(gen_key, &_gen_key, sizeof(tpm_ipv6_gen_acl_key_t));
	memcpy(dip_key, &_dip_key, sizeof(tpm_ipv6_addr_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv6_5t_flow(uint32_t flow_id)
{
	int32_t ret;
	tpm_db_ipv6_5t_flow_shadow_t *flow_array = &tpm_db.ipv6_5t_flow_shadow[0];
	tpm_l4_ports_key_t l4_key;
	tpm_ipv6_gen_acl_key_t gen_key;
	tpm_ipv6_addr_key_t dip_key;
	uint32_t src_dir, parse_bm, protocol, subflow_bm, subflow_id, is_pppoe;


	ret = tpm_db_get_ipv6_5t_flow(flow_id, &src_dir, &parse_bm, &is_pppoe, &protocol, &l4_key, &gen_key, &dip_key);

	if (ret != TPM_DB_OK)
		return TPM_DB_ERR_REC_INV;

	subflow_bm = parse_bm & TPM_DB_IPV6_GEN_SUBFLOW_PARSE_BM_MASK;
	if (subflow_bm != 0) {
		subflow_id = tpm_db_find_matched_ipv6_gen_subflow(src_dir, subflow_bm, protocol, &l4_key, &gen_key);
		if (subflow_id != TPM_DB_INVALID_IPV6_FLOW_ID)
			tpm_db_decrease_ipv6_gen_subflow_user_num(src_dir, subflow_id);
		else {
			subflow_bm = parse_bm & TPM_DB_IPV6_L4_SUBFLOW_PARSE_BM_MASK;
			if (subflow_bm != 0) {
				subflow_id = tpm_db_find_matched_ipv6_l4_subflow(src_dir, subflow_bm, protocol, &l4_key);
				if (subflow_id != TPM_DB_INVALID_IPV6_FLOW_ID)
					tpm_db_decrease_ipv6_l4_subflow_user_num(src_dir, subflow_id);
			}
		}
	}

	if (flow_array[flow_id].dip_key != TPM_DB_INVALID_IPV6_KEY_ID) {
		tpm_db_decrease_ipv6_dip_key_user_num(flow_array[flow_id].dip_key);
		tpm_db_del_ipv6_dip_key(flow_array[flow_id].dip_key);
	}

	memset(&flow_array[flow_id], 0, sizeof(tpm_db_ipv6_5t_flow_shadow_t));

	return TPM_DB_OK;
}

int32_t tpm_db_init_ipv6_5t_flow_reset(void)
{
	memset(&tpm_db.ipv6_key_shadow, 0, sizeof(tpm_db_ipv6_key_shadow_t));
	memset(tpm_db.ipv6_subflow_shadow, 0, TPM_NUM_DIRECTIONS * sizeof(tpm_db_ipv6_subflow_shadow_t));
	memset(tpm_db.ipv6_5t_flow_shadow, 0, TPM_DB_IPV6_MAX_5T_FLOW_NUM * sizeof(tpm_db_ipv6_5t_flow_shadow_t));

	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_mode_set(tpm_drop_precedence_t mode)
{
	tpm_db.drop_precedence.mode = mode; 
	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_mode_get(tpm_drop_precedence_t *mode)
{
	*mode = tpm_db.drop_precedence.mode; 
	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_rule_set(uint32_t rule_index)
{
	uint32_t index;
	tpm_db_drop_precedence_rule_entry_t *rule_entry;

	for (index = 0; index < TPM_MAX_NUM_DROP_PRECEDENCE; index++) {
		rule_entry = &tpm_db.drop_precedence.drop_rule[index];
		if (rule_entry->valid == TPM_FALSE)
			break;
	}

	if(index >= TPM_MAX_NUM_DROP_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "PnC partition for drop precedence is full %d\n", rule_index);
		return TPM_DB_ERR_DB_TBL_FULL;
	}

	rule_entry->rule_index	= rule_index;
	rule_entry->valid	= TPM_TRUE;

	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_rule_delete(uint32_t rule_index)
{
	uint32_t index;
	tpm_db_drop_precedence_rule_entry_t *rule_entry;
	
	for (index = 0; index < TPM_MAX_NUM_DROP_PRECEDENCE; index++) {
		rule_entry = &tpm_db.drop_precedence.drop_rule[index];
		if ((rule_entry->valid == TPM_TRUE) &&
		    (rule_entry->rule_index == rule_index))
			break;
	}

	if(index >= TPM_MAX_NUM_DROP_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "Did not find drop precedence PnC rule for index %d\n", rule_index);
		return TPM_DB_ERR_REC_NOT_EXIST;
	}

	memset(rule_entry, 0, sizeof(tpm_db_drop_precedence_rule_entry_t));
	rule_entry->valid = TPM_FALSE;
	rule_entry->rule_index = 0;

	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_rule_get(uint32_t index,
	tpm_db_drop_precedence_rule_entry_t *rule_entry)
{
	if(index >= TPM_MAX_NUM_DROP_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "The index(%d) >= Maximium number(%d)\n",
			index, index);
		return TPM_DB_ERR_REC_NOT_EXIST;
	}

	rule_entry->valid = tpm_db.drop_precedence.drop_rule[index].valid;
	rule_entry->rule_index = tpm_db.drop_precedence.drop_rule[index].rule_index;

	return TPM_DB_OK;
}

int32_t tpm_db_drop_precedence_db_reset(void)
{
	uint32_t index;

	memset(&tpm_db.drop_precedence, 0, sizeof(tpm_db.drop_precedence));
	for (index = 0; index < TPM_MAX_NUM_DROP_PRECEDENCE; index++) {
		tpm_db.drop_precedence.drop_rule[index].valid = TPM_FALSE;
	}

	return TPM_DB_OK;
}

int32_t tpm_db_ctc_cm_rule_set(tpm_src_port_type_t src_port,
			       uint32_t precedence,
			       tpm_parse_fields_t l2_parse_rule_bm,
			       tpm_parse_fields_t ipv4_parse_rule_bm,
			       tpm_parse_fields_t ipv6_parse_rule_bm,
			       tpm_l2_acl_key_t *l2_key,
			       tpm_ipv4_acl_key_t *ipv4_key,
			       tpm_ipv6_acl_key_t *ipv6_key,
			       tpm_pkt_frwd_t *pkt_frwd,
			       tpm_pkt_action_t pkt_act,
			       uint32_t pbits,
			       uint32_t ipv4_sub_pattern_index,
			       uint32_t rule_index)
{
	tpm_db_ctc_cm_rule_entry_t *rule_entry;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if(precedence >= TPM_MAX_NUM_CTC_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input precedence(%d)\n", precedence);
		return TPM_DB_ERR_INV_INPUT;
	}

	rule_entry = &tpm_db.ctc_cm_data.cm_rule[src_port][precedence];

	rule_entry->l2_parse_rule_bm   = l2_parse_rule_bm;
	rule_entry->ipv4_parse_rule_bm = ipv4_parse_rule_bm;
	rule_entry->ipv6_parse_rule_bm = ipv6_parse_rule_bm;
	memcpy(&rule_entry->l2_key, l2_key, sizeof(tpm_l2_acl_key_t));
	memcpy(&rule_entry->ipv4_key, ipv4_key, sizeof(tpm_ipv4_acl_key_t));
	memcpy(&rule_entry->ipv6_key, ipv6_key, sizeof(tpm_ipv6_acl_key_t));
	memcpy(&rule_entry->pkt_frwd, pkt_frwd, sizeof(tpm_pkt_frwd_t));
	rule_entry->pkt_act                = pkt_act;
	rule_entry->pbits                  = pbits;
	rule_entry->cm_main_rule_index     = rule_index;
	rule_entry->ipv4_sub_pattern_key   = ipv4_sub_pattern_index;
	rule_entry->valid                  = 1;

	if(l2_parse_rule_bm & ipv4_parse_rule_bm)
		rule_entry->rule_type = TPM_CTC_CM_COMBO;
	else if(l2_parse_rule_bm)
		rule_entry->rule_type = TPM_CTC_CM_L2;
	else if(ipv4_parse_rule_bm)
		rule_entry->rule_type = TPM_CTC_CM_IPv4;

	return TPM_DB_OK;
}

int32_t tpm_db_ctc_cm_rule_delete(tpm_src_port_type_t src_port, uint32_t precedence)
{
	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if(precedence >= TPM_MAX_NUM_CTC_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input precedence(%d)\n", precedence);
		return TPM_DB_ERR_INV_INPUT;
	}

	memset(&tpm_db.ctc_cm_data.cm_rule[src_port][precedence], 0, sizeof(tpm_db_ctc_cm_rule_entry_t));
	return TPM_DB_OK;
}

int32_t tpm_db_ctc_cm_rule_get(tpm_src_port_type_t src_port, uint32_t precedence, tpm_db_ctc_cm_rule_entry_t *cm_rule)
{
	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if(precedence >= TPM_MAX_NUM_CTC_PRECEDENCE) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input precedence(%d)\n", precedence);
		return TPM_DB_ERR_INV_INPUT;
	}

	memcpy(cm_rule, &tpm_db.ctc_cm_data.cm_rule[src_port][precedence], sizeof(tpm_db_ctc_cm_rule_entry_t));
	return TPM_DB_OK;
}

int32_t tpm_db_ctc_cm_get_num_rules(tpm_src_port_type_t src_port)
{
	int32_t loop;
	int32_t num_rules = 0;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	for(loop = 0; loop < TPM_MAX_NUM_CTC_PRECEDENCE; loop++)
		if(tpm_db.ctc_cm_data.cm_rule[src_port][loop].valid)
			num_rules++;

	return num_rules;
}

int32_t tpm_db_ctc_cm_get_ipv6_num_rules(void)
{
	int32_t loop;
	int32_t num_rules = 0;
	tpm_src_port_type_t src_port;

	for (src_port = TPM_SRC_PORT_UNI_0; src_port < TPM_MAX_NUM_UNI_PORTS; src_port++)
		for(loop = 0; loop < TPM_MAX_NUM_CTC_PRECEDENCE; loop++)
			if(    (tpm_db.ctc_cm_data.cm_rule[src_port][loop].valid)
			    && (tpm_db.ctc_cm_data.cm_rule[src_port][loop].ipv6_parse_rule_bm))
				num_rules++;

	return num_rules;
}

int32_t tpm_db_ctc_cm_db_reset(void)
{
	memset(&tpm_db.ctc_cm_data.cm_rule, 0, sizeof(tpm_db.ctc_cm_data.cm_rule));
	memset(&tpm_db.ctc_cm_data.ipv4_pre_table, 0, sizeof(tpm_db_cnm_ipv4_pre_table_t));
	memset(&tpm_db.ctc_cm_data.ipv4_pre_filter, 0, TPM_MAX_NUM_UNI_PORTS * sizeof(tpm_db_cnm_ipv4_pre_filter_t));
	tpm_db.ctc_cm_data.ipv6_parse_win = tpm_db.ctc_cm_data.ipv6_parse_win_original;
	return TPM_DB_OK;
}

int32_t tpm_db_ipv6_mc_sip_db_reset(void)
{
	memset(&tpm_db.ipv6_mc_sip, 0, sizeof(tpm_db.ipv6_mc_sip));
	/* reserve the first IPv6 MC SIP entry for not matching any SIP */
	tpm_db.ipv6_mc_sip[0].valid = 1;
	return TPM_DB_OK;
}

int32_t tpm_db_ipv6_mc_sip_index_get(uint8_t  *src_ip)
{
	uint32_t i;
	int32_t ret;
	tpm_db_pnc_range_t range_data;

	/*check param*/
	if (src_ip == NULL)
		return 0;

	ret = tpm_db_pnc_rng_get(TPM_PNC_IPV6_MC_SIP, &range_data);
	if(ret != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "TPM_PNC_IPV6_MC_SIP is not created!\n");
		return 0;
	}

	for (i = 1; i < range_data.pnc_range_conf.range_size; i++) {
		if (tpm_db.ipv6_mc_sip[i].valid == 0)
			continue;

		if (memcmp(tpm_db.ipv6_mc_sip[i].src_ip, src_ip, 16)== 0)
			return i;
	}

	/* does not find this src_ip */
	return 0;
}

int32_t tpm_db_ipv6_mc_sip_add(uint8_t  *src_ip)
{
	uint32_t i;
	int32_t ret;
	tpm_db_pnc_range_t range_data;

	/*check param*/
	if (src_ip == NULL)
		return 0;

	ret = tpm_db_pnc_rng_get(TPM_PNC_IPV6_MC_SIP, &range_data);
	if(ret != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "TPM_PNC_IPV6_MC_SIP is not created!\n");
		return 0;
	}

	for (i = 1; i < range_data.pnc_range_conf.range_size; i++) {
		if (tpm_db.ipv6_mc_sip[i].valid == 1)
			continue;

		memcpy(tpm_db.ipv6_mc_sip[i].src_ip, src_ip, 16);
		tpm_db.ipv6_mc_sip[i].valid = 1;
		tpm_db.ipv6_mc_sip[i].reference_num = 1;
		return i;
	}

	/* do not have slot for this src_ip */
	return 0;
}
int32_t tpm_db_ipv6_mc_sip_ref_num_inc(uint8_t  src_ip_index)
{
	/*check param*/
	if (src_ip_index >= TPM_MC_IPv6_SIP_NUM_MAX)
		return (TPM_DB_ERR_INV_INPUT);

	if (tpm_db.ipv6_mc_sip[src_ip_index].valid == 0)
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.ipv6_mc_sip[src_ip_index].reference_num++;

	return TPM_DB_OK;
}
int32_t tpm_db_ipv6_mc_sip_ref_num_dec(uint8_t  src_ip_index, uint8_t  *new_ref_num)
{
	/*check param*/
	if (src_ip_index >= TPM_MC_IPv6_SIP_NUM_MAX)
		return (TPM_DB_ERR_INV_INPUT);

	if (tpm_db.ipv6_mc_sip[src_ip_index].valid == 0)
		return (TPM_DB_ERR_INV_INPUT);

	if (tpm_db.ipv6_mc_sip[src_ip_index].reference_num == 0)
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.ipv6_mc_sip[src_ip_index].reference_num--;

	*new_ref_num = tpm_db.ipv6_mc_sip[src_ip_index].reference_num;
	/* if new ref num is 0, remove this SIP in DB */
	if (tpm_db.ipv6_mc_sip[src_ip_index].reference_num == 0) {
		memset(&tpm_db.ipv6_mc_sip[src_ip_index], 0, sizeof(tpm_db.ipv6_mc_sip[src_ip_index]));
	}

	return TPM_DB_OK;
}

int32_t tpm_db_ipv6_mc_sip_free_slot_num_get(void)
{
	uint32_t i;
	int32_t ret;
	tpm_db_pnc_range_t range_data;
	uint32_t free_slot_num = 0;

	ret = tpm_db_pnc_rng_get(TPM_PNC_IPV6_MC_SIP, &range_data);
	if(ret != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_DB_MOD, "TPM_PNC_IPV6_MC_SIP is not created!\n");
		return 0;
	}

	for (i = 1; i < range_data.pnc_range_conf.range_size; i++) {
		if (tpm_db.ipv6_mc_sip[i].valid == 1)
			continue;
		free_slot_num++;
	}

	return free_slot_num;
}

int32_t tpm_db_ctc_cm_enable_set(tpm_db_ctc_cm_enable_t ctc_cm_enable)
{
	tpm_db.ctc_cm_data.enable = ctc_cm_enable;
	return(TPM_DB_OK);
}

int32_t tpm_db_ctc_cm_enable_get(tpm_db_ctc_cm_enable_t *ctc_cm_enable)
{
	*ctc_cm_enable = tpm_db.ctc_cm_data.enable;
	return(TPM_DB_OK);
}
int32_t tpm_db_ctc_cm_ipv6_parse_win_set(tpm_db_ctc_cm_ipv6_parse_win_t ctc_cm_ipv6_parse_win)
{
	tpm_db.ctc_cm_data.ipv6_parse_win = ctc_cm_ipv6_parse_win;
	return(TPM_DB_OK);
}
int32_t tpm_db_ctc_cm_ipv6_parse_win_orig_set(tpm_db_ctc_cm_ipv6_parse_win_t ctc_cm_ipv6_parse_win)
{
	tpm_db.ctc_cm_data.ipv6_parse_win_original = ctc_cm_ipv6_parse_win;
	return(TPM_DB_OK);
}

int32_t tpm_db_ctc_cm_ipv6_parse_win_get(tpm_db_ctc_cm_ipv6_parse_win_t *ctc_cm_ipv6_parse_win)
{
	*ctc_cm_ipv6_parse_win = tpm_db.ctc_cm_data.ipv6_parse_win;
	return(TPM_DB_OK);
}
int32_t tpm_db_ctc_cm_ipv6_ety_rule_num_set(uint32_t ipv6_ety_rule_num)
{
	tpm_db.ctc_cm_data.ipv6_ety_rule_num = ipv6_ety_rule_num;
	return(TPM_DB_OK);
}

int32_t tpm_db_ctc_cm_ipv6_ety_rule_num_get(uint32_t *ipv6_ety_rule_num)
{
	*ipv6_ety_rule_num = tpm_db.ctc_cm_data.ipv6_ety_rule_num;
	return(TPM_DB_OK);
}

int32_t tpm_db_add_ipv4_pre_rule(tpm_src_port_type_t src_port, uint32_t key_pattern, uint32_t *rule_num)
{
	uint32_t rule_index, i, j;
	uint32_t *rule_table = &tpm_db.ctc_cm_data.ipv4_pre_table.rule_index[0];

	if (rule_num == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	rule_index = TPM_DB_CNM_GEN_IPV4_PRE_RULE_INDEX(src_port, key_pattern);
	if (rule_index == TPM_DB_CNM_INVALID_IPV4_PRE_RULE_INDEX)
		return TPM_DB_ERR_INV_INPUT;

	TPM_OS_DEBUG(TPM_DB_MOD, "add rule_index(0x%x)\n", rule_index);

	for (i = 0; i < tpm_db.ctc_cm_data.ipv4_pre_table.num_rules; i++) {
		if (rule_index == rule_table[i]) {
			TPM_OS_ERROR(TPM_DB_MOD, " ipv4_pre_rule already exists!\n");
			return TPM_DB_ERR_DB_INCONSISTENCY;
		} else if (rule_index > rule_table[i]) {
			break;
		}
	}

	for (j = tpm_db.ctc_cm_data.ipv4_pre_table.num_rules; j > i; j--)
		rule_table[j] = rule_table[j - 1];

	rule_table[j] = rule_index;
	tpm_db.ctc_cm_data.ipv4_pre_table.num_rules++;

	*rule_num = i;

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv4_pre_rule(tpm_src_port_type_t src_port, uint32_t key_pattern, uint32_t *rule_num)
{
	uint32_t rule_index, i, j;
	uint32_t *rule_table = &tpm_db.ctc_cm_data.ipv4_pre_table.rule_index[0];

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	rule_index = TPM_DB_CNM_GEN_IPV4_PRE_RULE_INDEX(src_port, key_pattern);
	if (rule_index == TPM_DB_CNM_INVALID_IPV4_PRE_RULE_INDEX)
		return TPM_DB_ERR_REC_EXIST;

	TPM_OS_DEBUG(TPM_DB_MOD, "delete rule_index(0x%x)\n", rule_index);

	for (i = 0; i < tpm_db.ctc_cm_data.ipv4_pre_table.num_rules; i++) {
		if (rule_index == rule_table[i])
			break;
	}

	if (i == tpm_db.ctc_cm_data.ipv4_pre_table.num_rules) {
		TPM_OS_ERROR(TPM_DB_MOD, " ipv4_pre_rule does not exist!\n");
		return TPM_DB_ERR_REC_NOT_EXIST;
	}

	for (j = i; j < tpm_db.ctc_cm_data.ipv4_pre_table.num_rules; j++)
		rule_table[j] = rule_table[j + 1];

	rule_table[j] = TPM_DB_CNM_INVALID_IPV4_PRE_RULE_INDEX;
	tpm_db.ctc_cm_data.ipv4_pre_table.num_rules--;

	*rule_num = i;

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv4_pre_rule_num(uint32_t *num_rules)
{
	*num_rules = tpm_db.ctc_cm_data.ipv4_pre_table.num_rules;
	return TPM_DB_OK;
}

int32_t tpm_db_alloc_ipv4_pre_filter_key(tpm_src_port_type_t src_port, uint32_t *key_idx)
{
	uint32_t i;

	/*check param*/
	if (key_idx == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].num_keys >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_DB_TBL_FULL;

	for (i = 0; i < TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM; i++) {
		if (tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[i].valid == TPM_FALSE)
			break;
	}

	if (i >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_DB_INCONSISTENCY;

	*key_idx = i;

	return TPM_DB_OK;
}

int32_t tpm_db_set_ipv4_pre_filter_key(tpm_src_port_type_t src_port,
				       uint32_t key_idx,
				       tpm_parse_fields_t parse_rule_bm,
				       tpm_ipv4_acl_key_t *ipv4_key)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	/*check param*/
	if (ipv4_key == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid != TPM_FALSE)
		return TPM_DB_ERR_REC_EXIST;

	key->valid = TPM_TRUE;
	key->num_users = 0;
	key->parse_rule_bm = parse_rule_bm;
	memcpy(&key->ipv4_key, ipv4_key, sizeof(tpm_ipv4_acl_key_t));

	tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].num_keys++;

	return TPM_DB_OK;
}

int32_t tpm_db_del_ipv4_pre_filter_key(tpm_src_port_type_t src_port, uint32_t key_idx)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid == TPM_FALSE)
		return TPM_DB_ERR_REC_NOT_EXIST;

	memset(key, 0, sizeof(tpm_db_cnm_ipv4_pre_filter_key_t));

	tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].num_keys--;

	return TPM_DB_OK;
}

int32_t tpm_db_set_gmac_rate_limit(tpm_db_tx_mod_t gmac_i,
				   uint32_t bucket_size,
				   uint32_t rate_limit,
				   uint32_t prio)
{
	/*check param*/
	if (gmac_i >= TPM_MAX_NUM_TX_PORTS)
		return (TPM_DB_ERR_INV_INPUT);

	tpm_db.gmac_tx[gmac_i].bucket_size = bucket_size;
	tpm_db.gmac_tx[gmac_i].rate_limit = rate_limit;
	tpm_db.gmac_tx[gmac_i].prio = prio;

	return TPM_DB_OK;
}

int32_t tpm_db_get_gmac_rate_limit(tpm_gmacs_enum_t gmac_i,
				   uint32_t *bucket_size,
				   uint32_t *rate_limit,
				   uint32_t *prio)
{
	/*check param*/
	if (gmac_i >= TPM_MAX_NUM_TX_PORTS)
		return (TPM_DB_ERR_INV_INPUT);

	*bucket_size = tpm_db.gmac_tx[gmac_i].bucket_size;
	*rate_limit = tpm_db.gmac_tx[gmac_i].rate_limit;
	*prio = tpm_db.gmac_tx[gmac_i].prio;

	return TPM_DB_OK;
}
int32_t tpm_db_set_gmac_q_rate_limit(tpm_db_tx_mod_t gmac_i,
				   uint32_t queue,
				   uint32_t bucket_size,
				   uint32_t rate_limit,
				   uint32_t wrr)
{
	/*check param*/
	if (gmac_i >= TPM_MAX_NUM_TX_PORTS)
		return (TPM_DB_ERR_INV_INPUT);

	if (queue >= TPM_MAX_NUM_TX_QUEUE)
		return TPM_DB_ERR_INV_INPUT;

	tpm_db.gmac_tx[gmac_i].tx_queue[queue].bucket_size = bucket_size;
	tpm_db.gmac_tx[gmac_i].tx_queue[queue].rate_limit = rate_limit;
	tpm_db.gmac_tx[gmac_i].tx_queue[queue].wrr = wrr;

	return TPM_DB_OK;
}

int32_t tpm_db_get_gmac_q_rate_limit(tpm_gmacs_enum_t gmac_i,
				   uint32_t queue,
				   uint32_t *bucket_size,
				   uint32_t *rate_limit,
				   uint32_t *wrr)
{
	/*check param*/
	if (gmac_i >= TPM_MAX_NUM_TX_PORTS)
		return (TPM_DB_ERR_INV_INPUT);

	if (queue >= TPM_MAX_NUM_TX_QUEUE)
		return TPM_DB_ERR_INV_INPUT;

	*bucket_size = tpm_db.gmac_tx[gmac_i].tx_queue[queue].bucket_size;
	*rate_limit = tpm_db.gmac_tx[gmac_i].tx_queue[queue].rate_limit;
	*wrr = tpm_db.gmac_tx[gmac_i].tx_queue[queue].wrr;

	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv4_pre_filter_key_num(tpm_src_port_type_t src_port, uint32_t *num_keys)
{
	/*check param*/
	if (num_keys == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	*num_keys = tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].num_keys;
	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv4_pre_filter_key(tpm_src_port_type_t src_port,
				       uint32_t key_idx,
				       tpm_parse_fields_t *parse_rule_bm,
				       tpm_ipv4_acl_key_t *ipv4_key)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	/*check param*/
	if (parse_rule_bm == NULL || ipv4_key == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid == TPM_FALSE)
		return TPM_DB_ERR_REC_NOT_EXIST;

	*parse_rule_bm = key->parse_rule_bm;
	memcpy(ipv4_key, &key->ipv4_key, sizeof(tpm_ipv4_acl_key_t));

	return TPM_DB_OK;
}

int32_t tpm_db_find_ipv4_pre_filter_key(tpm_src_port_type_t src_port,
					tpm_parse_fields_t parse_rule_bm,
					tpm_ipv4_acl_key_t *ipv4_key,
					uint32_t *key_idx)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key;
	uint32_t i;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[0];

	/*check param*/
	if (key_idx == NULL || ipv4_key == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	for (i = 0; i < TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM; i++) {
		if (key[i].valid == TPM_FALSE)
			continue;
		if (key[i].parse_rule_bm != parse_rule_bm)
			continue;
		if (parse_rule_bm & TPM_IPv4_PARSE_SIP) {
			if (memcmp(ipv4_key->ipv4_src_ip_add, key[i].ipv4_key.ipv4_src_ip_add, 4 * sizeof(uint8_t)) ||
				memcmp(ipv4_key->ipv4_src_ip_add_mask, key[i].ipv4_key.ipv4_src_ip_add_mask, 4 * sizeof(uint8_t)))
				continue;
		}
		if (parse_rule_bm & TPM_IPv4_PARSE_DIP) {
			if (memcmp(ipv4_key->ipv4_dst_ip_add, key[i].ipv4_key.ipv4_dst_ip_add, 4 * sizeof(uint8_t)) ||
				memcmp(ipv4_key->ipv4_dst_ip_add_mask, key[i].ipv4_key.ipv4_dst_ip_add_mask, 4 * sizeof(uint8_t)))
				continue;
		}
		if (parse_rule_bm & TPM_IPv4_PARSE_DSCP) {
			if ((ipv4_key->ipv4_dscp & ipv4_key->ipv4_dscp_mask) != (key[i].ipv4_key.ipv4_dscp & key[i].ipv4_key.ipv4_dscp_mask))
				continue;
		}
		if (parse_rule_bm & TPM_IPv4_PARSE_PROTO) {
			if (ipv4_key->ipv4_proto != key[i].ipv4_key.ipv4_proto)
				continue;
		}
		if (parse_rule_bm & TPM_PARSE_L4_SRC) {
			if (ipv4_key->l4_src_port != key[i].ipv4_key.l4_src_port)
				continue;
		}
		if (parse_rule_bm & TPM_PARSE_L4_DST) {
			if (ipv4_key->l4_dst_port != key[i].ipv4_key.l4_dst_port)
				continue;
		}
		*key_idx = i;
		return TPM_DB_OK;
	}

	*key_idx = TPM_CNM_INVALID_IPV4_PRE_FILTER_KEY_ID;
	return TPM_DB_ERR_REC_NOT_EXIST;
}

int32_t tpm_db_inc_ipv4_pre_filter_key_user_num(tpm_src_port_type_t src_port, uint32_t key_idx)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid == TPM_FALSE)
		return TPM_DB_ERR_REC_NOT_EXIST;

	key->num_users++;
	return TPM_DB_OK;
}

int32_t tpm_db_dec_ipv4_pre_filter_key_user_num(tpm_src_port_type_t src_port, uint32_t key_idx)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid == TPM_FALSE)
		return TPM_DB_ERR_REC_NOT_EXIST;

	if (key->num_users > 0)
		key->num_users--;
	return TPM_DB_OK;
}

int32_t tpm_db_get_ipv4_pre_filter_key_user_num(tpm_src_port_type_t src_port, uint32_t key_idx, uint32_t *num_users)
{
	tpm_db_cnm_ipv4_pre_filter_key_t *key = NULL;

	/*check param*/
	if (num_users == NULL)
		return (TPM_DB_ERR_INV_INPUT);

	if (key_idx >= TPM_DB_CNM_MAX_IPV4_PRE_FILTER_KEY_NUM)
		return TPM_DB_ERR_REC_INV;

	if(src_port >= TPM_MAX_NUM_UNI_PORTS) {
		TPM_OS_ERROR(TPM_DB_MOD, "invalid input Src Port(%d)\n", src_port);
		return TPM_DB_ERR_INV_INPUT;
	}

	key = &tpm_db.ctc_cm_data.ipv4_pre_filter[src_port].key[key_idx];

	if (key->valid == TPM_FALSE)
		return TPM_DB_ERR_REC_NOT_EXIST;

	*num_users = key->num_users;
	return TPM_DB_OK;
}


/*******************************************************************************
* tpm_db_mac_learn_mod_idx_set()
*
* DESCRIPTION: Set mac leanring pmt mod index, just for mac learning
*
* INPUTS:
* mod_idx
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mac_learn_mod_idx_set(uint32_t mod_idx)
{
	tpm_db.mac_learn_mod_idx = mod_idx;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_mac_learn_mod_idx_get()
*
* DESCRIPTION: Get mac leanring pmt mod index, just for mac learning
*
* INPUTS:
* mod_idx
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_mac_learn_mod_idx_get(uint32_t *mod_idx)
{
	*mod_idx = tpm_db.mac_learn_mod_idx;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_ds_mac_based_trunk_enable_set()
*
* DESCRIPTION: Set ds_mac_based_trunk_enable
*
* INPUTS:
* enable       -   ds_mac_based_trunk_enable
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ds_mac_based_trunk_enable_set(tpm_db_ds_mac_based_trunk_enable_t enable)
{
	tpm_db.ds_mac_based_trunk_enable = enable;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_ds_mac_based_trunk_enable_get()
*
* DESCRIPTION: Get ds_mac_based_trunk_enable
*
* INPUTS:
*
* OUTPUTS:
* enable       -   ds_mac_based_trunk_enable
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_ds_mac_based_trunk_enable_get(tpm_db_ds_mac_based_trunk_enable_t *enable)
{
	*enable = tpm_db.ds_mac_based_trunk_enable;

	return (TPM_DB_OK);
}
int32_t tpm_db_api_data_backup(void)
{
	memcpy(hot_swap_bak_db.api_ent_mem_area_bak, tpm_db.api_ent_mem_area, sizeof(tpm_db.api_ent_mem_area));
	memcpy(hot_swap_bak_db.api_section_bak, tpm_db.api_section, sizeof(tpm_db.api_section));
	memcpy(hot_swap_bak_db.mc_vid_port_cfg_bak, tpm_db.mc_vid_port_cfg, sizeof(tpm_db.mc_vid_port_cfg));
	memcpy(hot_swap_bak_db.gmac_tx_bak, tpm_db.gmac_tx, sizeof(tpm_db.gmac_tx));
	memcpy(hot_swap_bak_db.igmp_proxy_sa_mac, tpm_db_mc_igmp_proxy_sa_mac, 6);
	hot_swap_bak_db.igmp_proxy_sa_mac_valid = tpm_db_mc_igmp_proxy_sa_mac_valid;
	hot_swap_bak_db.switch_init = tpm_db.func_profile.switch_init;

	return (TPM_DB_OK);
}
int32_t tpm_db_api_data_rcvr(void)
{
	memcpy(tpm_db.mc_vid_port_cfg, hot_swap_bak_db.mc_vid_port_cfg_bak, sizeof(tpm_db.mc_vid_port_cfg));
	memcpy(tpm_db.gmac_tx, hot_swap_bak_db.gmac_tx_bak, sizeof(tpm_db.gmac_tx));
	memcpy(tpm_db_mc_igmp_proxy_sa_mac, hot_swap_bak_db.igmp_proxy_sa_mac, 6);
	tpm_db_mc_igmp_proxy_sa_mac_valid = hot_swap_bak_db.igmp_proxy_sa_mac_valid;
	tpm_db.func_profile.switch_init = hot_swap_bak_db.switch_init;

	return (TPM_DB_OK);
}
void tpm_db_exchange_value(uint32_t *v1, uint32_t *v2)
{
	uint32_t tmp;

	tmp = *v1;
	*v1 = *v2;
	*v2 = tmp;

	return;
}
int32_t tpm_db_wan_lan_rate_limit_exchange_db(tpm_db_gmac_tx_t *gmac_tx)
{
	int32_t queue;

	for (queue = 0; queue < TPM_MAX_NUM_TX_QUEUE; queue++) {
		tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].tx_queue[queue].bucket_size),
					&(gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[queue].bucket_size));
		tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].tx_queue[queue].rate_limit),
					&(gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[queue].rate_limit));
		tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].tx_queue[queue].wrr),
					&(gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[queue].wrr));
	}

	tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].bucket_size),
				&(gmac_tx[TPM_TX_MOD_GMAC1].bucket_size));
	tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].rate_limit),
				&(gmac_tx[TPM_TX_MOD_GMAC1].rate_limit));
	tpm_db_exchange_value(&(gmac_tx[TPM_TX_MOD_GMAC0].prio),
				&(gmac_tx[TPM_TX_MOD_GMAC1].prio));

	return (TPM_DB_OK);
}
int32_t tpm_db_wan_lan_rate_limit_exchange(void)
{
	tpm_db_wan_lan_rate_limit_exchange_db(tpm_db.gmac_tx);
	tpm_db_wan_lan_rate_limit_exchange_db(hot_swap_bak_db.gmac_tx_bak);
	return (TPM_DB_OK);
}

int32_t tpm_db_api_section_bak_num_entries_get(tpm_api_sections_t api_section, uint32_t *num_entries)
{
	if (hot_swap_bak_db.api_section_bak[api_section].valid == TPM_DB_INVALID) {
		printk("api_section: %d is not valid\n", api_section);
		*num_entries = 0;
	} else
		*num_entries = hot_swap_bak_db.api_section_bak[api_section].num_valid_entries;

	printk("api_section: %d, number_valid: %d\n", api_section, *num_entries);
	return (TPM_DB_OK);
}
int32_t tpm_db_api_section_bak_ent_tbl_get(tpm_api_sections_t api_sec, tpm_db_api_entry_t *api_ent_mem_area, uint32_t index)
{
	if (ILLEGAL_API_SEC(api_sec))
		IF_ERROR_I(TPM_DB_ERR_REC_NOT_EXIST, api_sec);

	if (NULL == api_ent_mem_area)
		return (TPM_DB_ERR_INV_INPUT);

	memcpy(api_ent_mem_area,
		&hot_swap_bak_db.api_ent_mem_area_bak[(hot_swap_bak_db.api_section_bak[api_sec].table_start) + index],
		sizeof(tpm_db_api_entry_t));

	return (TPM_DB_OK);
}
int32_t tpm_db_api_entry_bak_get_next(tpm_api_sections_t api_section,
				      int32_t cur_rule,
				      int32_t *next_rule)
{
	int32_t ind = -1;
	int32_t i;
	uint32_t min_rule, l_next_rule = ~0;
	tpm_db_api_entry_t *api_tbl;

	api_tbl = &(hot_swap_bak_db.api_ent_mem_area_bak[hot_swap_bak_db.api_section_bak[api_section].table_start]);

	if (cur_rule <= -1)
		min_rule = 0;
	else
		min_rule = cur_rule + 1;

	/*TPM_OS_DEBUG(TPM_DB_MOD, "min_rule(%d) \n", min_rule); */

	for (i = 0; i <= hot_swap_bak_db.api_section_bak[api_section].last_valid_index; i++) {
		if (((api_tbl + i)->valid == TPM_DB_VALID) &&
		    ((api_tbl + i)->rule_num >= min_rule) && ((api_tbl + i)->rule_num < l_next_rule)) {
			l_next_rule = (api_tbl + i)->rule_num;
			ind = i;
			TPM_OS_INFO(TPM_DB_MOD, "rule_num(%d), rule_idx(%d) update\n", (api_tbl + i)->rule_num, (api_tbl + i)->rule_idx);
		} else
			TPM_OS_INFO(TPM_DB_MOD, "rule_num(%d), rule_idx(%d) \n", (api_tbl + i)->rule_num, (api_tbl + i)->rule_idx);
	}

	/*TPM_OS_DEBUG(TPM_DB_MOD, "l_next_rule(%d) ind(%d) \n", l_next_rule, ind); */

	if ((l_next_rule < (uint32_t) (~0)) && (ind != -1)) {
		*next_rule = ind;
	} else		/* Not found */
		*next_rule = -1;

	TPM_OS_INFO(TPM_DB_MOD, "next_rule(%d) \n", *next_rule);
	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_max_uni_port_nr_get()
*
* DESCRIPTION: Get max UNI port number
*
* INPUTS:
*
* OUTPUTS:
* max_uni_port_nr       -   max UNI port number
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_max_uni_port_nr_get(uint32_t *max_uni_port_nr)
{
	*max_uni_port_nr = tpm_db.max_uni_port_nr + 1;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_uni_egr_rate_limit_set()
*
* DESCRIPTION: Set GMAC UNI egress rate limit
*
* INPUTS:
*        port - GMAC UNI port to do rate limit
*        rate_limit - rate limit value
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_gmac_uni_egr_rate_limit_set(tpm_src_port_type_t port, uint32_t rate_limit)
{
	tpm_db.gmac_uni_egr_rate_limit[port] = rate_limit;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_uni_egr_rate_limit_get()
*
* DESCRIPTION: Get GMAC UNI egress rate limit
*
* INPUTS:
*        port - GMAC UNI port to do rate limit
* OUTPUTS:
*        rate_limit - rate limit value, if value got is 0, means no rate limit set
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_gmac_uni_egr_rate_limit_get(tpm_src_port_type_t port, uint32_t *rate_limit)
{
	if (NULL == rate_limit)
		return (TPM_DB_ERR_INV_INPUT);

	*rate_limit = tpm_db.gmac_uni_egr_rate_limit[port];

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_lpk_uni_ingr_rate_limit_set()
*
* DESCRIPTION: Set GMAC UNI ingress rate limit only with loopback mode
*
* INPUTS:
*        port - GMAC UNI port to do rate limit
*        rate_limit - rate limit value
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_gmac_lpk_uni_ingr_rate_limit_set(tpm_src_port_type_t port, tpm_db_gmac_lpk_uni_ingr_rate_limit_t rate_limit)
{
	tpm_db.gmac_lpk_uni_ingr_rate_limit[port].count_mode = rate_limit.count_mode;
	tpm_db.gmac_lpk_uni_ingr_rate_limit[port].cir = rate_limit.cir;
	tpm_db.gmac_lpk_uni_ingr_rate_limit[port].cbs = rate_limit.cbs;
	tpm_db.gmac_lpk_uni_ingr_rate_limit[port].ebs = rate_limit.ebs;

	return (TPM_DB_OK);
}

/*******************************************************************************
* tpm_db_gmac_lpk_uni_ingr_rate_limit_get()
*
* DESCRIPTION: Get GMAC UNI ingress rate limit with loopback mode
*
* INPUTS:
*        port - GMAC UNI port to do rate limit
* OUTPUTS:
*        rate_limit - rate limit value, if value got is 0, means no rate limit set
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_gmac_lpk_uni_ingr_rate_limit_get(tpm_src_port_type_t port, tpm_db_gmac_lpk_uni_ingr_rate_limit_t *rate_limit)
{
	if (NULL == rate_limit)
		return (TPM_DB_ERR_INV_INPUT);

	memcpy(rate_limit,
	       &tpm_db.gmac_lpk_uni_ingr_rate_limit[port],
	       sizeof(tpm_db_gmac_lpk_uni_ingr_rate_limit_t));

	return (TPM_DB_OK);
}

#ifdef CONFIG_MV_INCLUDE_PON
static PON_SHUTDOWN_FUNC gb_pon_callback_func = NULL;

/*******************************************************************************
* tpm_db_register_pon_callback()
*
* DESCRIPTION: Function used to register PON callback functions.
*
* INPUTS:
* pon_func: PON callback function
*
* OUTPUTS:
* None
*
* RETURNS:
* On success, the function returns TPM_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*******************************************************************************/
int32_t tpm_db_register_pon_callback(PON_SHUTDOWN_FUNC pon_func)
{
	tpm_error_code_t ret_code = TPM_OK;

	gb_pon_callback_func = pon_func;

	return ret_code;
}

/*******************************************************************************
* tpm_db_get_pon_callback()
*
* DESCRIPTION: Function used to get PON callback functions.
*
* INPUTS:
* None
*
* OUTPUTS:
* pon_func: PON callback function
*
* RETURNS:
* On success, the function returns TPM_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*******************************************************************************/
int32_t tpm_db_get_pon_callback(PON_SHUTDOWN_FUNC *pon_func)
{
	tpm_error_code_t ret_code = TPM_OK;

	*pon_func = gb_pon_callback_func;

	return ret_code;
}
#endif

/*******************************************************************************
* tpm_db_init()
*
* DESCRIPTION:      Perform DB Initialization. Set all structures to 0, and all valid fields to TPM_DB_INVALID
*
* INPUTS:
*
* OUTPUTS:
*
* RETURNS:
* On success, the function returns TPM_DB_OK. On error different types are returned
* according to the case - see tpm_db_err_t.
*
* COMMENTS:
*
*******************************************************************************/
int32_t tpm_db_init(void)
{
	uint32_t i, j;

	/* Erase DB */
	memset(&tpm_db, 0, sizeof(tpm_db_t));

	/* Set All entries in all structures to invalid */

	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
		tpm_db.eth_ports[i].valid = TPM_DB_INVALID;

	/* GMAC Connect */
	for (i = 0; i < TPM_NUM_GMACS; i++)
		tpm_db.gmac_port_conf[i].valid = TPM_DB_INVALID;
	tpm_db.num_valid_tcont_llid = 0;

	/* GMAC Func. */
	for (i = 0; i < TPM_MAX_NUM_GMACS; i++)
		tpm_db.gmac_func[i] = TPM_GMAC_FUNC_NONE;

	for (i = 0; i < TPM_MAX_NUM_TX_PORTS; i++) {
		tpm_db.gmac_tx[i].valid = TPM_DB_INVALID;
		for (j = 0; j < TPM_MAX_NUM_TX_QUEUE; j++)
			tpm_db.gmac_tx[i].tx_queue[j].valid = TPM_DB_INVALID;
	}

	/* IGMP */
	tpm_db.igmp_def.frwd_mode[TPM_SRC_PORT_WAN] = TPM_IGMP_FRWD_MODE_DROP;
	for (i = TPM_SRC_PORT_UNI_0; i <= TPM_SRC_PORT_UNI_7; i++)
		 tpm_db.igmp_def.frwd_mode[i] = TPM_IGMP_FRWD_MODE_DROP;
	tpm_db.igmp_def.cpu_queue = 0;
	tpm_db.igmp_def.igmp_snoop_enable = TPM_FALSE;

	tpm_db.igmp_def.mc_lpbk_enable[TPM_IP_VER_4] = TPM_FALSE;
	tpm_db.igmp_def.mc_lpbk_enable[TPM_IP_VER_6] = TPM_FALSE;

	/* Misc. */
	tpm_db.init_misc.omci_etype = TPM_DB_INVALID;
	tpm_db.init_misc.pnc_init_debug_port = TPM_DB_INVALID;
	tpm_db.init_misc.pon_type = TPM_DB_INVALID;
	tpm_db.init_misc.ds_mh_set_conf = TPM_DB_INVALID;
	tpm_db.init_misc.cfg_pnc_parse = TPM_DB_INVALID;
	tpm_db.init_misc.cpu_loopback = TPM_DB_INVALID;
	tpm_db.init_misc.tpm_init_succeeded = TPM_DB_INVALID;
	tpm_db.func_profile.virt_uni_info.enabled = TPM_DB_INVALID;
	tpm_db.func_profile.virt_uni_info.switch_port = TPM_DB_INVALID;
	tpm_db.func_profile.virt_uni_info.uni_port = TPM_DB_INVALID;

	/* Ownership */
	for (i = 0; i < TPM_MAX_API_TYPES; i++)
		tpm_db.owners[i].valid = TPM_DB_INVALID;

	/* API Ranges */
	for (i = 0; i < TPM_MAX_NUM_API_SECTIONS; i++) {
		for (j = 0; j < TPM_NUM_DIRECTIONS; j++)
			tpm_db_api_section_invalidate(i);
	}

	/* API_Busy */
	tpm_db_api_busy_init();

	/* API Entries Area, stripe whole area */
	tpm_db_api_entries_area_reset();

	/* PNC Tables */
	for (i = 0; i < TPM_MAX_NUM_RANGES; i++)
		tpm_db.pnc_range[i].valid = TPM_DB_INVALID;

	for (i = 0; i < TPM_PNC_SIZE; i++)
		tpm_db.pnc_shadow[i].valid = TPM_DB_INVALID;

	/* Modification Tables */
	tpm_db_mod2_init();

	/* Vlan Ethertype */
	for (i = 0; i < TPM_NUM_VLAN_ETYPE_REGS; i++)
		tpm_db.vlan_etype[i].valid = TPM_DB_INVALID;

	/* Multicast Tables */
	tpm_db_mc_lpbk_entries_num = 0;
	memset(tpm_db_mc_stream_table, 0, TPM_MC_MAX_STREAM_NUM * sizeof(tpm_db_mc_stream_entry_t *));
	memset(tpm_db_mc_mac_table, 0, TPM_MC_MAX_MAC_NUM * sizeof(tpm_db_mc_mac_entry_t *));
	memset(tpm_db_mc_lpbk_table, 0, TPM_MC_MAX_LPBK_ENTRIES_NUM * sizeof(tpm_db_mc_lpbk_entry_t *));
	memset(tpm_db_mc_vlan_xits_table, 0, TPM_MC_MAX_MVLAN_XITS_NUM * sizeof(tpm_db_mc_vlan_entry_t *));
	memset(tpm_db_mc_virt_uni_entry_state_table, 0, TPM_MC_MAX_STREAM_NUM * sizeof(uint8_t));
	tpm_db_mc_igmp_proxy_sa_mac_valid = 0;
	memset(tpm_db_mc_igmp_proxy_sa_mac, 0, 6 * sizeof(uint8_t));

	/* IPV6 Flow Tables */
	tpm_db_init_ipv6_5t_flow_reset();

	/* CTC CnM db */
	tpm_db_ctc_cm_db_reset();

	/* IPv6 MC SIP db */
	tpm_db_ipv6_mc_sip_db_reset();

	return (TPM_DB_OK);
}
