/*******************************************************************************
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.

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

/*******************************************************************************
* mvNfp.h - Header File for Marvell NFP
*
* DESCRIPTION:
*       This header file contains macros, typedefs and function declarations
* 	specific to the Marvell Network Fast Processing.
*
* DEPENDENCIES:
*       None.
*
*******************************************************************************/

#ifndef __mvNfp_h__
#define __mvNfp_h__

#include "mvSysHwConfig.h"
#include "mvTypes.h"
#include "mvCommon.h"
#include "mvStack.h"
#include "mvList.h"
#include "mv802_3.h"
#include "gbe/mvEthRegs.h"
#include "pnc/mvPnc.h"

#include "mvNfpDefs.h"

/* Enable / Disable NFP Debug Prints: */

#define NFP_DBG(x...)  if (nfpDebugLevel & NFP_DBG_PRINT) mvOsPrintf(x)
/*#define NFP_WARN(x...)*/

#define NFP_WARN(x...)  if (nfpDebugLevel & NFP_WARN_PRINT) mvOsPrintf(x)
/*#define NFP_WARN(x...)*/

#define	NFP_NO_PRINT	0x0
#define	NFP_DBG_PRINT	0x1
#define	NFP_WARN_PRINT	0x2

/* defined in mvNfp.c */
extern MV_U32 nfpDebugLevel;

extern MV_U32	 nfp_ports[];
extern MV_U32    nfp_jhash_iv;

#ifdef CONFIG_MV_ETH_SWITCH
/* switchGroup coded by bits[4-7] of MSB in Marvell header */
#define NFP_SWITCH_GROUP(port, mh)       	\
		((nfp_ports[port] & NFP_F_PORT_MH) ? ((*(MV_U8 *)(mh)) >> 4) : NFP_INVALID_SWITCH_GROUP)
#else
# define NFP_SWITCH_GROUP(port, mh)      NFP_INVALID_SWITCH_GROUP
#endif /* CONFIG_MV_ETH_SWITCH */

/* NFP Operation Mode */
typedef enum {
	MV_NFP_DISABLED	= 0,
	MV_NFP_2_TUPLE	= 1,
	MV_NFP_5_TUPLE	= 2,
	MV_NFP_MODE_LAST
} MV_NFP_MODE;

typedef enum {
	MV_NFP_OFF = 0,
	MV_NFP_ON  = 1,
	MV_NFP_STATE_LAST
} MV_NFP_STATE;


static INLINE MV_U32 mv_jhash_array(const MV_U8 *k, MV_U32 length, MV_U32 initval)
{
	MV_U32 a, b, c, l;

	l = length;
	a = b = MV_JHASH_GOLDEN_RATIO;
	c = initval;

	while (l >= 12) {
		a += (k[0] + ((MV_U32) k[1] << 8) + ((MV_U32) k[2] << 16) + ((MV_U32) k[3] << 24));
		b += (k[4] + ((MV_U32) k[5] << 8) + ((MV_U32) k[6] << 16) + ((MV_U32) k[7] << 24));
		c += (k[8] + ((MV_U32) k[9] << 8) + ((MV_U32) k[10] << 16) + ((MV_U32) k[11] << 24));
		MV_JHASH_MIX(a, b, c);
		k += 12;
		l -= 12;
	}

	c += length;
	switch (l) {
	case 11:
		c += ((MV_U32) k[10] << 24);
	case 10:
		c += ((MV_U32) k[9] << 16);
	case 9:
		c += ((MV_U32) k[8] << 8);
	case 8:
		b += ((MV_U32) k[7] << 24);
	case 7:
		b += ((MV_U32) k[6] << 16);
	case 6:
		b += ((MV_U32) k[5] << 8);
	case 5:
		b += k[4];
	case 4:
		a += ((MV_U32) k[3] << 24);
	case 3:
		a += ((MV_U32) k[2] << 16);
	case 2:
		a += ((MV_U32) k[1] << 8);
	case 1:
		a += k[0];
	default:
		/* do nothing */;
	}

	MV_JHASH_MIX(a, b, c);
	return c;
}


static INLINE MV_U32 mv_jhash_2addr(int family, const MV_U8 *aa, const MV_U8 *ab, MV_U32 c, MV_U32 initval)
{
	MV_U32 a, b;

	if (family == MV_INET6) {
		a = mv_jhash_array(aa, 16, initval);
		b = mv_jhash_array(ab, 16, initval);
	} else {
		a = *((const MV_U32 *)(aa));
		b = *((const MV_U32 *)(ab));
	}

	return mv_jhash_3words(a, b, c, initval);
}

static INLINE MV_U32 mv_jhash_2macs(const MV_U8 *da, const MV_U8 *sa, MV_U32 c, MV_U32 initval)
{
	MV_U32 a, b;

	a = mv_jhash_array(da, MV_MAC_ADDR_SIZE, initval);
	b = mv_jhash_array(sa, MV_MAC_ADDR_SIZE, initval);

	return mv_jhash_3words(a, b, c, initval);
}

static INLINE MV_U32 mv_jhash_1addr(int family, const MV_U8 *aa, MV_U32 b, MV_U32 c, MV_U32 initval)
{
	MV_U32 a;

	if (family == MV_INET6)
		a = mv_jhash_array(aa, 16, initval);
	else
		a = *((const MV_U32 *)(aa));

	return mv_jhash_3words(a, b, c, initval);
}

/* L3 address copy. Supports AF_INET and AF_INET6 */
static inline MV_VOID l3_addr_copy(int family, u8 *dst, const u8 *src)
{
	const u32 *s = (const u32 *)src;
	u32 *d = (u32 *) dst;

	*d++ = *s++;		/* 4 */
	if (family == MV_INET)
		return;

	*d++ = *s++;		/* 8 */
	*d++ = *s++;		/* 12 */
	*d++ = *s++;		/* 16 */
}

static INLINE MV_U32 l3_addr_eq(int family, const MV_U8 *a, const MV_U8 *b)
{
	const MV_U32 *aa = (const MV_U32 *)a;
	const MV_U32 *bb = (const MV_U32 *)b;
	MV_U32 r;

	r = *aa++ ^ *bb++;	/* 4 */
	if (family == MV_INET)
		return !r;

	r |= *aa++ ^ *bb++;	/* 8 */
	r |= *aa++ ^ *bb++;	/* 12 */
	r |= *aa++ ^ *bb++;	/* 16 */

	return !r;
}

/*******************************
 * Hash tables size definitions
 *******************************/

#define NFP_DEV_HASH_BITS	7
#define NFP_DEV_HASH_SZ		(1 << NFP_DEV_HASH_BITS)
#define NFP_DEV_HASH_MASK	(NFP_DEV_HASH_SZ - 1)

#define	NFP_FDB_HASH_BITS	14
#define	NFP_FSB_HASH_SIZE	(1 << NFP_FDB_HASH_BITS)
#define	NFP_FDB_HASH_MASK	(NFP_FDB_HASH_SIZE - 1)

#define	NFP_BRIDGE_HASH_BITS	14
#define	NFP_BRIDGE_HASH_SIZE	(1 << NFP_BRIDGE_HASH_BITS)
#define	NFP_BRIDGE_HASH_MASK	(NFP_BRIDGE_HASH_SIZE - 1)

#define	NFP_ARP_HASH_BITS	14
#define	NFP_ARP_HASH_SIZE	(1 << NFP_ARP_HASH_BITS)
#define	NFP_ARP_HASH_MASK	(NFP_ARP_HASH_SIZE - 1)

#define	NFP_FIB_HASH_BITS	14
#define	NFP_FIB_HASH_SIZE	(1 << NFP_FIB_HASH_BITS)
#define	NFP_FIB_HASH_MASK	(NFP_FIB_HASH_SIZE - 1)

#define	NFP_CT_HASH_BITS	14
#define	NFP_CT_HASH_SIZE	(1 << NFP_CT_HASH_BITS)
#define	NFP_CT_HASH_MASK	(NFP_CT_HASH_SIZE - 1)

/*********
 * Flags
 *********/

/* Flags relevant for port capabilities */
#define NFP_F_PORT_MH           0x1

/* Flags relevant for NFP_IF_MAP, to be used in NFP_IF_MAP flags */
#define NFP_F_MAP_INT                    0x0001
#define NFP_F_MAP_EXT                    0x0002
#define NFP_F_MAP_SWITCH_PORT            0x0004
#define NFP_F_MAP_BRIDGE                 0x0008
#define NFP_F_MAP_BRIDGE_PORT            0x0010
#define NFP_F_MAP_TX_MH                  0x0020
#define NFP_F_MAP_VLAN_PVID              0x0040
#define NFP_F_MAP_VLAN_RX_DROP_TAGGED    0x0080
#define NFP_F_MAP_VLAN_RX_DROP_UNTAGGED  0x0100
#define NFP_F_MAP_VLAN_RX_DROP_UNKNOWN   0x0200
#define NFP_F_MAP_VLAN_RX_FLAGS          (NFP_F_MAP_VLAN_RX_DROP_TAGGED | NFP_F_MAP_VLAN_RX_DROP_UNTAGGED | \
										NFP_F_MAP_VLAN_RX_DROP_UNKNOWN)

#define NFP_F_MAP_VLAN_TX_TAGGED         0x0400
#define NFP_F_MAP_VLAN_TX_UNTAGGED       0x0800
#define NFP_F_MAP_VLAN_TX_FLAGS          (NFP_F_MAP_VLAN_TX_UNTAGGED | NFP_F_MAP_VLAN_TX_TAGGED)

#define NFP_F_MAP_PPPOE                  0x1000

/* Flags relevant for NFP Bridging, to be used in NFP_RULE_BRIDGE flags */
#define NFP_F_BR_SET_VLAN_PRIO  0x1
#define NFP_F_BR_SET_TXQ        0x2
#define NFP_F_BR_SET_TXP        0x4
#define NFP_F_BR_SET_MH         0x8
#define NFP_F_BR_NOT_EXIST      0x10

/* Flags relevant for NFP FIB rules, to be used in NFP_RULE_FIB flags */
#define NFP_F_FIB_BRIDGE_INV    0x1
#define NFP_F_FIB_ARP_INV       0x2
#define NFP_F_FIB_HWF           0x4
#define NFP_F_FIB_ALL_FLAGS	    (NFP_F_FIB_BRIDGE_INV | NFP_F_FIB_ARP_INV | NFP_F_FIB_HWF)

/* Flags relevant for 5 Tuple NFP mode (CT), to be used in NFP_RULE_CT flags */
#define	NFP_F_CT_SNAT           0x1
#define	NFP_F_CT_DNAT           0x2
#define NFP_F_CT_DROP           0x4
#define NFP_F_CT_SET_DSCP       0x8
#define NFP_F_CT_SET_VLAN_PRIO  0x10
#define NFP_F_CT_SET_TXQ        0x20
#define NFP_F_CT_SET_TXP        0x40
#define NFP_F_CT_SET_MH         0x80
#define NFP_F_CT_LIMIT          0x100
#define NFP_F_CT_FIB_INV        0x200
#define NFP_F_CT_HWF            0x400
#define NFP_F_CT_UDP_CSUM       0x800
#define NFP_F_CT_NOT_EXIST      0x1000


/* Flags relevant for classification info NFP_CLASSIFY_INFO */
#define NFP_F_SET_TXQ			0x01
#define NFP_F_SET_TXP			0x02
#define NFP_F_SET_MH			0x04
#define NFP_F_SET_VLAN_PRIO		0x08
#define NFP_F_SET_DSCP			0x10
#define NFP_F_SET_PRIO_TXQ		0x20
#define NFP_F_SET_PRIO_TXP		0x40
#define NFP_F_SET_PRIO_MH		0x80
#define NFP_F_SET_PRIO_VLAN_PRIO	0x100
#define NFP_F_SET_PRIO_DSCP		0x200
#define NFP_F_SET_EXACT_TXQ		0x400
#define NFP_F_SET_EXACT_TXP		0x800
#define NFP_F_SET_EXACT_MH		0x1000
#define NFP_F_SET_EXACT_VLAN_PRIO	0x2000
#define NFP_F_SET_EXACT_DSCP		0x4000

#define NFP_INVALID_VLAN          4096
#define NFP_INVALID_VPRIO         -1
#define NFP_INVALID_DSCP          -1
#define NFP_INVALID_TXP	          255
#define NFP_INVALID_TXQ	          255
#define NFP_INVALID_MH	          0xFFFF
#define NFP_INVALID_SWITCH_GROUP  255
#define NFP_INVALID_PORT          255

/*****************************
 * Classification definitions
 *****************************/

#ifdef NFP_CLASSIFY

/* 0..7 + one cell for global mapping regardless of the old VLAN Prio value (the '-1' option) */
#define NFP_VPRI_MAP_SIZE	9
#define NFP_VPRI_MAP_GLOBAL	8 /* index in the array for the global mapping */
#define NFP_VPRI_MIN		0
#define NFP_VPRI_MAX		7

typedef struct {
	MV_U16 eth_type; /* Used for bridging VLAN priority mapping */
	MV_U8 new_prio;
	MV_U8 valid;
} NFP_VPRI_MAP_INFO;


#define	MV_ETH_NFP_GLOBAL_MAP	-1

/* 0..63 + one cell for global mapping regardless of the old DSCP value (the '-1' option) */
#define NFP_DSCP_MAP_SIZE	65
#define NFP_DSCP_MAP_GLOBAL	64 /* index in the array for the global mapping */
#define NFP_DSCP_MIN		0
#define NFP_DSCP_MAX		63

typedef struct {
	MV_U8 new_dscp;
	MV_U8 valid;
} NFP_DSCP_MAP_INFO;

typedef struct {
	MV_U8 txq;
	MV_U8 valid;
} NFP_TXQ_MAP_INFO;

#define MV_NFP_CLASSIFY_FEATURES	5

typedef enum {
	MV_NFP_CLASSIFY_FEATURE_DSCP		= 0,
	MV_NFP_CLASSIFY_FEATURE_VPRIO		= 1,
	MV_NFP_CLASSIFY_FEATURE_TXQ		= 2,
	MV_NFP_CLASSIFY_FEATURE_TXP		= 3,
	MV_NFP_CLASSIFY_FEATURE_MH		= 4,
	MV_NFP_CLASSIFY_FEATURE_INVALID	= 5,
} MV_NFP_CLASSIFY_FEATURE;

typedef enum {
	MV_NFP_CLASSIFY_MODE_DISABLED	= 0,
	MV_NFP_CLASSIFY_MODE_EXACT	= 1,
	MV_NFP_CLASSIFY_MODE_PRIO	= 2,
	MV_NFP_CLASSIFY_MODE_HIGHEST	= 3,
	MV_NFP_CLASSIFY_MODE_LOWEST	= 4,
	MV_NFP_CLASSIFY_MODE_INVALID  = 5,
} MV_NFP_CLASSIFY_MODE;

typedef enum {
	MV_NFP_CLASSIFY_POLICY_HIGHEST	= 0,
	MV_NFP_CLASSIFY_POLICY_LOWEST	= 1,
	MV_NFP_CLASSIFY_POLICY_FIRST	= 2,
	MV_NFP_CLASSIFY_POLICY_LAST	= 3,
	MV_NFP_CLASSIFY_POLICY_EXACT	= 4,
	MV_NFP_CLASSIFY_POLICY_PRIORITY	= 5,
	MV_NFP_CLASSIFY_POLICY_INVALID = 6,
} MV_NFP_CLASSIFY_POLICY;

MV_STATUS mvNfpClassifyModeSet(MV_NFP_CLASSIFY_FEATURE feature, MV_NFP_CLASSIFY_MODE mode);
MV_NFP_CLASSIFY_MODE mvNfpClassifyModeGet(MV_NFP_CLASSIFY_FEATURE feature);

MV_STATUS mvNfpExactPolicySet(MV_NFP_CLASSIFY_FEATURE feature, MV_NFP_CLASSIFY_POLICY policy);
MV_NFP_CLASSIFY_POLICY mvNfpExactPolicyGet(MV_NFP_CLASSIFY_FEATURE feature);
MV_STATUS mvNfpPrioPolicySet(MV_NFP_CLASSIFY_POLICY policy);
MV_NFP_CLASSIFY_POLICY mvNfpPrioPolicyGet(MV_VOID);
MV_STATUS mvNfpMixedPolicySet(MV_NFP_CLASSIFY_FEATURE feature, MV_NFP_CLASSIFY_POLICY policy);
MV_NFP_CLASSIFY_POLICY mvNfpMixedPolicyGet(MV_NFP_CLASSIFY_FEATURE feature);

/* Priority classification API */
#define NFP_PRIO_MAP_SIZE 64
#define NFP_PRIO_MAX 63
#define NFP_PRIO_INVALID -1

/* Flags relevant for NFP_PRIO_CLASSIFY_INFO */
#define NFP_F_PRIO_DSCP		0x01
#define NFP_F_PRIO_VPRIO	0x02
#define NFP_F_PRIO_TXP		0x04
#define NFP_F_PRIO_TXQ		0x08
#define NFP_F_PRIO_MH		0x10

typedef struct {
	MV_U8 prio;
	MV_U8 valid;
} NFP_PRIO_MAP_INFO;


typedef struct {
	MV_U16 flags;
	MV_U8  txp;
	MV_U8  txq;
	int dscp;
	int vprio;
	MV_U16 mh;
} NFP_PRIO_CLASSIFY_INFO;

MV_STATUS mvNfpIifToPrioSet(int iif, MV_U8 prio);
MV_STATUS mvNfpIifVlanToPrioSet(int iif, MV_U8 vlan_prio, MV_U8 prio);
MV_STATUS mvNfpIifDscpToPrioSet(int iif, MV_U8 dscp, MV_U8 prio);

MV_STATUS mvNfpIifToPrioDel(int iif);
MV_STATUS mvNfpIifVlanToPrioDel(int iif, MV_U8 vlan_prio);
MV_STATUS mvNfpIifDscpToPrioDel(int iif, MV_U8 dscp);

MV_STATUS mvNfpPrioToDscpSet(int oif, MV_U8 prio, MV_U8 dscp);
MV_STATUS mvNfpPrioToVprioSet(int oif, MV_U8 prio, MV_U8 vlan_prio);
MV_STATUS mvNfpPrioToTxpSet(int oif, MV_U8 prio, MV_U8 txp);
MV_STATUS mvNfpPrioToTxqSet(int oif, MV_U8 prio, MV_U8 txq);
MV_STATUS mvNfpPrioToMhSet(int oif, MV_U8 prio, MV_U16 mh);

MV_STATUS mvNfpPrioToDscpDel(int oif, MV_U8 prio);
MV_STATUS mvNfpPrioToVprioDel(int oif, MV_U8 prio);
MV_STATUS mvNfpPrioToTxpDel(int oif, MV_U8 prio);
MV_STATUS mvNfpPrioToTxqDel(int oif, MV_U8 prio);
MV_STATUS mvNfpPrioToMhDel(int oif, MV_U8 prio);

MV_VOID mvNfpIngressPrioDump(int iif);
MV_VOID mvNfpEgressPrioDump(int oif);
#endif /* NFP_CLASSIFY */


/*****************
 * Interface Map
 *****************/

typedef struct nfp_if_map {

	struct nfp_if_map *nextMap;
	struct nfp_if_map *parentIf;
	struct nfp_if_map *virtIf;
	struct nfp_if_map *virtNext;
	int     ifIdx;
	char    name[16];
	MV_VOID *dev;
	MV_U8   port;
	MV_U8   switchGroup;
	MV_U16  pvid;
	MV_U16  txMh;
	MV_U8   mac[MV_MAC_ADDR_SIZE];
	MV_U16  vlanId;
	int     mtu;
	int     bridgeIf;
	MV_U32  flags;
#ifdef NFP_PPP
	MV_U16  sid;
	MV_U8   remoteMac[MV_MAC_ADDR_SIZE];
#endif /* NFP_PPP */

#ifdef NFP_CLASSIFY
	int prio;
	NFP_PRIO_MAP_INFO dscp_to_prio[NFP_DSCP_MAP_SIZE];
	NFP_PRIO_MAP_INFO vpri_to_prio[NFP_VPRI_MAP_SIZE];
	NFP_PRIO_CLASSIFY_INFO prio_to_classify[NFP_PRIO_MAP_SIZE];
#endif /* NFP_CLASSIFY */
} NFP_IF_MAP;

extern NFP_IF_MAP  *nfp_if_map[NFP_DEV_HASH_SZ];
extern NFP_IF_MAP  *nfp_if_real_map[NFP_MAX_PORTS][NFP_MAX_SWITCH_GROUPS];

static INLINE NFP_IF_MAP *mvNfpIfMapGet(int ifIdx)
{
	NFP_IF_MAP *ifMap = nfp_if_map[ifIdx & NFP_DEV_HASH_MASK];

	while (ifMap != NULL) {
		if (ifMap->ifIdx == ifIdx)
			return ifMap;
		ifMap = ifMap->nextMap;
	}
	return NULL;
}

static INLINE int mvNfpIfMapCmp(int port, MV_U8 switchGroup, NFP_IF_MAP *ifMap)
{
	if ((ifMap->port == port) && (ifMap->switchGroup == switchGroup))
		return MV_TRUE;

	return MV_FALSE;
}

static INLINE NFP_IF_MAP *mvNfpIfMapRealGet(int port, MV_U8 *mh)
{
	MV_U8		switchGroup;
	NFP_IF_MAP	*ifMap;

	/* Support port and switchGroup */
	switchGroup = NFP_SWITCH_GROUP(port, mh);
	if (switchGroup == NFP_INVALID_SWITCH_GROUP)
		ifMap = nfp_if_real_map[port][0];
	else
		ifMap = nfp_if_real_map[port][switchGroup];

	if ((ifMap) && mvNfpIfMapCmp(port, switchGroup, ifMap))
		return ifMap;

	return NULL;
}


/************
 * Bridging
 ************/

#ifdef NFP_BRIDGE

#define NFP_BRIDGE_INV		0
#define NFP_BRIDGE_LOCAL	1
#define NFP_BRIDGE_NON_LOCAL	2

typedef struct nfp_rule_fdb {
	struct nfp_rule_fdb *next;
	MV_U16 reserved;
	MV_U8  mac[MV_MAC_ADDR_SIZE];
	int    bridgeIf;
	int    if_index;
	MV_U32 age;
	MV_U8  status;

} NFP_RULE_FDB;

extern NFP_RULE_FDB **nfp_fdb_hash;

static INLINE MV_U32 mvNfpFdbRuleHash(int bridgeIf, const MV_U8 *mac)
{
	MV_U32 hash = 0;
	int    align = (MV_U32)mac & 3;

	switch (align) {
	case 0:
		/* SA - 4 byte alignement - BE support TBD */
		hash = mv_jhash_3words(bridgeIf, *(MV_U16 *)(mac), (*(MV_U16 *)(mac + 2)) | ((*(MV_U16 *)(mac + 4)) << 16),
							nfp_jhash_iv);
		break;

	case 2:
		/* DA - 2 byte alignement */
		hash = mv_jhash_3words(bridgeIf, *(MV_U16 *)(mac), *(MV_U32 *)(mac + 2), nfp_jhash_iv);
		break;

	default:
		mvOsPrintf("%s: Unexpected alignment: mac=%p\n", __func__, mac);
	}

	hash &= NFP_BRIDGE_HASH_MASK;
	return hash;
}

static INLINE MV_STATUS mvNfpFdbRuleCmp(MV_U16 bridgeIf, const MV_U8 *mac, NFP_RULE_FDB *rule)
{
	int    align = (MV_U32)mac & 3;

	switch (align) {
	case 0:
		/* SA - 4 byte alignement */
		if ((rule->bridgeIf == bridgeIf) &&
			(*(MV_U16 *)(rule->mac)) == (*(MV_U16 *)(mac)) &&
			(*(MV_U16 *)(rule->mac + 2)) == (*(MV_U16 *)(mac + 2)) &&
			(*(MV_U16 *)(rule->mac + 4)) == (*(MV_U16 *)(mac + 4)))
			return MV_TRUE;
		break;
	case 2:
		/* DA - 2 byte alignement */
		if ((rule->bridgeIf == bridgeIf) &&
			(*(MV_U16 *)(rule->mac)) == (*(MV_U16 *)(mac)) &&
			(*(MV_U32 *)(rule->mac + 2)) == (*(MV_U32 *)(mac + 2)))
			return MV_TRUE;
		break;
	default:
		mvOsPrintf("%s: Unexpected alignment: mac=%p\n", __func__, mac);
	}
	return MV_FALSE;
}

static INLINE NFP_RULE_FDB *mvNfpFdbLookup(MV_U16 bridgeIf, const MV_U8 *mac)
{
	MV_U32 hash;
	NFP_RULE_FDB *rule;

	hash = mvNfpFdbRuleHash(bridgeIf, mac);

	rule = nfp_fdb_hash[hash];
	while (rule) {
		if (mvNfpFdbRuleCmp(bridgeIf, mac, rule))
			return rule;

		rule = rule->next;
	}
	return NULL;
}

typedef struct nfp_rule_bridge {
	struct nfp_rule_bridge *next;
	MV_U16  reserved;
	MV_U8	da[MV_MAC_ADDR_SIZE];
	MV_U8	sa[MV_MAC_ADDR_SIZE];
	int	iif;
	int	oif;
	MV_U32	flags;
	MV_U32	age;
#ifdef NFP_CLASSIFY
	NFP_VPRI_MAP_INFO  vpri_map[NFP_VPRI_MAP_SIZE];
	MV_U8	txq;
	MV_U8	txp;
	MV_U16  mh;
#endif /* NFP_CLASSIFY */

} NFP_RULE_BRIDGE;

extern NFP_RULE_BRIDGE **nfp_bridge_hash;


static INLINE MV_U32 mvNfpBridgeRuleHash(const MV_U8 *da, const MV_U8 *sa, MV_U16 iif)
{
	MV_U32 hash = mv_jhash_2macs(da, sa, iif, nfp_jhash_iv);
	hash &= NFP_BRIDGE_HASH_MASK;
	return hash;
}


static INLINE MV_STATUS mvNfpBridgeRuleCmp(const MV_U8 *da, const MV_U8 *sa, MV_U16 iif, NFP_RULE_BRIDGE *rule)
{
	if ((iif == rule->iif) &&
	    (*(MV_U16 *)(rule->da)) == (*(MV_U16 *)(da))	 &&
	    (*(MV_U32 *)(rule->da + 2)) == (*(MV_U32 *)(da + 2)) &&
	    (*(MV_U32 *)(rule->sa)) == (*(MV_U32 *)(sa))	 &&
	    (*(MV_U16 *)(rule->sa + 4)) == (*(MV_U16 *)(sa + 4)))
		return MV_TRUE;

	return MV_FALSE;
}

static INLINE NFP_RULE_BRIDGE *mvNfpBridgeLookup(const MV_U8 *da, const MV_U8 *sa, MV_U16 iif)
{
	MV_U32 hash;
	NFP_RULE_BRIDGE *rule;

	hash = 	mvNfpBridgeRuleHash(da, sa, iif);

	rule = nfp_bridge_hash[hash];
	while (rule) {
		if (mvNfpBridgeRuleCmp(da, sa, iif, rule))
			return rule;

		rule = rule->next;
	}
	return NULL;
}
#endif /* NFP_BRIDGE */

typedef struct nfp_rule_arp {
	struct nfp_rule_arp *next;
	int	family;
	MV_U8	nextHopL3[MV_MAX_L3_ADDR_SIZE];
	MV_U8	da[MV_MAC_ADDR_SIZE];
	MV_U32	age;

} NFP_RULE_ARP;

#ifdef NFP_FIB
typedef struct nfp_rule_fib {
	struct nfp_rule_fib *next;
	int	family;
	MV_U8	srcL3[MV_MAX_L3_ADDR_SIZE];
	MV_U8	dstL3[MV_MAX_L3_ADDR_SIZE];
	MV_U16	mh;
	MV_U8	da[MV_MAC_ADDR_SIZE];
	MV_U8	sa[MV_MAC_ADDR_SIZE];
	MV_U32	age;
	MV_U8	defGtwL3[MV_MAX_L3_ADDR_SIZE];
	MV_U32	flags;
	int     oif;
#ifdef NFP_CT
	MV_U16	ct_ref;
	MV_U16	ct_hwf_ref;
#endif /* NFP_CT */
} NFP_RULE_FIB;
#endif /* NFP_FIB */

#ifdef NFP_LIMIT
typedef struct {
	MV_U32	credit;
	MV_U32	creditMax;
	MV_U32	creditPerTick;
	MV_U32	lastUpdate;

	MV_U32	refCnt;
	MV_U32 	index;
	MV_U32	maxElapsedTicks;
} NFP_TBF_INFO;
#endif /* NFP_LIMIT */

#ifdef NFP_CT
typedef struct {
	int family;
	MV_U8  src_l3[MV_MAX_L3_ADDR_SIZE];
	MV_U8  dst_l3[MV_MAX_L3_ADDR_SIZE];
	MV_U16 sport;
	MV_U16 dport;
	MV_U8  proto;
} MV_NFP_CT_KEY;

typedef struct {
	MV_U32 flags;
	MV_U32 new_sip;
	MV_U32 new_dip;
	MV_U16 new_sport;
	MV_U16 new_dport;
	MV_U8 sa[MV_MAC_ADDR_SIZE];
	MV_U8 da[MV_MAC_ADDR_SIZE];
	MV_U8 out_port;
#ifdef NFP_CLASSIFY
	MV_U8 txp;
	MV_U8 txq;
	MV_U8 dscp;
	MV_U8 vprio;
	MV_U16 mh;
#endif /* NFP_CLASSIFY */
} MV_NFP_CT_INFO;

typedef struct nfp_rule_ct {
	struct nfp_rule_ct *next;
	/* 5 tuple key */
	int family;
	MV_U8 srcL3[MV_MAX_L3_ADDR_SIZE];
	MV_U8 dstL3[MV_MAX_L3_ADDR_SIZE];
	MV_U32 ports;
	MV_U16 proto;
	MV_U16 reserved;	/* for alignment */
	NFP_RULE_FIB *fib;
#ifdef NFP_NAT
	MV_U32 new_sip;
	MV_U32 new_dip;
	MV_U16 new_sport;
	MV_U16 new_dport;
#endif /* NFP_NAT */

#ifdef NFP_LIMIT
	/* Token Bucket Filter information */
	NFP_TBF_INFO *tbfInfo;
#endif /* NFP_LIMIT */

#ifdef NFP_CLASSIFY
	/* indexes 0..63 are the old dscp, values in the array cells are the new dscp. index 64 is for global mapping */
	NFP_DSCP_MAP_INFO  dscp_map[NFP_DSCP_MAP_SIZE];
	NFP_VPRI_MAP_INFO  vpri_map[NFP_VPRI_MAP_SIZE];
	NFP_TXQ_MAP_INFO   txq_map[NFP_DSCP_MAP_SIZE];
	MV_U8 txp;
	MV_U16 mh;
#endif /* NFP_CLASSIFY */
	MV_U32 flags;
	MV_U32 age;
	MV_U32 hit_cntr;
	MV_U8 visited;
} NFP_RULE_CT;
#endif /* NFP_CT */

typedef struct {
#ifdef NFP_STAT
	MV_U32 rx;
	MV_U32 iif_err;
	MV_U32 oif_err;
	MV_U32 mac_mcast;
	MV_U32 non_ip;
	MV_U32 ipv4;
	MV_U32 ipv6;
	MV_U32 ipv4_csum_err;
	MV_U32 ipv4_rx_frag;
	MV_U32 ttl_exp;
	MV_U32 l4_unknown;
	MV_U32 l4_csum_err;
	MV_U32 ip_tx_frag;
	MV_U32 ip_tx_frag_err;

#ifdef NFP_BRIDGE
	MV_U32 bridge_hit;
	MV_U32 bridge_miss;
	MV_U32 bridge_local;

	MV_U32 fdb_sa_miss;
	MV_U32 fdb_da_miss;
	MV_U32 fdb_port_miss;
	MV_U32 fdb_hit;
	MV_U32 fdb_local;
#endif /* NFP_BRIDGE */


#ifdef NFP_VLAN
	MV_U32 vlan_rx_tag_drop;
	MV_U32 vlan_rx_untag_drop;
	MV_U32 vlan_rx_unknown_drop;
	MV_U32 vlan_rx_found;
	MV_U32 vlan_rx_trans;
	MV_U32 vlan_tx_add;
	MV_U32 vlan_tx_remove;
	MV_U32 vlan_tx_replace;
#endif /* NFP_VLAN */

#ifdef NFP_PPP
	MV_U32 pppoe_rx_not_found;
	MV_U32 pppoe_rx_found;
	MV_U32 pppoe_tx_add;
	MV_U32 pppoe_tx_remove;
	MV_U32 pppoe_tx_replace;
#endif	/* NFP_PPP */

#ifdef NFP_FIB
	MV_U32 fib_hit;
	MV_U32 fib_miss;
	MV_U32 fib_inv;
#endif	/* NFP_FIB */

#ifdef NFP_CT
	MV_U32 ct_hit;
	MV_U32 ct_miss;
	MV_U32 ct_tcp_fin_rst;
#endif /* NFP_CT */

#ifdef NFP_NAT
	MV_U32 dnat_hit;
	MV_U32 dnat_miss;
	MV_U32 dnat_inv;
	MV_U32 snat_hit;
	MV_U32 snat_miss;
	MV_U32 snat_inv;
#endif	/* NFP_NAT */

#endif	/* NFP_STAT */
} NFP_STATS;

MV_VOID   mvNfpInit(MV_VOID);

MV_VOID   mvNfpPortCapSet(MV_U32 port, MV_U32 cap, MV_U32 on);
MV_U32    mvNfpPortCapGet(MV_U32 port);
MV_VOID   mvNfpDebugLevelSet(int dbgLevelFlags);

MV_VOID   mvNfpStats(MV_U32);
MV_VOID   mvNfpStats(MV_U32 port);

#ifdef NFP_BRIDGE
MV_STATUS mvNfpIfToBridgeAdd(int bridge_if, int port_if);
MV_STATUS mvNfpIfToBridgeDel(int bridge_if, int port_if);
MV_BOOL   mvNfpIfOnSameBridge(NFP_IF_MAP *ifMap1, NFP_IF_MAP *ifMap2);
#ifdef NFP_FDB_MODE
MV_STATUS _INIT mvNfpFdbInit(MV_VOID);
void      mvNfpFdbDestroy(void);
MV_STATUS mvNfpFdbRuleAdd(NFP_RULE_FDB *rule2);
MV_STATUS mvNfpFdbRuleDel(NFP_RULE_FDB *rule2);
MV_STATUS mvNfpFdbRuleAge(NFP_RULE_FDB *rule2);
MV_VOID	  mvNfpFdbDump(MV_VOID);
MV_VOID	  mvNfpFdbFlushBridge(int ifindex);
#else
MV_STATUS _INIT mvNfpBridgeInit(MV_VOID);
void      mvNfpBridgeDestroy(void);
MV_STATUS mvNfpBridgeRuleAdd(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeRuleDel(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeRuleAge(NFP_RULE_BRIDGE *rule2);
MV_VOID	  mvNfpBridgeDump(MV_VOID);

#ifdef NFP_CLASSIFY
MV_STATUS mvNfpBridgeTxqRuleAdd(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeTxqRuleDel(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeTxpRuleAdd(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeTxpRuleDel(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeMhRuleAdd(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeMhRuleDel(NFP_RULE_BRIDGE *rule2);
MV_STATUS mvNfpBridgeVlanPrioRuleAdd(NFP_RULE_BRIDGE *rule2, int eth_type, int new_prio);
MV_STATUS mvNfpBridgeVlanPrioRuleDel(NFP_RULE_BRIDGE *rule2, int eth_type);
#endif /* NFP_CLASSIFY */
#endif /* NFP_FDB_MODE */
#endif /* NFP_BRIDGE */

#ifdef NFP_VLAN
MV_STATUS mvNfpVlanPvidSet(int if_index, MV_U16 pvid);
MV_STATUS mvNfpVlanVidSet(int if_index, MV_U16 vid);
MV_STATUS mvNfpVlanVidGet(int if_index, MV_U16 *vid);
#endif /* NFP_VLAN */

#ifdef NFP_PPP
MV_STATUS mvNfpPppAdd(int ifIndex, MV_U16 sid, MV_U8 *remoteMac);
MV_STATUS mvNfpPppDel(int ifIndex);
#endif /* NFP_PPP */

#ifdef NFP_FIB
extern NFP_RULE_FIB **fib_hash;
extern MV_LIST_ELEMENT *fib_inv_list;
extern NFP_RULE_ARP **nfp_arp_hash;

static INLINE MV_U32 mvNfpArpRuleHash(int family, MV_U8 *nextHopL3)
{
	MV_U32 hash = mv_jhash_1addr(family, nextHopL3, (MV_U32)0, (MV_U32)0, nfp_jhash_iv);
	hash &= NFP_ARP_HASH_MASK;
	return hash;
}

static INLINE MV_STATUS mvNfpArpRuleCmp(int family, MV_U8 *nextHopL3, NFP_RULE_ARP *rule)
{
	if ((family == rule->family) && l3_addr_eq(family, rule->nextHopL3, nextHopL3))
		return MV_TRUE;

	return MV_FALSE;
}

static INLINE NFP_RULE_ARP *mvNfpArpLookup(int family, MV_U8 *nextHopL3)
{
	MV_U32 hash;
	NFP_RULE_ARP *rule;

	hash = mvNfpArpRuleHash(family, nextHopL3);

	rule = nfp_arp_hash[hash];
	while (rule) {
		if (mvNfpArpRuleCmp(family, nextHopL3, rule))
			return rule;

		rule = rule->next;
	}
	return NULL;
}

static INLINE MV_U32 mvNfpFibRuleHash(int family, const MV_U8 *src_l3, const MV_U8 *dst_l3)
{
	MV_U32 hash = mv_jhash_2addr(family, src_l3, dst_l3, (MV_U32)0, nfp_jhash_iv);
	hash &= NFP_FIB_HASH_MASK;
	return hash;
}

static INLINE MV_STATUS mvNfpFibRuleCmp(int family, const MV_U8 *src_l3, const MV_U8 *dst_l3, NFP_RULE_FIB *rule)
{
	if ((family == rule->family) &&
		l3_addr_eq(family, rule->srcL3, src_l3)	&&
		l3_addr_eq(family, rule->dstL3, dst_l3))
		return MV_TRUE;

	return MV_FALSE;
}

static INLINE NFP_RULE_FIB *mvNfpFibLookup(int family, const MV_U8 *src_l3, const MV_U8 *dst_l3)
{
	MV_U32 hash;
	NFP_RULE_FIB *rule;

	hash = mvNfpFibRuleHash(family, src_l3, dst_l3);
	rule = fib_hash[hash];
	while (rule) {
		if (!(rule->family == family))
			continue;
		if (mvNfpFibRuleCmp(family, src_l3, dst_l3, rule))
			return rule;
		rule = rule->next;
	}
	return NULL;
}

MV_VOID   mvNfpModeSet(int mode);

MV_VOID   mvNfpIpInfoPrint(u32 dbgLevel, int family, u8 *ipAddr);
MV_VOID   mvNfp2TupleInfoPrint(u32 dbgLevel, int family, u8 *srcL3, u8 *dstL3);
MV_VOID   mvNfp5TupleInfoPrint(u32 dbgLevel, int family, u8 *srcL3, u8 *dstL3, u16 sport, u16 dport, u8 proto);

MV_STATUS mvNfpIfMapCreate(NFP_IF_MAP *ifMap);
MV_STATUS mvNfpIfVirtMap(int parentIf, int virtIf);
MV_STATUS mvNfpIfVirtUnmap(int virtIf);

MV_STATUS mvNfpIfFlagsSet(int ifIdx, MV_U32 flags);
MV_STATUS mvNfpIfFlagsClear(int ifIdx, MV_U32 flags);
MV_STATUS mvNfpIfMapMacUpdate(int ifIdx, const MV_U8 *mac);
MV_STATUS mvNfpIfMapMtuUpdate(int ifIdx, int mtu);
MV_STATUS mvNfpIfMapDelete(int ifIdx);
MV_VOID   mvNfpIfMapDump(MV_VOID);

MV_STATUS mvNfpFibInit(MV_VOID);
MV_VOID   mvNfpFibDump(MV_VOID);
MV_VOID   mvNfpFibClean(MV_VOID);
MV_VOID   mvNfpFibDestroy(MV_VOID);
MV_STATUS mvNfpFibRuleValid(NFP_RULE_FIB *fib, MV_LIST_ELEMENT *curr);

MV_STATUS mvNfpFibRuleAdd(NFP_RULE_FIB *fib2);
MV_STATUS mvNfpFibRuleDel(NFP_RULE_FIB *fib2);
MV_STATUS mvNfpFibRuleAge(NFP_RULE_FIB *fib2);


MV_STATUS mvNfpArpInit(MV_VOID);
MV_VOID   mvNfpArpDump(MV_VOID);
MV_VOID   mvNfpArpDestroy(MV_VOID);
MV_STATUS mvNfpArpRuleAdd(NFP_RULE_ARP *arp2);
MV_STATUS mvNfpArpRuleDel(NFP_RULE_ARP *arp2);
MV_STATUS mvNfpArpRuleAge(NFP_RULE_ARP *arp2);
MV_STATUS mvNfpArpRuleUpdateFibEntries(NFP_RULE_ARP *arp);

#endif /* NFP_FIB */

#ifdef NFP_CT
extern NFP_RULE_CT **ct_hash;

static INLINE MV_U32 mvNfpCtHashByTuple(int family, const MV_U8 *src_l3, const MV_U8 *dst_l3,
					MV_U32 ports, MV_U16 proto)
{
	MV_U32 hash = mv_jhash_2addr(family, src_l3, dst_l3, (ports | proto), nfp_jhash_iv);
	hash &= NFP_CT_HASH_MASK;
	return hash;
}

static INLINE NFP_RULE_CT *mvNfpCtLookupByTuple(int family, const MV_U8 *src_l3, const MV_U8 *dst_l3,
						 MV_U32 ports, MV_U16 proto)
{
	MV_U32 hash;
	NFP_RULE_CT *ct;

	hash = mvNfpCtHashByTuple(family, src_l3, dst_l3, ports, proto);
	ct = ct_hash[hash];
	while (ct) {
		if ((ct->family == family) &&
			l3_addr_eq(ct->family, ct->srcL3, src_l3) &&
			l3_addr_eq(ct->family, ct->dstL3, dst_l3) &&
			(ct->ports == ports) && (ct->proto == proto))
			return ct;
		ct = ct->next;
	}

	return NULL;
}

extern NFP_RULE_CT **ct_hash;
MV_STATUS mvNfpCtInit(MV_VOID);
MV_VOID mvNfpCtRuleFibUpdate(NFP_RULE_FIB *fib);
MV_VOID mvNfpCtRuleFibInvalidate(NFP_RULE_FIB *fib);
MV_STATUS mvNfpCtFilterModeSet(NFP_RULE_CT *ct2);
MV_STATUS mvNfpCtRuleUdpCsumSet(NFP_RULE_CT *ct2, int mode);
MV_STATUS mvNfpCtRateLimitSet(NFP_RULE_CT *ct2, int tbf_index);
MV_STATUS mvNfpCtRateLimitDel(NFP_RULE_CT *ct2);
#ifdef NFP_CLASSIFY
MV_STATUS mvNfpCtDscpRuleAdd(NFP_RULE_CT *ct2, int dscp, int new_dscp);
MV_STATUS mvNfpCtDscpRuleDel(NFP_RULE_CT *ct2, int dscp);
MV_STATUS mvNfpCtVlanPrioRuleAdd(NFP_RULE_CT *ct2, int prio, int new_prio);
MV_STATUS mvNfpCtVlanPrioRuleDel(NFP_RULE_CT *ct2, int prio);
MV_STATUS mvNfpCtTxqRuleAdd(NFP_RULE_CT *ct2, int dscp, int txq);
MV_STATUS mvNfpCtTxqRuleDel(NFP_RULE_CT *ct2, int dscp);
MV_STATUS mvNfpCtTxpRuleAdd(NFP_RULE_CT *ct2);
MV_STATUS mvNfpCtTxpRuleDel(NFP_RULE_CT *ct2);
MV_STATUS mvNfpCtMhRuleAdd(NFP_RULE_CT *ct2);
MV_STATUS mvNfpCtMhRuleDel(NFP_RULE_CT *ct2);
#endif /* NFP_CLASSIFY */
MV_STATUS mvNfpCtRuleDel(NFP_RULE_CT *rule);
MV_STATUS mvNfpCtRuleAge(NFP_RULE_CT *rule);
MV_VOID mvNfpCtDump(MV_VOID);
MV_VOID mvNfpCtClean(int family);
MV_VOID mvNfpCtDestroy(MV_VOID);

MV_VOID mvNfpCtCleanVisited(MV_U32 row, MV_U32 iterator_id);
MV_STATUS mvNfpCtFirstRuleGet(NFP_RULE_CT **rule, MV_U32 iterator_id);
MV_STATUS mvNfpCtNextRuleGet(NFP_RULE_CT **rule, MV_U32 iterator_id);
MV_STATUS mvNfpCtRuleMaxHitCntrGet(NFP_RULE_CT **rule);
MV_STATUS mvNfpCtRuleHwfSet(MV_NFP_CT_KEY *key, int mode);
MV_STATUS mvNfpCtRuleHitCntrGet(MV_NFP_CT_KEY *key, MV_U32 *hit_cntr);
MV_STATUS mvNfpCtRuleHitCntrSet(MV_NFP_CT_KEY *key, MV_U32 val);
MV_STATUS mvNfpCtRuleInfoGet(MV_NFP_CT_KEY *key, MV_NFP_CT_INFO *ct_info);
#endif /* NFP_CT */

#ifdef NFP_NAT
MV_STATUS mvNfpCtNatRuleAdd(NFP_RULE_CT *rule);
#endif /* NFP_NAT */

#ifdef NFP_LIMIT
void mvNfpCtTbfsDump(void);
int mvNfpTbfCreate(int limit, int burst_limit);
MV_STATUS mvNfpTbfDel(int tbf);
MV_STATUS mvNfpTbfProcess(NFP_TBF_INFO *tbf, MV_U32 packetSize);
#endif /* NFP_LIMIT */

#ifndef NFP_FDB_MODE
void mvNfpFlushBridge(int ifindex);
#endif

void mvNfpFlushFib(int ifindex);

#endif /* __mvNfp_h__ */
