/*
* Copyright c                  Realtek Semiconductor Corporation, 2002  
* All rights reserved.
* 
* Program : Header File for IC-specific Function
* Abstract : 
* Author : Louis Yung-Chieh Lo (yjlou@realtek.com.tw)               
* $Id: rtl865xc_testModel_L34_test.c,v 1.8 2012/10/24 04:48:19 ikevin362 Exp $
*/

#include <linux/in.h>
#include <linux/inet.h>
//#include <arpa/inet.h>


#include "rtl865xc_testModel.h"
#include "rtl865xc_testModel_L34_test.h"
#include "../common/rtl_utils.h"
#include "packetGen/pktGen.h"
#include <net/rtl/rtl865x_multicast.h>
//#include <stdio.h>
//#include <assert.h>
//#include <net/rtl/rtl_types.h>
#include <net/rtl/rtl_glue.h>

#if defined(CONFIG_RTL_8685S_HWNAT)
//#include <net/rtl/rtl865x_nat.h>
//#include <net/rtl/rtl867x_hwnat_api.h>
//#include "../l4Driver/rtl865x_nat_local.h"
#include "packetGen/pktForm.h"
#include <net/rtl/rtl865x_netif.h>
extern char pkt_data[2048];
extern int DumpSwNicTxRx_debug_pkt;
#endif
extern int DumpSwNicTxRx_debug;

#define MSGHEAD_RED		"\033[0;31m"
#define MSGHEAD_GREEN	"\033[0;31m"
#define MSGTAIL			"\033[m"

#include "../AsicDriver/rtl865x_asicCom.h"
#include "../AsicDriver/rtl865x_asicL4.h"
#include "../AsicDriver/rtl865x_asicL3.h"
#include "../AsicDriver/rtl865x_asicL2.h"
#include "../AsicDriver/rtl865x_asicBasic.h"
#include "../rtl865xc_swNic.h"
#include "../common/mbuf.h"

#define	RTL_BridgeWANVLANID		7 /* WAN vid (bridged, default no vlan tag)*/
#define	RTL_WANVLANID			8 /* WAN vid (routed,   default no vlan tag)*/
#define	RTL_LANVLANID			9 /* LAN vid  (default no vlan tag) */

#define PKTHDR_ETHERNET      0
#define PKTHDR_IP            2
#define PKTHDR_ICMP          3
#define PKTHDR_IGMP          4
#define PKTHDR_TCP           5
#define PKTHDR_UDP           6
#define PKTHDR_IPv6          7

#define v4FIRST		0x1
#define v4HDR_FLAG	0x2
#define v6HDR_FLAG	0x4


#define PKTHDR_FREE          (BUF_FREE << 8)        /* Free. Not occupied. should be on free list   */
#define PKTHDR_USED          (BUF_USED << 8)
#define PKTHDR_ASICHOLD      (BUF_ASICHOLD<<8)      /* Hold by ASIC */
#define PKTHDR_DRIVERHOLD    (BUF_DRIVERHOLD<<8)    /* Hold by driver */
#define PKTHDR_CPU_OWNED     0x4000
#define PKT_INCOMING         0x1000     /* Incoming: packet is incoming */
#define PKT_OUTGOING         0x0800     /*  Outgoing: packet is outgoing */
#define PKT_BCAST            0x0100     /*send/received as link-level broadcast  */
#define PKT_MCAST            0x0080     /*send/received as link-level multicast   */
#define PKTHDR_BRIDGING      0x0040     /* when PKTHDR_HWLOOKUP is on. 1: Hardware assist to do L2 bridging only, 0:hardware assist to do NAPT*/
#define PKTHDR_HWLOOKUP      0x0020	/* valid when ph_extPortList!=0. 1:Hardware table lookup assistance*/
#define PKTHDR_PPPOE_AUTOADD    0x0004  /* PPPoE header auto-add */
#define CSUM_TCPUDP_OK       0x0001     /*Incoming:TCP or UDP cksum checked */
#define CSUM_IP_OK           0x0002     /* Incoming: IP header cksum has checked */
#define CSUM_TCPUDP          0x0001     /*Outgoing:TCP or UDP cksum offload to ASIC*/
#define CSUM_IP              0x0002     /* Outgoing: IP header cksum offload to ASIC*/

#define PKTHDR_EXTPORT_MAGIC		0xA530 //Kevin ,the pkt is toward to export1 (port6)
#define PKTHDR_EXTPORT_MAGIC2		0xA531 //Kevin ,the pkt is toward to export1 (port7)
#define PKTHDR_EXTPORT_MAGIC3		0xA532 //Kevin ,the pkt is toward to export1 (port8)
#define PKTHDR_EXTPORT_P1				6
#define PKTHDR_EXTPORT_P2				7
#define PKTHDR_EXTPORT_P3				8

#define PKTHDR_EXTPORT_LIST_P0		0
#define PKTHDR_EXTPORT_LIST_P1		1
#define PKTHDR_EXTPORT_LIST_P2		2
#define PKTHDR_EXTPORT_LIST_CPU 	3

#define PKTHDR_VLAN_P0_AUTOADD			(0x0001<<0)
#define PKTHDR_VLAN_P1_AUTOADD			(0x0001<<1)
#define PKTHDR_VLAN_P2_AUTOADD			(0x0001<<2)
#define PKTHDR_VLAN_P3_AUTOADD			(0x0001<<3)
#define PKTHDR_VLAN_P4_AUTOADD			(0x0001<<4)
#define PKTHDR_VLAN_P5_AUTOADD			(0x0001<<5)


int TEST_MODEL_DONOT_DIRECT_TX=0;
int TEST_V6MC_PORT_MASK=0xe;
int RTL_FPGA_DEBUG_DUMP=0;

extern int32 dumphs(void);

static  void rtl_direct_txInfo(uint32 port_mask,rtl_nicTx_info *txInfo)
{
	txInfo->portlist = port_mask & 0x3f;
	txInfo->srcExtPort = 0;		//PKTHDR_EXTPORT_LIST_CPU;
	txInfo->flags &= ~(PKTHDR_USED|PKT_OUTGOING);	
	txInfo->flags |= (PKTHDR_USED|PKT_OUTGOING);	
}

static  void rtl_hwLookup_txInfo(rtl_nicTx_info *txInfo,uint32 extPortID)
{
	txInfo->portlist = 0;		/* must be set 0x7 */
	txInfo->srcExtPort = extPortID+1;
	txInfo->flags &= ~(PKTHDR_USED|PKTHDR_HWLOOKUP|PKTHDR_BRIDGING|PKT_OUTGOING);
	txInfo->flags |=(PKTHDR_USED|PKTHDR_HWLOOKUP|PKTHDR_BRIDGING|PKT_OUTGOING);
}

#define DBG_TESTMODEL_L34_TEST
#ifdef DBG_TESTMODEL_L34_TEST
#define DBG_TESTMODEL_L34_TEST_PRK printk
#else
#define DBG_TESTMODEL_L34_TEST_PRK(format, args...)
#endif

#define RTL865xC_TEST_PORT_NUM 		5
#define RTL865xC_TEST_WAN_PORT 		0
#define RTL865xC_TEST_LAN_PORT_START	1
#define RTL865xC_TEST_EXTLAN_PORT_START	6
#define RTL865xC_TEST_LAN_PORT_NUM 	4

#define RTL865xC_TEST_WAN_PORT_BITMAP (1<<RTL865xC_TEST_WAN_PORT)
#define RTL865xC_TEST_LAN_PORT_BITMAP (((1<<RTL865xC_TEST_LAN_PORT_NUM)-1)<<RTL865xC_TEST_LAN_PORT_START)
#define RTL865xC_TEST_ALL_PORT_BITMAP (RTL865xC_TEST_WAN_PORT_BITMAP|RTL865xC_TEST_LAN_PORT_BITMAP)

/************** 
    LAN setting      
**************/
#define RTL865xC_TEST_LAN_VID 			9
#define RTL865xC_TEST_LAN_FID 			0
#define RTL865xC_TEST_LAN_NETIFNAME		ALIASNAME_BR0
#define RTL865xC_TEST_LAN_GMAC 			"00-00-00-AA-AA-AA"
#define RTL865xC_TEST_LAN_IP				"192.168.1.1"
#define RTL865xC_TEST_LAN_SUBNET_MASK	"255.255.255.0"

#define RTL865xC_TEST_LAN_HOST0_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+0)
#define RTL865xC_TEST_LAN_HOST0_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST0_PHYPORT)
#define RTL865xC_TEST_LAN_HOST0_IP			"192.168.1.2"
#define RTL865xC_TEST_LAN_HOST0_MAC			"00-00-00-00-11-00"


#define RTL865xC_TEST_LAN_HOST1_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+0)

#define RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST1_PHYPORT)	
#define RTL865xC_TEST_LAN_HOST1_IP			"192.168.1.3"
#define RTL865xC_TEST_LAN_HOST1_MAC			"00-00-00-00-11-11"

#define RTL865xC_TEST_LAN_HOST2_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+2)
#define RTL865xC_TEST_LAN_HOST2_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST2_PHYPORT)	
#define RTL865xC_TEST_LAN_HOST2_IP			"192.168.1.4"
#define RTL865xC_TEST_LAN_HOST2_MAC			"00-00-00-00-11-22"

#if defined(CONFIG_RTL_8685S_HWNAT)
#define RTL865xC_TEST_LAN_HOST3_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+0)
#else
#define RTL865xC_TEST_LAN_HOST3_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+3)
#endif
#define RTL865xC_TEST_LAN_HOST3_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST3_PHYPORT)	
#define RTL865xC_TEST_LAN_HOST3_IP			"192.168.1.5"
#define RTL865xC_TEST_LAN_HOST3_MAC			"00-00-00-00-11-33"

/************** 
   EXT LAN setting      
**************/

#define RTL865xC_TEST_EXTLAN_HOST0_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+0)
#define RTL865xC_TEST_EXTLAN_HOST0_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST1_PHYPORT)	
#define RTL865xC_TEST_EXTLAN_HOST0_IP			"192.168.1.11"
#define RTL865xC_TEST_EXTLAN_HOST0_MAC			"00-00-00-00-22-00"

#define RTL865xC_TEST_EXTLAN_HOST1_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+1)
#define RTL865xC_TEST_EXTLAN_HOST1_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST1_PHYPORT)	
#define RTL865xC_TEST_EXTLAN_HOST1_IP			"192.168.1.12"
#define RTL865xC_TEST_EXTLAN_HOST1_MAC			"00-00-00-00-22-11"

#define RTL865xC_TEST_EXTLAN_HOST2_PHYPORT		(RTL865xC_TEST_LAN_PORT_START+2)
#define RTL865xC_TEST_EXTLAN_HOST2_PHYPORT_MASK	(1<<RTL865xC_TEST_LAN_HOST1_PHYPORT)	
#define RTL865xC_TEST_EXTLAN_HOST2_IP			"192.168.1.13"
#define RTL865xC_TEST_EXTLAN_HOST2_MAC			"00-00-00-00-22-22"




/************** 
    EXT Port  setting      
**************/



/************** 
    WAN setting  
**************/
#define RTL865xC_TEST_WANTYPE_UNTAG_PURE_ROUTING		0
#define RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE			1
#define RTL865xC_TEST_WANTYPE_UNTAG_NAPT				2


#define RTL865xC_TEST_WAN_NETIFNAME			"nas_test"
#define RTL865xC_TEST_WAN_NETIFNAME_PPP		"nas_test_ppp"
#define RTL865xC_TEST_WAN_HOST_PHYPORT		(RTL865xC_TEST_WAN_PORT)
#define RTL865xC_TEST_WAN_HOST_PHYPORT_MASK	(RTL865xC_TEST_WAN_PORT_BITMAP)	

/* WAN 0 : untag routing WAN   */
#define RTL865xC_TEST_WAN0_VID 			8
#define RTL865xC_TEST_WAN0_FID 			0
#define RTL865xC_TEST_WAN0_GMAC 			"00-00-00-BB-BB-BB"
#define RTL865xC_TEST_WAN0_IP			"192.168.2.2"
#define RTL865xC_TEST_WAN0_SUBNET_MASK	"255.255.255.0"

#define RTL865xC_TEST_WAN0_HOST_IP		"192.168.2.1"
#define RTL865xC_TEST_WAN0_HOST_MAC		"00-00-00-00-22-00"

/* WAN 1 : untag bridged WAN   */
#define RTL865xC_TEST_WAN1_VID 			7
#define RTL865xC_TEST_WAN1_FID 			0
#define RTL865xC_TEST_WAN1_NETIFNAME		"nas_test_1"
#define RTL865xC_TEST_WAN1_GMAC 			"00-00-11-BB-BB-BB"

#define RTL865xC_TEST_WAN1_HOST_IP		"192.168.1.200"
#define RTL865xC_TEST_WAN1_HOST_MAC		"00-00-00-00-22-11"

/* WAN 2 : untag PPPoE WAN   */
#define RTL865xC_TEST_WAN2_VID 			10
#define RTL865xC_TEST_WAN2_FID 			0
#define RTL865xC_TEST_WAN2_GMAC 			"00-00-00-CC-CC-CC"
#define RTL865xC_TEST_WAN2_IP			"192.168.5.55"
#define RTL865xC_TEST_WAN2_SUBNET_MASK	"255.255.255.255"
#define RTL865xC_TEST_WAN2_SSID			123

#define RTL865xC_TEST_WAN2_HOST_IP		"192.168.5.66"
#define RTL865xC_TEST_WAN2_HOST_MAC		"00-00-00-00-22-22"


/* stream info */
#define RTL865xC_TEST_STREAM0_TTL			254
#define RTL865xC_TEST_STREAM0_PORT_INT		1024
#define RTL865xC_TEST_STREAM0_PORT_EXT		1025
#define RTL865xC_TEST_STREAM0_PORT_REM		1026
#define RTL865xC_TEST_STREAM0_PAYLOAD_LEN	25

extern int rtl865xC_swDriver_init(void);

typedef uint32 in_addr_t;
static int inet_aton(const char *cp, struct in_addr *addrptr)
{
	in_addr_t addr;
	int value;
	int part;

	addr = 0;
	for (part = 1; part <= 4; part++) {

		if (!isdigit(*cp))
			return 0;

		value = 0;
		while (isdigit(*cp)) {
			value *= 10;
			value += *cp++ - '0';
			if (value > 255)
				return 0;
		}

		if (part < 4) {
			if (*cp++ != '.')
				return 0;
		} else {
			char c = *cp++;
			if (c != '\0' && !isspace(c))
			return 0;
		}

		addr <<= 8;
		addr |= value;
	}

	/*  W. Richard Stevens in his book UNIX Network Programming,
	 *  Volume 1, second edition, on page 71 says:
	 *
	 *  An undocumented feature of inet_aton is that if addrptr is
	 *  a null pointer, the function still performs it validation
	 *  of the input string, but does not store the result.
	 */
	if (addrptr) {
	    addrptr->s_addr = htonl(addr);
	}

	return 1;
}

static uint32 inet_addr(const int8 *cp){

	struct in_addr a;

	if (!inet_aton(cp, &a))
		return -1;
	else
		return a.s_addr;
}

int _vlanConfig(int vid,int fid,int member,int untag)
{
	int ret;
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;
	vlanp.fid=fid;
	vlanp.memberPortMask = member;
	vlanp.untagPortMask =  untag;
	ret = rtl8651_setAsicVlan(vid,&vlanp);
	return ret;
}

rtl8651_PktConf_t conf;
int32 pktLen;  
int32 pktLen_Expect;  
uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
enum PORT_MASK rxPort;	

#define CFG_PKTLEN(x)		(x)
#define CFG_DA(x)			(x)
#define CFG_SA(x)			(x)
#define CFG_IPTTL(x) 		(x)
#define CFG_IPID(x)			(x)
#define CFG_IPSIP(x)		(x)
#define CFG_IPDIP(x)		(x)
#define CFG_IPPROTOCOL(x)	(x)

void _pktIPv4Config(int pktType,unsigned char *da,unsigned char *sa,int pktLen,int id,int ttl,unsigned char *sip,unsigned char *dip,int protocol,rtl8651_PktConf_t *conf)
{
	ether_addr_t mac;

	memset(conf, 0, sizeof(rtl8651_PktConf_t));  
	conf->pktType					= pktType;	
	conf->payload.length 			= pktLen;
	conf->payload.content			= pkt_payload_Data;

	memcpy(conf->conf_dmac,(void*)strtomac(&mac,da),sizeof(ether_addr_t));
	memcpy(conf->conf_smac,(void*)strtomac(&mac,sa),sizeof(ether_addr_t));
	
	conf->ip.id			= 0x0a;
	conf->ip.ttl 		= 128;
	conf->ip.src_ip		= ntohl(inet_addr(sip));
	conf->ip.dst_ip		= ntohl(inet_addr(dip));
	conf->ip.protocol	= protocol;
}

/*
 *  *ip is return with host-order.
 *
 *  IP               0   1   2   3
 *     BIG-endian: 31_24 .....  7_0
 *  Little-endian:  7_0  ..... 31_24
 */
static uint32  strtoip(ipaddr_t *ip, int8 *str)
{
    int32 t1, t2, t3, t4;
    sscanf((char*)str, "%d.%d.%d.%d", &t1, &t2, &t3, &t4);
    *ip = (t1<<24)|(t2<<16)|(t3<<8)|t4;
	return *(uint32*)ip;
}

int32 default_register(void)
{

	int i;
	//en L2/L3/L4
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPMv4 function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );
	//open IPNv6 function
	WRITE_MEM32(V6CTR0,((1500)<<CF_IPMCASTMTU_V6) | CF_IPMSTCTL_V6_EN); 

	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	//env6 hoplimit
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);


	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON)|L4EnHash1);

	//en-v6rd
	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL));		//enble 6rd mode
	//en-dslite
	WRITE_MEM32(DSLITECTR0,CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 	

	WRITE_MEM32(TEACR,0);

//	DHCP PRI VID Remark
	WRITE_MEM32(0xbb804464,0); //port0
	WRITE_MEM32(0xbb804468,0); //port1
	WRITE_MEM32(0xbb80446C,0); //port2
	WRITE_MEM32(0xbb80446C,0); //port3
	WRITE_MEM32(0xbb804470,0); //port4
	WRITE_MEM32(0xbb804474,0); //port5

	for(i=0;i<9;i++)
		rt8198C_delAsicPortLearningLimit(i);



}

/*
	Create two subnet , LAN and WAN(untag routing WAN)
	There exists hosts(192.168.1.2 , 192.168.2.1) under coresponding subnet.
*/

#define assert_equal(value1,value2)\
do {\
	if ((value1) != (value2)) {\
		rtlglue_printf("\033[31;43m%s(%d): value1=0x%x value2=0x%x, fail, so abort!\033[m\n", __FUNCTION__, __LINE__,(value1),(value2));\
		return FAILED; \
	}\
}while (0)


#if 0
int32 rtl865xC_layer3Config( int WAN_TYPE , int isPPPoE)
{
	int i;
	rtl865x_netif_t netif;
	ipaddr_t ipAddr;
	ipaddr_t ipMask;
	ether_addr_t macAddr;

	/* init WAN para. */
	int 				wan_vid=0;
	int 				wan_fid=0;
	ether_addr_t	wan_gmac;
	ipaddr_t			wan_ipAddr;
	ipaddr_t			wan_ipMask;	

	ipaddr_t			wan_host_ip;
	ether_addr_t	wan_host_mac;
	
	switch(WAN_TYPE)
	{
		case RTL865xC_TEST_WANTYPE_UNTAG_PURE_ROUTING:
			if(!isPPPoE)
			{
				wan_vid = RTL865xC_TEST_WAN0_VID;
				wan_fid = RTL865xC_TEST_WAN0_FID;
				strtomac(&wan_gmac, RTL865xC_TEST_WAN0_GMAC);	
				strtoip(&wan_ipAddr, RTL865xC_TEST_WAN0_IP);
				strtoip(&wan_ipMask, RTL865xC_TEST_WAN0_SUBNET_MASK);	
				
				strtoip(&wan_host_ip, RTL865xC_TEST_WAN0_HOST_IP);
				strtomac(&wan_host_mac, RTL865xC_TEST_WAN0_HOST_MAC);
			}
			else
			{
				wan_vid = RTL865xC_TEST_WAN2_VID;
				wan_fid = RTL865xC_TEST_WAN2_FID;
				strtomac(&wan_gmac, RTL865xC_TEST_WAN2_GMAC);	
				strtoip(&wan_ipAddr, RTL865xC_TEST_WAN2_IP);
				strtoip(&wan_ipMask, RTL865xC_TEST_WAN2_SUBNET_MASK);	
				
				strtoip(&wan_host_ip, RTL865xC_TEST_WAN2_HOST_IP);
				strtomac(&wan_host_mac, RTL865xC_TEST_WAN2_HOST_MAC);
			}
			break;
		case RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE:
			if(isPPPoE)
				return FAILED;
			wan_vid = RTL865xC_TEST_WAN1_VID;
			wan_fid = RTL865xC_TEST_WAN1_FID;
			strtomac(&wan_gmac, RTL865xC_TEST_WAN1_GMAC);
			
			strtoip(&wan_host_ip, RTL865xC_TEST_WAN1_HOST_IP);
			strtomac(&wan_host_mac, RTL865xC_TEST_WAN1_HOST_MAC);
			break;
	}




	
	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl8651_setAsicOperationLayer(4));
	//WRITE_MEM32(ALECR, READ_MEM32(ALECR)|EN_PPPOE|TTL_1Enable);//enable PPPoE auto encapsulation and TTL-1	

	/* Set pvid */
	for(i=0;i<RTL865xC_TEST_PORT_NUM;i++)
	{
		if(WAN_TYPE==RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE)
		{
			RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl8651_setAsicPvid(i,wan_vid));
		}
		else
		{
			if(i==RTL865xC_TEST_WAN_PORT)
				RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl8651_setAsicPvid(i,wan_vid));
			else
				RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl8651_setAsicPvid(i,RTL865xC_TEST_LAN_VID));
		}
	}



	/* Set Network Interface Table */
	/*  		-- LAN --  */
	memset(&netif, 0, sizeof(rtl865x_netif_t));
	memcpy(netif.name,RTL865xC_TEST_LAN_NETIFNAME,MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, RTL865xC_TEST_LAN_GMAC);
	netif.mtu 		= 1500;
	netif.if_type 		= IF_ETHER;
	netif.vid 		= RTL865xC_TEST_LAN_VID;
	netif.is_wan 		= 0;	
	netif.is_slave 	= 0;
	netif.enableRoute	= 1;
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addNetif(&netif));

	/*  		-- WAN --  */
	memset(&netif, 0, sizeof(rtl865x_netif_t));
	memcpy(netif.name,RTL865xC_TEST_WAN_NETIFNAME,MAX_IFNAMESIZE);
	memcpy(&netif.macAddr,&wan_gmac,ETHER_ADDR_LEN);
	netif.mtu 		= 1500;
	netif.if_type 		= IF_ETHER;
	netif.vid 		= wan_vid;
	netif.is_wan 		= 0;	
	netif.is_slave 	= 0;
	netif.enableRoute	= 1;
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addNetif(&netif));
	


	if(isPPPoE)
	{
		memset(&netif, 0, sizeof(rtl865x_netif_t));
		memcpy(netif.name,RTL865xC_TEST_WAN_NETIFNAME_PPP,MAX_IFNAMESIZE);
		memcpy(&netif.macAddr,&wan_gmac,ETHER_ADDR_LEN);
		netif.mtu 		= 1500;
		netif.if_type 		= IF_PPPOE;
		netif.vid 		= wan_vid;
		netif.is_wan 		= 0;	
		netif.is_slave 	= 1;
		netif.enableRoute	= 1;
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addNetif(&netif));
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_attachMasterNetif(RTL865xC_TEST_WAN_NETIFNAME_PPP, RTL865xC_TEST_WAN_NETIFNAME));
	}



	/* Set VLAN Table */
	/*  		-- LAN --  */
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addVlan(RTL865xC_TEST_LAN_VID));
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_setVlanFilterDatabase(RTL865xC_TEST_LAN_VID,RTL865xC_TEST_LAN_FID));
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_modVlanPortMember(RTL865xC_TEST_LAN_VID,RTL865xC_TEST_LAN_PORT_BITMAP,RTL865xC_TEST_LAN_PORT_BITMAP));



	/*  		-- WAN --  */
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addVlan(wan_vid));
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_setVlanFilterDatabase(wan_vid,wan_fid));
	if(WAN_TYPE==RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE)
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_modVlanPortMember(wan_vid,RTL865xC_TEST_ALL_PORT_BITMAP,RTL865xC_TEST_ALL_PORT_BITMAP));
	else
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_modVlanPortMember(wan_vid,RTL865xC_TEST_WAN_PORT_BITMAP,RTL865xC_TEST_WAN_PORT_BITMAP));

	printk("[HP]** %s %d  **\n",__func__,__LINE__);


	/* Set L2 Table */
	/*  		-- LAN --  */
	strtomac(&macAddr, RTL865xC_TEST_LAN_HOST0_MAC);
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(_rtl865x_addFilterDatabaseEntry(RTL865x_L2_TYPEII, RTL865xC_TEST_LAN_FID, &macAddr
							, FDB_TYPE_FWD, RTL865xC_TEST_LAN_HOST0_PHYPORT_MASK	, FALSE, FALSE));
	
	strtomac(&macAddr, RTL865xC_TEST_LAN_HOST1_MAC);
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(_rtl865x_addFilterDatabaseEntry(RTL865x_L2_TYPEII, RTL865xC_TEST_LAN_FID, &macAddr
							, FDB_TYPE_FWD, RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK	, FALSE, FALSE));


	
	/*  		-- WAN --  */
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(_rtl865x_addFilterDatabaseEntry(RTL865x_L2_TYPEII, RTL865xC_TEST_LAN_FID, &wan_host_mac
							, FDB_TYPE_FWD, RTL865xC_TEST_WAN_HOST_PHYPORT_MASK	, FALSE, FALSE));	

	printk("[HP]** %s %d  **\n",__func__,__LINE__);
	
	


	/* Set PPPoE Table */
	if(isPPPoE)
	{
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(
			rtl865x_addPpp(RTL865xC_TEST_WAN_NETIFNAME_PPP , &wan_host_mac, RTL865xC_TEST_WAN2_SSID, 0));
	}


	/* Set L3 Table */
	/*  		-- LAN --  */
	strtoip(&ipAddr, RTL865xC_TEST_LAN_IP);
	strtoip(&ipMask, RTL865xC_TEST_LAN_SUBNET_MASK);	
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addRoute (ipAddr,ipMask,0,RTL865xC_TEST_LAN_NETIFNAME,0));

	/*  		-- WAN --  */
	if(WAN_TYPE!=RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE)
	{
		if(!isPPPoE)
			RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addRoute (wan_ipAddr,wan_ipMask,0,RTL865xC_TEST_WAN_NETIFNAME,0));
		else
			RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addRoute (wan_ipAddr,wan_ipMask,0,RTL865xC_TEST_WAN_NETIFNAME_PPP,0));
	}

	/* Set ARP Table */
	/*  		-- LAN --  */
	strtoip(&ipAddr, RTL865xC_TEST_LAN_HOST0_IP);
	strtomac(&macAddr, RTL865xC_TEST_LAN_HOST0_MAC);
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addArp (ipAddr,&macAddr));
	
	strtoip(&ipAddr, RTL865xC_TEST_LAN_HOST1_IP);
	strtomac(&macAddr, RTL865xC_TEST_LAN_HOST1_MAC);
	RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addArp (ipAddr,&macAddr));
	
	/*		-- WAN --  */
	if(WAN_TYPE!=RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE && !isPPPoE)
		RTL_TESTMODEL_INIT_CHECK_SUCCESS(rtl865x_addArp (wan_host_ip,&wan_host_mac));
	

	return SUCCESS;
	
}
#endif

hsb_param_t Ghsb =
{
		spa: 3,			len: 64,
		vid: 0x0,			tagif: 0,
		pppoeif: 0,		sip:0,
		sprt: 0,			dip:0,
		dprt: 0,			ipptl: 0xdd,
		ipfg: 0x0,			iptos: 0x65,
		tcpfg: 0x00,		type: HSB_TYPE_TCP,
		patmatch:0,		ethtype: 0x0800,
		da:{0x00,0x00,0x00,0x00,0x88,0x8a},
		sa:{0x00,0x80,0xc0,0x00,0x00,0x00},
		hiprior: 0,		snap: 0,
		udpnocs: 0,		ttlst: 0x2,
		dirtx: 0,			l3csok: 1,
		l4csok: 1,		ipfo0_n: 0,
		llcothr: 0,			urlmch: 0,
		extspa: 0,		extl2: 0,
};


static uint8 port_number_of_host[3][MAX_PORT_NUMBER] = {{0,1,2,3,4,5},{4,3,2,1,0,5},{1,0,3,2,4,5}};
static uint8 *hp;


#define VID_0 0
#define WAN0_VID 1
#define GW_WAN0_MAC "00-00-00-00-88-88"

#define WAN1_VID 9
#define GW_WAN1_MAC "00-00-00-00-88-89"
//#define GW_WAN1_SUBNET_MASK "255.255.255.254"

#define WAN2_VID 9
#define GW_WAN2_MAC "00-00-00-00-88-90"

#define WAN3_VID 9
#define GW_WAN3_MAC "00-00-00-00-88-91"


#define LAN0_VID 0x3C7
#define GW_LAN0_MAC "00-00-00-00-88-8a"
#define GW_LAN0_IPMV6_MAC "33-33-00-00-88-8a"
#define GW_LAN0_IPMV4_MAC "01-00-5e-00-88-8a"


#define GW_LAN0_IP "192.168.2.1"
#define GW_LAN0_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0000:0001"

#define GW_LAN0_SUBNET_MASK "255.255.255.248"

#define LAN1_VID 11
#define GW_LAN1_MAC "00-00-00-00-88-8b"
#define GW_LAN1_IPMV6_MAC "33-33-00-00-88-8b"
#define GW_LAN1_IPMV4_MAC "01-00-5e-00-88-8b"
#define GW_LAN1_IP "192.168.1.1"
#define GW_LAN1_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0001:0001"
#define GW_LAN1_V6IPMIP "ffff:0db8:85a3:08d3:1319:8a2e:0001:0001"
#define GW_LAN1_SUBNET_MASK "255.255.255.248"

#define LAN2_VID 13
#define GW_LAN2_MAC "00-00-00-00-88-8c"
#define GW_LAN2_IP "192.168.3.1"
#define GW_LAN2_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0002:0001"
#define GW_LAN2_SUBNET_MASK "255.255.255.248"


/* isp 0 */
#define WAN0_ISP_MAC "00-00-00-00-99-9c"
#define WAN0_ISP_PPPOE_SID 0x55
#define WAN0_ISP_PUBLIC_IP "192.168.4.1"
#define WAN3_ISP_PUBLIC_IP "192.168.4.3"
/* isp 1 */
#define WAN1_ISP_PUBLIC_IP 	"192.168.3.1"
#define GW_WAN1_IP 			"192.168.3.1"
#define GW_WAN1_SUBNET_MASK "255.255.255.248"

/* isp 1 */
#define WAN2_ISP_PUBLIC_IP 	"192.168.4.1"
#define GW_WAN2_IP 			"192.168.4.1"
#define GW_WAN2_SUBNET_MASK "255.255.255.248"

/* isp 1 */
#define WAN3_ISP_PUBLIC_IP 	"192.168.5.1"
#define GW_WAN3_IP 			"192.168.5.1"
#define GW_WAN3_SUBNET_MASK "255.255.255.248"


/* wan 0 hosts */
#define HOST5_MAC "00-00-00-00-00-10"
#define HOST5_IP "192.168.4.5"
#define HOST5_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0370:5555"

/* wan 1 hosts */
#define HOST4_MAC "00-00-00-00-00-20"
#define HOST4_IP "192.168.3.2"
#define HOST4_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0370:4444"


/* lan 0 hosts */
#define HOST3_MAC "00-00-00-00-00-30"
#define HOST3_v4IPM_MAC "01-00-5e-00-00-30"
#define HOST3_v6IPM_MAC "33-33-00-00-00-30"
#define HOST3_IP "192.168.2.2"
#define HOST3_IPMIP "224.168.2.2"
#define HOST3_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0000:3333"
#define HOST3_IPMV6IP "ffff:0db8:85a3:08d3:1319:8a2e:0000:3333"


/* lan 1 hosts */
#define HOST1_MAC "00-00-00-00-01-40"
#define HOST1_v4IPM_MAC "01-00-5e-00-00-40"
#define HOST1_v6IPM_MAC "33-33-00-00-00-40"
#define HOST1_IP "192.168.1.2"
#define HOST1_IPMIP "224.0.0.11"
#define HOST1_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0001:1111"
#define HOST1_IPMV6IP "ffff:0db8:85a3:08d3:1319:8a2e:0001:1111"


#define HOST2_MAC "00-00-00-00-00-50"
#define HOST2_v4IPM_MAC "01-00-5e-00-00-50"
#define HOST2_v6IPM_MAC "33-33-00-00-00-50"
#define HOST2_IP "192.168.1.3"
#define HOST2_IPMIP "224.0.0.22"
#define HOST2_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0370:2222"
#define HOST2_IPMV6IP "ffff:0db8:85a3:08d3:1319:8a2e:0370:2222"


#define HOST6_MAC "00-00-00-00-00-60"
#define HOST6_IP "192.168.1.4"
#define HOST6_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0370:6666"

#define CE_IP "140.112.1.11"
#define CE_MAC "00-00-00-00-01-11"
#define BR_IP "140.112.1.22"
#define BR_MAC "00-00-00-00-01-22"

#define BR_INV_IP "140.112.1.11"
#define BR_INV_MAC "00-00-00-00-01-11"
#define BR_INVIPM_MAC "00-00-00-00-01-11"

#define CE_INV_IP "140.112.1.22"
#define CE_INV_MAC "00-00-00-00-01-22"
#define CE_INVIPM_MAC "01-00-5e-00-01-22"


#define AFTR_IP "140.112.1.100"
#define AFTR_MAC "00-00-00-00-af-af"
#define AFTR_V6IP "2001:0db8:85a3:08d3:1319:8a2e:0000:afaf"

#define AFTR_INV_IP 	"140.112.1.100"
#define AFTR_INV_MAC	"00-00-00-00-af-af"
#define AFTR_INV_V6IP 	"2001:0db8:85a3:08d3:1319:8a2e:0000:afaf"


#define MULTICAST_MAC "01-00-5e-00-00-03"
#define EXTERNAL_PORT 20
#define INTERNAL_PORT 30
#define LOWER_PORT	    80
#define UPPER_PORT	    180
#define MORE_FRAG	2


/* lan 1 hosts */
#define HOSTIPM0_V6MAC "33-33-00-00-00-40"
#define HOSTIPM0_V4MAC "01-00-5e-00-00-40"
#define HOSTIPM0_IP "224.168.1.1"
#define HOSTIPM0_V6IP "ffff:0db8:85a3:08d3:1319:8a2e:0000:0000"

/* lan 1 hosts */
#define HOSTIPM1_MAC "00-00-00-00-00-50"
#define HOSTIPM1_IP "224.168.2.1"
#define HOSTIPM1_V6IP "ffff:0db8:85a3:08d3:1319:8a2e:0001:1111"



uint32 getL2TableRowFromMacStr(int8 *str)
{
    int32 t1, t2, t3, t4, t5, t6;
    ether_addr_t mac;
    sscanf((char*)str, "%x-%x-%x-%x-%x-%x", &t1, &t2, &t3, &t4, &t5, &t6);
    mac.octet[0]=t1; mac.octet[1]=t2; mac.octet[2]=t3; mac.octet[3]=t4; mac.octet[4]=t5; mac.octet[5]=t6;
    return rtl8651_filterDbIndex(&mac,0);
}

#if defined(CONFIG_RTL_8685S_HWNAT)
uint32 getL2TableRowFromMacStrAndFid(int8 *str,int32 fid)
{
    int32 t1, t2, t3, t4, t5, t6;
    ether_addr_t mac;
    sscanf((char*)str, "%x-%x-%x-%x-%x-%x", &t1, &t2, &t3, &t4, &t5, &t6);
    mac.octet[0]=t1; mac.octet[1]=t2; mac.octet[2]=t3; mac.octet[3]=t4; mac.octet[4]=t5; mac.octet[5]=t6;
    return rtl8651_filterDbIndex(&mac,fid);
}
#endif


int32   rtl865xc_netIfIndex(int vid)  
{
	uint16 i;
	rtl865xc_tblAsic_netifTable_t	 netif;
	for (i=0;i<RTL865XC_NETIFTBL_SIZE;i++)
	{
		_rtl8651_readAsicEntry(TYPE_NETINTERFACE_TABLE, i, &netif);
		if (netif.vid==vid){
//			printk("netif.vid = %d  vid=%d  i=%d \n",netif.vid,vid,i);
			return i;
		}
	}
	rtlglue_printf("Error  !!! not  foud network interface..... %s %d\n",__FILE__,__LINE__);
	return RTL865XC_NETIFTBL_SIZE;
}
#ifndef bzero
		#define bzero( p, s ) memset( p, 0, s )
#endif

int32 rtl8651_clearAsicPvid(void)
{


	WRITE_MEM32( PVCR0,READ_MEM32(PVCR0) &( ~(0xfff<<16)) & (~0xffff));
	WRITE_MEM32( PVCR1,READ_MEM32(PVCR1) &( ~(0xfff<<16)) & (~0xffff));
	WRITE_MEM32( PVCR2,READ_MEM32(PVCR2) &( ~(0xfff<<16)) & (~0xffff));

	return SUCCESS;
}
#if 0
/*
@func void | rtl8651_clearRegister | Clear ALL registers in ASIC
@comm
	Clear ALL registers in ASIC.
	for RTL865xC only
*/

void rtl8651_clearRegister(void)
{
#ifdef CONFIG_RTL865XC
	int i = 0;

#if !defined(CONFIG_RTL_8196C) && !defined(CONFIG_RTL_8198)
	WRITE_MEM32(MACCR,LONG_TXE);	
#endif
	WRITE_MEM32(MGFCR_E0R0,0);
	WRITE_MEM32(MGFCR_E0R1,0);
	WRITE_MEM32(MGFCR_E0R2,0);
	WRITE_MEM32(MGFCR_E1R0,0);
	WRITE_MEM32(MGFCR_E1R1,0);
	WRITE_MEM32(MGFCR_E1R2,0);	
	WRITE_MEM32(MGFCR_E2R0,0);
	WRITE_MEM32(MGFCR_E2R1,0);
	WRITE_MEM32(MGFCR_E2R2,0);
	WRITE_MEM32(MGFCR_E3R0,0);
	WRITE_MEM32(MGFCR_E3R1,0);
	WRITE_MEM32(MGFCR_E3R2,0);	
	WRITE_MEM32(VCR0,0);		
	WRITE_MEM32(VCR1,0);	
	WRITE_MEM32(PVCR0,0);	
	WRITE_MEM32(PVCR1,0);	
	WRITE_MEM32(PVCR2,0);	
	WRITE_MEM32(PVCR3,0);	
	WRITE_MEM32(PVCR4,0);	
	WRITE_MEM32(TEACR,0);
	WRITE_MEM32(FFCR,0);
	WRITE_MEM32(DOT1XPORTCR,0);
	WRITE_MEM32(DOT1XMACCR,0);
	WRITE_MEM32(GVGCR,0);
	WRITE_MEM32(SWTCR0,0);
	WRITE_MEM32(SWTCR1,0);
	WRITE_MEM32(PLITIMR,0);
	/* Set all Protocol-Based Reg. to 0 */
	WRITE_MEM32(PBVCR0,  0x00000000);
	WRITE_MEM32(PBVCR1, 0x00000000);
	WRITE_MEM32(PBVR0_0, 0x00000000);	/* IPX */
	WRITE_MEM32(PBVR0_1, 0x00000000);	/* IPX */
	WRITE_MEM32(PBVR0_2, 0x00000000);	/* IPX */
	WRITE_MEM32(PBVR0_3, 0x00000000);	/* IPX */
	WRITE_MEM32(PBVR0_4, 0x00000000);	/* IPX */		
	WRITE_MEM32(PBVR1_0,  0x00000000);	/* NetBIOS */
	WRITE_MEM32(PBVR1_1,  0x00000000);	/* NetBIOS */
	WRITE_MEM32(PBVR1_2,  0x00000000);	/* NetBIOS */
	WRITE_MEM32(PBVR1_3,  0x00000000);	/* NetBIOS */
	WRITE_MEM32(PBVR1_4,  0x00000000);	/* NetBIOS */
	WRITE_MEM32(PBVR2_0,  0x00000000);	/* PPPoE Control */
	WRITE_MEM32(PBVR2_1,  0x00000000);	
	WRITE_MEM32(PBVR2_2,  0x00000000);	
	WRITE_MEM32(PBVR2_3,  0x00000000);	
	WRITE_MEM32(PBVR2_4,  0x00000000);	
	WRITE_MEM32(PBVR3_0,  0x00000000);	/* PPPoE Session */
	WRITE_MEM32(PBVR3_1,  0x00000000);	/* PPPoE Session */
	WRITE_MEM32(PBVR3_2,  0x00000000);	/* PPPoE Session */
	WRITE_MEM32(PBVR3_3,  0x00000000);	/* PPPoE Session */
	WRITE_MEM32(PBVR3_4,  0x00000000);	/* PPPoE Session */
	WRITE_MEM32(PBVR4_0,  0x00000000);	/* User-defined 1 */
	WRITE_MEM32(PBVR4_1,  0x00000000);	/* User-defined 1 */
	WRITE_MEM32(PBVR4_2,  0x00000000);	/* User-defined 1 */
	WRITE_MEM32(PBVR4_3,  0x00000000);	/* User-defined 1 */
	WRITE_MEM32(PBVR4_4,  0x00000000);	/* User-defined 1 */
	WRITE_MEM32(PBVR5_0,  0x00000000);	/* User-defined 2 */
	WRITE_MEM32(PBVR5_1,  0x00000000);	/* User-defined 2 */
	WRITE_MEM32(PBVR5_2,  0x00000000);	/* User-defined 2 */
	WRITE_MEM32(PBVR5_3,  0x00000000);	/* User-defined 2 */
	WRITE_MEM32(PBVR5_4,  0x00000000);	/* User-defined 2 */
	WRITE_MEM32(MSCR,0);   

	#ifdef CONFIG_RTL8198
	WRITE_MEM32(PCRP0, (1 | MacSwReset));
	WRITE_MEM32(PCRP1, (1 | MacSwReset));   
	WRITE_MEM32(PCRP2, (1 | MacSwReset));   
	WRITE_MEM32(PCRP3, (1 | MacSwReset));   
	WRITE_MEM32(PCRP4, (1 | MacSwReset));   
	#else
	WRITE_MEM32(PCRP0,1);   
	WRITE_MEM32(PCRP1,1);   
	WRITE_MEM32(PCRP2,1);   
	WRITE_MEM32(PCRP3,1);   
	WRITE_MEM32(PCRP4,1);   
	#endif

	WRITE_MEM32(PCRP5,1);   
	WRITE_MEM32(PCRP6,1);   
	WRITE_MEM32(PCRP7,1);   
	WRITE_MEM32(PCRP8,1);   
	WRITE_MEM32(PPMAR,1);
	WRITE_MEM32(SIRR, TRXRDY);
	/* WRITE_MEM32(TMCR,0xFCFC0000); */
	WRITE_MEM32(QIDDPCR,(0x1<<NAPT_PRI_OFFSET)|(0x1<<ACL_PRI_OFFSET)|(0x1<<DSCP_PRI_OFFSET)|(0x1<<BP8021Q_PRI_OFFSET)|(0x1<<PBP_PRI_OFFSET));
	WRITE_MEM32(LPTM8021Q,0);
	WRITE_MEM32(DSCPCR0,0);
	WRITE_MEM32(DSCPCR1,0);
	WRITE_MEM32(DSCPCR2,0);
	WRITE_MEM32(DSCPCR3,0);
	WRITE_MEM32(DSCPCR4,0);
	WRITE_MEM32(DSCPCR5,0);
	WRITE_MEM32(DSCPCR6,0);	
	WRITE_MEM32(RMACR,0);
	WRITE_MEM32(ALECR,0);

	/* System Based Flow Control Threshold Register */
	WRITE_MEM32( SBFCR0, (0x1E0<<S_DSC_RUNOUT_OFFSET) );
	WRITE_MEM32( SBFCR1, (0x0190<<S_DSC_FCOFF_OFFSET)|(0x01CC<<S_DSC_FCON_OFFSET) );
	WRITE_MEM32( SBFCR2, (0x0050<<S_Max_SBuf_FCOFF_OFFSET)|(0x006C<<S_Max_SBuf_FCON_OFFSET) );
	/* Port Based Flow Control Threshold Register */
	WRITE_MEM32( PBFCR0, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );
	WRITE_MEM32( PBFCR1, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );
	WRITE_MEM32( PBFCR2, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );
	WRITE_MEM32( PBFCR3, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );
	WRITE_MEM32( PBFCR4, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );
	WRITE_MEM32( PBFCR5, (0x003C<<P_MaxDSC_FCOFF_OFFSET)|(0x005A<<P_MaxDSC_FCON_OFFSET) );

	/* Packet Schecduling Control Register */
	WRITE_MEM32(ELBPCR, (51<<Token_OFFSET)|(38<<Tick_OFFSET) );
	WRITE_MEM32(ELBTTCR, /*0x99*/0x400<<L2_OFFSET );
	WRITE_MEM32(ILBPCR1, (0<<UpperBound_OFFSET)|(0<<LowerBound_OFFSET) );
	WRITE_MEM32(ILBPCR2, (0x33<<ILB_feedToken_OFFSET)|(0x26<<ILB_Tick_OFFSET) );
	for( i = 0; i<42; i++ )
		WRITE_MEM32(P0Q0RGCR+i*4, (7<<PPR_OFFSET)|(0xff<<L1_OFFSET)|(0x3FFF<<APR_OFFSET) );
	for( i = 0; i<7; i++ )
	{
		WRITE_MEM32(WFQRCRP0+i*4*3+ 0, 0x3fff<<APR_OFFSET );
		WRITE_MEM32(WFQRCRP0+i*4*3+ 4, 0 ); /* WFQWCR0P? */
		WRITE_MEM32(WFQRCRP0+i*4*3+ 8, 0 ); /* WFQWCR1P? */
	}

	for (i=0;i<48;i+=4)
			WRITE_MEM32(PATP0+i,0xfe12);	

	rtl8651_totalExtPortNum=0;

	/* Set chip's mode as NORMAL mode */
	WRITE_MEM32(TMCR,~ENHSBTESTMODE&READ_MEM32(TMCR));

	/* CPU NIC */
	WRITE_MEM32(CPUICR,READ_MEM32(CPUICR)&~(LBMODE|LB10MHZ|MITIGATION|EXCLUDE_CRC)); 
	WRITE_MEM32(CPUIISR,READ_MEM32(CPUIISR));  /* clear all interrupt */
	WRITE_MEM16(CPUQDM0,0); 
	WRITE_MEM16(CPUQDM1,0); 
	WRITE_MEM16(CPUQDM2,0); 
	WRITE_MEM16(CPUQDM3,0); 
	WRITE_MEM16(CPUQDM4,0); 
	WRITE_MEM16(CPUQDM5,0); 
	WRITE_MEM32(RMCR1P,0); 
	WRITE_MEM32(DSCPRM0,0); 
	WRITE_MEM32(DSCPRM1,0); 
	WRITE_MEM32(RLRC,0); 
	
#if 0 /* Since swNic only init once when starting model code, we don't clear the following registers. */
	WRITE_MEM32(CPURPDCR0,0); 
	WRITE_MEM32(CPURPDCR1,0); 
	WRITE_MEM32(CPURPDCR2,0); 
	WRITE_MEM32(CPURPDCR3,0); 
	WRITE_MEM32(CPURPDCR4,0); 
	WRITE_MEM32(CPURPDCR5,0); 
	WRITE_MEM32(CPURMDCR0,0); 
	WRITE_MEM32(CPUTPDCR0,0); 
	WRITE_MEM32(CPUTPDCR1,0); 
	WRITE_MEM32(CPUIIMR,0); 
#endif

#else
	rtlglue_printf("Driver of current CHIP version does not support [%s]\n", __FUNCTION__);
#endif
}
#endif


extern int32 rtl8651_clearAsicL2Table(void);
uint32 rtl_check_virtual_mac(void)
{
	int i,rxPort,ret,pktLen;
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if(ret==SUCCESS || pktLen!=0)
		{
			rtlglue_printf("!!! virtualMacOutput fail  rxPort=%x\n",rxPort);
			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			return FAILED;
		}
	}
	return SUCCESS;
}

void rtl_clear_virtual_mac(void)
{
	int i,rxPort,ret,pktLen;
	uint8 *pktBuf = RTL865xC_Test_SharedPkt[0];	

	for(i=0;i<6;i++)
	{
		ret = SUCCESS;
		rxPort = 1<<i;
		pktLen = 2048;
		while(ret==SUCCESS && pktLen!=0)
		{
			ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
			printk("port:%d ret:%d pktLen=%d\n",i,ret,pktLen);
			cond_resched();
		}
	}
	return;
}


void rtl_reset_all_tables(void)
{
	int i,j,rxPort,ret,pktLen;
	uint8 *pktBuf = RTL865xC_Test_SharedPkt[0];	
	
	rtl8651_clearAsicL2Table();
	rtl8651_clearSpecifiedAsicTable(TYPE_EXT_INT_IP_TABLE, RTL8651_IPTABLE_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_ARP_TABLE, RTL8651_ARPTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_PPPOE_TABLE, RTL8651_PPPOETBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_NEXT_HOP_TABLE, RTL8651_NEXTHOPTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_L3_ROUTING_TABLE, RTL8651_ROUTINGTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_MULTICAST_TABLE, RTL8651_IPMULTICASTTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_NETINTERFACE_TABLE, RTL865XC_NETIFTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_DS_LITE_TABLE, RTL8198C_DSLITETBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_6RD_TABLE, RTL8198C_IPv6RDTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_IPv6_ROUTING_TABLE, RTL8198C_IPv6ROUTINGTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_IPv6_NEXTHOP_TABLE, RTL8198C_V6NEXTHOPTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_IPV6_NEIGH_TABLE, RTL8198C_V6NEIGHTBL_SIZE);
	rtl8651_clearSpecifiedAsicTable(TYPE_IPv6_MULTICAST_TABLE, RTL8198C_IPv6MCASTTBL_SIZE);

	//Clear virtualMac
	for(i=0;i<6;i++)
	{
		int i,rxPort,ret,pktLen;
		uint8 *pktBuf = RTL865xC_Test_SharedPkt[0];
		
		while(1)
		{
			rxPort = 1<<i;
			ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
			if(ret==SUCCESS) continue;
			break;
		}
	}
}


void rtl_dump_hs(void)
{
	hsb_param_t *hsb_r, dummy_hsb_r;
	hsa_param_t *hsa_r, dummy_hsa_r;
	ipaddr_t addr;
	char addr_s[100];

	hsb_r = &dummy_hsb_r;
	hsa_r = &dummy_hsa_r;
	memset((void*)hsb_r,0,sizeof(hsb_r));
	memset((void*)hsa_r,0,sizeof(hsa_r));
	
	rtl865xC_virtualMacGetHsb( hsb_r );
	{
		printk("HSB(");
		printk("\ttype:%d",hsb_r->type);
		
		printk("\tspa:%d",hsb_r->spa);
		printk("\tlen:%d",hsb_r->len);
		printk("\tvid :%d\n",hsb_r->vid);
		printk("\tpppoe:%d",hsb_r->pppoeif);
		
		/* Protocol contents */
		printk("\ttagif:%d\tpppoeId:%d",hsb_r->tagif,hsb_r->pppoeid);
		printk("\tethrtype:0x%04x\n",hsb_r->ethtype);
		printk("\tllc_other:%d\tsnap:%d\n",hsb_r->llcothr,hsb_r->snap);
		printk("\tda:%02x-%02x-%02x-%02x-%02x-%02x",hsb_r->da[0],hsb_r->da[1],hsb_r->da[2],hsb_r->da[3],hsb_r->da[4],hsb_r->da[5]);
		printk("\tsa:%02x-%02x-%02x-%02x-%02x-%02x\n",hsb_r->sa[0],hsb_r->sa[1],hsb_r->sa[2],hsb_r->sa[3],hsb_r->sa[4],hsb_r->sa[5]);
		
		addr = ntohl( hsb_r->sip);
		inet_ntoa_r(addr, addr_s);
		printk("\tsip:%s(hex:%08x)   ",addr_s,hsb_r->sip);
		printk("\tsprt:%d (hex:%x)\n ",(int)hsb_r->sprt,hsb_r->sprt);
		addr  = ntohl(hsb_r->dip);
		inet_ntoa_r(addr, addr_s);
		printk("\tdip:%s(hex:%08x) ",addr_s,hsb_r->dip);		
		printk("\tdprt:%d(hex:%08x)\n",hsb_r->dprt,hsb_r->dprt);
		
		printk("\tipptl:%d,",(int)hsb_r->ipptl);
		printk("\tipflg:%d,",hsb_r->ipfg);
		printk("\tiptos:%d,",hsb_r->iptos);
		printk("\ttcpflg:%d\n",hsb_r->tcpfg);
		
		printk("\tdirtx:%d,",hsb_r->dirtx);
		printk("\tprtnmat:%d",hsb_r->patmatch);
	       
		printk("\tudp_nocs:%d",hsb_r->udpnocs);
		printk("\tttlst:0x%x\n",hsb_r->ttlst);

		
		printk("\thp:%d",hsb_r->hiprior);
		printk("\tl3csok:%d\tl4csok:%d\tipfragif:%d\n",hsb_r->l3csok,hsb_r->l4csok,hsb_r->ipfo0_n);
		
	 	printk("\textspa:%d",hsb_r->extspa);
		
#if defined(CONFIG_RTL_8685S_HWNAT)
		printk("\turlmch:%d\n",hsb_r->urlmch);


		printk("\t ipv4_opt:%d",hsb_r->ipv4_opt);
		printk("\t cpuTagIf:%d",hsb_r->cpuTagIf);
		printk("\t v6Ext:%d\n",hsb_r->v6Ext);
		printk("\t v6fragmOffs:%d",hsb_r->v6fragmOffs);	
		printk("\t v6Flag:%d",hsb_r->v6Flag);	
		printk("\t qpri:%d\n",hsb_r->qpri);	
		printk("\t ptpPkt:%d",hsb_r->ptpPkt);	
		printk("\t ptpVer:%d",hsb_r->ptpVer);	
		printk("\t ptpTyp:%d",hsb_r->ptpTyp);	
		printk("\t ipVerFirst:%d\n",hsb_r->ipVerFirst);	

		printk("\t Sipv6:\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
		                ,hsb_r->v6Sip.s6_addr32[0]>>16,hsb_r->v6Sip.s6_addr32[0]&0xFFFF
		        		,hsb_r->v6Sip.s6_addr32[1]>>16,hsb_r->v6Sip.s6_addr32[1]&0xFFFF
		        		,hsb_r->v6Sip.s6_addr32[2]>>16,hsb_r->v6Sip.s6_addr32[2]&0xFFFF
		        		,hsb_r->v6Sip.s6_addr32[3]>>16,hsb_r->v6Sip.s6_addr32[3]&0xFFFF);		

		printk("\t Dipv6:\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
						,hsb_r->v6Dip.s6_addr32[0]>>16,hsb_r->v6Dip.s6_addr32[0]&0xFFFF
						,hsb_r->v6Dip.s6_addr32[1]>>16,hsb_r->v6Dip.s6_addr32[1]&0xFFFF
						,hsb_r->v6Dip.s6_addr32[2]>>16,hsb_r->v6Dip.s6_addr32[2]&0xFFFF
						,hsb_r->v6Dip.s6_addr32[3]>>16,hsb_r->v6Dip.s6_addr32[3]&0xFFFF);	
		
		printk("\t v6HopLimit:%d",hsb_r->v6HopLimit);
		printk("\t v6TafficClass:%d",hsb_r->v6TafficClass);
		printk("\t v6FlowLabel:%d",hsb_r->v6FlowLabel);
		printk("\t v6NxtHdr:%d\n",hsb_r->v6NxtHdr);
		printk("\t v4PktHdr:%d",hsb_r->v4PktHdr);
		printk("\t v6PktHdr:%d",hsb_r->v6PktHdr);
		printk("\t innerIpLen:%d",hsb_r->innerIpLen);
		printk("\t tunnelLen:%d\n)\n",hsb_r->tunnelLen);
#else /* CONFIG_RTL_8685S_HWNAT */
		printk("\turlmch:%d\n)\n",hsb_r->urlmch);

#endif /* CONFIG_RTL_8685S_HWNAT */

	}

	rtl865xC_virtualMacGetHsa( hsa_r );
	{
		printk(("HSA("));
		printk("\tmac:%02x-%02x-%02x-%02x-%02x-%02x\n",hsa_r->nhmac[0],hsa_r->nhmac[1],hsa_r->nhmac[2],hsa_r->nhmac[3],hsa_r->nhmac[4],hsa_r->nhmac[5]);

		addr =ntohl( hsa_r->trip);
		inet_ntoa_r(addr, addr_s);
		printk("\ttrip:%s(hex:%08x)",addr_s,hsa_r->trip);	
		printk("\tprt:%d\tipmcast:%d\n",hsa_r->port,hsa_r->ipmcastr);
		printk("\tl3cs:%d",hsa_r->l3csdt);
		printk("\tl4cs:%d",hsa_r->l4csdt);
		printk("\tInternal NETIF:%d",hsa_r->egif);
		printk("\tl2tr:%d,\n ",hsa_r->l2tr);
		printk("\tl34tr:%d",hsa_r->l34tr);
		printk("\tdirtx:%d",hsa_r->dirtxo);
		printk("\ttype:%d",hsa_r->typeo);
		printk("\tsnapo:%d",hsa_r->snapo);
		printk("\twhy2cpu 0x%x (%d)\n",hsa_r->why2cpu,hsa_r->why2cpu);
		printk("\tpppif:%d",hsa_r->pppoeifo);
		printk("\tpppid:%d",hsa_r->pppidx);
		printk("\tttl_1:0x%x",hsa_r->ttl_1if);
		printk("\tdpc:%d,",hsa_r->dpc);

		printk("\tleno:%d(0x%x)\n",hsa_r->leno,hsa_r->leno);

		printk("\tl3CrcOk:%d",hsa_r->l3csoko);
		printk("\tl4CrcOk:%d",hsa_r->l4csoko);
		printk("\tfrag:%d",hsa_r->frag);
		printk("\tlastFrag:%d\n",hsa_r->lastfrag);



		printk("\tsvid:0x%x",hsa_r->svid);
		printk("\tdvid:%d(0x%x)",hsa_r->dvid,hsa_r->dvid);
		printk("\tdestination interface :%d\n",hsa_r->difid);
		printk("\trxtag:%d",hsa_r->rxtag);
		printk("\tdvtag:0x%x",hsa_r->dvtag);
		printk("\tspa:%d",hsa_r->spao);
		printk("\tdpext:0x%x\thwfwrd:%d\n",hsa_r->dpext,hsa_r->hwfwrd);
		printk("\tspcp:%d",hsa_r->spcp);
		printk("\tpriority:%d",hsa_r->priority);
		
		printk("\tdp:0x%x\n",hsa_r->dp);

#if defined(CONFIG_RTL_8685S_HWNAT)

		printk("\t mirrort:%d",hsa_r->mirrort);
		printk("\t v4First:%d",hsa_r->v4First);
		printk("\t cpuTag:%d\n",hsa_r->cpuTag);
		printk("\t ptpPkt:%d",hsa_r->ptpPkt);
		printk("\t ptpV2:%d",hsa_r->ptpV2);
		printk("\t ptpType:%d\n",hsa_r->ptpType);
		printk("\t routeModeDstPort:%d",hsa_r->routeModeDstPort);
		printk("\t dPri:%d",hsa_r->dPri);
		printk("\t ipMdf:%d\n",hsa_r->ipMdf);

		printk("\t Sipv6(6rd/dslite):\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
						,hsa_r->sip.s6_addr32[0]>>16,hsa_r->sip.s6_addr32[0]&0xFFFF
						,hsa_r->sip.s6_addr32[1]>>16,hsa_r->sip.s6_addr32[1]&0xFFFF
						,hsa_r->sip.s6_addr32[2]>>16,hsa_r->sip.s6_addr32[2]&0xFFFF
						,hsa_r->sip.s6_addr32[3]>>16,hsa_r->sip.s6_addr32[3]&0xFFFF);

		printk("\t Dipv6(6rd/dslite):\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
						,hsa_r->dip.s6_addr32[0]>>16,hsa_r->dip.s6_addr32[0]&0xFFFF
						,hsa_r->dip.s6_addr32[1]>>16,hsa_r->dip.s6_addr32[1]&0xFFFF
						,hsa_r->dip.s6_addr32[2]>>16,hsa_r->dip.s6_addr32[2]&0xFFFF
						,hsa_r->dip.s6_addr32[3]>>16,hsa_r->dip.s6_addr32[3]&0xFFFF);

		printk("\t ipLen:%d",hsa_r->ipLen);
		printk("\t v4Id:%d",hsa_r->v4Id);
		printk("\t v4pkt:%d",hsa_r->v4pkt);
		printk("\t v6pkt:%d\n",hsa_r->v6pkt);
		printk("\t tunnelLen:%d",hsa_r->tunnelLen);
		printk("\t v6Multicast:%d",hsa_r->v6Multicast);
		printk("\t addipPri:%d\n",hsa_r->addipPri);

		
#else /* CONFIG_RTL_8685S_HWNAT */
		printk("\t fragpkt:%d",hsa_r->fragpkt);
#endif /* CONFIG_RTL_8685S_HWNAT */

		
		printk(")\n");
	}
}


#undef REAL_ASIC_ACCESS

int32  layer3Config( int routetIsPPPoE )
{
#ifdef 	REAL_ASIC_ACCESS
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t intf;
	rtl865x_AclRule_t *aclt;
#else
	struct rtl865x_netif_s netif;
#endif		
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	ipaddr_t ip32;
	
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();
	rtl8651_clearAsicCommTable();
//	rtl8651_clearAsicAllTable();
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[5],WAN0_VID);  /*host 5 pvid 0*/
	rtl8651_setAsicPvid(hp[4],9);   /*host 4 pvid 1*/
	rtl8651_setAsicPvid(hp[3],LAN0_VID);  /*host 3 pvid 2*/
	rtl8651_setAsicPvid(hp[2],11);  /*host 2 pvid 3*/
	rtl8651_setAsicPvid(hp[1],11);  /*host 1 pvid 3*/
	rtl8651_setAsicPvid(hp[6],11);  /*host 6 pvid 3*/
	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	rtl8651_setAsicOperationLayer(3);
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));
	/* VLAN tagging control reg: accept all frame */
	//WRITE_MEM32( VCR0, EN_ALL_PORT_VLAN_INGRESS_FILTER);	



	 /* config vlan table */
	/* wan 0 */
#ifdef REAL_ASIC_ACCESS

	memset((void*) &intf,0, sizeof(intf));
	strtomac(&intf.macAddr, GW_WAN0_MAC);
	intf.macAddrNumber = 1;
	intf.vid = WAN0_VID;
	intf.mtu = 1500;	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	intf.enableRoute = 1;
	intf.valid = 1;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	memset(&netif, 0, sizeof(rtl865x_netif_t));
	memcpy(netif.name,"nas0_0test",MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_WAN0_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = WAN0_VID;
	netif.is_wan = 0;
	netif.is_slave = 0;
	netif.enableRoute=1;
	rtl865x_addNetif(&netif);
#endif


	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask= (1<<hp[5]);
	rtl8651_setAsicVlan(WAN0_VID,&vlant);
#else	
	if(rtl865x_addVlan(WAN0_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN0_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN0_VID,(1<<hp[5]),(1<<hp[5]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
#endif

#ifdef REAL_ASIC_ACCESS

	 /* ingress filter gateway mac */
	aclt = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
	 memset(aclt, 0,sizeof(rtl865x_AclRule_t));	
	aclt->ruleType_ = RTL865X_ACL_MAC;
	aclt->actionType_ = RTL865X_ACL_PERMIT;
	aclt->pktOpApp_	 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(0, aclt);
	
#endif	


	 /* wan 1 */
#ifdef REAL_ASIC_ACCESS

	strtomac(&intf.macAddr, GW_WAN1_MAC);
	intf.vid = VID_0;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	
	memcpy(netif.name,"nas0_1test",MAX_IFNAMESIZE); 
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = VID_0;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif
	
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (1<<hp[4])|(1<<hp[0]);	

		rtl8651_setAsicVlan(VID_0,&vlant);
#else
	if(rtl865x_addVlan(VID_0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(VID_0,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(VID_0,(1<<hp[4])|(1<<hp[0]),(1<<hp[4])|(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
#endif

#ifdef REAL_ASIC_ACCESS

	/* ingress filter gateway mac */	
	aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_		 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(4, aclt);
#endif	
	/* lan 0 */

#ifdef REAL_ASIC_ACCESS

	strtomac(&intf.macAddr, GW_LAN0_MAC);
	intf.vid = LAN0_VID;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else

	memcpy(netif.name,RTL865xC_TEST_LAN_NETIFNAME,MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = LAN0_VID;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif

	
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = 0x3f;//(1<<hp[3]);
	vlant.untagPortMask = 0; //tagged
	rtl8651_setAsicVlan(LAN0_VID,&vlant);
#else
		if(rtl865x_addVlan(LAN0_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN0_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN0_VID,0x3f,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
#endif

#ifdef REAL_ASIC_ACCESS

	/* ingress filter gateway mac */
	aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_	 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(8, aclt);
#endif	
	/* lan 1 */
#ifdef REAL_ASIC_ACCESS

	strtomac(&intf.macAddr, GW_LAN1_MAC);
	intf.vid = LAN1_VID;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;	
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	memcpy(netif.name,"br1",MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = LAN1_VID;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif


	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (1<<hp[2])|(1<<hp[1])|(1<<hp[6]);
	rtl8651_setAsicVlan(LAN1_VID,&vlant);
#else
	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[6]),(1<<hp[2])|(1<<hp[1])|(1<<hp[6]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


#endif
#ifdef REAL_ASIC_ACCESS

	 /* ingress filter gateway mac */
	aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_	 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(12, aclt);    
	kfree(aclt);
#endif	


	/* config l2 table */
	memset((void*) &l2t,0, sizeof(l2t));
	/* wan 0 isp modem */
	strtomac(&l2t.macAddr, WAN0_ISP_MAC);
	l2t.memberPortMask = (1<<hp[5]);
	l2t.isStatic = 1;
	l2t.nhFlag=TRUE;
	
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(WAN0_ISP_MAC), 0, &l2t);
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[4]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 0 host */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[3]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);
	/* lan 1 host 1 */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.memberPortMask = (1<<hp[2]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);
	/* lan 1 host 0 */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);
	/* lan 1 host 5 */
	strtomac(&l2t.macAddr, HOST6_MAC);
	l2t.memberPortMask = (1<<hp[6]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST6_MAC), 0, &l2t);
	    
	/* config pppoe table */
	memset((void*) &pppoet,0, sizeof(pppoet));
	pppoet.sessionId = WAN0_ISP_PPPOE_SID;
	rtl8651_setAsicPppoe(0, &pppoet);
	/* config arp table */
	memset((void*) &arpt,0, sizeof(arpt));
	/* wan 1 host */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	strtoip(&ip32, HOST4_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);
	/* lan 0 host */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);
    
	/* lan 1 host 1 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST2_MAC);
	strtoip(&ip32, HOST2_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);	
	/* lan 1 host 0 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);
	 /* lan 1 host 5 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST6_MAC);
	strtoip(&ip32, HOST6_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);
	/* config routing table */
	memset((void*) &routet,0, sizeof(routet));
	/* route to wan 1: use arp table [0:7] */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	strtoip(&routet.ipMask, GW_WAN1_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(VID_0);
	routet.arpStart = 0;
	routet.arpEnd = 0;
	routet.internal=1;
 	rtl8651_setAsicRouting(0, &routet);
	
	/* route to lan 0: use arp table [8:15] */
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	strtoip(&routet.ipMask, GW_LAN0_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart = 8;
	routet.arpEnd = 8;
	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);
	 /* route to lan 1: use arp table [16:23] */
	 strtoip(&routet.ipAddr, GW_LAN1_IP);
	strtoip(&routet.ipMask, GW_LAN1_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart = 16;
	routet.arpEnd = 16;
	routet.internal=1;
	rtl8651_setAsicRouting(6, &routet);
	/* default route to wan 0: direct to modem */
	 memset((void*) &routet,0, sizeof(routet));
	 strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN0_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	if (routetIsPPPoE==0)
	{
		routet.nhStart = 0;
		routet.nhNum = 2; /*index 4~5*/
		routet.nhNxt = 0;
		routet.nhAlgo = 2; /*per-source*/
		routet.ipDomain = 0;
		routet.internal=1;
	}
	else
	{
		routet.nhStart = 30;
		routet.nhNum = 2; /*index 4~5*/
		routet.nhNxt = 0;
		routet.nhAlgo = 2; 
		routet.ipDomain = 0;
		routet.internal=1;
	}


	rtl8651_setAsicRouting(7, &routet);
	 /* config next hop table */
	 memset((void*) &nxthpt,0, sizeof(nxthpt));
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	nxthpt.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN0_VID);
	nxthpt.extIntIpIdx = 0;
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       

	nxthpt.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN0_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid =1;
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 1;
	rtl8651_setAsicNextHopTable(30, &nxthpt);       

	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0;
	nxthpt.dvid =0;
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(31, &nxthpt);       



	return 0;
	
}
/*
 *
 *          +----+----+----+----+----+----+
 *          | P0 | P1 | P2 | P3 | P4 | P5 |
 *          +----+----+----+----+----+----+
 *      PVID  11   11   11  967    9    1
 * tag/untag                      tag  tag
 *  internal      LAN1      LAN0  WAN1  WAN0 default route: PPPoE, 192.168.4.1(NPE) ----- HOST5:192.168.4.5
 *              1.1/29     2.1/29  3.1/29(NE)
 *                 |          |     |
 *                 |          |     \---- HOST4:192.168.3.1/29
 *                 |          |
 *                 |          \---- HOST3:192.168.2.2 (NPI)
 *                 |
 *                 \--- HOST1:192.168.1.2(NI)
 */


int32 rtl865xC_testLayer3GuestVLAN(void)
{
	hsa_param_t hsa;
	uint16 guestVid;
	ether_addr_t mac;
	int32 retval = SUCCESS;
	rtl865x_tblAsicDrv_multiCastParam_t mcast; 
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hsb_param_t hsb ;
	uint32 multi_mtu;

	layer3Config(0);			
	rtl8651_setAsicOperationLayer(3);
	guestVid=13;
	memcpy((void*)&hsb,(void*)&Ghsb,sizeof(hsb));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
#ifndef REAL_ASIC_ACCESS		
	#if defined(CONFIG_RTL_HARDWARE_NAT) && defined(CONFIG_RTL_LAYERED_DRIVER_ACL) 

	rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);	

	#endif
#endif	
	/**********************************************************************
	IP Multicast Packet 224.0.0.3 
	TAG Packet 
	expect : Drop
	**********************************************************************/
	WRITE_MEM32(DOT1XMACCR, EN_8021X_PORT3_MAC_CONTROL);
	multi_mtu=1500; 
	rtl8651_setAsicMulticastMTU(multi_mtu);
	rtl8651_setAsicMulticastEnable(TRUE);
	memset((void*) &mcast,0,sizeof(mcast));
	mcast.dip= ntohl(inet_addr("224.0.0.3"));
	mcast.sip=ntohl(inet_addr("192.168.1.1"));
	mcast.mbr=PM_PORT_1|PM_PORT_2|PM_PORT_3;
	mcast.svid=LAN0_VID;
	mcast.port=3;
	rtl8651_setAsicIpMulticastTable(&mcast);
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,"01-00-5e-00-00-03"),sizeof(ether_addr_t));
	hsb.sip=ntohl(inet_addr("192.168.1.1"));
	hsb.dip=ntohl(inet_addr("224.0.0.3"));
	hsb.spa=3;
	hsb.tagif=1;
	hsb.vid=LAN0_VID;
	hsb.type=HSB_TYPE_UDP;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be DROP , but .......",hsa.dp,0) ;

	/**********************************************************************
	IP Multicast Packet 224.0.0.3 
	TAG Packet 
	expect : forward lookup ip multicast table
	**********************************************************************/
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,"00-00-5e-00-00-03"),sizeof(ether_addr_t));
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr,"00-00-5e-00-00-03");
	l2t.memberPortMask = (1<<3);
	l2t.auth=1;
	retval=rtl8651_setAsicL2Table(getL2TableRowFromMacStr("00-00-5e-00-00-03"), 0, &l2t);
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be to forward , but .......",hsa.dp,mcast.mbr) ;									

	/**********************************************************************
	IP Multicast Packet 224.0.0.3 
	TAG Packet 
	expect : forward , because ... disable multicast table
	**********************************************************************/
	rtl8651_setAsicMulticastEnable(FALSE);
	WRITE_MEM32(FFCR, READ_MEM32(FFCR)&~EnUnkMC2CPU);

	WRITE_MEM32(DOT1XMACCR, EN_8021X_PORT3_MAC_CONTROL|EN_8021X_PORT2_MAC_CONTROL);
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be to forward , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_4|PM_PORT_5) ;									

	/**********************************************************************
	IP Multicast Packet 224.0.0.3 
	TAG Packet 
	enable port authentication			
	expect : forward

	**********************************************************************/
	rtl8651_setAsicMulticastEnable(TRUE);

	WRITE_MEM32(DOT1XPORTCR, EN_DOT1XPB_P0|EN_DOT1XPB_P1);							
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be to forward , but .......",hsa.dp,mcast.mbr) ;												
	/**********************************************************************
	IP Multicast Packet 224.0.0.3 
	TAG Packet 
	expect : CPU
	**********************************************************************/
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr,"01-00-5e-00-00-03");
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =1;
	l2t.auth=1;
	retval=rtl8651_setAsicL2Table(getL2TableRowFromMacStr("01-00-5e-00-00-03"), 0, &l2t);				
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be to forward , but .......",hsa.dp,mcast.mbr) ;						

	/*********************************************************************
	authenticated node --> unauthenticated node 
	DA is Gateway MAC
	Expect  :Forward
	**********************************************************************/
	WRITE_MEM32(DOT1XMACCR, EN_8021X_PORT3_MAC_CONTROL);			
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =0;
	l2t.auth=1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);				
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	hsb.dip= ntohl(inet_addr("124.0.0.3"));
	hsb.spa=3;
	hsb.type=HSB_TYPE_TCP;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dp,PM_PORT_5 );
	/*********************************************************************
	authenticated node --> unauthenticated node 
	enable port authenicatioin
	DA is Gateway MAC
	Expect  :drop
	**********************************************************************/
	WRITE_MEM32(DOT1XPORTCR, EN_DOT1XPB_P0|EN_DOT1XPB_P5);				
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =0;
	l2t.auth=1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);				
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	hsb.dip= ntohl(inet_addr("124.0.0.3"));
	hsb.spa=3;
	hsb.type=HSB_TYPE_TCP;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dp,0  );
	RTL_TESTMODEL_IS_EQUAL("Finish  Lookup Working .......",hsa.hwfwrd,1);
	/*********************************************************************
	authenticated node --> unauthenticated node 
	enable port authenicatioin
	DA is Gateway MAC
	Expect  :forward
	**********************************************************************/
	WRITE_MEM32(DOT1XPORTCR, EN_DOT1XPB_P0|EN_DOT1XPB_P5|EN_DOT1XPB_P5_OPINDIR);				
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =0;
	l2t.auth=1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);				
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	hsb.dip= ntohl(inet_addr("124.0.0.3"));
	hsb.spa=3;
	hsb.type=HSB_TYPE_TCP;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dp,PM_PORT_5  );
	RTL_TESTMODEL_IS_EQUAL("Finish  Lookup Working .......",hsa.hwfwrd,1  );
	/*********************************************************************
	authenticated node --> unauthenticated node 
	enable port authenicatioin and MAC 1X
	DA is Gateway MAC
	Expect  :forward
	**********************************************************************/
	WRITE_MEM32(DOT1XPORTCR, EN_DOT1XPB_P0|EN_DOT1XPB_P5|EN_DOT1XPB_P5_OPINDIR);				
	WRITE_MEM32(DOT1XMACCR, EN_8021X_PORT3_MAC_CONTROL|EN_8021X_PORT5_MAC_CONTROL);			
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =0;
	l2t.auth=1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);				
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	hsb.dip= ntohl(inet_addr("124.0.0.3"));
	hsb.spa=3;
	hsb.type=HSB_TYPE_TCP;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dp,0 );
	RTL_TESTMODEL_IS_EQUAL("Finish  Lookup Working .......",hsa.hwfwrd,1 );			
	/*********************************************************************
	unauthenticated node --> unauthenticated node 
	DA is Gateway MAC
	Entry is dynamic
	Expect  :Drop
	**********************************************************************/
	memset((void*) &l2t,0,sizeof(l2t));
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic =0;
	l2t.auth=0;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);				
	memcpy((void*)&hsb.sa[0],(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	hsb.spa=3;
	hsb.type=HSB_TYPE_TCP;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be Drop, but .......",hsa.dp,0x0 );	
	/*********************************************************************
	Enable Guest VLAN  
	unauthenticated node --> unauthenticated node 
		DA is Gateway MAC		
		Entry is static
	Expect Drop
	*********************************************************************/			 
	WRITE_MEM32(GVGCR,guestVid|EN_8021X_TOGVLAN);
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic = 1;
	l2t.auth=0;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);							
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL(" Pakcet should be Drop, but .......",hsa.dp,0x0 );
	/*********************************************************************
	Enable Guest VLAN  layer3 ToCPU 
	unauthenticated node --> unauthenticated node 
		DA is Gateway MAC			 
	Expect to CPU
	*********************************************************************/		
	WRITE_MEM32(GVGCR,guestVid|EN_8021X_TOGVLAN|EN_DOT1X_GVR2CPU);
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL(" Pakcet should be CPU, but .......",hsa.dpext,PM_PORT_CPU );
	/*********************************************************************
	Enable Guest VLAN  layer3 ToCPU 
	unauthenticated node --> unauthenticated node 
		DA is Gateway MAC			 
	Expect to CPU
	*********************************************************************/		
	strtomac(&l2t.macAddr, GW_LAN0_MAC);
	l2t.memberPortMask = (1<<3);
	l2t.isStatic = 0;
	l2t.auth=1;			
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(GW_LAN0_MAC), 0, &l2t);
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL(" Pakcet should be CPU, but .......",hsa.dpext,PM_PORT_CPU  );

	return 	SUCCESS;
}

int32 rtl865xC_testLayer3Routing(void)
{
	int32 retval = SUCCESS;
	hsb_param_t hsb =
	{
		spa: 3, 	len: 64,
		vid: 0x0,		tagif: 0,
		pppoeif: 0, 	sip: ntohl(inet_addr("192.168.1.2")),
		sprt: 1020, 	dip:ntohl(inet_addr("120.168.1.3")),
		dprt: 80,			ipptl: 0xdd,
		iptos: 0x65,
		tcpfg: 0x00,		type: HSB_TYPE_UDP, 
		patmatch:0, 	ethtype: 0x0800,
		ipfg:0, 		ipfo0_n:0,
		sa:{0x00,0x80,0xc0,0x00,0x00,0x00},
		hiprior: 0, 	snap: 0,
		udpnocs: 0, 	ttlst: 2,
		dirtx: 0,			l3csok: 1,
		l4csok: 1,		
		llcothr: 0, 		urlmch: 0,
		extspa: 0,		extl2: 0,
		
	};
	
	hsa_param_t hsa;
	ether_addr_t mac;
	{

	/* Compare the HSA of expected, model, FPGA, and real IC. */
		layer3Config(0);			
#ifndef REAL_ASIC_ACCESS		
	#if defined(CONFIG_RTL_HARDWARE_NAT) && defined(CONFIG_RTL_LAYERED_DRIVER_ACL) 

		rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);	

	#endif
#endif	
		/*********************************************************************		
		Expect : Forward
		*********************************************************************/
		WRITE_MEM32(SWTCR0, (READ_MEM32(SWTCR0)&~LIMDBC_MASK) | LIMDBC_VLAN);
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
		hsb.dip=ntohl(inet_addr(HOST5_IP));
		hsb.sip=ntohl(inet_addr("192.168.1.2"));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);

		
		/*********************************************************************		
		PORT  BASE Routing
		Expect : Forward
		*********************************************************************/
		WRITE_MEM32(SWTCR0,(READ_MEM32(SWTCR0)&~LIMDBC_MASK) | LIMDBC_PORT);
		
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_WAN0_MAC),sizeof(ether_addr_t));
		hsb.spa=PN_PORT0;
		hsb.dip=ntohl(inet_addr(HOST5_IP));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_4);

		/*********************************************************************		
		PORT  BASE Routing
		Expect : NOT MATCH AND Layer2 Forward
		*********************************************************************/
		rtl8651_setPortToNetif(0,6);
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_4);
	
		/*********************************************************************		
		PORT  BASE Routing
		Expect : Routing and Forward
		*********************************************************************/
		hsb.spa=PN_PORT1;

		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);

		
		WRITE_MEM32( VCR0,READ_MEM32(VCR0) &~ EN_ALL_PORT_VLAN_INGRESS_FILTER); 
		hsb.vid=WAN0_VID;
		hsb.tagif=1;

		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);

		hsb.tagif=0;
		rtl8651_setPortToNetif(1,6);
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_4|PM_PORT_2);		
		
		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		WRITE_MEM32(SWTCR0,(READ_MEM32(SWTCR0) & ~LIMDBC_MASK)| LIMDBC_MAC);
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_WAN0_MAC),sizeof(ether_addr_t));
		hsb.spa=0;
		hsb.dip=ntohl(inet_addr(HOST5_IP));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);

		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		hsb.spa=PN_PORT1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		hsb.spa=PN_PORT2;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		hsb.spa=PN_PORT3;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);

		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		hsb.spa=PN_PORT3;
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
	//	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_4|PM_PORT_5);
		/*********************************************************************		
		MAC  BASE Routing
		Expect : Forward
		*********************************************************************/		
		hsb.spa=PN_PORT4;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	//	RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....",PM_PORT_1|PM_PORT_2,hsa.dp);
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
#if 0 //MAC mask have a bug, so we skip !	
		/*********************************************************************
		Testing 8 GATEWAY MACs
		*********************************************************************/
		layer3Config(0);		
		bzero(&intf,sizeof(intf));			
		strtomac(&intf.macAddr, GW_LAN0_MAC);
		intf.macAddr.octet[5]&=0xf0;
		intf.vid = LAN0_VID;
		intf.inAclStart = 0;
		intf.inAclEnd = 0;
		intf.outAclStart = intf.outAclEnd = 0;
		intf.valid=1;
		intf.macAddrNumber=8;
		intf.mtu=1500;
		intf.enableRoute=1; 
		rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
		
		WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
		bzero( &vlant, sizeof(vlant) );
		vlant.memberPortMask = (1<<hp[3]);
		vlant.untagPortMask = 0; //tagged
		rtl8651_setAsicVlan(intf.vid,&vlant);
		memcpy((void*)&hsb,(void*)&Ghsb,sizeof(hsb));
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
		hsb.da[5] =intf.macAddr.octet[5] |0x1;
		hsb.sip=ntohl(inet_addr("192.168.1.2")),
		hsb.dip=ntohl(inet_addr(HOST5_IP));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************		
		Expect : Forward
		*********************************************************************/
		hsb.dip=ntohl(inet_addr(HOST5_IP));
		hsb.da[5] |=0x2;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************		
		Expect : Forward
		*********************************************************************/
		hsb.da[5] |=0x3;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************		
		Expect : Forward
		*********************************************************************/
		hsb.da[5] |=0x7;
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_5);
		/*********************************************************************
		 VID 0 Routing 
		Expect : Piroirty TAG
		*********************************************************************/
		hsb.dip=ntohl(inet_addr(HOST4_IP));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward ,but ....", hsa.dp,PM_PORT_4);

#endif
	}
	retval = SUCCESS;	
	return retval;
}


int32 rtl865xC_testEnhancedGRE(void)
{
	return SUCCESS;
}
int32 rtl865xC_testIpOther(void)
{
	return SUCCESS;
}
int32 rtl865xC_testLayer3RoutingToCpu(void)
{
	hsb_param_t hsb =
	{
		spa: 3,		len: 64,
		vid: 0x0,		tagif: 0,
		pppoeif: 0,		sip: ntohl(inet_addr("192.168.1.2")),
		sprt: 1020,		dip:ntohl(inet_addr("120.168.1.3")),
		dprt: 80,			ipptl: 0xdd,
		iptos: 0x65,
		tcpfg: 0x00,		type: HSB_TYPE_UDP,	
		patmatch:0,		ethtype: 0x0800,
		ipfg:0,			ipfo0_n:0,
		sa:{0x00,0x80,0xc0,0x00,0x00,0x00},
		hiprior: 0,		snap: 0,
		udpnocs: 0,		ttlst: 2,
		dirtx: 0,			l3csok: 1,
		l4csok: 1,		
		llcothr: 0,			urlmch: 0,
		extspa: 0,		extl2: 0,
		
	};
	ether_addr_t mac;
		rtl865x_tblAsicDrv_routingParam_t routet;
		hsa_param_t hsa;		
		//ether_addr_t mac;
		/* Configure a pure routing environment  */
		layer3Config(0);
		//RTL_TESTMODEL_INIT_CHECK(rtl865xC_layer3Config(0));
#ifndef REAL_ASIC_ACCESS			
	#if defined(CONFIG_RTL_HARDWARE_NAT) && defined(CONFIG_RTL_LAYERED_DRIVER_ACL) 

		rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);	

	#endif
#endif		
		strtoip(&routet.ipAddr, "222.222.222.222");
		strtoip(&routet.ipMask, "255.255.255.128");
		routet.process = PROCESS_S_CPU;
		routet.internal = 1;
		rtl8651_setAsicRouting(2, &routet);
	
		/*********************************************************************		
		Expect : Forward
		*********************************************************************/
		memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
		hsb.dip=ntohl(inet_addr("222.222.222.234"));
		RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
		RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
		
		RTL_TESTMODEL_IS_EQUAL("hsa.dpc should be 1", hsa.dpc, 1 );
		RTL_TESTMODEL_IS_EQUAL("Pakcet should be trapped to CPU", hsa.dp, PM_PORT_NOTPHY );
		RTL_TESTMODEL_IS_EQUAL("Packet should be forwarded to CPU", hsa.dpext, PM_PORT_CPU) ;
		RTL_TESTMODEL_IS_EQUAL("CPU Reason[4:1] should be L34 Action Required (real, expect)", (hsa.why2cpu>>1)&0xf, 5/*L34 Action Required*/ );
		RTL_TESTMODEL_IS_EQUAL("CPU Reason[9:5] should be NPI(SIP) (real, expect)", (hsa.why2cpu>>5)&0x1f, 0x10/*NPI*/);
		RTL_TESTMODEL_IS_EQUAL("CPU Reason[14:10] should be NPI(DIP) (real, expect)", (hsa.why2cpu>>10)&0x1f, 0x10/*NPI*/ );	

	return SUCCESS;

}

int32  layer4Config( void )
{

	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
#ifdef 	REAL_ASIC_ACCESS	
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t intf;
	rtl865x_AclRule_t *aclt;
#else	
	struct rtl865x_netif_s netif;
#endif	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();
	default_register();
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[5],WAN0_VID);  /*host 5 pvid 1*/
	rtl8651_setAsicPvid(hp[4],9);   /*host 4 pvid 1*/
	rtl8651_setAsicPvid(hp[3],LAN0_VID);  /*host 3 pvid 0x3c7*/
	rtl8651_setAsicPvid(hp[2],11);  /*host 2 pvid 3*/
	rtl8651_setAsicPvid(hp[1],11);  /*host 1 pvid 3*/
	rtl8651_setAsicPvid(hp[0],11);  /*host 6 pvid 3*/

	
	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	rtl8651_setAsicOperationLayer(4);
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));

	 /* config vlan table */

#ifdef REAL_ASIC_ACCESS	 
	 bzero((void*) &intf, sizeof(intf));
	/* wan 0 */
	strtomac(&intf.macAddr, GW_WAN0_MAC);
	intf.macAddrNumber = 1;
	intf.vid = WAN0_VID;
	intf.mtu = 1500;
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	intf.enableRoute = 1;
	intf.valid = 1;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	memset(&netif, 0, sizeof(rtl865x_netif_t));
	memcpy(netif.name,"nas0_0test",MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_WAN0_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = WAN0_VID;
	netif.is_wan = 0;
	netif.is_slave = 0;
	netif.enableRoute=1;
	rtl865x_addNetif(&netif);
#endif	
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	
#ifdef REAL_ASIC_ACCESS	
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask= (1<<hp[5]);
	rtl8651_setAsicVlan(WAN0_VID,&vlant);
#else	
	if(rtl865x_addVlan(WAN0_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN0_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN0_VID,(1<<hp[5]),(1<<hp[5]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
#endif
#ifdef REAL_ASIC_ACCESS	
	 /* ingress filter gateway mac */

	aclt = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
	memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
	aclt->ruleType_ = RTL865X_ACL_MAC;
	aclt->actionType_ = RTL865X_ACL_PERMIT;
	aclt->pktOpApp_  = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(0, aclt);
#endif	
	 /* wan 1 */	
#ifdef REAL_ASIC_ACCESS
	strtomac(&intf.macAddr, GW_WAN1_MAC);
	intf.vid = WAN1_VID;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	
	memcpy(netif.name,"nas0_1test",MAX_IFNAMESIZE); 
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = WAN1_VID;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif


#ifdef REAL_ASIC_ACCESS	
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (1<<hp[4]);	

		rtl8651_setAsicVlan(WAN1_VID,&vlant);
#else
	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[4]),(1<<hp[4]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


#endif



	
#ifdef REAL_ASIC_ACCESS
	/* ingress filter gateway mac */	
	aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_		 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(4, aclt);
#endif
	/* lan 0 */

#ifdef REAL_ASIC_ACCESS

	strtomac(&intf.macAddr, GW_LAN0_MAC);
	intf.vid = LAN0_VID;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else

	memcpy(netif.name,RTL865xC_TEST_LAN_NETIFNAME,MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = LAN0_VID;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif


#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = 0xf;//(1<<hp[3]);
	vlant.untagPortMask = 0; //tagged

	rtl8651_setAsicVlan(LAN0_VID,&vlant);
#else
	if(rtl865x_addVlan(LAN0_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN0_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN0_VID,0xf,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
#endif
#ifdef REAL_ASIC_ACCESS

	/* ingress filter gateway mac */
	aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_	 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(8, aclt);
	
#endif		
	/* lan 1 */


#ifdef REAL_ASIC_ACCESS

	strtomac(&intf.macAddr, GW_LAN1_MAC);
	intf.vid = LAN1_VID;
	
	intf.inAclStart = 0;
	intf.inAclEnd = 0;
	intf.outAclStart = intf.outAclEnd = 0;	
	rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
	memcpy(netif.name,"br1",MAX_IFNAMESIZE);
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.if_type = IF_ETHER;
	netif.vid = LAN1_VID;
	netif.is_wan = 0;
	netif.is_slave = 0; 
	netif.enableRoute=1; 
	rtl865x_addNetif(&netif);
#endif

#ifdef REAL_ASIC_ACCESS

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (1<<hp[2])|(1<<hp[1])|(1<<hp[0]);
	rtl8651_setAsicVlan(LAN1_VID,&vlant);
#else
	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[6]),(1<<hp[2])|(1<<hp[1])|(1<<hp[6]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


#endif

	
#ifdef REAL_ASIC_ACCESS

	 /* ingress filter gateway mac */
	 aclt->ruleType_ = RTL865X_ACL_MAC;
	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);
	aclt->actionType_ = RTL865X_ACL_TOCPU;
	aclt->pktOpApp_	 = RTL865X_ACL_ALL_LAYER;
	_rtl865x_setAclToAsic(12, aclt);    
	
#endif	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	/* wan 0 isp modem */
	strtomac(&l2t.macAddr, WAN0_ISP_MAC);
	l2t.memberPortMask = (1<<hp[5]);
	l2t.isStatic = 1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(WAN0_ISP_MAC), 0, &l2t);
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[4]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 0 host */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[3]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);
	/* lan 1 host 1 */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.memberPortMask = (1<<hp[2]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);
	/* lan 1 host 0 */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);
	/* lan 1 host 5 */
	strtomac(&l2t.macAddr, HOST6_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST6_MAC), 0, &l2t);
	    
	/* config pppoe table */
	bzero((void*) &pppoet, sizeof(pppoet));
	pppoet.sessionId = WAN0_ISP_PPPOE_SID;
	rtl8651_setAsicPppoe(0, &pppoet);



	
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));
	/* wan 1 host */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	strtoip(&ip32, HOST4_IP);
	rtl8651_setAsicArp(ip32 & 0x7, &arpt);
	
	/* lan 0 host */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);
    
	/* lan 1 host 1 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST2_MAC);
	strtoip(&ip32, HOST2_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);		
	/* lan 1 host 0 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);
	/* lan 1 host 5 */
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST6_MAC);
	strtoip(&ip32, HOST6_IP);
	rtl8651_setAsicArp(16 + (ip32 & 0xff), &arpt);
	/* config routing table */
	bzero((void*) &routet, sizeof(routet));


	
	/* route to wan 1: use arp table [0:7] */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	strtoip(&routet.ipMask, GW_WAN1_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.arpStart = 0;
	routet.arpEnd = 0;
	routet.internal=0;
 	rtl8651_setAsicRouting(0, &routet);
	
	/* route to lan 0: use arp table [8:15] */
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	strtoip(&routet.ipMask, GW_LAN0_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart = 8;
	routet.arpEnd = 8;
	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);
	
	/* route to lan 1: use arp table [16:23] */
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	strtoip(&routet.ipMask, GW_LAN1_SUBNET_MASK);
	routet.process = PROCESS_INDIRECT;
	routet.vidx = rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart = 16;
	routet.arpEnd = 16;
	routet.internal=1;
	rtl8651_setAsicRouting(2, &routet);
	
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN0_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
	
	 /* config next hop table */
	 bzero((void*) &nxthpt, sizeof(nxthpt));
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	 bzero((void*) &nxthpt, sizeof(nxthpt));
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	nxthpt.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN0_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       

	nxthpt.nextHopRow = getL2TableRowFromMacStr(WAN0_ISP_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN0_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 1;
	rtl8651_setAsicNextHopTable(30, &nxthpt);       

	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 1;
	rtl8651_setAsicNextHopTable(29, &nxthpt);       	
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(31, &nxthpt);       
	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
	strtoip(&ipt.intIpAddr, "0.0.0.0");
	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 1;
	rtl8651_setAsicExtIntIpTable(1, &ipt);
	return 0;
	
}


int32 rtl865xC_testIPMulticast(void)
{
	hsa_param_t hsa;
	int32 retval = SUCCESS;
	rtl865x_tblAsicDrv_multiCastParam_t mcast; 
	hsb_param_t hsb ;
	uint32 multi_mtu;
	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;
#ifdef REAL_ASIC_ACCESS	
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t intf;
	rtl865x_AclRule_t *aclt;
#endif
	memcpy((void*)&hsb,(void*)&Ghsb,sizeof(hsb));

	/* Compare the HSA of expected, model, FPGA, and real IC. */

	{	
			layer4Config(); 	
#ifndef REAL_ASIC_ACCESS		
	#if defined(CONFIG_RTL_HARDWARE_NAT) && defined(CONFIG_RTL_LAYERED_DRIVER_ACL) 

			rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	#endif
#endif			
			/*strtomac(&intf.macAddr, GW_LAN0_MAC);*/

			/**********************************************************************
			0. Config: IP Multicast Table
			   SVID:10, sport=3, mbr=P0,P1,P2,P3
			**********************************************************************/
			multi_mtu=1500;
			rtl8651_setAsicMulticastMTU(multi_mtu);
			rtl8651_setAsicMulticastEnable(TRUE);

			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("192.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=PN_PORT3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			
			/**********************************************************************
			1. IP Multicast Packet 224.0.0.3
			   expect hsa.trip WAN0_ISP_PUBLIC_IP
			**********************************************************************/
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.tagif=0;
			hsb.pppoeif=0;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("IP should be TRIP, but .......",hsa.trip,ntohl(inet_addr(WAN0_ISP_PUBLIC_IP))) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			2. IP Multicast Packet 224.0.0.3
			   Payload length(46B) is just match to MTU
			   Expect Forward
			**********************************************************************/
			multi_mtu=46;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.tagif=0;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet should be forward, but .......",hsa.dp,mcast.mbr) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			3. IP Multicast Packet 224.0.0.3
			   Payload length(46B) exceeds MTU(45B)
			   Expect to CPU
			**********************************************************************/
			multi_mtu=45;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.tagif=0;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("hsa.dpc should be 1", hsa.dpc, 1) ;
			RTL_TESTMODEL_IS_EQUAL("Packet should be forwarded to CPU", hsa.dp, PM_PORT_NOTPHY) ;
			RTL_TESTMODEL_IS_EQUAL("Packet should be forwarded to CPU", hsa.dpext, PM_PORT_CPU) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			RTL_TESTMODEL_IS_EQUAL("Bit[4:1] of CPU Reason is wrong (real, expect)", hsa.why2cpu&0x1e, 0x4<<1/*ACL filtered, but before DMAC==GMAC*/ );
			
			/**********************************************************************
			4. IP Multicast Packet 224.0.0.3
			   Payload length(42B, -4[vlan]) under MTU(45B)
			   Expect to forward
			**********************************************************************/
			multi_mtu=45;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.type=HSB_TYPE_UDP;
			hsb.tagif=1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			RTL_TESTMODEL_IS_EQUAL("Packet should be forward, but .......",hsa.dp,mcast.mbr) ;
			
			/**********************************************************************
			5. IP Multicast Packet 224.0.0.3
			   expect hsa.trip WAN0_ISP_PUBLIC_IP
			   Payload length(42B) exceeds MTU (41B)
			   Expect to CPU
			**********************************************************************/
			multi_mtu=41;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("192.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=PN_PORT3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.type=HSB_TYPE_UDP;
			hsb.tagif=1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet should be CPU, but .......",hsa.dpext,PM_PORT_CPU) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			6. IP Multicast Packet 224.0.0.3
			   expect hsa.trip WAN0_ISP_PUBLIC_IP
			   MTU exceed but disable multicast (pure layer2 operation)
			   Expect :forward
			**********************************************************************/
			rtl8651_setAsicMulticastEnable(FALSE);
			WRITE_MEM32(FFCR, READ_MEM32(FFCR)&~EnUnkMC2CPU);
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("192.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=PN_PORT3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet should be CPU, but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			
			/**********************************************************************
			7. IP Multicast Packet 224.0.0.4
			   DMAC:01-00-5e-00-00-02 is unknown MAC (Multicast is enabled, MTU=1500)
			   expect to CPU
			**********************************************************************/ 		
			multi_mtu=1500; 
			rtl8651_setAsicMulticastMTU(multi_mtu);
			rtl8651_setAsicMulticastEnable(TRUE);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-02"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.5"));
			hsb.spa=PN_PORT3;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_CPU);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			RTL_TESTMODEL_IS_EQUAL("Bit[4:1] of CPU Reason is wrong (real, expect)", hsa.why2cpu&0x1e, 0x4<<1/*ACL filtered, but before DMAC==GMAC*/ );
			
			/**********************************************************************
			8. IP Multicast Packet 224.0.0.3 
			   TAG Packet (normal forward, just like 1 and 4)
			   expect hsa.trip WAN0_ISP_PUBLIC_IP
			**********************************************************************/
			rtl8651_setAsicMulticastEnable(TRUE);

			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("192.168.1.1"));
			mcast.mbr=PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=PN_PORT3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.tagif=1;
			hsb.vid=LAN0_VID;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("IP should be translated, but .......",hsa.trip,ntohl(inet_addr(WAN0_ISP_PUBLIC_IP))) ;
			RTL_TESTMODEL_IS_EQUAL("Packet  should be forward , but .......",hsa.dp,mcast.mbr) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			9. IP Multicast Packet 224.0.0.3 
			   ACL[5]: ONLY_L4 --> trap to CPU
			   ACL[6]: ONLY_L3 --> PERMIT
			   expect forward and hsa.trip=WAN0_ISP_PUBLIC_IP
			**********************************************************************/
#ifdef REAL_ASIC_ACCESS			

			strtomac(&intf.macAddr, GW_LAN0_MAC);
			intf.vid = LAN0_VID;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.mtu = 1500;
			intf.inAclStart =5;
			intf.inAclEnd = 6;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.enableRoute = 1;
			intf.macAddrNumber=1;
			intf.valid = 1;
			retval=rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );


			aclt = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
			memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
			aclt->ruleType_ = RTL865X_ACL_MAC;
			aclt->actionType_ = RTL865X_ACL_TOCPU;
			aclt->pktOpApp_  = RTL865X_ACL_ONLY_L4;
			_rtl865x_setAclToAsic(5, aclt);

			memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
			aclt->ruleType_ = RTL865X_ACL_MAC;
			aclt->actionType_ = RTL865X_ACL_PERMIT;
			aclt->pktOpApp_  = RTL865X_ACL_ONLY_L3;
			_rtl865x_setAclToAsic(6, aclt);

#else
		{
			rtl865x_AclRule_t *rule;
			rule = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
			if(!rule)
			{				
			printk("\n!!!!!!%s(%d): No memory freed for kmalloc!!!",__FUNCTION__,__LINE__);
			return FAILED;
			}		
			memset(rule, 0,sizeof(rtl865x_AclRule_t));	
			rule->ruleType_ = RTL865X_ACL_MAC;
			rule->actionType_ = RTL865X_ACL_TOCPU;
			rule->pktOpApp_ = RTL865X_ACL_ONLY_L4;
			rule->direction_ = RTL865X_ACL_INGRESS;	
			rtl865x_add_acl(rule,RTL865xC_TEST_LAN_NETIFNAME, RTL865X_ACL_IPv4MUL,0,1);

			memset(rule, 0,sizeof(rtl865x_AclRule_t));	
			rule->ruleType_ = RTL865X_ACL_MAC;
			rule->actionType_ = RTL865X_ACL_PERMIT;
			rule->pktOpApp_ = RTL865X_ACL_ONLY_L3;
			rule->direction_ = RTL865X_ACL_INGRESS;	
			rtl865x_add_acl(rule,RTL865xC_TEST_LAN_NETIFNAME, RTL865X_ACL_IPv4MUL,0,1);
		
			kfree(rule);
		}
#endif
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=PN_PORT3;
			hsb.tagif=1;
			hsb.vid=LAN0_VID;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("IP should be translated, but .......",hsa.trip,ntohl(inet_addr(WAN0_ISP_PUBLIC_IP))) ;
			RTL_TESTMODEL_IS_EQUAL("Packet  should be forward , but .......",hsa.dp,mcast.mbr) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			10. IP Multicast Packet 224.0.0.3 
				Disable netif l34 routing
				expect hsa.trip WAN0_ISP_PUBLIC_IP
				expect to layer2 operatoin
			**********************************************************************/ 	
#ifdef REAL_ASIC_ACCESS			
			strtomac(&intf.macAddr, GW_LAN0_MAC);
			intf.vid = LAN0_VID;
			intf.enableRoute=0;
			intf.inAclStart = 0;
			intf.inAclEnd = 0;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.mtu = 1500;
			intf.inAclStart = 0;
			intf.inAclEnd = 0;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.enableRoute = 0;
			intf.macAddrNumber=1;
			intf.valid = 1;
			retval=rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else		
{
			rtl865x_netif_local_t *netif = NULL;
			netif=_rtl865x_getNetifByName(RTL865xC_TEST_LAN_NETIFNAME);
			rtl865x_disableNetifRouting(netif);
//			kfree(netif);
}
#endif
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet  should be forward , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			11. Expect layer2 operation due to l3/4 routing disable
				Seems the same as 10.
			**********************************************************************/

			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet  should be forward , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;

			/**********************************************************************
			12. ACL[5] not include L3/L4 when ip mulicast is layer2 operation 
				Expect: apply layer2   
			**********************************************************************/
#ifdef REAL_ASIC_ACCESS			
			strtomac(&intf.macAddr, GW_LAN0_MAC);
			intf.vid = LAN0_VID;
			intf.enableRoute=0;
			intf.inAclStart = 0;
			intf.inAclEnd = 0;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.mtu = 1500;
			intf.inAclStart =5;
			intf.inAclEnd = 6;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.enableRoute = 0;
			intf.macAddrNumber=1;
			intf.valid = 1;
			retval=rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
	
			memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
			aclt->ruleType_ = RTL865X_ACL_MAC;
			aclt->actionType_ = RTL865X_ACL_TOCPU;
			aclt->pktOpApp_  = RTL865X_ACL_L3_AND_L4;
			_rtl865x_setAclToAsic(5, aclt);

			memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
			aclt->ruleType_ = RTL865X_ACL_MAC;
			aclt->actionType_ = RTL865X_ACL_PERMIT;
			aclt->pktOpApp_  = RTL865X_ACL_ALL_LAYER;
			_rtl865x_setAclToAsic(6, aclt);

#else

		{
			rtl865x_AclRule_t *rule;
			int32 retval2 = SUCCESS;
			rule = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
			if(!rule)
			{				
			printk("\n!!!!!!%s(%d): No memory freed for kmalloc!!!",__FUNCTION__,__LINE__);
			return FAILED;
			}		
			memset(rule, 0,sizeof(rtl865x_AclRule_t));	
			rule->ruleType_ = RTL865X_ACL_MAC;
			rule->actionType_ = RTL865X_ACL_TOCPU;
			rule->pktOpApp_ = RTL865X_ACL_L3_AND_L4;
			rule->direction_ = RTL865X_ACL_INGRESS; 
			retval2=rtl865x_add_acl(rule,RTL865xC_TEST_LAN_NETIFNAME, RTL865X_ACL_IPv4MUL,0,1);

			memset(rule, 0,sizeof(rtl865x_AclRule_t));	
			rule->ruleType_ = RTL865X_ACL_MAC;
			rule->actionType_ = RTL865X_ACL_PERMIT;
			rule->pktOpApp_ = RTL865X_ACL_ALL_LAYER;
			rule->direction_ = RTL865X_ACL_INGRESS; 
			retval2=rtl865x_add_acl(rule,RTL865xC_TEST_LAN_NETIFNAME, RTL865X_ACL_IPv4MUL,0,1);

			kfree(rule);
		}
#endif
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-06"),sizeof(ether_addr_t));
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet  should be forward , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
		

			/**********************************************************************
			13. Egress ACL[20]: all ==> trap to CPU
				Expect TO CPU
			**********************************************************************/
			WRITE_MEM32(FFCR, READ_MEM32(FFCR)|EnUnkMC2CPU);
#ifdef REAL_ASIC_ACCESS			
			intf.outAclStart=intf.outAclEnd = 20;
			retval=rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
			
			
			memset(aclt, 0,sizeof(rtl865x_AclRule_t)); 
			aclt->ruleType_ = RTL865X_ACL_MAC;
			aclt->actionType_ = RTL865X_ACL_TOCPU;
			aclt->pktOpApp_  = RTL865X_ACL_ALL_LAYER;

			_rtl865x_setAclToAsic(20, aclt);
#else
			
		{
			rtl865x_AclRule_t *rule;
			int32 retval2 = SUCCESS;
			rule = kmalloc(sizeof(rtl865x_AclRule_t), GFP_KERNEL);
			if(!rule)
			{				
			printk("\n!!!!!!%s(%d): No memory freed for kmalloc!!!",__FUNCTION__,__LINE__);
			return FAILED;
			}			
			memset(rule, 0,sizeof(rtl865x_AclRule_t));	
			rule->ruleType_ = RTL865X_ACL_MAC;
			rule->actionType_ = RTL865X_ACL_TOCPU;
			rule->pktOpApp_ = RTL865X_ACL_ALL_LAYER;
			rule->direction_ = RTL865X_ACL_INGRESS; 
			retval2=rtl865x_add_acl(rule,RTL865xC_TEST_LAN_NETIFNAME, RTL865X_ACL_IPv4MUL,0,1);			
			kfree(rule);
		}
		
#endif			
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet  should be CPU , but .......",hsa.dpext,PM_PORT_CPU) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;

			/**********************************************************************
			 * restore netif setting (netif.enableRoute=FALSE)
			 **********************************************************************/
#ifdef REAL_ASIC_ACCESS			 
			bzero( &vlant, sizeof(vlant) );
			vlant.memberPortMask = (1<<3);
			vlant.untagPortMask = 0; //tagged	
			/* ingress filter gateway mac */
			strtomac(&intf.macAddr, GW_LAN0_MAC);
			intf.vid = LAN0_VID;
			intf.enableRoute=0;
			intf.inAclStart = 0;
			intf.inAclEnd = 0;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.mtu = 1500;
			intf.inAclStart = 0;
			intf.inAclEnd = 0;
			intf.outAclStart = intf.outAclEnd = 0;
			intf.enableRoute = 1;
			intf.macAddrNumber=1;
			intf.valid = 1;
			retval=rtl8651_setAsicNetInterface( RTL865XC_NETIFTBL_SIZE, &intf );
#else
{
			rtl865x_netif_local_t *netif = NULL;
			netif=_rtl865x_getNetifByName(RTL865xC_TEST_LAN_NETIFNAME);
			rtl865x_enableNetifRouting(netif);
				//	kfree(netif);
			}
#endif
		
			/**********************************************************************
			14. Source Port Mismatch
				expect DROP
			**********************************************************************/
			rtl8651_setAsicIpMulticastTable(&mcast);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=2;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Packet  should be drop",hsa.dp,0) ;
			RTL_TESTMODEL_IS_EQUAL("hsa.dpc should be equal to 0", hsa.dpc, 0) ;
#if 0
	/* please see RTL8198_SWRevision_20090924.doc
	the IP multicast table has no "Source Vlan ID" field in 8196c formal chip
	*/
#if !defined(CONFIG_RTL_8196C_REV_B) && !defined(CONFIG_RTL_8198_REV_B)
			/**********************************************************************
			15. SVID Mismatch
				expect : drop
			**********************************************************************/
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=3;
			hsb.vid=LAN1_VID;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Packet  should be drop , but .......",hsa.dp,0) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be equal to 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			16. Enable 1Q_UNWARE. So even SVID is dismatch, ASIC can forward this packet based on port-based VID.
				expect hsa.trip WAN0_ISP_PUBLIC_IP
			**********************************************************************/
			WRITE_MEM32( VCR0,READ_MEM32(VCR0)| EN_1QTAGVIDIGNORE); 		
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("IP should be translated",hsa.trip,ntohl(inet_addr(WAN0_ISP_PUBLIC_IP))) ;
			RTL_TESTMODEL_IS_EQUAL("Packet should be forward",hsa.dp,mcast.mbr) ;
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
#endif			
#endif
			/**********************************************************************
			17. Wan2Lan
				PPPoE unicast Packet 
				Downstream (Only )
				IP Multicast Packet 224.0.0.3 
				TAG Packet 
			**********************************************************************/
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("142.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("142.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=3;
			hsb.tagif=1;
			hsb.vid=LAN0_VID;
			hsb.type=HSB_TYPE_IGMP;
			hsb.pppoeif=1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			//RTL_TESTMODEL_IS_EQUAL_MAC(" MAC should be translated ....",hsa.nhmac,mac);
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be drop , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			18. LAN to WAN
				DMAC:01-00-5e-00-00-03
				MAC and IP Dismatch
				expect to CPU
			**********************************************************************/
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.4"));
			hsb.spa=3;
			hsb.tagif=0;
			hsb.type=HSB_TYPE_UDP;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be drop , but .......",hsa.dpext,PM_PORT_CPU);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			19. IP Multicast Packet IP	224.0.0.3
				DMAC:01-00-5e-00-00-03
				Multicast mask = P0,P1,P2,P3
				L2 mask = P0
				L2 table entry can't override IP Multicast Table
				Expect Forward
			**********************************************************************/
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("192.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3;
			mcast.svid=LAN0_VID;
			mcast.port=3;
			retval=rtl8651_setAsicIpMulticastTable(&mcast);

			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac," 01-00-5e-00-00-03"),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("192.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			bzero(&l2t,sizeof(l2t));
			strtomac(&l2t.macAddr, " 01-00-5e-00-00-03");
			l2t.memberPortMask = PM_PORT_0;
			l2t.isStatic=1; 		
			rtl8651_setAsicL2Table(getL2TableRowFromMacStr("01-00-5e-00-00-03"), 0, &l2t);
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL_MAC(" MAC should be translated ....",hsa.nhmac,mac);
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward , but .......",hsa.dp,PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;

			/**********************************************************************
			20. Wan2Lan
				Member Two Extension Ports
				PPPoE unicast Packet 
				Expect to Ext0 and Ext2
			**********************************************************************/
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("142.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3|(PM_PORT_EXT0<<RTL8651_PORT_NUMBER)|(PM_PORT_EXT2<<RTL8651_PORT_NUMBER);
			mcast.svid=LAN0_VID;
			mcast.port=3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			memcpy((void*)&hsb.da[0],(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
			hsb.sip=ntohl(inet_addr("142.168.1.1"));
			hsb.dip=ntohl(inet_addr("224.0.0.3"));
			hsb.spa=3;
			hsb.tagif=1;
			hsb.vid=LAN0_VID;
			hsb.type=HSB_TYPE_IGMP;
			hsb.pppoeif=1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
//			RTL_TESTMODEL_IS_EQUAL_MAC(" MAC should be translated ....",hsa.nhmac,mac);
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp,PM_PORT_NOTPHY|PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3 );
			RTL_TESTMODEL_IS_EQUAL("hsa.dpext",hsa.dpext,PM_PORT_EXT0|PM_PORT_EXT2 );
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;

			/**********************************************************************
			21. Wan2Lan
				FFCR : IP Multicast To CPU
				Expect to CPU
			**********************************************************************/
			WRITE_MEM32(FFCR,(READ_MEM32(FFCR) & ~IPMltCstCtrl_MASK)|IPMltCstCtrl_TrapToCpu);
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp,PM_PORT_NOTPHY );
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_CPU );
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
				Change extension port member port mask
			**********************************************************************/
			WRITE_MEM32(FFCR,(READ_MEM32(FFCR) & ~IPMltCstCtrl_MASK)|IPMltCstCtrl_Enable);
			bzero((void*) &mcast,sizeof(mcast));
			mcast.dip= ntohl(inet_addr("224.0.0.3"));
			mcast.sip=ntohl(inet_addr("142.168.1.1"));
			mcast.mbr=PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3|(PM_PORT_EXT1<<RTL8651_PORT_NUMBER)|(PM_PORT_EXT2<<RTL8651_PORT_NUMBER);
			mcast.svid=LAN0_VID;
			mcast.port=3;
			rtl8651_setAsicIpMulticastTable(&mcast);
			
			/**********************************************************************
			22. Wan2Lan
				Payload length(38B, minused PPPoE header) just makes MTU(38B)
				Expect forward
			**********************************************************************/
			multi_mtu=38;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			hsb.pppoeif = 1;
			hsb.tagif = 0;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	
			strtomac(&mac,"01-00-5e-00-00-03");
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp, PM_PORT_NOTPHY|PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3 );
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_EXT1|PM_PORT_EXT2 );
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			23. Wan2Lan
				Payload length(38B) exceeds MTU(37B)
				Expect to CPU
			**********************************************************************/
			multi_mtu=37;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			hsb.tagif = 0;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp,PM_PORT_NOTPHY);
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_CPU);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			24. Wan2Lan
				Payload length(34B, minused VLAN header) just make MTU(34B)
				Expect forward
			**********************************************************************/
			multi_mtu=34;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			hsb.tagif = 1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
				RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));

			strtomac(&mac,"01-00-5e-00-00-03");
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp, PM_PORT_NOTPHY|PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3);
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_EXT1|PM_PORT_EXT2);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			
			/**********************************************************************
			25. Wan2Lan
				Payload length(34B) exceeds MTU(33B)
				Expect to CPU
			**********************************************************************/
			multi_mtu=33;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			hsb.tagif = 1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			strtomac(&mac,"01-00-5e-00-00-03");
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp,PM_PORT_NOTPHY);
			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_CPU);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;

			/**********************************************************************
			26. Wan2Lan (trap to CPU)
				Payload length(34B, minused VLAN header) just make MTU(34B)
				Expect forward to physical ports and to CPU
			**********************************************************************/
			{ /* set cpu bit */
				rtl865xc_tblAsic_ipMulticastTable_t entry;
				uint32 index;

				index = rtl8651_ipMulticastTableIndex( mcast.dip, mcast.sip );
				retval = _rtl8651_readAsicEntry( TYPE_MULTICAST_TABLE, index, &entry );

				entry.toCPU = TRUE;
				retval = _rtl8651_forceAddAsicEntry( TYPE_MULTICAST_TABLE, index, &entry );

			}
			multi_mtu=34;	
			rtl8651_setAsicMulticastMTU(multi_mtu);
			hsb.tagif = 1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
			RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
			strtomac(&mac,"01-00-5e-00-00-03");
			RTL_TESTMODEL_IS_EQUAL("hsa.dp",hsa.dp, PM_PORT_NOTPHY|PM_PORT_0|PM_PORT_1|PM_PORT_2|PM_PORT_3);

			RTL_TESTMODEL_IS_EQUAL("Pakcet should be forward, but .......",hsa.dpext,PM_PORT_EXT1|PM_PORT_EXT2);
			RTL_TESTMODEL_IS_NOT_EQUAL("hsa.dpc should be more than 0", hsa.dpc, 0) ;
			{ /* recover */
				rtl865xc_tblAsic_ipMulticastTable_t entry;
				uint32 index;

				index = rtl8651_ipMulticastTableIndex( mcast.dip, mcast.sip );
				retval = _rtl8651_readAsicEntry( TYPE_MULTICAST_TABLE, index, &entry );
				entry.toCPU = FALSE;
				retval = _rtl8651_forceAddAsicEntry( TYPE_MULTICAST_TABLE, index, &entry );

			}

			
	}


	return SUCCESS;

}


int32 rtl865xC_testLayer3MTU(void)
{
	
	hsa_param_t hsa;	
	hsb_param_t hsb =
	{
		spa: RTL865xC_TEST_LAN_HOST0_PHYPORT,		len:1300,
		vid: 0x0,		tagif: 0,
		pppoeif: 0,		sip: ntohl(inet_addr(RTL865xC_TEST_LAN_HOST0_IP)),
		sprt: 1020,		dip: ntohl(inet_addr(RTL865xC_TEST_WAN0_HOST_IP)),
		dprt: 80,			ipptl: 0xdd,
		ipfg: 0x0,		iptos: 0x65,
		tcpfg: 0x00,		type: HSB_TYPE_UDP,	
		patmatch:0,		ethtype: 0x0800,
		ipfo0_n:0,
		hiprior: 0,		snap: 0,
		udpnocs: 0,		ttlst:2,
		dirtx: 0,			l3csok: 1,
		l4csok: 1,		
		llcothr: 0,		urlmch: 0,
		extspa: 0,		extl2: 0,
		
	};
	strtomac((ether_addr_t *)hsb.sa, RTL865xC_TEST_LAN_HOST0_MAC);
	strtomac((ether_addr_t *)hsb.da, RTL865xC_TEST_LAN_GMAC);

	/* Configure a pure routing environment  */
//	RTL_TESTMODEL_INIT_CHECK(rtl865xC_layer3Config(RTL865xC_TEST_WANTYPE_UNTAG_PURE_ROUTING,0));
	#if defined(CONFIG_RTL_HARDWARE_NAT) && defined(CONFIG_RTL_LAYERED_DRIVER_ACL) 
	rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);	
	#endif

	/* Start Test 1 : Use the packet whose length <= MTU, should  hwacc normally */
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be hwacc normally,but ....", hsa.dp,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be hwacc normally,but ....", hsa.dpext,0);


	/* Start Test 2 : Use the packet whose length > MTU, should  trap to cpu  */
	hsb.len = 1600;
	RTL_TESTMODEL_INIT_CHECK(virtualMacSetHsb(&hsb));
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be to CPU,but ....", hsa.dp,PM_PORT_NOTPHY);
	RTL_TESTMODEL_IS_EQUAL("Pakcet should be to CPU,but ....", hsa.dpext,PM_PORT_CPU);	

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
}


/* Test Downstream Mulitcast , port 0 to port 1*/
static int32 _rtl865xC_testPktIPMulticast(int layer,int isPPPoE)
{
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	hsa_param_t hsa;	


	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;
	
	if(layer==2 && isPPPoE==0)
	{
//		RTL_TESTMODEL_INIT_CHECK(rtl865xC_layer3Config(RTL865xC_TEST_WANTYPE_UNTAG_BRIDGE,0));
		strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
		strtomac(&multicast_stream_dmac," 01-00-5e-00-00-03");
		strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
		strtoip(&multicast_stream_dip, "224.0.0.3");
		strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);
	}
	else if(layer==3 && isPPPoE==0)
	{
//		RTL_TESTMODEL_INIT_CHECK(rtl865xC_layer3Config(RTL865xC_TEST_WANTYPE_UNTAG_PURE_ROUTING,0));
		strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN0_HOST_MAC);
		strtomac(&multicast_stream_dmac," 01-00-5e-00-00-03");
		strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN0_HOST_IP);
		strtoip(&multicast_stream_dip, "224.0.0.3");
		strtomac(&wan_gmac,RTL865xC_TEST_WAN0_GMAC);
	}
	else if(layer==3 && isPPPoE==1)
	{
//		RTL_TESTMODEL_INIT_CHECK(rtl865xC_layer3Config(RTL865xC_TEST_WANTYPE_UNTAG_PURE_ROUTING,1));
		strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN2_HOST_MAC);
		strtomac(&multicast_stream_dmac,RTL865xC_TEST_WAN2_GMAC);
		strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN2_HOST_IP);
		strtoip(&multicast_stream_dip, "224.0.0.3");
		strtomac(&wan_gmac,RTL865xC_TEST_WAN2_GMAC);
	}
	else
		return RTL_TESTMODEL_TESTCASE_RUN_INIT_FAILED;

	/* Add Downstream Multicast entry into hw table */
	RTL_TESTMODEL_INIT_CHECK(rtl865x_addMulticastEntry(multicast_stream_dip,multicast_stream_sip
						,0,RTL865xC_TEST_WAN_HOST_PHYPORT,RTL865xC_TEST_LAN_HOST0_PHYPORT_MASK ));


	
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= RTL865xC_TEST_STREAM0_TTL;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	if(isPPPoE)
	{
		conf.pppoe.type 			= ETH_P_PPP_SES;
		conf.pppoe.session		= 0;
		conf.l2Flag 				= L2_PPPoE;
	}

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	
	/* Input */
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));

	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST0_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST0_PHYPORT_MASK);

	/* Compare Output data with expected data 
		1. if output port is not in input's vlan mbr (routing) 
				: DA changes to {01005e, 0, dip[22:0]}
				: SA changes to the GMAC of "input netif"  (weird...,should be "output netif" , has already reportd to designer YoYo)
		2. remove valan and PPPoE tag
	*/	
	if(layer==3)
	{
		//conf.ip.ttl  = RTL865xC_TEST_STREAM0_TTL-1;
		stringToConfMac(conf.conf_dmac," 01-00-5e-00-00-03");
		memcpy(conf.conf_smac,&wan_gmac,ETHER_ADDR_LEN);
	}	
	if(isPPPoE)
		conf.l2Flag = 0;
	
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	
	
	RTL_TESTMODEL_INIT_CHECK(virtualMacGetHsa(&hsa));	
//	RTL_TESTMODEL_COMPARE_PKT(pktBuf_Expect,pktLen_Expect,pktBuf,pktLen-4,(&hsa));	
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);




	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
}

/* Test Downstream Mulitcast , port 0 to port 1*/

#define sampleTestCase 1
#if sampleTestCase


int32 rtl8198C_testPktIPMulticastPPPoERouing(void)
{
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	enum PORT_MASK rxPort;	
	int i=0,ret;
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t netif;
	ether_addr_t macAddr;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;
	hsa_param_t hsa;

	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;

	DBG_TESTMODEL_L34_TEST_PRK("Config ....\n");
	DBG_TESTMODEL_L34_TEST_PRK("   ==>port-based vlan table...\n");
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(0,WAN0_VID);
	rtl8651_setAsicPvid(1,LAN0_VID);
	rtl8651_setAsicPvid(2,LAN0_VID);
	rtl8651_setAsicPvid(3,LAN0_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,WAN0_VID);
	rtl8651_setAsicPvid(6,LAN0_VID);
	rtl8651_setAsicPvid(7,LAN0_VID);
	rtl8651_setAsicPvid(8,LAN0_VID);

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));

	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	DBG_TESTMODEL_L34_TEST_PRK("   ==>network interface table...\n");
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
	netif.vid = WAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	DBG_TESTMODEL_L34_TEST_PRK("   ==>vlan table...\n");
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<4) | (0x1<<3) | (0x1<<2) | (0x1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);
	
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<5) | (0x1<<0);
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN0_VID,&vlant);

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_BYPASS);

	DBG_TESTMODEL_L34_TEST_PRK("   ==>IP Multicast table...\n");
	//IPM table 
	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	strtoip(&mCast_t.dip,"224.1.2.3");
	strtoip(&mCast_t.sip,RTL865xC_TEST_WAN0_HOST_IP);
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0x16;	
	mCast_t.port = 0;
	rtl8651_setAsicIpMulticastTable(&mCast_t);

	memset((void*) &pppoet,0, sizeof(pppoet));
	pppoet.sessionId = 0x2;
	pppoet.age = 100;
	rtl8651_setAsicPppoe(0, &pppoet);

	DBG_TESTMODEL_L34_TEST_PRK("Gerenate input packet ... \n");
	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN0_HOST_MAC);
	strtomac(&multicast_stream_dmac,"00-00-11-AA-AA-AA");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN0_HOST_IP);
	strtoip(&multicast_stream_dip, "224.1.2.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.pppoe.type = 0x0800;
			conf.l2Flag = 0;
			conf.ip.ttl = 127;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* =======================================================
	   Test IPMC PPPoE packets egress VLAn tag MUST BE REMOVED
	   ======================================================= */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_REMOVE);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x0800;
			conf.l2Flag = 0;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* ==============================================
	   Test IPMC PPPoE packets egress BYPASS VLAn tag
	   ============================================== */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_BYPASS);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x0800;
			conf.l2Flag = 0;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* ==============================================
	   Test IPMC PPPoE packets egress Remarking VLAn tag
	   ============================================== */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_REMARK | (0x123<<CF_IPM4VID_OFFSET));

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x0800;
			conf.l2Flag = 0;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* ==============================================
	   Test IPMC PPPoE packets egress ADD VLAn tag
	   ============================================== */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_ADD | (0x123<<CF_IPM4VID_OFFSET));

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = (0x1<<4) | (0x1<<3) | (0x1<<2) | (0x1<<1);
	vlant.untagPortMask = (0x1<<4) | (0x1<<2);
	vlant.fid=0;
	rtl8651_setAsicVlan(0x123,&vlant);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x8100;
			conf.l2Flag = L2_VLAN;
			conf.vlan.vid = 0x123;
			conf.vlan.cfi = 0;
			conf.vlan.prio = 0;
 			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* =======================================================
	   Test IPMC PPPoE packets egress VLAN tag MUST BE REMOVED
	   ======================================================= */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_REMOVE);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE | L2_VLAN;
	conf.vlan.vid					= WAN0_VID;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x0800;
			conf.l2Flag = 0;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* ==============================================
	   Test IPMC PPPoE packets egress BYPASS VLAN tag
	   ============================================== */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_BYPASS);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = (0x1<<5) | (0x1<<0);
	vlant.untagPortMask = (0x1<<0);
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN0_VID,&vlant);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE | L2_VLAN;
	conf.vlan.vid					= WAN0_VID;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x8100;
			conf.l2Flag = L2_VLAN;
			conf.vlan.vid = WAN0_VID;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* =================================================
	   Test IPMC PPPoE packets egress Remarking VLAN tag
	   ================================================= */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_REMARK | (0x123<<CF_IPM4VID_OFFSET));

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = (0x1<<4) | (0x1<<3) | (0x1<<2) | (0x1<<1);
	vlant.untagPortMask = (0x1<<4) | (0x1<<2);
	vlant.fid=0;
	rtl8651_setAsicVlan(0x123,&vlant);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE | L2_VLAN;
	conf.vlan.vid					= WAN0_VID;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x0800;
			conf.l2Flag = L2_VLAN;
			conf.vlan.vid = 0x123;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	/* ==============================================
	   Test IPMC PPPoE packets egress ADD VLAn tag
	   ============================================== */
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_ADD | (0x123<<CF_IPM4VID_OFFSET));

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = (0x1<<4) | (0x1<<3) | (0x1<<2) | (0x1<<1);
	vlant.untagPortMask = (0x1<<4) | (0x1<<2);
	vlant.fid=0;
	rtl8651_setAsicVlan(0x123,&vlant);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;
	conf.l2Flag						= L2_PPPoE | L2_VLAN;
	conf.vlan.vid					= WAN0_VID;
	conf.pppoe.type 				= 0x8864;
	conf.pppoe.session				= 0x2;
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x16)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				rtl_dump_hs();
				return FAILED;
			}
			strtomac(conf.conf_smac, "00-00-11-AA-AA-AA");	/* Bug: SMAC would be replaced by ingress interface MAC */
			strtomac(conf.conf_dmac, "01-00-5e-01-02-03");
			conf.ip.ttl = 127;
			conf.pppoe.type = 0x8100;
			conf.l2Flag = L2_VLAN;
			conf.vlan.vid = 0x123;
			conf.vlan.cfi = 0;
			conf.vlan.prio = 0;
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d should egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("But virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				rtl_dump_hs();
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0x16);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);	

	return SUCCESS;
}

int32 rtl8198C_testPktIPMulticastUnmatchSPA(void)
{
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	int i=0,ret;
	rtl8651_PktConf_t conf;
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t netif;
	ether_addr_t macAddr;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;
	hsa_param_t hsa;

	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;

	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
	strtomac(&multicast_stream_dmac,"01-00-5e-00-00-03");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&multicast_stream_dip, "224.0.0.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);

	DBG_TESTMODEL_L34_TEST_PRK("Config ....\n");
	DBG_TESTMODEL_L34_TEST_PRK("   ==>port-based vlan table...\n");
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(0,LAN0_VID);
	rtl8651_setAsicPvid(1,LAN0_VID);
	rtl8651_setAsicPvid(2,LAN0_VID);
	rtl8651_setAsicPvid(3,LAN0_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_BYPASS);
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));

	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	DBG_TESTMODEL_L34_TEST_PRK("   ==>network interface table...\n");
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	DBG_TESTMODEL_L34_TEST_PRK("   ==>vlan table...\n");
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<5) | (0x1<<4) | (0x1<<2) | (0x1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);
	
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<5) | (0x1<<4) | (0x1<<0);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

	DBG_TESTMODEL_L34_TEST_PRK("   ==>IP Multicast table...\n");
	//IPM table 
	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	mCast_t.dip= htonl(multicast_stream_dip);
	mCast_t.sip= htonl(multicast_stream_sip);
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0xe;
	mCast_t.port = 4;	 //notice  cf_ipm_spa_unmch
	rtl8651_setAsicIpMulticastTable(&mCast_t);

	/* ================
       Unmatch SPA Drop
       ================ */
	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x400 /* ->cf_ipm_spa_unmch */ );
	
	DBG_TESTMODEL_L34_TEST_PRK("Gerenate input packet ... \n");
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		DBG_TESTMODEL_L34_TEST_PRK("### Port%d egress no packets. ###\n",i);
		if(ret==SUCCESS)
		{
			DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x\n",rxPort);
			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			return FAILED;
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.dp,0); //flooding

	/* ====================
       Unmatch SPA Flooding
       ==================== */
	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );

	DBG_TESTMODEL_L34_TEST_PRK("Gerenate input packet ... \n");
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if((1<<i) & 0x36)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x \n",rxPort);
				return FAILED;
			}
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d ###\n",i);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			DBG_TESTMODEL_L34_TEST_PRK("### Port%d egress no packets. ###\n",i);
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.dp,0x36); //flooding

	/* ================
       Unmatch SPA TRAP
       ================ */
    WRITE_MEM32(0xb8010000,READ_MEM32(0xb8010000) & (~(0x1<<30)));
	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x0 /* ->cf_ipm_spa_unmch */ );
	
	DBG_TESTMODEL_L34_TEST_PRK("Gerenate input packet ... \n");
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if(ret==SUCCESS)
		{
			DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x\n",rxPort);
			rtl_dump_hs();
			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			return FAILED;
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.dp,0x40);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}


int32 rtl8198C_testPktIPMulticastL3(void)
{
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	int i=0,ret;
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	rtl865x_tblAsicDrv_intfParam_t netif;
	ether_addr_t macAddr;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;
	hsa_param_t hsa;

	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;

	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
	strtomac(&multicast_stream_dmac,"01-00-5e-00-00-03");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&multicast_stream_dip, "224.0.0.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);

	DBG_TESTMODEL_L34_TEST_PRK("Config ....\n");
	DBG_TESTMODEL_L34_TEST_PRK("   ==>port-based vlan table...\n");
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(0,LAN0_VID);
	rtl8651_setAsicPvid(1,LAN0_VID);
	rtl8651_setAsicPvid(2,LAN0_VID);
	rtl8651_setAsicPvid(3,LAN0_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );
	for(i=0;i<6;i++)
		WRITE_MEM32(IPM4VLDSCPCR_P0+(i<<2),CF_IPM4VID_ACT_BYPASS);
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));

	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	DBG_TESTMODEL_L34_TEST_PRK("   ==>network interface table...\n");
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	DBG_TESTMODEL_L34_TEST_PRK("   ==>vlan table...\n");
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<3) | (0x1<<2) | (0x1<<0);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);
	
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask = vlant.untagPortMask = (0x1<<5) | (0x1<<4) | (0x1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );

	DBG_TESTMODEL_L34_TEST_PRK("   ==>IP Multicast table...\n");
	//IPM table 
	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	mCast_t.dip= htonl(multicast_stream_dip);
	mCast_t.sip= htonl(multicast_stream_sip);
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0xe;  //010,101010
	mCast_t.port = 0;	 //notice  cf_ipm_spa_unmch
	
	rtl8651_setAsicIpMulticastTable(&mCast_t);

	DBG_TESTMODEL_L34_TEST_PRK("Gerenate input packet ... \n");
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	DBG_TESTMODEL_L34_TEST_PRK("MAC input packet ... \n");
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	DBG_TESTMODEL_L34_TEST_PRK("Verify output results ... \n");
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	for(i=0;i<6;i++)
	{
		rxPort = 1<<i;
		ret = virtualMacOutput( &rxPort,pktBuf, &pktLen);
		if(rxPort & 0xe)
		{
			if(ret!=SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x @ %d\n",rxPort,__LINE__);
				return FAILED;
			}
			if(rxPort & (0x1<<1))
			{
				strtomac(conf.conf_smac, "00-00-11-BB-BB-BB");
				conf.ip.ttl = 127;
			}
			else
			{
				strtomac(conf.conf_smac, RTL865xC_TEST_WAN1_HOST_MAC);
				conf.ip.ttl = 128;
			}
			pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}
		else
		{
			if(ret==SUCCESS)
			{
				DBG_TESTMODEL_FAILED("virtualMacOutput fail  rxPort=%x\n",rxPort);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				return FAILED;
			}
		}
	}

	memset(&hsa,0,sizeof(hsa));
	rtl865xC_virtualMacGetHsa(&hsa);
	assert_equal(hsa.ipmcastr,1);
	assert_equal(hsa.hwfwrd,1);
	assert_equal(hsa.l2tr,1);
	assert_equal(hsa.l34tr,0);
	assert_equal(hsa.dp,0xe);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	
	return SUCCESS;
}



static int32 rtl8198C_testPktIPMulticast(int layer,int isPPPoE)
{

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	int i=0;


	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;


	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
	strtomac(&multicast_stream_dmac,"01-00-5e-00-00-03");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&multicast_stream_dip, "224.0.0.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);

	rtl8651_clearAsicPvid();

	rtl8651_setAsicPvid(0,LAN0_VID);
	rtl8651_setAsicPvid(1,LAN0_VID);
	rtl8651_setAsicPvid(2,LAN0_VID);
	rtl8651_setAsicPvid(3,LAN0_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );

	
	/* TTL control reg: enable TTL-1 operation */
//	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	{
		rtl865x_tblAsicDrv_intfParam_t netif;
		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
		netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
#endif
		netif.enableRoute=1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
#endif
		netif.valid=1;
		netif.macAddrNumber= 1;
		rtl8651_setAsicNetInterface(0,&netif);

		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
		netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
#endif
		netif.enableRoute =1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
#endif
		netif.valid=1;
		netif.macAddrNumber= 1;
		rtl8651_setAsicNetInterface(1,&netif);
	}

	{
		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0xf;
		vlant.untagPortMask = 0xf;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN0_VID,&vlant);

		
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0x1f0;
		vlant.untagPortMask = 0x1f0;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN1_VID,&vlant);
	}

	//IPM table 
	{
		ether_addr_t macAddr;
		rtl865x_tblAsicDrv_multiCastParam_t mCast_t;

		memset(&mCast_t,0,sizeof(mCast_t));
		mCast_t.age=0x7;
		mCast_t.dip= htonl(multicast_stream_dip);
		mCast_t.sip= htonl(multicast_stream_sip);
		mCast_t.extIdx = 0;
		mCast_t.mbr = 0xaa;  //010,101010
		mCast_t.port = 1;	 //notice  cf_ipm_spa_unmch
		
		rtl8651_setAsicIpMulticastTable(&mCast_t);
	}

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );

	//cf_ipm_ip_unmch set:  0x000 cpu,0x100 drop ,0x200 flooding 	
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0x300)) | 0x000 /* ->cf_ipm_ip_unmch */ );


	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	/* Input */
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(/*portID*/0,pktBuf, pktLen+4));

	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	
	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	
	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */		

	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0xe)!=0)
			{
				rxPort = 1<<egressPort;
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)!=SUCCESS)
				{
					rtlglue_printf("virtualMacOutput fail  rxPort=%x\n",rxPort);
					return FAILED;
				}else{
					rtlglue_printf("virtualMacOutput success  rxPort=%x\n",rxPort);
					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

				}
			}
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
				
	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		//0xf - 0x1  vlan members - input port 
		if(hsa.dp == 0xe)
			return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
		else
			return FAILED;
	}

	
}

/* IPM ource port unmuch need flooding to vlan members except input port */
int32 rtl8198C_testPktIPMulticastL2(void)
{
	return rtl8198C_testPktIPMulticast(2,0);
}

int32  layer4ConfigNaptOutbound( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
		{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

		}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	{

	 rtl865x_tblAsicDrv_routingParam_t routet;

	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 0;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 2; //per-source
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);

	 /* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);
	}
	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	return 0;
	
}


int32 rtl8198C_testNAPTOutbound(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	{	
		_rtl8651_enableEnhancedHash1();
		layer4ConfigNaptOutbound(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

		intPort=0x1111;
		extPort=0x2222;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
		printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

		//UP-stream
		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		asic_nat.insideLocalIpAddr= ntohl(inet_addr(HOST1_IP));
		asic_nat.insideLocalPort = intPort;
		asic_nat.isCollision		= 1;
		asic_nat.isValid=1;
		asic_nat.isCollision2		= 1;
		asic_nat.isDedicated		= 0;
		asic_nat.isStatic			= 1;
		asic_nat.isTcp= 0; 
		#if defined(CONFIG_RTL_HW_NAPT_4KENTRY)
		asic_nat.offset				= (extPort&0xffff)>>12;
		asic_nat.selEIdx			= (extPort&0x3ff);
		asic_nat.selEIdxExt			= (extPort>>10)&0x3;
		#else
		asic_nat.offset				= (extPort&0xffff)>>10;
		asic_nat.selEIdx			= (extPort&0x3ff);
		#endif
		asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
		asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
												 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
												 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
												(enhanced hash1 doesn't support outbound/inbound share one connection) */
		asic_nat.ageSec				= 0x3f;
		asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


		//Outbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
		conf.ip.id						= 0xfe0b;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 127;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= extPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



int32  layer4ConfigNaptOutboundAclRedirect( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);

	/* opnen ingressACL and enable l2/l3/l4 */
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));
//	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	


/*  set ACL table */
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

//	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_UDP;
	aclRule.nexthopIdx_ =0;
	aclRule.un_ty.L3L4._srcIpAddr = htonl(inet_addr(HOST1_IP));
	aclRule.un_ty.L3L4._srcIpAddrMask =0xffff0000 ;
	aclRule.un_ty.L3L4._dstIpAddr = htonl(inet_addr(HOST4_IP)); 
	aclRule.un_ty.L3L4._dstIpAddrMask =0xffff0000 ;
	aclRule.un_ty.L3L4._tos = 0;
	aclRule.un_ty.L3L4._tosMask	 = 0;
	aclRule.un_ty.L3L4.is.udp._srcPortUpperBound =0xffff ;
	aclRule.un_ty.L3L4.is.udp._srcPortLowerBound =0 ;
	aclRule.un_ty.L3L4.is.udp._dstPortUpperBound =0xffff ;
	aclRule.un_ty.L3L4.is.udp._dstPortLowerBound =0 ;
	aclRule.direction_ = RTL865X_ACL_INGRESS ;//i think it's useless
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



}

	/* config vlan table */
	 /* wan 1 */	
		{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

		}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);



	{

	 rtl865x_tblAsicDrv_routingParam_t routet;

	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 30;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 2; //per-source
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);

	 /* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}

	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	bzero((void*) &ipt, sizeof(ipt));
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}



int32 rtl8198C_testNAPTOutboundAclRedirect(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	{	

		_rtl8651_enableEnhancedHash1();
		layer4ConfigNaptOutboundAclRedirect(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Normal);

		intPort=0x1111;
		extPort=0x2222;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
		printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

		//UP-stream
		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
		asic_nat.insideLocalPort = intPort;
		asic_nat.isCollision		= 1;
		asic_nat.isCollision2		= 1;
		asic_nat.isDedicated		= 0;
		asic_nat.isStatic			= 1;
		asic_nat.isTcp				= 0; 
		asic_nat.offset				= (extPort&0xffff)>>10;
		asic_nat.selEIdx		= (extPort&0x3ff);
		asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
		asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
												 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
												 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
												(enhanced hash1 doesn't support outbound/inbound share one connection) */
		asic_nat.ageSec 		= 0x3f;
		asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		asic_nat.isValid=1;

		rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


		//Outbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
		conf.ip.id						= 0xfe0b;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 127;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= extPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



int32  layer4ConfigNaptOutboundAclRedirectChain( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);

	
	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);

	/* opnen ingressACL and enable l2/l3/l4 */
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));
//	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	


/*  set ACL table */
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

//=====================chain=====================
	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_UDP;
	aclRule.comb =1;
	aclRule.nexthopIdx_ =0;
	aclRule.un_ty.L3L4._srcIpAddr = htonl(inet_addr(HOST1_IP));
	aclRule.un_ty.L3L4._srcIpAddrMask =0xffff0000 ;
	aclRule.un_ty.L3L4._dstIpAddr = htonl(inet_addr(HOST4_IP)); 
	aclRule.un_ty.L3L4._dstIpAddrMask =0xffff0000 ;
	aclRule.un_ty.L3L4._tos = 0;
	aclRule.un_ty.L3L4._tosMask	 = 0;
	aclRule.un_ty.L3L4.is.udp._srcPortUpperBound =0xffff ;
	aclRule.un_ty.L3L4.is.udp._srcPortLowerBound =0 ;
	aclRule.un_ty.L3L4.is.udp._dstPortUpperBound =0xffff ;
	aclRule.un_ty.L3L4.is.udp._dstPortLowerBound =0 ;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
	
	memset(&aclRule,0x0,sizeof(aclRule));
	_rtl865x_getAclFromAsic(8,&aclRule);
	printk("aclRule.comb= %x \n",aclRule.comb);

	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =1;
//	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN1_MAC);
//	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN1_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST1_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST1_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 10;
	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT;		//chain end action type
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =0;
	aclRule.nexthopIdx_ =0;
	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN1_MAC);
	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN1_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST1_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST1_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
//=====================end chain=====================


	aclRule.aclIdx = 11;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;

	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

}

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=11;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);



	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 30;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

	 /* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#endif
	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}


int32 rtl8198C_testNAPTOutboundAclRedirectChain(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	{	

		_rtl8651_enableEnhancedHash1();
		layer4ConfigNaptOutboundAclRedirectChain(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Normal);

		intPort=0x1111;
		extPort=0x2222;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
		printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

		//UP-stream
		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
		asic_nat.insideLocalPort = intPort;
		asic_nat.isCollision		= 1;
		asic_nat.isCollision2		= 1;
		asic_nat.isDedicated		= 0;
		asic_nat.isStatic			= 1;
		asic_nat.isTcp				= 0; 
		asic_nat.offset				= (extPort&0xffff)>>10;
		asic_nat.selEIdx		= (extPort&0x3ff);
		asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
		asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
												 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
												 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
												(enhanced hash1 doesn't support outbound/inbound share one connection) */
		asic_nat.ageSec 		= 0x3f;
		asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		asic_nat.isValid=1;

		rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


		//Outbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
		conf.ip.id						= 0xfe0b;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 127;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= extPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



int32  layer4ConfigNaptInbound( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
//	struct rtl865x_netif_s netif;
	rtl865x_tblAsicDrv_l2Param_t l2t;
//	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
//	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();
	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	
	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
		{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);

		}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
	l2t.nhFlag = 1;


	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);


	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));
	/* lan 1 host 0 */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

#if 1	//napt inbound arp
	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
//	routet.arpEnd= 8;
//	routet.arpEnd= 31;
//	routet.arpEnd= 32;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);
#else  //napt inbound nexthop
	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 30;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


#endif
	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#endif
	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */

#if 1	//napt inbound arp
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       
#else	//napt inbound nexthop
	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);	   
	rtl8651_setAsicNextHopTable(1, &nxthpt);   

	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);   

#endif

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}


int32 rtl8198C_testNAPTInbound(void)
{
	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	RTL_FPGA_DEBUG_DUMP=1;
	{	

		_rtl8651_enableEnhancedHash1();
		layer4ConfigNaptInbound(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

		intPort=0x1111;
		extPort=0x2222;
//		extPort=0xf12;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
		printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		//Down-stream
		{
			uint16 very;

			very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
			
			memset(&asic_nat, 0, sizeof(asic_nat)); 
			asic_nat.insideLocalIpAddr 			= ntohl(inet_addr(HOST1_IP));
			asic_nat.insideLocalPort 	= intPort;
			asic_nat.isCollision		= 1;
			asic_nat.isCollision2		= 1;
			asic_nat.isDedicated		= 0;
			asic_nat.isStatic			= 1;
			asic_nat.isTcp				= 0;
			#if defined(CONFIG_RTL_HW_NAPT_4KENTRY)
			asic_nat.offset				= (extPort & 0xf);
			asic_nat.selEIdx			= very & 0x3ff;
			asic_nat.selEIdxExt			= (very>>10)&0x3;
			asic_nat.selExtIPIdx		= (extPort & 0xff) >> 4;
			#else
			asic_nat.offset				= (extPort & 0x3f);
			asic_nat.selEIdx			= very & 0x3ff;
			asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
			#endif
			asic_nat.tcpFlag			= 0x2;
			asic_nat.ageSec 			= 0x3f;
			asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
			asic_nat.isValid=1;

			rtl8651_setAsicNaptTcpUdpTable(1,1511, &asic_nat);
		}

		RTL_FPGA_DEBUG_DUMP=0;
		//Inbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0xa;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= extPort;
		conf.conf_sport 				= remPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
		conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));

		conf.ip.ttl 					= 127;
		conf.conf_dport 				= intPort;
		conf.conf_sport 				= remPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}


/* l3 checksum != 0xffff  */
int32 rtl8198C_testl3CheckSum(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	{	

		_rtl8651_enableEnhancedHash1();
		layer4ConfigNaptOutbound(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

		intPort=0x1111;
		extPort=0xf12;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
		printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

		//UP-stream
		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
		asic_nat.insideLocalPort = intPort;
		asic_nat.isCollision		= 1;
		asic_nat.isCollision2		= 1;
		asic_nat.isDedicated		= 0;
		asic_nat.isStatic			= 1;
		asic_nat.isTcp				= 0; 
		//asic_nat.extPort			=extPort;
		asic_nat.offset 			= (extPort&0xffff)>>10;
		asic_nat.selEIdx		= (extPort&0x3ff);
		asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
		asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
												 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
												 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
												(enhanced hash1 doesn't support outbound/inbound share one connection) */
		asic_nat.ageSec		= 0x3f;
		asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		asic_nat.isValid=1;

		rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);




#if 1
	//Down-stream
	{
	uint16 very;

	very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);

	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset 			= (extPort & 0x3f);
	asic_nat.selEIdx		= very & 0x3ff;
	asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
	asic_nat.tcpFlag			= 0x2;
	asic_nat.ageSec			= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
	}
#endif


#if 1
	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xffff-0x4c02;//0xfe0b -511;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
#endif

	}

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}

/* L4 checksum can't equall to 0xffff */
int32 rtl8198C_testl4CheckSum(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptOutbound(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0xffff-0x220f;
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	//asic_nat.extPort			=extPort;
	asic_nat.offset 			= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


#if 1
//Down-stream
{
	uint16 very;

	very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
	
	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset 			= (extPort & 0x3f);
	asic_nat.selEIdx		= very & 0x3ff;
	asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
	asic_nat.tcpFlag			= 0x2;
	asic_nat.ageSec			= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
}
#endif


#if 1
	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
#endif


}
//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



int32  layer3ConfigArpRouting( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_arpParam_t arpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}


	{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

	}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
	{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

	}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

		
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	/* lan HOST3_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);

	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT; //PROCESS_INDIRECT //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT; //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 8;
	routet.arpEnd= 8;
	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);

	

	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#else
//default route

#endif
	
#if 0
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN0_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);  
#endif


#if 0
	/* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));

	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);       

	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(29, &nxthpt);       	
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; /*WAN0_ISP0_PPPOE_SID*/
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 0; /*WAN0_ISP0_NPE_IP*/
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(31, &nxthpt);  
#endif

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}


/*LAN Routing test*/
int32 rtl8198C_testArpRouting(void)

{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	
	remPort=0x1111;
	intPort=0x2222;


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

int32  layer3ConfigNxthopRouting( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	ipaddr_t ip32;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
		{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}


{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

#if 0
{
	rtl865x_tblAsicDrv_arpParam_t arpt;

	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	/* lan HOST3_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);
}
#endif

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP; 
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP; //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);

	routet.nhNum =2;
	routet.nhStart =30;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;

	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);

	

	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#endif


#if 1

{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN0_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);  

}
#endif

	return 0;
	
}



/*LAN Routing test*/
int32 rtl8198C_testNxthopRouting(void)

{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigNxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	
	remPort=0x1111;
	intPort=0x2222;


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}


int32  layer2ConfigLanswitching( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
#if 1
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

//set netif table  
   {

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



   }


#else


WRITE_MEM32(0xbb804204,0x00000001);
WRITE_MEM32(0xb8000010,0x301808e7);
WRITE_MEM32(0xb8000034,0x06791e00);

WRITE_MEM32(0xbb804104,0x028f0039);    	//force port0 link, enable PHY IF
WRITE_MEM32(0xbb804108,0x028f0039);		//force port1 link, enable PHY IF

WRITE_MEM32(0xbb804d08,0xbb060160);		//write vlan table
WRITE_MEM32(0xbb804d20,0x00007e3f);		//vid 11 member=0~5  untag set=0~5
WRITE_MEM32(0xbb804d00,0x00000003);		//write vlan table

WRITE_MEM32(0xbb804d08,0xbb040000);		//write netif table
WRITE_MEM32(0xbb804d20,0x11116017);	
WRITE_MEM32(0xbb804d24,0xe0000000);	
WRITE_MEM32(0xbb804d28,0xfefefefe);	
WRITE_MEM32(0xbb804d2c,0x00001773);	
WRITE_MEM32(0xbb804d00,0x00000003);	


WRITE_MEM32(0xbb804a08,0x000b000b);	 //    set port0 1 pvid=11
WRITE_MEM32(0xb8000010,0x301808e7);	
WRITE_MEM32(0xb8000034,0x06791e00);	
WRITE_MEM32(0xbb804410,0x00000007);	

rtlglue_printf("new code seting FUNC=%s  LINE:%d\n",__func__,__LINE__);


#endif
	

#if 1
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);
#endif

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}



/*LAN L2 test*/
int32 rtl8198C_testL2(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
//	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
//	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat_old;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;

#if 0  //auto learn l2
//host1 to host2 auto learn
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));


//host2 to host1 auto learn
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST2_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1/*port ID*/,pktBuf, pktLen+4));
#endif
	
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}

int32  layer3ConfigV6ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
}

#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum= 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	rtl8198C_setAsicIpv6Routing(1, &v6routet);

	}
#endif

//assert_equal(rtl_check_virtual_mac(),SUCCESS);

return 0;


}

int32 rtl8198C_testV6ArpRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigV6ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}



int32  layer3ConfigV6NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	


}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
//	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
//	v6routet.subnetIdx = 0; //L3 table idx
	v6routet.nhStart = 0 ;
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
//	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
//	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.nhStart = 30;
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

/*nextHop table setting*/
#if 1
{
	rtl8198C_tblAsicDrv_v6NexthopParam_t nxthop;
	
	bzero((void*) &nxthop, sizeof(nxthop));
	nxthop.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	nxthop.destVlanIdx = rtl865xc_netIfIndex(LAN0_VID);
	rtl8198C_setAsicNexthop6(0,&nxthop);
	rtl8198C_setAsicNexthop6(1,&nxthop);


	bzero((void*) &nxthop, sizeof(nxthop));
	nxthop.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthop.destVlanIdx = rtl865xc_netIfIndex(LAN1_VID);
	rtl8198C_setAsicNexthop6(30,&nxthop);
	rtl8198C_setAsicNexthop6(31,&nxthop);


}
#endif

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

return 0;


}


int32 rtl8198C_testV6NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigV6NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				=128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				=254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}


int32  layer2ConfigV6Lanswitching( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	//set netif table  
	   {

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	
	
	
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	}

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}

/*LAN L2 test*/
int32 rtl8198C_testV6L2(void)

{

	ether_addr_t mac;
	uint32  intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigV6Lanswitching(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);


	
	remPort=0x1111;
	intPort=0x2222;

/*

int in6_pton	
(	
	const char * 	src,
	int 	srclen,
	u8 * 	dst,
	int 	delim,
	const char ** 	end 
)	

in6_pton - convert an IPv6 address from literal to binary representation 
		{
			src: the start of the IPv6 address string 
			srclen: the length of the string, -1 means strlen(src) 
			dst: the binary (u8[16] array) representation of the IPv6 address 
			delim: the delimiter of the IPv6 address in , -1 means no delimiter 
			end: A pointer to the end of the parsed string will be placed here
		}
*/


//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));



	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}




int32  layer3Config_V6RdEncap_ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode
	WRITE_MEM32(DSLITECTR0,0);	//Disable DS-Lite

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, BR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(BR_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(BR_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	

}

#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	
	}
#endif


//setting v6rd table
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

/*  delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}

//assert_equal(rtl_check_virtual_mac(),SUCCESS);
	{
		int i;
		for(i=0;i<20000;i++)
			rtlglue_printf("\r");
	}

return 0;


}



int32 rtl8198C_testV6RdEncap_ArpRouting(void)
{
	ether_addr_t mac;

	uint32 intPort, remPort;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];
	enum PORT_MASK rxPort;	

	layer3Config_V6RdEncap_ArpRouting();	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);


#if 1
{
	remPort=0x1111;
	intPort=0x2222;

	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);

	pktLen_Expect +=20 ; //add ipv4 header

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{
		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

int32  layer3Config_V6RdDecap_ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN2_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,READ_MEM32(V6RDCTR0)|CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_INV_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_MAC);
	netif.vid = LAN2_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
//	strtomac(&l2t.macAddr, CE_INV_MAC);
//	l2t.memberPortMask = (1<<hp[0]);
//	l2t.nhFlag = 1;
//	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(CE_INV_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan CE_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	

}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN2_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

	/*	delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_INV_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_INV_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}
#endif

//assert_equal(rtl_check_virtual_mac(),SUCCESS);

return 0;
}

int32 rtl8198C_testV6RdDecap_ArpRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdDecap_ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


/*Expect packet*/

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 127;

	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	memcpy(conf.conf_smac,(void*)strtomac(&mac,CE_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */



	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

int32  layer3Config_DsLiteEncap_NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0,CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 	
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);


	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	/* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	/* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif

//assert_equal(rtl_check_virtual_mac(),SUCCESS);

return 0;


}

int32 rtl8198C_testDsLiteEncap_NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteEncap_NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
/**Expect packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003


	pktLen_Expect +=40 ; //add ipv6 header

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif



	return SUCCESS;

}



int32  layer3Config_DsLiteDecap_NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0, CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 		//enble 6rd mode
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);

{
	rtl865x_tblAsicDrv_arpParam_t arpt ;
	uint32 ip32;
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);


}

	{

	 rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}



int32 rtl8198C_testDsLiteDecap_NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteDecap_NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
/**input packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	//Expect packet
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif
	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

int32 rtl8198C_testPktIPMulticast_txRemarkVid(void)
{

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	int i=0;

	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;

	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
	strtomac(&multicast_stream_dmac,"01-00-5e-00-00-03");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&multicast_stream_dip, "224.0.0.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(0,LAN0_VID);
	rtl8651_setAsicPvid(1,LAN1_VID);
	rtl8651_setAsicPvid(2,LAN1_VID);
	rtl8651_setAsicPvid(3,LAN1_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );
	
	/* TTL control reg: enable TTL-1 operation */
//	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));

	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	{
		rtl865x_tblAsicDrv_intfParam_t netif;
		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
		netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
#endif
		netif.enableRoute =1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
#endif
		netif.valid=1;
		netif.macAddrNumber= 1;
		rtl8651_setAsicNetInterface(0,&netif);

		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
		netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
#endif
		netif.enableRoute =1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
#endif
		netif.valid=1;
		netif.macAddrNumber= 1;
		rtl8651_setAsicNetInterface(1,&netif);
	}

	{

		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0x1;
		vlant.untagPortMask = 0x1;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN0_VID,&vlant);

		
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0x3e;
		vlant.untagPortMask = 0x3e;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN1_VID,&vlant);
	}

//IPM table 
	{
		ether_addr_t macAddr;
		rtl865x_tblAsicDrv_multiCastParam_t mCast_t;

		memset(&mCast_t,0,sizeof(mCast_t));
		mCast_t.age=0x7;
		mCast_t.dip= htonl(multicast_stream_dip);
		mCast_t.sip= htonl(multicast_stream_sip);
		mCast_t.extIdx = 0;
		mCast_t.mbr = 0x3e;  //000,111110
		mCast_t.port = 0;	 //notice  cf_ipm_spa_unmch
		
		rtl8651_setAsicIpMulticastTable(&mCast_t);
	}

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x000 /* ->cf_ipm_spa_unmch */ );

	//cf_ipm_ip_unmch set:  0x000 cpu,0x100 drop ,0x200 flooding 	
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0x300)) |  0x000 /* ->cf_ipm_ip_unmch */ );

	WRITE_MEM32(0xbb804468,3<<12 /*always remark vid*/| 0x123/*remark vid*/);
	WRITE_MEM32(0xbb80446C,3<<12 /*always remark vid*/| 0x234/*remark vid*/);

	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= 128;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	/* Input */
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(/*portID*/0,pktBuf, pktLen+4));

	/* Output , and ckeck output port */
	/* Generate and output a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= multicast_stream_sip;
	conf.conf_dip					= multicast_stream_dip; 
	strtomac(&(conf.conf_smac), "00-00-11-BB-BB-BB");
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);

	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0x3e)!=0)
			{
			
				conf.l2Flag 					= L2_VLAN;
				if(egressPort==1)
					conf.vlan.vid				= 0x123;
				else if(egressPort==2)
					conf.vlan.vid				= 0x234;
				else
					conf.l2Flag 				= 0;
				pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */		
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				virtualMacOutput( &rxPort,pktBuf, &pktLen);
				RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
			}
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		//0xf - 0x1  vlan members - input port 
		if(hsa.dp == 0x3e)
			return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
		else
			return FAILED;

	}

}


int32  layer4ConfigNaptOutbound_arp( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{
		rtl865x_tblAsicDrv_intfParam_t netif;
		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, GW_WAN1_MAC);
		netif.mtu = 1500;
		netif.vid = WAN1_VID;
		#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
		#endif
		netif.enableRoute =1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
		#endif
		netif.valid=1;
		netif.macAddrNumber= 1;
		rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)
	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{
		rtl865x_tblAsicDrv_intfParam_t netif;
		memset(&netif,0,sizeof(netif));
		strtomac(&netif.macAddr, GW_LAN1_MAC);
		netif.mtu = 1500;
		netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.enablev6Route=1;  
#endif
		netif.enableRoute =1;
		netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
		netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
		netif.v6mtu=1500;  
#endif
		netif.valid=1;
		netif.macAddrNumber= 1;

		rtl8651_setAsicNetInterface(0,&netif);
		//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )
	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	{
		rtl865x_tblAsicDrv_arpParam_t arpt;
		/* config arp table */
		bzero((void*) &arpt, sizeof(arpt));
		/* lan 1 host 0 */
		arpt.aging = 0x1f;
		arpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
		strtoip(&ip32, HOST4_IP);
		rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);
#if 0
		 /* config next hop table */
		bzero((void*) &nxthpt, sizeof(nxthpt));	 
		nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
		nxthpt.pppoeIdx = 0; 
		nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
		nxthpt.extIntIpIdx = 1; 
		nxthpt.isPppoe = 0;
		rtl8651_setAsicNextHopTable(0, &nxthpt);       
		rtl8651_setAsicNextHopTable(1, &nxthpt);  
#endif
	}

	{
		rtl865x_tblAsicDrv_routingParam_t routet;

		/* config routing table */
		bzero((void*) &routet, sizeof(routet));
		/* route to wan 1 */
		strtoip(&routet.ipAddr, GW_WAN1_IP);
		routet.ipMask = 0xfffffffC;
		routet.process = PROCESS_ARP;
		routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
		routet.arpStart= 8;
		routet.arpEnd= 8;
		routet.arpIpIdx= 3;
		routet.internal=0;
		rtl8651_setAsicRouting(1, &routet);

		 /* route to lan 1 */

		bzero((void*) &routet, sizeof(routet));
		strtoip(&routet.ipAddr, GW_LAN1_IP);
		routet.ipMask = 0xfffffffC;
		routet.process = PROCESS_ARP;
		routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
		routet.arpStart= 0;
		routet.arpEnd= 0;

		routet.internal=1;
		rtl8651_setAsicRouting(0, &routet);
	}

	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(3, &ipt);

	return 0;
	
}



int32 rtl8198C_testNAPTOutbound_ARP(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptOutbound_arp(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec 		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}


#endif //end sampleTestCase


#define FourWayNAPT_Test 1
#if FourWayNAPT_Test

int32  layer4ConfigNaptInbound_4way( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
//	struct rtl865x_netif_s netif;
	rtl865x_tblAsicDrv_l2Param_t l2t;
//	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
//	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();
	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{


	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	}



	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	}


{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN1_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[2])|(1<<hp[1])|(1<<hp[3]);
	vlant.untagPortMask =(1<<hp[2])|(1<<hp[1])|(1<<hp[3]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}



	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
	l2t.nhFlag = 1;
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);
	
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));
	/* lan 1 host 0 */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);


	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 30;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}


	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);	   
	rtl8651_setAsicNextHopTable(1, &nxthpt);   

	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);   


	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));

	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}

int32 rtl8198C_testNAPTInbound_4way(void)
{
	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	int payloadLen;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat,occupied_nat;
	int i,j;
	hsa_param_t hsa;
	int intPortarray[4]={0};
	int extPortarray[4]={0};
	int remPortarray[4]={0};
	rtl8651_PktConf_t conf;
	int32 pktLen;
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];
	enum PORT_MASK rxPort;	
	unsigned char naptVerified[4096];
	int checkAll = 1,checkNum;

	assert(virtualMacInit==SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	rtl_clear_virtual_mac();

	layer4ConfigNaptInbound_4way(); 
	_rtl8651_enableEnhancedHash1();
	_set4WayHash(TRUE);
	_setInbound4WayHash(TRUE);

	memset(&occupied_nat, 0, sizeof(occupied_nat)); 
	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;
	for(i=0 ; i<4096;i++)
	{
		int very;

		naptVerified[i] = 1;
		
		intPortarray[i]=intPort;
		remPortarray[i]=remPort;
		extPortarray[i]=extPort;
		very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
	
		memset(&occupied_nat, 0, sizeof(occupied_nat)); 
		occupied_nat.insideLocalIpAddr	= ntohl(inet_addr(HOST1_IP));
		occupied_nat.insideLocalPort	= intPort;
		occupied_nat.isCollision		= 0;
		occupied_nat.isCollision2		= 0;
		occupied_nat.isDedicated		= 0;
		occupied_nat.isStatic			= 1;
		occupied_nat.isTcp				= 0; 
		occupied_nat.offset 			= (extPort & 0xf);
		occupied_nat.selEIdx			= very & 0x3ff;
		occupied_nat.selEIdxExt 		= (very>>10)&0x3;
		occupied_nat.selExtIPIdx		= (extPort & 0xff) >> 4;
		occupied_nat.tcpFlag			= 0x2;
		occupied_nat.ageSec 			= 0x3f;
		occupied_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		occupied_nat.isValid=1;
		rtl8651_setAsicNaptTcpUdpTable(1,(inIdx&0xfffffffc) + i, &occupied_nat);
	}

	while(checkAll)
	{	
		int very;

		remPort++;extPort++;intPort++;

		inIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);

		if(naptVerified[inIdx]==0) continue;
		
		for(i=0;i<4;i++)
		{
			/* Inbound NAPT lookup miss will to cpu */
			payloadLen = (unsigned int)(jiffies%128)+64;
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_UDP;	
			conf.ip.id						= 0xa;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= extPort;
			conf.conf_sport 				= remPort;
			conf.payload.length 			= payloadLen;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
			conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
			conf.pppoe.type 				= 0x0800;
			conf.pppoe.session				= 0;
			conf.l2Flag 					= 0;
			
			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			//RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
			RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));
			
			rtl865xC_virtualMacGetHsa(&hsa);
			//printk("spa:%d dp:%02x sip:%pI4 dip:%pI4\n",hsa.spao,hsa.dp,&hsa.sip,&hsa.dip);
			if(hsa.dp == 0x40 && hsa.leno == (payloadLen+46/*eth+ip+udp+crc*/)){
				//printk("To CPU SUCCESS dp=%x len:%d \n",hsa.dp,hsa.leno);
			}else{
				printk("To CPU FAILED!! dp=%x len:%d \n",hsa.dp,hsa.leno);
				return FAILED;
			}

			//Add NAPTR
			very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
			naptVerified[inIdx]=0;
			printk("Verify inIdx:%d way:%d...",inIdx,i);
			memset(&asic_nat, 0, sizeof(asic_nat)); 
			asic_nat.insideLocalIpAddr 	= ntohl(inet_addr(HOST1_IP));
			asic_nat.insideLocalPort 	= intPort;
			asic_nat.isCollision		= 0;
			asic_nat.isCollision2		= 0;
			asic_nat.isDedicated		= 0;
			asic_nat.isStatic			= 1;
			asic_nat.isTcp				= 0; 
			asic_nat.offset				= (extPort & 0xf);
			asic_nat.selEIdx			= very & 0x3ff;
			asic_nat.selEIdxExt			= (very>>10)&0x3;
			asic_nat.selExtIPIdx		= (extPort & 0xff) >> 4;
			asic_nat.tcpFlag			= 0x2;
			asic_nat.ageSec 			= 0x3f;
			asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
			asic_nat.isValid=1;
			rtl8651_setAsicNaptTcpUdpTable(1,(inIdx&0xfffffffc) + i, &asic_nat);
			printk("index=%d...",(inIdx&0xfffffffc)+i);

			//Inbound hardware forwarding
			payloadLen = (unsigned int)(jiffies%128)+64;
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_UDP;	
			conf.ip.id						= 0xa;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= extPort;
			conf.conf_sport 				= remPort;
			conf.payload.length 			= payloadLen;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
			conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
			conf.pppoe.type 				= 0x0800;
			conf.pppoe.session				= 0;
			conf.l2Flag 					= 0;

			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			//RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
			RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));

			conf.ip.ttl 					= 127;
			conf.conf_dport 				= intPort;
			conf.conf_sport 				= remPort;
			conf.payload.length 			= payloadLen;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
			RTL_TESTMODEL_OUTPUT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
			//RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
			{
				int k;
				checkNum = 0;
				for(k=0;k<4096;k++)
					checkNum += naptVerified[k];
			}
			printk("pass! [%d/4096]\n",4096-checkNum);

			rtl8651_setAsicNaptTcpUdpTable(1,(inIdx&0xfffffffc) + i, &occupied_nat);
		}

		checkAll = 0;
		for(i=0;i<4096;i++)
			checkAll |= naptVerified[i];

		cond_resched();
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
}

int32  layer4ConfigNaptOutbound_4way( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);



	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

	/* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}

	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}

int32 rtl8198C_testNAPTOutbound_4way(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
	int i,j;
	hsa_param_t hsa;
	int intPortarray[5]={0};
	int extPortarray[5]={0};
	int remPortarray[5]={0};

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	


	layer4ConfigNaptOutbound_4way(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	_rtl8651_enableEnhancedHash1();
	_set4WayHash(TRUE);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;

	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);	
for(i=0 ; i<5;i++)
{

	
	printk("outIdx =%d inIdx=%d intPort=%d	remPort=%d extPort=%d\n",outIdx,inIdx,intPort,remPort,extPort);
	intPortarray[i]=intPort;
	remPortarray[i]=remPort;
	extPortarray[i]=extPort;

	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec 		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,(outIdx&0xfffc)+i, &asic_nat);
	printk("outindex=%d \n",(outIdx&0xfffc)+i);
	//Find Collision
	while(1){
	remPort++;extPort++;intPort++;
	if(outIdx == rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort))
		break;
	}



}

for(i=0;i<4;i++){
	intPort=intPortarray[i];
	remPort=remPortarray[i];
	extPort=extPortarray[i];
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d intPort=%d	remPort=%d extPort=%d\n",outIdx,inIdx,intPort,remPort,extPort);

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a+i;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
}


	intPort=intPortarray[4];
	remPort=remPortarray[4];
	extPort=extPortarray[4];

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	
	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("To CPU SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("To CPU FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}


}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}
#endif

#define NaptPerflow 1
#if NaptPerflow
int32  layer4ConfigNaptOutboundPerflow( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

#if 1

	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 30;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

	/* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}
#endif

	/* isp 0 occupies 3 entries */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}

int32 rtl8198C_testNAPTOutboundPerflow(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	


{	

//		_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptOutboundPerflow(); 
	WRITE_MEM32( SWTCR1, READ_MEM32( SWTCR1 ) | L4EnHash1 | L4EnPerFlow );   //enable perfolw and enhancehash1
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

	//UP-stream
//		WRITE_MEM32(TEACR,L4AgingDisable);

#if 1
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 1;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec 		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.nhIdxValid		= 1;
	asic_nat.nhIdx			= 1;
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);

	{
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_test_nat;
	rtl8651_getAsicNaptTcpUdpTable(outIdx,&asic_test_nat);
	printk("nhIdxValid =%d   nhIdx=%d \n",asic_test_nat.nhIdxValid,asic_test_nat.nhIdx);
	printk("%8x %8x %8x \n",READ_MEM32(0xbb0945a0),READ_MEM32(0xbb0945a4),READ_MEM32(0xbb0945a8));

	}
#else
	printk("!!!!!!!!!!!!!!!!!!!!  hello new code 1\n");
//write TCR
//		WRITE_MEM32(0xbb804d20,0xc0a80102);
//		WRITE_MEM32(0xbb804d24,0x444148a3);
//		WRITE_MEM32(0xbb804d28,0x3f031111);
//write SWTAA
//		WRITE_MEM32(0xbb804d08,0xbb0945a0);
//write table
//		WRITE_MEM32(0xbb804d00,0x00000009);


//write TCR
	WRITE_MEM32(0xbb804d20,0xc0a80102);
	WRITE_MEM32(0xbb804d24,0x444148a3);
	WRITE_MEM32(0xbb804d28,0x03031111);
//write SWTAA
	WRITE_MEM32(0xbb804d08,0xbb0945a0);
//write table
	WRITE_MEM32(0xbb804d00,0x00000009);


	mdelay(500);
	printk("!!!!!!!!!!!!!!!!!!!!  hello new code 2\n");
#endif
	printk("!!!!!!!!!!!!!!!!!!!!  hello new code 3\n");

#if 1
	//Outbound input packet
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	{
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_test_nat;
	rtl8651_getAsicNaptTcpUdpTable(outIdx,&asic_test_nat);
	printk("nhIdxValid =%d	 nhIdx=%d \n",asic_test_nat.nhIdxValid,asic_test_nat.nhIdx);
	printk("%8x %8x %8x \n",READ_MEM32(0xbb0945a0),READ_MEM32(0xbb0945a4),READ_MEM32(0xbb0945a8));
	//mdelay(10000);
	}


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect output packet
	
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	{
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_test_nat;
	rtl8651_getAsicNaptTcpUdpTable(outIdx,&asic_test_nat);
	printk("nhIdxValid =%d	 nhIdx=%d \n",asic_test_nat.nhIdxValid,asic_test_nat.nhIdx);
	printk("%8x %8x %8x \n",READ_MEM32(0xbb0945a0),READ_MEM32(0xbb0945a4),READ_MEM32(0xbb0945a8));
	//mdelay(10000);

	}

	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

#endif

}

	{
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_test_nat;
	rtl8651_getAsicNaptTcpUdpTable(outIdx,&asic_test_nat);
	printk("nhIdxValid =%d	 nhIdx=%d \n",asic_test_nat.nhIdxValid,asic_test_nat.nhIdx);
	printk("%8x %8x %8x \n",READ_MEM32(0xbb0945a0),READ_MEM32(0xbb0945a4),READ_MEM32(0xbb0945a8));

	}
	WRITE_MEM32( SWTCR1, READ_MEM32( SWTCR1 ) & (~L4EnPerFlow) );	 //disable perfolw 

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}
#endif


#define Egress_MTU_Bug 1
//6rd egress+IPM MTU bug
#if Egress_MTU_Bug

int32  layer3Config_V6RdEncapIPM_ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/** enble 6rd mode **/
	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 
	/** enble v6IPM mode **/
	WRITE_MEM32(V6CTR0,((1500)<<CF_IPMCASTMTU_V6) | CF_IPMSTCTL_V6_EN); 
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);


	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,(uint32)EN_TTL1 | ((1500-1)<<MultiCastMTU_OFFSET) );	
	

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	

	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500-1;
#if defined(CONFIG_RTL_8685S_HWNAT)  		
	netif.v6mtu=1500-1;
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
	{
		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask =(1<<hp[1]);
		vlant.untagPortMask = (1<<hp[1]);
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN1_VID,&vlant);

	}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, BR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(BR_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(BR_MAC);
	in6_pton(HOSTIPM1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	


}



#if 0
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
//	v6routet.v6rdeg =1;
//	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

/*  delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1480;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}


{


	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	v6mcastp.ageTime = 0x7;
	in6_pton(HOSTIPM1_V6IP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = TEST_V6MC_PORT_MASK;//0x0f;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =1 ;
	v6mcastp.v6rdTbIdx =1 ;
	rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));


}

//assert_equal(rtl_check_virtual_mac(),SUCCESS);

return 0;


}


//6rd egress+IPM MTU bug
int32 rtl8198C_testV6RdEncapIPM_ArpRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdEncapIPM_ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

#endif

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.ipv6.hoplmt				= 0xff;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 0xfe;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-70-01-16"),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);

	pktLen_Expect +=20 ; //add ipv4 header

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

#endif


#define Ingress_MTU_Bug 1
//6rd/dsl ingress MTU bug
#if Ingress_MTU_Bug
int32  layer3Config_V6RdDecapMtuBug_ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
	
	rtl8651_setAsicPvid(hp[1],LAN2_VID); //bb804a0c
	rtl8651_setAsicPvid(hp[0],LAN1_VID); ///bb804a08
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);

	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode  bb805208
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);													//				  bb805204
	
	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));											//bb804410

	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);							//bb80440c
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));						//bb80441c


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//bb804104
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//bb804108
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_INV_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);		//bb040000 16
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);		//bb060000+160

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_MAC);
	netif.vid = LAN2_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);		//bb040020  16
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);			//bb060000+1A0

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
//	strtomac(&l2t.macAddr, CE_INV_MAC);
//	l2t.memberPortMask = (1<<hp[0]);
//	l2t.nhFlag = 1;
//	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(CE_INV_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		//bb000000+2000  8

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan CE_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);						//bb140000+1c00   12
	

}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);			//bb120000 24


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN2_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);			//bb120020 24
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

	v6rdt.ipBR = ntohl(inet_addr(BR_INV_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_INV_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);		//bb110020 24

	
}
#endif

return 0;


}

int32 rtl8198C_testV6RdDecapMtuBug_ArpRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdDecapMtuBug_ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				=128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1432;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


/*Expect packet*/

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1432;
	conf.ipv6.hoplmt				= 127;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	memcpy(conf.conf_smac,(void*)strtomac(&mac,CE_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */



	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

int32  layer3Config_DsLiteDecapMtuBug_NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0,CF_DSLITE_EN ); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 	



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);

{
	rtl865x_tblAsicDrv_arpParam_t arpt ;
	uint32 ip32;
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);


}

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}

int32 rtl8198C_testDsLiteDecapMtuBug_NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteDecapMtuBug_NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
/**input packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1472;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	//Expect packet
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1472;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}
#endif


#define v6rdAnddsl_IPM_TTL_INENgess 1
#if v6rdAnddsl_IPM_TTL_INENgess

int32  layer3Config_V6RdEncapIPMTtlBug_ArpRouting( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();		
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	/** enble 6rd mode **/
	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 
	/** enble v6IPM mode **/
	WRITE_MEM32(V6CTR0,((1500)<<CF_IPMCASTMTU_V6) | CF_IPMSTCTL_V6_EN); 
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);


	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,(uint32)EN_TTL1 | ((1500-1)<<MultiCastMTU_OFFSET) );	
	

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	

	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_IPMV6_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] | 1<<1);
	vlant.untagPortMask = (1<<hp[0] | 1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
	{
		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask =(1<<hp[2] | 1<<3);
		vlant.untagPortMask = (1<<hp[2] | 1<<3);
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN1_VID,&vlant);

	}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, BR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(BR_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(BR_MAC);
	in6_pton(HOSTIPM1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	


}

#if 0
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
//	v6routet.v6rdeg =1;
//	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

/*	delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1480;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}


{


	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	v6mcastp.ageTime = 0x7;
	in6_pton(HOSTIPM1_V6IP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = TEST_V6MC_PORT_MASK;//0x0f;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =1 ;
	v6mcastp.v6rdTbIdx =1 ;
	rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
}

return 0;

}




int32 rtl8198C_testV6RdEncapIPMTtlBug_ArpRouting(void)
{


	ether_addr_t mac;
	hsa_param_t hsa;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdEncapIPMTtlBug_ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

#endif

#if 1
{

	remPort=0x1111;
	intPort=0x2222;

/*** same vlan ttl=2 IPM ***/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.ipv6.hoplmt				= 2;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));  //33-33-xx-xx-xx-xx

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 1;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128; 
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-70-01-16"),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);


	pktLen_Expect +=20 ; //add ipv4 header

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	/*** same vlan ttl=1 trap to cpu ***/

	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.ipv6.hoplmt				= 1;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));  //33-33-xx-xx-xx-xx


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}
	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;
#if 1


	/*** change to diff vlan  ***/

	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);

	{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] );
	vlant.untagPortMask = (1<<hp[0] );
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =( 1<<hp[2] | 1<<3 | 1<<1);
	vlant.untagPortMask = ( 1<<hp[2] | 1<<3 | 1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 

	/** egress hoplimit =2 **/		
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.ipv6.hoplmt				= 2;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
		
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 1;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-70-01-16"),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);


	pktLen_Expect +=20 ; //add ipv4 header

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK)!=0)
			{	
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

	/** egress hoplimit =1 trap to cpu **/	


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.ipv6.hoplmt				= 1;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOSTIPM1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

#endif

}
#endif	

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;


}

int32  layer3Config_V6RdDecapIPMTtlBug_ArpRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[0],LAN2_VID);//bb804a08
	rtl8651_setAsicPvid(hp[1],LAN2_VID);//bb804a0c
	rtl8651_setAsicPvid(hp[2],LAN2_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode  0xbb805208

	/** enble v6IPM mode **/
	WRITE_MEM32(V6CTR0,((1500)<<CF_IPMCASTMTU_V6) | CF_IPMSTCTL_V6_EN); 			//0xbb805200
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);													//0xbb805204


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));		//0xbb804410
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,(uint32)EN_TTL1 | ((1500-1)<<MultiCastMTU_OFFSET) );	//0xbb80440c
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));				//0xbb80441c


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	//0xbb804104
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	//0xbb804108
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_INVIPM_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);		//
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] | (1<<1) | (1<<2));
	vlant.untagPortMask = (1<<hp[0] | (1<<1) | (1<<2));
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);       //   bb060000+1a0

}

 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_MAC);
	netif.vid = LAN2_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =( (1<<3) | (1<<4) | (1<<5));
	vlant.untagPortMask = ( (1<<3) | (1<<4) | (1<<5));
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
//	strtomac(&l2t.macAddr, CE_INV_MAC);
//	l2t.memberPortMask = (1<<hp[0]);
//	l2t.nhFlag = 1;
//	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(CE_INV_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

#if 1
{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan CE_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	

}
#endif


#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	/* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	/* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN2_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);


	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

	v6rdt.ipBR = ntohl(inet_addr(BR_INV_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_INV_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}
#endif


#if 1
{


	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	v6mcastp.ageTime = 0x7;
	in6_pton(HOST1_IPMV6IP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = TEST_V6MC_PORT_MASK;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =0 ;
	v6mcastp.v6rdTbIdx =0 ;
	rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));


}
#endif



return 0;


}





int32 rtl8198C_testV6RdDecapIPMTtlBug_ArpRouting(void)
{

	ether_addr_t mac;
	hsa_param_t hsa;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdDecapIPMTtlBug_ArpRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

#if 1
{

	remPort=0x1111;
	intPort=0x2222;

/** input packet 6rd ingress(decapsulate) hoplimit=2  same vlan **/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);	
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));			//unimportant
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));		//unimportant
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 255;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(BR_INV_IP));
	conf.conf_dip					= ntohl(inet_addr(CE_INV_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


/*Expect packet*/

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				= 128;
	conf.ipv6.hoplmt				= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	memcpy(conf.conf_smac,(void*)strtomac(&mac,CE_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"33-33-00-01-11-11"),sizeof(ether_addr_t));
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

/** input packet 6rd ingress(decapsulate) hoplimit=1  same vlan  trap to cap **/

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(BR_INV_IP));
	conf.conf_dip					= ntohl(inet_addr(CE_INV_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

/* change vlan diff vlan */
	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN2_VID);
	rtl8651_setAsicPvid(hp[2],LAN2_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =((1<<1) | (1<<2));
	vlant.untagPortMask = ((1<<1) | (1<<2));
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);


	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =( 1<<hp[0] | (1<<3) | (1<<4) | (1<<5));
	vlant.untagPortMask = ( 1<<hp[0] | (1<<3) | (1<<4) | (1<<5));
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}


/** input packet 6rd ingress(decapsulate) hoplimit=2  diff vlan **/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);	

	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));			//unimportant
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));		//unimportant
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 255;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(BR_INV_IP));
	conf.conf_dip					= ntohl(inet_addr(CE_INV_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


/*Expect packet*/

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				= 128;
	conf.ipv6.hoplmt				= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	memcpy(conf.conf_smac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"33-33-00-01-11-11"),sizeof(ether_addr_t));
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

/** input packet 6rd ingress(decapsulate) hoplimit=1  diff vlan  trap to cap **/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);	

	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_IPMV6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(BR_INV_IP));
	conf.conf_dip					= ntohl(inet_addr(CE_INV_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,CE_INVIPM_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}
}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;

}



int32  layer3Config_DsLiteDecapIPMTtlBug_NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN0_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//**enble Ds-Lite mode**/
	WRITE_MEM32(DSLITECTR0, CF_DSLITE_EN ); 
	WRITE_MEM32(DSLITECTR1, (128 << CF_DSL_HOPLIMIT) ); 

	//**enble IPMv4 mode**/
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_IPMV6_MAC);
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] | 1<<1);
	vlant.untagPortMask = (1<<hp[0] | 1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_IPMV6_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.untagPortMask = (1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

#if 0	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);

{
	rtl865x_tblAsicDrv_arpParam_t arpt ;
	uint32 ip32;
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);


}

#endif

#if 0
	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);


	}
#endif


/*setting DSLite table*/
#if 1 
{


	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif

//IPM table 
#if 1
{

	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;


	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	mCast_t.dip= ntohl(inet_addr(HOST3_IPMIP)); 
	mCast_t.sip= ntohl(inet_addr(HOST1_IP));
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0xa9;  //010,101001
	mCast_t.port = 1;	 //notice  cf_ipm_spa_unmch
	
	rtl8651_setAsicIpMulticastTable(&mCast_t);

//{
//	rtl865x_tblAsicDrv_multiCastParam_t gmCast_t;

//    printk("idx = %d \n ",rtl8651_ipMulticastTableIndex(mCast_t->sip, mCast_t->dip));
// rtl8651_getAsicIpMulticastTable(&gmCast_t)
//}

}
#endif


#if 0
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}



int32 rtl8198C_testDsLiteDecapIPMTtlBug_NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
	hsa_param_t hsa;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteDecapIPMTtlBug_NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );

	//cf_ipm_ip_unmch set:  0x000 cpu,0x100 drop ,0x200 flooding 	
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0x300)) | 0x200 /* ->cf_ipm_ip_unmch */ );


#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	
/**input packet**/  // same vlan ttl=2 expect ttl-1

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

//**Expect packet **/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,"33-33-00-00-88-8a"),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-28-02-02"),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0xa9)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

/**input packet**/  // same vlan ttl=1 expect trap to cpu
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);


	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}
	
{
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);

	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] );
	vlant.untagPortMask = (1<<hp[0] );
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<1 | 1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.untagPortMask = (1<<1 | 1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);




/**input packet**/  // diff vlan ttl=1 expect trap to cpu

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);


	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x40){
		printk("ttl<=1 trap to cpu success dp=%x \n",hsa.dp );
	}else{
		printk("not trap FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}
	
/**input packet**/  // diff vlan ttl=2 expect ttl-1
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_IPMV6_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

//**Expect packet **/
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,"33-33-00-00-88-8b"),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-28-02-02"),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0xa9)!=0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;

}
#endif

#define SANP_MTMUG 1
#if SANP_MTMUG


int32  layer3ConfigArpRouting_SnapMtuBug( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_arpParam_t arpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}


{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

		
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	/* lan HOST3_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT; //PROCESS_INDIRECT //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT; //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 8;
	routet.arpEnd= 8;
	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);

	

	}


	return 0;
	
}




/*LAN Routing test*/
int32 rtl8198C_testArpRouting_SnapMtuBug(void)

{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigArpRouting_SnapMtuBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	
	remPort=0x1111;
	intPort=0x2222;

	/* input */
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1472;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= L2_SNAP;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 1472;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;

}

#endif



#define L2LearnLimit 1
#if L2LearnLimit



int32  layer2ConfigLanswitching_learnLimit( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];
	default_register();
	rtl8651_clearAsicPvid();
	
	rtl8651_setAsicPvid(hp[0],LAN1_VID);//bb804a08
	rtl8651_setAsicPvid(hp[1],LAN1_VID);//bb804a0c
	rtl8651_setAsicPvid(hp[2],LAN1_VID);//bb804a10
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));//bb804410

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);		//bb80440c
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));	//bb80441c


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804104
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804108
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	



{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=150;
	l2t.auth=1;
	l2t.isStatic=1;

	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	l2t.nhFlag = 1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);	


//set netif table  
   {

   rtl865x_tblAsicDrv_intfParam_t netif;
   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN0_MAC);
   netif.mtu = 1500;
   netif.vid = LAN0_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= 9;
   netif.inAclStart=8;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(0,&netif);



   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN1_MAC);
   netif.mtu = 1500;
   netif.vid = LAN1_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
   netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(1,&netif);



   }



	return 0;
	
}


#define INPUT_PKT_NUM 4
#define LEARN_LIMIT	3





/*LAN L2 test*/
int32 rtl8198C_testL2_learnLimitDropAndAgingOut(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/LEARN_LIMIT,/*action*/1);


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		if(i<LEARN_LIMIT)
		{
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning FAILED\n");
				return FAILED;
			}
			else
			{ 
				printk("Drop not learn  SUCCESS \n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x00){
				printk("Drop SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("not Drop FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}

	}



/*	now counter is	LEARN_LIMIT /L2 table counter is LEARN_LIMIT+1(dmac)*/

#if 1
/* aging out*/
{
		rtl865x_tblAsicDrv_l2Param_t asic_l2;
		int row,col;
		int l2counter=0;
		printk("testing aging out\n");
		if(IS_AFTER_RL6405){	
			if(LEARN_LIMIT== rt8198C_getAsicPortLearningCount(0)){
				printk("get learn count=%d SUCCESS\n",rt8198C_getAsicPortLearningCount(0));
			}else{
				printk("get learn count=%d FAILED\n",rt8198C_getAsicPortLearningCount(0));
				return FAILED;
			}
		}

/* try to set aging =0 to age out l2*/
#if 0

		l2counter=0;

		for(row=0x0; row<RTL8651_L2TBL_ROW; row++)
		{
			for(col=0; col<RTL8651_L2TBL_COLUMN; col++)
			{
				memset((void*)&asic_l2, 0, sizeof(asic_l2));
				if (rtl8651_getAsicL2Table(row, col, &asic_l2) == FAILED)
				{
					continue;
				}
				printk("[%d]aging=%d\n",row<<2+col,asic_l2.ageSec);
				asic_l2.ageSec =0;
				rtl8651_setAsicL2Table(row,col,&asic_l2);
				l2counter++;
			}
		}
		printk("l2counter =%d \n",l2counter);
		mdelay(1000); //wait 5 sec

#else

	if(IS_AFTER_RL6405)
	{
		rt8198C_resetAsicPortLearningCounter(0);
	}
	else
	{
	//fast aging out
	WRITE_MEM32(TEACR,(READ_MEM32(TEACR)&(~EnL2FastAging) | EnL2FastAging));
	while(1)
	{
			l2counter=0;
			
			for(row=0x0; row<RTL8651_L2TBL_ROW; row++)
			{
				for(col=0; col<RTL8651_L2TBL_COLUMN; col++)
				{
					memset((void*)&asic_l2, 0, sizeof(asic_l2));
					if (rtl8651_getAsicL2Table(row, col, &asic_l2) == FAILED)
					{
						continue;
					}
					
					if (asic_l2.isStatic && asic_l2.ageSec==0 && asic_l2.cpu && asic_l2.memberPortMask == 0 &&asic_l2.auth==0)
					{
						continue;
					}
					l2counter++;
				}
			}
			printk("l2counter =%d \n",l2counter);
			mdelay(2000);
			if(l2counter==1)
			{
				//smac all age out 
				break;
			}
	}
	
	WRITE_MEM32(TEACR,(READ_MEM32(TEACR)&(~EnL2FastAging))); //close fast aging out
	}
#endif

	
	if(IS_AFTER_RL6405)
	{
		if(0== rt8198C_getAsicPortLearningCount(0)){
			printk("get learn count=%d SUCCESS\n",rt8198C_getAsicPortLearningCount(0));
		}else{
			printk("get learn count=%d FAILED\n",rt8198C_getAsicPortLearningCount(0));
			return FAILED;
		}
	}



//**test learn count again **//

	mdelay(5000); //wait 5 sec
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		if(i<LEARN_LIMIT)
		{
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				if(IS_AFTER_RL6405)
				{
					printk("L2 learning counter=%d,testing FAILED\n",rt8198C_getAsicPortLearningCount(0));
				}
				return FAILED;
			}
			else
			{ 
				printk("Drop not learn  SUCCESS \n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x00){
				printk("Drop SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("not Drop FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}

	}

	//close fast aging out
	WRITE_MEM32(TEACR,(READ_MEM32(TEACR)&(~EnL2FastAging)));
}
#endif


	if(IS_AFTER_RL6405)
	{
		if(LEARN_LIMIT== rt8198C_getAsicPortLearningCount(0)){
			printk("get learn count=%d SUCCESS\n",rt8198C_getAsicPortLearningCount(0));
		}else{
			printk("get learn count=%d FAILED\n",rt8198C_getAsicPortLearningCount(0));
			return FAILED;
		}
	}


//now counter is	LEARN_LIMIT /L2 table counter is LEARN_LIMIT+1(dmac)
// /* port moving*/ need fix
if(IS_AFTER_RL6405)
{
	printk("port moving testing...\n");
/* port moving*/
/* HOST1_MAC change to port 1 ,DMAC not find flooding to vlan */
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.conf_smac[5]+=increaseNum-2;
	increaseNum++;


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning SUCCESS l2t.memberPortMask=%d\n",l2t.memberPortMask);
	}
	else
	{ 
		printk("learning FAILED l2t.memberPortMask=%d\n",l2t.memberPortMask);
		return FAILED;
	}

	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x1d){
		printk("flooding SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("flooding FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

	if((LEARN_LIMIT-1)== rt8198C_getAsicPortLearningCount(0)){
		printk("get learn count=%d SUCCESS\n",rt8198C_getAsicPortLearningCount(0));
	}else{
		printk("get learn count=%d FAILED\n",rt8198C_getAsicPortLearningCount(0));
		return FAILED;
	}



/* input a new mac to P0 should learn*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid					= LAN1_VID;
	conf.conf_smac[5]+=increaseNum;
	increaseNum++;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning SUCCESS\n");
	}
	else
	{ 
		printk("learning FAILED \n");
		return FAILED;
	}


/*  input a new smac should drop*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	conf.conf_smac[5]+=increaseNum;
	increaseNum++;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning FAILED\n");
		return FAILED;
	}
	else
	{ 
		printk("Drop not learn	SUCCESS \n");
}


rtl865xC_virtualMacGetHsa(&hsa);
if(hsa.dp == 0x00){
	printk("Drop SUCCESS dp=%x \n",hsa.dp );
}else{
	printk("not Drop FAILED!! dp=%x\n",hsa.dp );
	return FAILED;
}

}




	return SUCCESS;
}



/*LAN L2 test*/
int32 rtl8198C_testL2_learnLimitDropAndClloision(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/LEARN_LIMIT,/*action*/1);


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		if(i<LEARN_LIMIT)
		{
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning FAILED\n");
				return FAILED;
			}
			else
			{ 
				printk("Drop not learn  SUCCESS \n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x00){
				printk("Drop SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("not Drop FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}

	}



/*	now counter is	LEARN_LIMIT /L2 table counter is LEARN_LIMIT+1(dmac)*/




#if 1
/* collision  and overwrite open*/
{
	int l2Idx;
	int *increaseNummm;
	ether_addr_t tempmac;


	l2Idx=rtl8651_filterDbIndex(strtomac(&mac,HOST1_MAC),0);
	increaseNummm =&(mac.octet[2]);

	WRITE_MEM32(TEACR,(READ_MEM32(TEACR)&(~EnL2HashColOW)) | EnL2HashColOW);

	//find collision entry
	while(1)
	{
		(*increaseNummm)++;
		if(l2Idx == rtl8651_filterDbIndex(&mac,0))
		{
			memcpy(&tempmac,&mac,sizeof(mac));
			printk("l2Idx=%d mac=%02x-%02x-%02x-%02x-%02x-%02x \n",
				rtl8651_filterDbIndex(&mac,0),mac.octet[0],mac.octet[1],mac.octet[2],mac.octet[3],mac.octet[4],mac.octet[5]);
			break;
		}
	}

/* counter-1 collision*/

//input from P1
	for(i=0 ;i <5 ;i++){
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,&mac,sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1/*port ID*/,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<0;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


		memcpy(&mac,&tempmac,sizeof(mac));
		while(1)
		{
			(*increaseNummm)++;
			if(l2Idx == rtl8651_filterDbIndex(&mac,0))
			{
				memcpy(&tempmac,&mac,sizeof(mac));
				printk("l2Idx=%d mac=%02x-%02x-%02x-%02x-%02x-%02x \n",
				rtl8651_filterDbIndex(&mac,0),mac.octet[0],mac.octet[1],mac.octet[2],mac.octet[3],mac.octet[4],mac.octet[5]);
				break;
			}
		}
	}


printk("====================== collision test again ,input from P0  ============================ \n");

//collision test again ,input from P0
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
		if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
		{
			printk("learning SUCCESS\n");
		}
		else
		{ 
			printk("learning FAILED \n");
			return FAILED;
		}

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		//	conf.l2Flag 					= L2_VLAN;
		//	conf.vlan.vid					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
		if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
		{
			printk("learning FAILED\n");
			return FAILED;
		}
		else
		{ 
			printk("Drop not learn  SUCCESS \n");
		}


		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x00){
			printk("Drop SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("not Drop FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}

	//close L2 overwrite
	WRITE_MEM32(TEACR,(READ_MEM32(TEACR)&(~EnL2HashColOW)));
}
#endif


//need fix
if(IS_AFTER_RL6405)
{
/* port moving*/
/* HOST1_MAC change to port 1 ,DMAC not find flooding to vlan */
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	conf.conf_smac[5]+=increaseNum-2;
	increaseNum++;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning SUCCESS l2t.memberPortMask=%d\n",l2t.memberPortMask);
	}
	else
	{ 
		printk("learning FAILED l2t.memberPortMask=%d\n",l2t.memberPortMask);
		return FAILED;
	}

	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x1d){
		printk("flooding SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("flooding FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

/* input a new mac to P0 should learn*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid					= LAN1_VID;
	conf.conf_smac[5]+=increaseNum;
	increaseNum++;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning SUCCESS\n");
	}
	else
	{ 
		printk("learning FAILED \n");
		return FAILED;
	}


/*  input a new smac should drop*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	conf.conf_smac[5]+=increaseNum;
	increaseNum++;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
	if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
	{
		printk("learning FAILED\n");
		return FAILED;
	}
	else
	{ 
		printk("Drop not learn	SUCCESS \n");
}


	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x00){
		printk("Drop SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("not Drop FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

}




	return SUCCESS;
}




/*LAN L2 test*/
int32 rtl8198C_testL2_learnLimitForwardNotLearn(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/LEARN_LIMIT,/*action*/0);


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x02){
			printk("Forward SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("Forward FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}


		if(i<LEARN_LIMIT)
		{


			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit


			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("Forward without learn FAILD\n");
				return FAILED;
			}
			else
			{ 
				printk("Forward without learn SUCCESS\n");
			}


		}


	}

	return SUCCESS;
}



/*LAN L2 test*/
int32 rtl8198C_testL2_learnLimitToCpu(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/LEARN_LIMIT,/*action*/2);


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		TEST_MODEL_DONOT_DIRECT_TX=1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		if(i<LEARN_LIMIT)
		{
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning FAILED\n");
				return FAILED;
			}
			else
			{ 
				printk("Top CPU not learn  SUCCESS \n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x40){
				printk("To CPU SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("not To CPU FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}
		assert_equal(rtl_check_virtual_mac(),SUCCESS);
		TEST_MODEL_DONOT_DIRECT_TX=0;

	}

	return SUCCESS;
}


/*LAN L2 test*/
int32 rtl8198C_testL2_learnLimitForwardNotLearnCopyToCpu(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/LEARN_LIMIT,/*action*/3);


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<INPUT_PKT_NUM; i++)
	{
	//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		conf.conf_smac[5]+=increaseNum;
		increaseNum++;


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
//			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


		if(i<LEARN_LIMIT)
		{

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit


			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("Forward without learn FAILD\n");
				return FAILED;
			}
			else
			{ 
				printk("Forward without learn SUCCESS\n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x42){
				printk("Copy to CPU SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("Copy to CPU FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}


	}

	return SUCCESS;
}
#endif




#define UnknowSADA 1
#if UnknowSADA

int32  layer2ConfigLanswitchingUnknowSADA( void )
{

	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);//bb804a08
	rtl8651_setAsicPvid(hp[1],LAN1_VID);//bb804a0c
	rtl8651_setAsicPvid(hp[2],LAN1_VID);//bb804a10
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));  //bb804410

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	 //bb80440c
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON)); //bb80441c


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804104
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804108
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	




{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);			//bb060160
}

//set netif table  
   {

   rtl865x_tblAsicDrv_intfParam_t netif;
   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN0_MAC);
   netif.mtu = 1500;
   netif.vid = LAN0_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
   netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(0,&netif);			//bb040000



   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN1_MAC);
   netif.mtu = 1500;
   netif.vid = LAN1_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= 9;
   netif.inAclStart=8;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(1,&netif);			//bb040020

   }

	return 0;
	
}





/*LAN L2 test*/
int32 rtl8198C_testL2UnknowSADA(void)

{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	uint32 intPort, remPort;
	hsa_param_t hsa;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer2ConfigLanswitchingUnknowSADA(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);


	
	remPort=0x1111;
	intPort=0x2222;
	TEST_MODEL_DONOT_DIRECT_TX=1;

/*  testing  CF_UNKUC_ACT */
printk("====================testing  CF_UNKUC_ACT(unknow DA)==============================\n");


/* CF_UNKUC_ACT = normal -> flooding*/
#if 1

	printk("**********CF_UNKUC_ACT = normal -> flooding***********\n");
	WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
	0<<CF_UNKUC_ACT|
	0<<CF_UNKSA_ACT|
	0<<CF_UNMCHSPA_ACT
	);

	rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=0;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
	/* lan HOST2_MAC */
//	strtomac(&l2t.macAddr, HOST2_MAC);
//	l2t.nhFlag = 1;
//	l2t.memberPortMask = (1<<hp[1]);
//	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0x1e) != 0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
			//	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
				PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
			}
		}
	}

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
	if(l2t.memberPortMask == 1){
		printk("refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
	}else if(l2t.memberPortMask == 4){
		printk("non refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
		return FAILED;
	}else{
		printk("what up memberPortMask=%x \n",l2t.memberPortMask );
		return FAILED;
	}
	
	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x1e){
		printk("floodingu SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("floodingu FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

/* CF_UNKUC_ACT = drop packet  */
printk("**********CF_UNKUC_ACT = drop packet***********\n");

#if 1

	rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
	1<<CF_UNKUC_ACT|
	0<<CF_UNKSA_ACT|
	0<<CF_UNMCHSPA_ACT
	);

	rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=0;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
	/* lan HOST2_MAC */
//	strtomac(&l2t.macAddr, HOST2_MAC);
//	l2t.nhFlag = 1;
//	l2t.memberPortMask = (1<<hp[1]);
//	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(&l2t,0,sizeof(l2t));
	rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
	if(l2t.memberPortMask == 1){
		printk("refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
	}else if(l2t.memberPortMask == 4){
		printk("non refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
		return FAILED;
	}else{
		printk("what up memberPortMask=%x \n",l2t.memberPortMask );
		return FAILED;
	}
	
	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x00){
		printk("Drop packet SUCCESS dp=%x \n",hsa.dp );
	}else{
		printk("Drop packet FAILED!! dp=%x\n",hsa.dp );
		return FAILED;
	}

/* CF_UNKUC_ACT = trap to CPU */
printk("**********CF_UNKUC_ACT = trap to CPU***********\n");

#if 1

		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		2<<CF_UNKUC_ACT|
		0<<CF_UNKSA_ACT|
		0<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);

	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
		strtomac(&l2t.macAddr, HOST1_MAC);
		l2t.memberPortMask = (1<<hp[0]);
		l2t.nhFlag = 1;
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
	//	strtomac(&l2t.macAddr, HOST2_MAC);
	//	l2t.nhFlag = 1;
	//	l2t.memberPortMask = (1<<hp[1]);
	//	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif
	
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 1){
			printk("refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 4){
			printk("non refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
		
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("Trap CPU packet SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("Trap CPU packet FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}

		/* check original to cpu */
		mdelay(3000);
		PKT_CMP(&pkt_data,pktBuf,pktLen,pktLen,__func__,__LINE__);
		
printk("====================Testing  CF_UNKSA_ACT(unknow DA)==============================\n");
	
	/* CF_UNKSA_ACT = normal -> forward*/
#if 1
	
		printk("**********CF_UNKUC_ACT = normal -> forward***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		0<<CF_UNKSA_ACT|
		0<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
//		strtomac(&l2t.macAddr, HOST1_MAC);
//		l2t.memberPortMask = (1<<hp[0]);
//		l2t.nhFlag = 1;
//		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	
	
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	//	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	
		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 1){
			printk("learning memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 4){
			printk("non learning memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
		
//		rtl865xC_virtualMacGetHsa(&hsa);
//		if(hsa.dp == 0x1e){
//			printk("floodingu SUCCESS dp=%x \n",hsa.dp );
//		}else{
//			printk("floodingu FAILED!! dp=%x\n",hsa.dp );
//			return FAILED;
//		}


		/* CF_UNKSA_ACT =drop packet & disable learning*/
#if 1
	
		printk("**********CF_UNKUC_ACT = drop packet & disable learning***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		1<<CF_UNKSA_ACT|
		0<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
//		strtomac(&l2t.macAddr, HOST1_MAC);
//		l2t.memberPortMask = (1<<hp[0]);
//		l2t.nhFlag = 1;
//		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

	
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	
		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 0){
			printk(" disable learning memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 4){
			printk("  learning memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
			
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("drop SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("drop FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}

		
/* CF_UNKSA_ACT =trap to CPU & disable learning*/

#if 1
		
		printk("**********CF_UNKUC_ACT = trap to CPU & disable learning***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		2<<CF_UNKSA_ACT|
		0<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
//		strtomac(&l2t.macAddr, HOST1_MAC);
//		l2t.memberPortMask = (1<<hp[0]);
//		l2t.nhFlag = 1;
//		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 0){
			printk(" disable learning memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 4){
			printk("  learning memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
			
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("to cpu SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("to cpu FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}
		
		/* check original to cpu */
		mdelay(3000);
		PKT_CMP(&pkt_data,pktBuf,pktLen,pktLen,__func__,__LINE__);

		assert_equal(rtl_check_virtual_mac(),SUCCESS);

		/* CF_UNKSA_ACT = normal -> copy to CPU */
#if 1
		
			printk("**********CF_UNKUC_ACT = normal ->  copy to CPU***********\n");
			WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
			0<<CF_UNKUC_ACT|
			3<<CF_UNKSA_ACT|
			0<<CF_UNMCHSPA_ACT
			);
		
			rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
		
			/* config l2 table */
			bzero((void*) &l2t, sizeof(l2t));
			l2t.ageSec=500;
			l2t.auth=1;
			l2t.isStatic=0;
			
			/* lan HOST1_MAC */
	//		strtomac(&l2t.macAddr, HOST1_MAC);
	//		l2t.memberPortMask = (1<<hp[0]);
	//		l2t.nhFlag = 1;
	//		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
			/* lan HOST2_MAC */
			strtomac(&l2t.macAddr, HOST2_MAC);
			l2t.nhFlag = 1;
			l2t.memberPortMask = (1<<hp[1]);
			rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif
	
		
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_UDP;	
			conf.ip.id						= 0x0a;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			conf.pppoe.type 				= 0x0800;
			conf.pppoe.session				= 0;
		
		
			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
			RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

			/* check original to cpu */
			mdelay(3000);
			PKT_CMP(&pkt_data,pktBuf,pktLen,pktLen,__func__,__LINE__);

		
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		//	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		
			assert_equal(rtl_check_virtual_mac(),SUCCESS);
		
			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
			if(l2t.memberPortMask == 1){
				printk("learning memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
			}else if(l2t.memberPortMask == 4){
				printk("non learning memberPortMask=%x FAILED\n",l2t.memberPortMask );
				return FAILED;
			}else{
				printk("what up memberPortMask=%x \n",l2t.memberPortMask );
				return FAILED;
			}
			
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x42){
			printk("copy to cpu SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("copy to cpu FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}
		


	
	/*	testing  CF_UNMCHSPA_ACT */
	printk("====================testing  CF_UNMCHSPA_ACT(unknow DA)==============================\n");
	
	
	/* CF_UNMCHSPA_ACT = normal and learn*/
#if 1
	
		printk("**********CF_UNMCHSPA_ACT = normal ->forwarding***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		0<<CF_UNKSA_ACT|
		0<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
		strtomac(&l2t.macAddr, HOST1_MAC);
		l2t.memberPortMask = (1<<hp[2]);		//source port SA unmuch
		l2t.nhFlag = 1;
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	//	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 1){
			printk("refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 4){
			printk("refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
		}
		
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x2){
			printk("forwarding SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("forwarding FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}

		assert_equal(rtl_check_virtual_mac(),SUCCESS);
		
		/* CF_UNMCHSPA_ACT = drop packet & disable learning*/
#if 1
	
		printk("**********CF_UNMCHSPA_ACT = drop packet & disable learning***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		0<<CF_UNKSA_ACT|
		1<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
		strtomac(&l2t.macAddr, HOST1_MAC);
		l2t.memberPortMask = (1<<hp[2]);		//source port SA unmuch
		l2t.nhFlag = 1;
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 4){
			printk("non-refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 1){
			printk("refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
		
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("drop SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("drop FAILED!! dp=%x\n",hsa.dp );
			return FAILED;
		}	

		assert_equal(rtl_check_virtual_mac(),SUCCESS);

/* CF_UNMCHSPA_ACT =trap to CPU & disable learning*/
#if 1
		
		printk("**********CF_UNMCHSPA_ACT = trap to CPU & disable learning***********\n");
		WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
		0<<CF_UNKUC_ACT|
		0<<CF_UNKSA_ACT|
		2<<CF_UNMCHSPA_ACT
		);
	
		rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
	
		/* config l2 table */
		bzero((void*) &l2t, sizeof(l2t));
		l2t.ageSec=500;
		l2t.auth=1;
		l2t.isStatic=0;
		
		/* lan HOST1_MAC */
		strtomac(&l2t.macAddr, HOST1_MAC);
		l2t.memberPortMask = (1<<hp[2]);		//source port SA unmuch
		l2t.nhFlag = 1;
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
		/* lan HOST2_MAC */
		strtomac(&l2t.macAddr, HOST2_MAC);
		l2t.nhFlag = 1;
		l2t.memberPortMask = (1<<hp[1]);
		rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif


		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	
	
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		memset(&l2t,0,sizeof(l2t));
		rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
		if(l2t.memberPortMask == 4){
			printk("non-refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
		}else if(l2t.memberPortMask == 1){
			printk("refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
			return FAILED;
		}else{
			printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			return FAILED;
		}
		
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("trap to cpu SUCCESS dp=%x \n",hsa.dp );
		}else{
			printk("trap to cpu!! dp=%x\n",hsa.dp );
			return FAILED;
		}	
		
		/* check original to cpu */
		mdelay(3000);
		PKT_CMP(&pkt_data,pktBuf,pktLen,pktLen,__func__,__LINE__);

		assert_equal(rtl_check_virtual_mac(),SUCCESS);

	/* CF_UNMCHSPA_ACT =trap to CPU & disable learning*/
#if 1
			
			printk("**********CF_UNMCHSPA_ACT =copy to CPU and learning***********\n");
			WRITE_MEM32(FFCR,READ_MEM32(FFCR)&(~(CF_UNMCHSPA_ACT_MSK |CF_UNKSA_ACT_MSK|CF_UNKUC_ACT_MSK))|
			0<<CF_UNKUC_ACT|
			0<<CF_UNKSA_ACT|
			3<<CF_UNMCHSPA_ACT
			);
		
			rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, RTL8651_L2TBL_ROW*RTL8651_L2TBL_COLUMN);
		
			/* config l2 table */
			bzero((void*) &l2t, sizeof(l2t));
			l2t.ageSec=500;
			l2t.auth=1;
			l2t.isStatic=0;
			
			/* lan HOST1_MAC */
			strtomac(&l2t.macAddr, HOST1_MAC);
			l2t.memberPortMask = (1<<hp[2]);		//source port SA unmuch
			l2t.nhFlag = 1;
			rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);		
			/* lan HOST2_MAC */
			strtomac(&l2t.macAddr, HOST2_MAC);
			l2t.nhFlag = 1;
			l2t.memberPortMask = (1<<hp[1]);
			rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);		
#endif

			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_UDP;	
			conf.ip.id						= 0x0a;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			conf.pppoe.type 				= 0x0800;
			conf.pppoe.session				= 0;
	
	
			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
			RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
			/* check original to cpu */
			mdelay(3000);
			PKT_CMP(&pkt_data,pktBuf,pktLen,pktLen,__func__,__LINE__);


			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		//	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC),0,&l2t);
			if(l2t.memberPortMask == 1){
				printk("refresh memberPortMask=%x SUCCESS\n",l2t.memberPortMask );
			}else if(l2t.memberPortMask == 4){
				printk("non-refresh memberPortMask=%x FAILED\n",l2t.memberPortMask );
				return FAILED;
			}else{
				printk("what up memberPortMask=%x \n",l2t.memberPortMask );
			}
			
			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x42){
				printk("forwarding and copy to cpu SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("forwarding nd copy to cpu FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;
}
#endif


#define ChangeVidBug 1
#if ChangeVidBug

int32  layer2ConfigLanswitchinghangeVidBug( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(Ingress_ACL | EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) ;
	vlanp.untagPortMask =  0 ;
	rtl8651_setAsicVlan(LAN0_VID,&vlanp);

	vlanp.fid=1;
	vlanp.memberPortMask = (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]);
	vlanp.untagPortMask =  0;
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

//set netif table  
   {

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



   }

{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

//	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_VID;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.vid_=LAN1_VID;
	aclRule.fid_=1;

	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;


	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
}

#if 1
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.fid=0;
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.fid=1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(rtl8651_filterDbIndex(&(l2t.macAddr),1), 0, &l2t);
#endif

	return 0;
	
}



/*LAN L2 test*/
int32 rtl8198C_testL2AclChangeVlanBug(void)

{
	hsa_param_t hsa;

	ether_addr_t mac;

	uint32 intPort, remPort;
//	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
//	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat_old;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitchinghangeVidBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);


	
	remPort=0x1111;
	intPort=0x2222;

	
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid 					= LAN0_VID;

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */	
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid 					= LAN1_VID;
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	
	rtl865xC_virtualMacGetHsa(&hsa);
	if(hsa.dp == 0x02){
		printk("find l2 table  dp=%x \n",hsa.dp );
	}else{
		printk("flooding to vlan dp=%x\n",hsa.dp );
		return FAILED;
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}
#endif

#define v6AclChainBugf 1
#if v6AclChainBugf



int32  layer3ConfigV6NxthopRouting_AclV6CombBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);
	default_register();


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1; 
#endif
	netif.enableRoute =1;
	netif.inAclEnd=14;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

//{

//	
//	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
//	uint8 v6ip[16];
//	
//	/* config arp table */
//	
//	/* lan HOST1_IP */
//	bzero((void*) &v6arp, sizeof(v6arp));
//	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
//	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
//	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
//	v6arp.subnetIdx = 1; //L3 table idx
//	v6arp.age =  0x1f;
//	rtl8198C_setAsicArp6 (&v6arp);
//	


//}


/*  set ACL table */
{
	rtl865x_AclRule_t aclRule;

//===============================rule set chanin ==================================
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;	//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =1;
	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

#if 1
/* ipv6 rule 1 entry0*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;						//unimportant
	aclRule.ipv6ETY0_=1;
//	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6Addr),-1,NULL);
//	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
/* ipv6 rule 1 entry1*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 10;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;	
	aclRule.ipv6ETY0_=0;
	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6Addr),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



/* ipv6 rule 1 entry0*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 11;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;						//unimportant
	aclRule.ipv6ETY0_=1;
	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6Addr),-1,NULL);
	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
/* ipv6 rule 1 entry1*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 12;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;	
	aclRule.ipv6ETY0_=0;
//	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6Addr),-1,NULL);
//	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

#endif


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 13;
//	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT; //end of chain
//	aclRule.nexthopIdx_ =30;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =0;									//end of chain
//	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

//===============================rule set chanin END==================================


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 14;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



}


#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
	v6routet.nhStart = 0 ;
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
	v6routet.nhStart = 30;
//	v6routet.nhStart = 0; //haha....it's error nexthop
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

/*nextHop table setting*/
#if 1
{
	rtl8198C_tblAsicDrv_v6NexthopParam_t nxthop;


	bzero((void*) &nxthop, sizeof(nxthop));
	nxthop.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthop.destVlanIdx = rtl865xc_netIfIndex(LAN1_VID);
	rtl8198C_setAsicNexthop6(30,&nxthop);
	rtl8198C_setAsicNexthop6(31,&nxthop);


}
#endif



return 0;


}


int32 rtl8198C_testV6NxthopRouting_AclV6CombBug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigV6NxthopRouting_AclV6CombBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				=128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				=254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif



	return SUCCESS;

}






int32  layer3ConfigV6NxthopRouting_AclV6CombRedirect( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);
	default_register();


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=14;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

//{

//	
//	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
//	uint8 v6ip[16];
//	
//	/* config arp table */
//	
//	/* lan HOST1_IP */
//	bzero((void*) &v6arp, sizeof(v6arp));
//	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
//	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
//	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
//	v6arp.subnetIdx = 1; //L3 table idx
//	v6arp.age =  0x1f;
//	rtl8198C_setAsicArp6 (&v6arp);
//	


//}


/*  set ACL table */
{
	rtl865x_AclRule_t aclRule;

//===============================rule set chanin ==================================
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;	//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =1;
	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

#if 1
/* ipv6 rule 1 entry0*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;						//unimportant
	aclRule.ipv6ETY0_=1;
//	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6Addr),-1,NULL);
//	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
/* ipv6 rule 1 entry1*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 10;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;	
	aclRule.ipv6ETY0_=0;
	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6Addr),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



/* ipv6 rule 1 entry0*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 11;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =1;						//unimportant
	aclRule.ipv6ETY0_=1;
	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6Addr),-1,NULL);
	in6_pton(HOST3_V6IP ,-1,&(aclRule.un_ty.V6ETY._srcIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
/* ipv6 rule 1 entry1*/
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 12;
	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT;//end of chain
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_IPV6;
	aclRule.comb =0;									//end of chain
	aclRule.ipv6ETY0_=0;
	aclRule.nexthopIdx_=30;
//	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6Addr),-1,NULL);
//	in6_pton(HOST1_V6IP ,-1,&(aclRule.un_ty.V6ETY._dstIpV6AddrMask),-1,NULL );
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

#endif


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 13;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);


//===============================rule set chanin END==================================


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 14;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



}


#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
	v6routet.nhStart = 0 ;
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
//	v6routet.nhStart = 30;
	v6routet.nhStart = 0; //haha....it's error nexthop
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

/*nextHop table setting*/
#if 1
{
	rtl8198C_tblAsicDrv_v6NexthopParam_t nxthop;


	bzero((void*) &nxthop, sizeof(nxthop));
	nxthop.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthop.destVlanIdx = rtl865xc_netIfIndex(LAN1_VID);
	rtl8198C_setAsicNexthop6(30,&nxthop);
	rtl8198C_setAsicNexthop6(31,&nxthop);


}
#endif



return 0;


}



int32 rtl8198C_testV6NxthopRouting_AclV6CombRedirect(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigV6NxthopRouting_AclV6CombRedirect(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				=128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				=254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif



	return SUCCESS;

}


#endif


#define MultipleWAN 1
#if MultipleWAN

int32  ConfigMultipleWAN( void )
{
	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt; 
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register(); 

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	


{
	 rtl865x_tblAsicDrv_arpParam_t arpt;
	 /* config arp table */
	 bzero((void*) &arpt, sizeof(arpt));
	 /* lan 1 host 0 */
	 arpt.aging = 0x1f;
	 arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	 strtoip(&ip32, HOST1_IP);
	 rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);
}

	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN0_MAC);
	netif.mtu = 1500;
	netif.vid = WAN0_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(2,&netif);
}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = 0;
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN1_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[2])|(1<<hp[1])|(1<<hp[3]);
	vlant.untagPortMask =0;
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0])|(1<<hp[1]);
	vlant.untagPortMask =0;
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN0_VID,&vlant);

}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	{

	 rtl865x_tblAsicDrv_routingParam_t routet;

	 bzero((void*) &routet, sizeof(routet));
	 strtoip(&routet.ipAddr, GW_LAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_INDIRECT;
	 routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	 routet.arpStart= 0;
	 routet.arpEnd= 0;
	 routet.internal=1;
	 rtl8651_setAsicRouting(0, &routet);



	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 0;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 2; //per-source
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);
	}
	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);	   
	rtl8651_setAsicNextHopTable(1, &nxthpt);	   
	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	


}


int32 rtl8198C_testMultipleWAN(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	_rtl8651_enableEnhancedHash1();
	ConfigMultipleWAN(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

{
	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset 			= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


	memset(&asic_nat, 0, sizeof(asic_nat)); 	

}
	//Down-stream
{
	uint16 very;

	very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
	
	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr 			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort 	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= (extPort & 0x3f);
	asic_nat.selEIdx		= very & 0x3ff;
	asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
	asic_nat.tcpFlag			= 0x2;
	asic_nat.ageSec 			= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
}


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= LAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN1_VID;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	//Inbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));
	
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= intPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= LAN1_VID;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


}


/* combination bridge WAN*/

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN0_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN0_VID;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN0_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN0_VID;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



int32  ConfigMultipleWAN1( void )
{
	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt; 
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register(); 


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	


{
	 rtl865x_tblAsicDrv_arpParam_t arpt;
	 /* config arp table */
	 bzero((void*) &arpt, sizeof(arpt));
	 /* lan 1 host 0 */
	 arpt.aging = 0x1f;
	 arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	 strtoip(&ip32, HOST1_IP);
	 rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	bzero((void*) &arpt, sizeof(arpt));
	/* lan 1 host 0 */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST5_MAC);
	strtoip(&ip32, HOST5_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);

}

	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	}



{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = 0;
	vlant.fid=0;
	rtl8651_setAsicVlan(WAN1_VID,&vlant);

	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[2])|(1<<hp[1])|(1<<hp[3]);
	vlant.untagPortMask =0;
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);


}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	strtomac(&l2t.macAddr, HOST5_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST5_MAC), 0, &l2t);



	{

	 rtl865x_tblAsicDrv_routingParam_t routet;

	 bzero((void*) &routet, sizeof(routet));
	 strtoip(&routet.ipAddr, GW_LAN1_IP);
	 routet.ipMask = 0xfffffff0;
	 routet.process = PROCESS_ARP;
	 routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	 routet.arpStart= 0;
	 routet.arpEnd= 0;
	 routet.internal=1;
	 rtl8651_setAsicRouting(0, &routet);



	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffff0;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 0;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 2; //per-source
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);



	 bzero((void*) &routet, sizeof(routet));
	 strtoip(&routet.ipAddr, GW_WAN2_IP);
	 routet.ipMask = 0xfffffff0;
	 routet.process = PROCESS_ARP;
	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.arpStart= 8;
	 routet.arpEnd= 8;
	 routet.internal=1;
	 rtl8651_setAsicRouting(3, &routet);



	}

	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 1;
	nxthpt.pppoeIdx=2;
	rtl8651_setAsicNextHopTable(0, &nxthpt);	   
	rtl8651_setAsicNextHopTable(1, &nxthpt);	   

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	{

	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	memset(&pppoet,0,sizeof(pppoet));
	pppoet.age=0xff;
	pppoet.sessionId=5;
	rtl8651_setAsicPppoe(2,&pppoet);


	}


	
	return 0;
	


}



/* pppoe wan */
int32 rtl8198C_testMultipleWAN1(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	_rtl8651_enableEnhancedHash1();
	ConfigMultipleWAN1(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0x5555;
	outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

{
	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset 			= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


	memset(&asic_nat, 0, sizeof(asic_nat)); 	

}
	//Down-stream
{
	uint16 very;

	very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
	
	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr 			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort 	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= (extPort & 0x3f);
	asic_nat.selEIdx		= very & 0x3ff;
	asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
	asic_nat.tcpFlag			= 0x2;
	asic_nat.ageSec 			= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
}


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		conf.pppoe.type 				= ETH_P_PPP_SES;
//		conf.pppoe.session				= 5;
	conf.l2Flag 					= L2_VLAN ;
	conf.vlan.vid					= LAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= ETH_P_PPP_SES;
	conf.pppoe.session				= 5;
	conf.l2Flag 					= L2_VLAN | L2_PPPoE;
	conf.vlan.vid					= WAN1_VID;


	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


	//Inbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= ETH_P_PPP_SES;
	conf.pppoe.session				= 5;
	conf.l2Flag 					= L2_VLAN | L2_PPPoE;
	conf.vlan.vid					= WAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));
	
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= intPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= LAN1_VID;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


}


/** combination routing mode **/
	
	//wan to lan
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST5_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST5_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= ETH_P_PPP_SES;
//	conf.pppoe.session				= 5;
//	conf.l2Flag 					= L2_VLAN | L2_PPPoE;
	conf.l2Flag 					= L2_VLAN ;
	conf.vlan.vid					= WAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));
	
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST5_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= LAN1_VID;
	
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	
//	lan to wan
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST5_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= ETH_P_PPP_SES;
//	conf.pppoe.session				= 5;
//	conf.l2Flag 					= L2_VLAN | L2_PPPoE;
	conf.l2Flag 					= L2_VLAN ;
	conf.vlan.vid					= LAN1_VID;

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1,pktBuf, pktLen+4));
	
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST5_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST5_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= WAN1_VID;
	
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,1<<0);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



#endif

 
#define TCP_CHUCKSUM_BUG 1
#if TCP_CHUCKSUM_BUG


int32  layer4ConfigNaptOutboundTCP( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1; 
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);



	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

	/* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}

	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);
	return 0;
	
}

/* L4 checksum can't equall to 0xffff */
int32 rtl8198C_testl4TCPCheckSum(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptOutboundTCP(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	extPort=0x2222;
	remPort=0xffff-0x220f;
	outIdx = rtl8651_naptTcpUdpTableIndex((1|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	inIdx	= rtl8651_naptTcpUdpTableIndex((1|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);
	printk("outIdx =%d inIdx=%d \n",outIdx,inIdx);

	//UP-stream
	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	asic_nat.insideLocalIpAddr = ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort = intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 1; 
	//asic_nat.extPort			=extPort;
	asic_nat.offset 			= (extPort&0xffff)>>10;
	asic_nat.selEIdx		= (extPort&0x3ff);
	asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
	asic_nat.tcpFlag			= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
											 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
											 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
											(enhanced hash1 doesn't support outbound/inbound share one connection) */
	asic_nat.ageSec		= 0x3f;
	asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


#if 1
	//Down-stream
{
	uint16 very;

	very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
	
	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 1; 
	asic_nat.offset 			= (extPort & 0x3f);
	asic_nat.selEIdx		= very & 0x3ff;
	asic_nat.selExtIPIdx		= (extPort & 0x3ff) >> 6;
	asic_nat.tcpFlag			= 0x2;
	asic_nat.ageSec			= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
}
#endif


#if 1
	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
//		conf.ip.id						= 0x0a;
	conf.ip.id						= 0xfe0b;

	conf.conf_tcp_seq=0xaaaaaaaa-0xa4c1-0xd;
//		conf.conf_tcp_ack
//		conf.conf_tcp_flag
//		conf.conf_tcp_win
//		conf.conf_tcp_mss

	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
#endif


}


	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}






int32  layer3ConfigNxthopRouting_checksumbug( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	ipaddr_t ip32;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}


{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

#if 0
{
	rtl865x_tblAsicDrv_arpParam_t arpt;

	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	/* lan HOST3_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);
}
#endif

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP; 
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP; //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);

	routet.nhNum =2;
	routet.nhStart =30;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;

	routet.internal=1;
	rtl8651_setAsicRouting(1, &routet);

	

	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#endif


#if 1

{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN0_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);  

}
#endif

	return 0;
	
}


/*LAN Routing test checksum*/
int32 rtl8198C_testNxthopRouting_checksumbug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigNxthopRouting_checksumbug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	
	remPort=0x1111;
	intPort=0xfffa;


	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	
	conf.conf_tcp_seq=0xaaaaaaaa-0xb2c8;
	//		conf.conf_tcp_ack
	//		conf.conf_tcp_flag
	//		conf.conf_tcp_win
	//		conf.conf_tcp_mss

	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	return SUCCESS;

}

#endif /* TCP_CHUCKSUM_BUG */


#define Test2KL2 1  /* RL6405 */
#if defined(CONFIG_RTL_8685S_HWNAT)  
int32  layer2ConfigLanswitching2KL2( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}
#if 1
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);
#endif

	return 0;
	
}


/* RL6405 */
int32 rtl8198C_test2KL2(void)
{
	int i;
	int testFid = 2;
	rtl865x_tblAsicDrv_l2Param_t l2t,tmp;
	int ret;
	int row,col;
	int count=0;
	hsa_param_t hsa;

	layer2ConfigLanswitching2KL2(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	WRITE_MEM32( FFCR, READ_MEM32( FFCR ) & ~EN_UNUNICAST_TOCPU );
	RTL_TESTMODEL_CHECK(_vlanConfig(LAN1_VID,testFid,(1<<hp[0]),(1<<hp[0])));

	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;

	_pktIPv4Config(_PKT_TYPE_IP,CFG_DA(HOST1_MAC),CFG_SA(HOST2_MAC),CFG_PKTLEN(128),CFG_IPID(0x0a),CFG_IPTTL(128),
		CFG_IPSIP("192.168.1.22"),CFG_IPDIP("192.168.1.11"),CFG_IPPROTOCOL(IPPROTO_IP),&conf);

	for(i=0;i<0xfff;i++)
	{
		
		l2t.macAddr.octet[0]=0; l2t.macAddr.octet[1]=1; l2t.macAddr.octet[2]=2;
		l2t.macAddr.octet[3]=((i>>16)&0xff); l2t.macAddr.octet[4]=(i>>8)&0xff; l2t.macAddr.octet[5]=(i&0xff);

		row = rtl8651_filterDbIndex(&l2t.macAddr,testFid);
		for(col=0;col<4;col++)
		{
			ret = rtl8651_getAsicL2Table(row,col,&tmp);
			if(ret!=SUCCESS) break;
				
		}
		if(col==4) continue;
		rtl8651_setAsicL2Table(rtl8651_filterDbIndex(&l2t.macAddr,testFid),col, &l2t);

		/* DA Lookup */
		memcpy(conf.conf_dmac,&l2t.macAddr,sizeof(ether_addr_t));
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_CHECK(virtualMacInput(1,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<0;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		rtl865xC_virtualMacGetHsa(&hsa);
		RTL_TESTMODEL_IS_EQUAL("Check hardware forwarding...",hsa.hwfwrd,1);
	}
	
	/* Check 2k table access... */
	printk("==>Check l2 table total entries:\n");
	count=0;
	{
		int row,col;
		rtl865x_tblAsicDrv_l2Param_t l2;
		for(row=0;row<(2048>>2);row++)
		{
			for(col=0;col<4;col++)
			{
				memset(&l2,0,sizeof(l2));
				RTL_TESTMODEL_CHECK(rtl8651_getAsicL2Table(row,col,&l2));
				//printk("[%d %d] mac:%02x-%02x-%02x-%02x-%02x-%02x fid:%d\n",row,col,l2.macAddr.octet[0],l2.macAddr.octet[1],l2.macAddr.octet[2],l2.macAddr.octet[3],l2.macAddr.octet[4],l2.macAddr.octet[5],l2.fid);
				count++;
				printk("\rcount:%d",count);
			}
		}
	}
	RTL_TESTMODEL_IS_EQUAL("Check whether L2 ASIC Table 2048 enties full ...",count,2048);

	return SUCCESS;
}




int32  layer2ConfigLanswitching2KL2_basic( void )
{

	int ret;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	}

	return 0;
	
}


int32 dumphs(void)
{
	hsb_param_t *hsb_r, dummy_hsb_r;
	hsa_param_t *hsa_r, dummy_hsa_r;
	ipaddr_t addr;
	char addr_s[100];

	hsb_r = &dummy_hsb_r;
	hsa_r = &dummy_hsa_r;
	memset((void*)hsb_r,0,sizeof(hsb_r));
	memset((void*)hsa_r,0,sizeof(hsa_r));
	

	rtl865xC_virtualMacGetHsa( hsa_r );
	rtl865xC_virtualMacGetHsb( hsb_r );
	printk("HSB(");
	printk("\ttype:%d",hsb_r->type);
	
	printk("\tspa:%d",hsb_r->spa);
	printk("\tlen:%d",hsb_r->len);
	printk("\tvid :%d\n",hsb_r->vid);
	printk("\tpppoe:%d",hsb_r->pppoeif);
	
	/* Protocol contents */
	printk("\ttagif:%d\tpppoeId:%d",hsb_r->tagif,hsb_r->pppoeid);
	printk("\tethrtype:0x%04x\n",hsb_r->ethtype);
	printk("\tllc_other:%d\tsnap:%d\n",hsb_r->llcothr,hsb_r->snap);
	printk("\tda:%02x-%02x-%02x-%02x-%02x-%02x",hsb_r->da[0],hsb_r->da[1],hsb_r->da[2],hsb_r->da[3],hsb_r->da[4],hsb_r->da[5]);
	printk("\tsa:%02x-%02x-%02x-%02x-%02x-%02x\n",hsb_r->sa[0],hsb_r->sa[1],hsb_r->sa[2],hsb_r->sa[3],hsb_r->sa[4],hsb_r->sa[5]);
	
	addr = ntohl( hsb_r->sip);
	inet_ntoa_r(addr, addr_s);
	printk("\tsip:%s(hex:%08x)   ",addr_s,hsb_r->sip);
	printk("\tsprt:%d (hex:%x)\n ",(int)hsb_r->sprt,hsb_r->sprt);
	addr  = ntohl(hsb_r->dip);
	inet_ntoa_r(addr, addr_s);
	printk("\tdip:%s(hex:%08x) ",addr_s,hsb_r->dip);		
	printk("\tdprt:%d(hex:%08x)\n",hsb_r->dprt,hsb_r->dprt);
	
	printk("\tipptl:%d,",(int)hsb_r->ipptl);
	printk("\tipflg:%d,",hsb_r->ipfg);
	printk("\tiptos:%d,",hsb_r->iptos);
	printk("\ttcpflg:%d\n",hsb_r->tcpfg);
	
	printk("\tdirtx:%d,",hsb_r->dirtx);
	printk("\tprtnmat:%d",hsb_r->patmatch);
       
	printk("\tudp_nocs:%d",hsb_r->udpnocs);
	printk("\tttlst:0x%x\n",hsb_r->ttlst);

	
	printk("\thp:%d",hsb_r->hiprior);
	printk("\tl3csok:%d\tl4csok:%d\tipfragif:%d\n",hsb_r->l3csok,hsb_r->l4csok,hsb_r->ipfo0_n);
	
 	printk("\textspa:%d",hsb_r->extspa);
	
#if defined(CONFIG_RTL_8685S_HWNAT)
	printk("\turlmch:%d\n",hsb_r->urlmch);


	printk("\t ipv4_opt:%d",hsb_r->ipv4_opt);
	printk("\t cpuTagIf:%d",hsb_r->cpuTagIf);
	printk("\t v6Ext:%d\n",hsb_r->v6Ext);
	printk("\t v6fragmOffs:%d",hsb_r->v6fragmOffs);	
	printk("\t v6Flag:%d",hsb_r->v6Flag);	
	printk("\t qpri:%d\n",hsb_r->qpri);	
	printk("\t ptpPkt:%d",hsb_r->ptpPkt);	
	printk("\t ptpVer:%d",hsb_r->ptpVer);	
	printk("\t ptpTyp:%d",hsb_r->ptpTyp);	
	printk("\t ipVerFirst:%d\n",hsb_r->ipVerFirst);	

	printk("\t Sipv6:\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
	                ,hsb_r->v6Sip.s6_addr32[0]>>16,hsb_r->v6Sip.s6_addr32[0]&0xFFFF
	        		,hsb_r->v6Sip.s6_addr32[1]>>16,hsb_r->v6Sip.s6_addr32[1]&0xFFFF
	        		,hsb_r->v6Sip.s6_addr32[2]>>16,hsb_r->v6Sip.s6_addr32[2]&0xFFFF
	        		,hsb_r->v6Sip.s6_addr32[3]>>16,hsb_r->v6Sip.s6_addr32[3]&0xFFFF);		

	printk("\t Dipv6:\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
					,hsb_r->v6Dip.s6_addr32[0]>>16,hsb_r->v6Dip.s6_addr32[0]&0xFFFF
					,hsb_r->v6Dip.s6_addr32[1]>>16,hsb_r->v6Dip.s6_addr32[1]&0xFFFF
					,hsb_r->v6Dip.s6_addr32[2]>>16,hsb_r->v6Dip.s6_addr32[2]&0xFFFF
					,hsb_r->v6Dip.s6_addr32[3]>>16,hsb_r->v6Dip.s6_addr32[3]&0xFFFF);	
	
	printk("\t v6HopLimit:%d",hsb_r->v6HopLimit);
	printk("\t v6TafficClass:%d",hsb_r->v6TafficClass);
	printk("\t v6FlowLabel:%d",hsb_r->v6FlowLabel);
	printk("\t v6NxtHdr:%d\n",hsb_r->v6NxtHdr);
	printk("\t v4PktHdr:%d",hsb_r->v4PktHdr);
	printk("\t v6PktHdr:%d",hsb_r->v6PktHdr);
	printk("\t innerIpLen:%d",hsb_r->innerIpLen);
	printk("\t tunnelLen:%d\n",hsb_r->tunnelLen);
	printk("\t l3ChecksumOfflad:%d l4ChecksumOfflad:%d  innIpHeaderLen:%d \n\t swredPktFlag:%d  swredPktFlag:%d",
					hsb_r->l3ChecksumOfflad,hsb_r->l4ChecksumOfflad,hsb_r->innIpHeaderLen,hsb_r->swredPktFlag,hsb_r->swredPktType);
	printk("  l3Checksum:%d l4Checksum:%d \n)\n",
					hsb_r->l3Checksum,hsb_r->l4Checksum);


#else /* CONFIG_RTL_8685S_HWNAT */
	printk("\turlmch:%d\n)\n",hsb_r->urlmch);

#endif /* CONFIG_RTL_8685S_HWNAT */

	printk("HSA(");
	printk("\tmac:%02x-%02x-%02x-%02x-%02x-%02x\n",hsa_r->nhmac[0],hsa_r->nhmac[1],hsa_r->nhmac[2],hsa_r->nhmac[3],hsa_r->nhmac[4],hsa_r->nhmac[5]);

	addr =ntohl( hsa_r->trip);
	inet_ntoa_r(addr, addr_s);
	printk("\ttrip:%s(hex:%08x)",addr_s,hsa_r->trip);
	printk("\tprt:%d\tipmcast:%d\n",hsa_r->port,hsa_r->ipmcastr);
	printk("\tl3cs:%d",hsa_r->l3csdt);
	printk("\tl4cs:%d",hsa_r->l4csdt);
	printk("\tInternal NETIF:%d",hsa_r->egif);
	printk("\tl2tr:%d,\n ",hsa_r->l2tr);
	printk("\tl34tr:%d",hsa_r->l34tr);
	printk("\tdirtx:%d",hsa_r->dirtxo);
	printk("\ttype:%d",hsa_r->typeo);
	printk("\tsnapo:%d",hsa_r->snapo);
	printk("\twhy2cpu 0x%x (%d)\n",hsa_r->why2cpu,hsa_r->why2cpu);
	printk("\tpppif:%d",hsa_r->pppoeifo);
	printk("\tpppid:%d",hsa_r->pppidx);
	printk("\tttl_1:0x%x",hsa_r->ttl_1if);
	printk("\tdpc:%d,",hsa_r->dpc);

	printk("\tleno:%d(0x%x)\n",hsa_r->leno,hsa_r->leno);

	printk("\tl3CrcOk:%d",hsa_r->l3csoko);
	printk("\tl4CrcOk:%d",hsa_r->l4csoko);
	printk("\tfrag:%d",hsa_r->frag);
	printk("\tlastFrag:%d\n",hsa_r->lastfrag);



	printk("\tsvid:0x%x",hsa_r->svid);
	printk("\tdvid:%d(0x%x)",hsa_r->dvid,hsa_r->dvid);
	printk("\tdestination interface :%d\n",hsa_r->difid);
	printk("\trxtag:%d",hsa_r->rxtag);
	printk("\tdvtag:0x%x",hsa_r->dvtag);
	printk("\tspa:%d",hsa_r->spao);
	printk("\tdpext:0x%x\thwfwrd:%d\n",hsa_r->dpext,hsa_r->hwfwrd);
	printk("\tspcp:%d",hsa_r->spcp);
	printk("\tpriority:%d",hsa_r->priority);

	printk("\tdp:0x%x\n",hsa_r->dp);

#if defined(CONFIG_RTL_8685S_HWNAT)

	printk("\t mirrort:%d",hsa_r->mirrort);
	printk("\t v4First:%d",hsa_r->v4First);
	printk("\t cpuTag:%d\n",hsa_r->cpuTag);
	printk("\t ptpPkt:%d",hsa_r->ptpPkt);
	printk("\t ptpV2:%d",hsa_r->ptpV2);
	printk("\t ptpType:%d\n",hsa_r->ptpType);
	printk("\t routeModeDstPort:%d",hsa_r->routeModeDstPort);
	printk("\t dPri:%d",hsa_r->dPri);
	printk("\t ipMdf:%d\n",hsa_r->ipMdf);

	printk("\t Sipv6(6rd/dslite):\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
	                                ,hsa_r->sip.s6_addr32[0]>>16,hsa_r->sip.s6_addr32[0]&0xFFFF
	                                ,hsa_r->sip.s6_addr32[1]>>16,hsa_r->sip.s6_addr32[1]&0xFFFF
	                                ,hsa_r->sip.s6_addr32[2]>>16,hsa_r->sip.s6_addr32[2]&0xFFFF
	                                ,hsa_r->sip.s6_addr32[3]>>16,hsa_r->sip.s6_addr32[3]&0xFFFF);

	printk("\t Dipv6(6rd/dslite):\t%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n"
	                                ,hsa_r->dip.s6_addr32[0]>>16,hsa_r->dip.s6_addr32[0]&0xFFFF
	                                ,hsa_r->dip.s6_addr32[1]>>16,hsa_r->dip.s6_addr32[1]&0xFFFF
	                                ,hsa_r->dip.s6_addr32[2]>>16,hsa_r->dip.s6_addr32[2]&0xFFFF
	                                ,hsa_r->dip.s6_addr32[3]>>16,hsa_r->dip.s6_addr32[3]&0xFFFF);

	printk("\t ipLen:%d",hsa_r->ipLen);
	printk("\t v4Id:%d",hsa_r->v4Id);
	printk("\t v4pkt:%d",hsa_r->v4pkt);
	printk("\t v6pkt:%d\n",hsa_r->v6pkt);
	printk("\t tunnelLen:%d",hsa_r->tunnelLen);
	printk("\t v6Multicast:%d",hsa_r->v6Multicast);
	printk("\t addipPri:%d\n",hsa_r->addipPri);

	if(IS_AFTER_RL6405)
	{
	        printk("\t l3ChecksumOfflad:%d  l4ChecksumOfflad:%d  innIpHeaderLen:%d  \n\t swredPktFlag:%d  swredPktType:%d \n"
	                                        ,hsa_r->l3ChecksumOfflad,hsa_r->l4ChecksumOfflad,hsa_r->innIpHeaderLen,hsa_r->swredPktFlag,hsa_r->swredPktType);
	}

#else /* CONFIG_RTL_8685S_HWNAT */
	printk("\t fragpkt:%d",hsa_r->fragpkt);
#endif /* CONFIG_RTL_8685S_HWNAT */


	printk(")\n");

}

/* RL6405 */
/*
testing hash fucntion ,4-way and basic l2 forwarding and all entry
*/
int32 rtl8198C_test2KL2_basic(void)
{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2tSmac,l2tDmac,l2tSmacGet,l2tDmacGet;
	ether_addr_t	OriSmacAddr;
	uint32 intPort, remPort;
	int i,col=0,fid=0;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];
	hsa_param_t hsa;
	enum PORT_MASK rxPort;	
	uint32 SmacHash,DmacHash;

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching2KL2_basic(); 

//	layer2ConfigLanswitching();	

	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;
	strtomac(&OriSmacAddr.octet, HOST1_MAC);

	bzero((void*) &l2tSmac, sizeof(l2tSmac));
	l2tSmac.ageSec=500;
	l2tSmac.auth=1;
	l2tSmac.isStatic=1;
	l2tSmac.memberPortMask = (1<<hp[0]);
	l2tSmac.nhFlag = 1;
	strtomac(&l2tSmac.macAddr, HOST1_MAC);
	l2tSmac.macAddr.octet[4]=0x2;
//	l2tSmac.macAddr.octet[5]=0x3f;
	
	bzero((void*) &l2tDmac, sizeof(l2tDmac));
	l2tDmac.ageSec=500;
	l2tDmac.auth=1;
	l2tDmac.isStatic=1;
	l2tDmac.nhFlag = 1;
	l2tDmac.memberPortMask = (1<<hp[1]);
	strtomac(&l2tDmac.macAddr, HOST2_MAC);
	l2tDmac.macAddr.octet[4]=0x2;
//	l2tDmac.macAddr.octet[5]=0x4f;
	printk("this test case need about 20 minute,please wait...\n");



	for(i=0 ;i<512;i++){

		for(fid=0;fid<4;fid++){

			for(col=0;col<4;col++){

				//**step1. reinit L2 table **/
				rtl8651_clearSpecifiedAsicTable(TYPE_L2_SWITCH_TABLE, 2048);
				rtl8651_clearSpecifiedAsicTable(TYPE_VLAN_TABLE, RTL865XC_VLAN_NUMBER);


				//**step2.write smac and dmac to L2 table **/
				SmacHash = rtl8651_filterDbIndex(&l2tSmac.macAddr,fid);
				DmacHash = rtl8651_filterDbIndex(&l2tDmac.macAddr,fid);
				printk("HOST1_MAC idx=%d    HOST2_MAC idx=%d \n",SmacHash,DmacHash);

				printk("ADD Smac=%x-%x-%x-%x-%x-%x  Dmac= %x-%x-%x-%x-%x-%x  fid=%d i=%d col=%d \n",
					l2tSmac.macAddr.octet[0],l2tSmac.macAddr.octet[1],l2tSmac.macAddr.octet[2],l2tSmac.macAddr.octet[3],l2tSmac.macAddr.octet[4],l2tSmac.macAddr.octet[5],
					l2tDmac.macAddr.octet[0],l2tDmac.macAddr.octet[1],l2tDmac.macAddr.octet[2],l2tDmac.macAddr.octet[3],l2tDmac.macAddr.octet[4],l2tDmac.macAddr.octet[5],
					fid,i,col);
				l2tSmac.fid=fid;
				l2tDmac.fid=fid;
				RTL_TESTMODEL_CHECK(rtl8651_setAsicL2Table(SmacHash, col, &l2tSmac));
				RTL_TESTMODEL_CHECK(rtl8651_setAsicL2Table(DmacHash, col, &l2tDmac));


				//check get same mac
				memset(&l2tSmacGet,0x0,sizeof(l2tSmacGet));
				memset(&l2tDmacGet,0x0,sizeof(l2tDmacGet));
				if(rtl8651_getAsicL2Table(SmacHash, col, &l2tSmacGet)!= SUCCESS){
					printk("l2tSmac get fail  row=%d col=%d \n",SmacHash, col);
					return FAILED;
				}
				if(rtl8651_getAsicL2Table(DmacHash, col, &l2tDmacGet)!= SUCCESS){
					printk("l2tDmac get fail  row=%d col=%d \n",DmacHash, col);
					return FAILED;
				}
				/*
				printk("Get Smac=%x-%x-%x-%x-%x-%x  Dmac= %x-%x-%x-%x-%x-%x  fid=%d i=%d col=%d \n",
					l2tSmacGet.macAddr.octet[0],l2tSmacGet.macAddr.octet[1],l2tSmacGet.macAddr.octet[2],l2tSmacGet.macAddr.octet[3],l2tSmacGet.macAddr.octet[4],l2tSmacGet.macAddr.octet[5],
					l2tDmacGet.macAddr.octet[0],l2tDmacGet.macAddr.octet[1],l2tDmacGet.macAddr.octet[2],l2tDmacGet.macAddr.octet[3],l2tDmacGet.macAddr.octet[4],l2tDmacGet.macAddr.octet[5],
					fid,i,col);		
				*/
				if(memcmp(&l2tSmacGet.macAddr,&l2tSmac.macAddr,6)!=0 || memcmp(&l2tSmacGet.macAddr,&l2tSmac.macAddr,6)!=0){
					printk("memecmp fail\n");
					return FAILED;
				}
				
				
				//**step3.set vlan and fid **/
				{
				rtl865x_tblAsicDrv_vlanParam_t	vlanp;
				vlanp.fid=fid;
				vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
				vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
				rtl8651_setAsicVlan(LAN1_VID,&vlanp);
				}


				/*step4.generate input packet**/
				//host1(port0) to host2(port1) forward
				//input packet
				memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
				conf.pktType					= _PKT_TYPE_UDP;	
				conf.ip.id						= 0x0a;
				conf.ip.ttl 					= 128;
				conf.conf_dport 				= remPort;
				conf.conf_sport 				= intPort;
				conf.payload.length 			= 128;
				conf.payload.content			= pkt_payload_Data;
				conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
				conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
				memcpy(conf.conf_smac,&l2tSmac.macAddr,sizeof(ether_addr_t));
				memcpy(conf.conf_dmac,&l2tDmac.macAddr,sizeof(ether_addr_t));
				pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
				
				//**step5.virtualMacInput**/
				RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
				//RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

//auto learn
#if 0
				/*step4.generate input packet**/
				//host1(port0) to host2(port1) forward
				//input packet
				memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
				conf.pktType					= _PKT_TYPE_UDP;	
				conf.ip.id						= 0x0a;
				conf.ip.ttl 					= 128;
				conf.conf_dport 				= intPort;
				conf.conf_sport 				= remPort;
				conf.payload.length 			= 128;
				conf.payload.content			= pkt_payload_Data;
				conf.conf_sip					= ntohl(inet_addr(HOST2_IP));
				conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
				memcpy(conf.conf_dmac,&l2tSmac.macAddr,sizeof(ether_addr_t));
				memcpy(conf.conf_smac,&l2tDmac.macAddr,sizeof(ether_addr_t));
				pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
				
				//**step5.virtualMacInput**/
				RTL_TESTMODEL_CHECK(virtualMacInput(1/*port ID*/,pktBuf, pktLen+4));
				RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

				/*step4.generate input packet**/
				//host1(port0) to host2(port1) forward
				//input packet
				memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
				conf.pktType					= _PKT_TYPE_UDP;	
				conf.ip.id						= 0x0a;
				conf.ip.ttl 					= 128;
				conf.conf_dport 				= remPort;
				conf.conf_sport 				= intPort;
				conf.payload.length 			= 128;
				conf.payload.content			= pkt_payload_Data;
				conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
				conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
				memcpy(conf.conf_smac,&l2tSmac.macAddr,sizeof(ether_addr_t));
				memcpy(conf.conf_dmac,&l2tDmac.macAddr,sizeof(ether_addr_t));
				pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		

				//**step5.virtualMacInput**/
				RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
				RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

#endif


#if 1

				//**step6.generate expect packet and virtualMacOuput**/
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				//Expect packet
				conf.ip.ttl 					= 128;
				conf.conf_dport 				= remPort;
				conf.conf_sport 				= intPort;
				conf.payload.length 			= 128;
				conf.payload.content			= pkt_payload_Data;
				conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
				conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
				memcpy(conf.conf_smac,&l2tSmac.macAddr,sizeof(ether_addr_t));
				memcpy(conf.conf_dmac,&l2tDmac.macAddr,sizeof(ether_addr_t));
				pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */	
				//Output packet
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<1;
				RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
				//**step7.check hsa and output packet **/
				//RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
				RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
				PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				
				RTL_TESTMODEL_CHECK(rtl865xC_virtualMacGetHsa(&hsa));
				if(hsa.dp != (1<<1))	
					dumphs();
				RTL_TESTMODEL_IS_EQUAL("hsa.dp error",hsa.dp,1<<1);


#endif
			
			}

		}

#if 1
		if(l2tSmac.macAddr.octet[5] ==0xff){
			l2tSmac.macAddr.octet[5]=0;
		}else{
			l2tSmac.macAddr.octet[5]++;
		}	
		
		if(l2tDmac.macAddr.octet[5] ==0xff){
			l2tDmac.macAddr.octet[5]=0;
		}else{
			l2tDmac.macAddr.octet[5]++;
		}	


		if(OriSmacAddr.octet[5] ==l2tSmac.macAddr.octet[5]){
			l2tSmac.macAddr.octet[4]++;
			l2tDmac.macAddr.octet[4]++;
		}
//			printk("next Smac=%x-%x-%x-%x-%x-%x  Dmac= %x-%x-%x-%x-%x-%x  fid=%d i=%d col=%d \n",
//				l2tSmac.macAddr.octet[0],l2tSmac.macAddr.octet[1],l2tSmac.macAddr.octet[2],l2tSmac.macAddr.octet[3],l2tSmac.macAddr.octet[4],l2tSmac.macAddr.octet[5],
//				l2tDmac.macAddr.octet[0],l2tDmac.macAddr.octet[1],l2tDmac.macAddr.octet[2],l2tDmac.macAddr.octet[3],l2tDmac.macAddr.octet[4],l2tDmac.macAddr.octet[5],
//				fid,i,col);
#endif

	}

	return SUCCESS;
}



#define ALE_HANG_BUG 1 
/* IPV4/V6 multicast hit L3V6 table entry and proc=ARP�AALE hang*/
#if ALE_HANG_BUG


int32  layer2ConfigV6Mcast( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register(); 
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	WRITE_MEM32(V6CTR0,((READ_MEM32(V6CTR0)& ~CF_IPM_IP_UNMCH_V6_MSK)& ~CF_IPM_SPA_UNMCH_V6_MSK) |2<<CF_IPM_SPA_UNMCH_V6 |1<<CF_IPM_IP_UNMCH_V6  );


	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}

 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);



{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(GW_LAN1_V6IPMIP);
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all 
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

{


	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	v6mcastp.ageTime = 0x7;
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = TEST_V6MC_PORT_MASK;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =0 ;
	v6mcastp.v6rdTbIdx =0 ;
	rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));


}



return 0;

}


int32 rtl8198C_testV6Mcast(void)
{
	
	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer2ConfigV6Mcast(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&TEST_V6MC_PORT_MASK) != 0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}
}
#endif
		assert_equal(rtl_check_virtual_mac(),SUCCESS);
	
		return SUCCESS;

}


int32  layer3Config_DsLiteDecapIPM_ALE_HangBug_NxthopRouting( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN0_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//**enble Ds-Lite mode**/
	WRITE_MEM32(DSLITECTR0, CF_DSLITE_EN ); 
	WRITE_MEM32(DSLITECTR1, (128 << CF_DSL_HOPLIMIT) ); 

	//**enble IPMv4 mode**/
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_IPMV6_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0] | 1<<1);
	vlant.untagPortMask = (1<<hp[0] | 1<<1);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_IPMV6_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.untagPortMask = (1<<2 | 1<<3| 1<<4| 1<<5);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}


#if 0
	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);


	}
#endif

#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all 
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	rtl8198C_setAsicIpv6Routing(1, &v6routet);


	}
#endif



/*setting DSLite table*/
#if 1 
{


	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif

//IPM table 
#if 1
{

	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;


	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	mCast_t.dip= ntohl(inet_addr(HOST3_IPMIP)); 
	mCast_t.sip= ntohl(inet_addr(HOST1_IP));
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0xa9;  //010,101001
	mCast_t.port = 1;	 //notice  cf_ipm_spa_unmch
	
	rtl8651_setAsicIpMulticastTable(&mCast_t);

//{
//	rtl865x_tblAsicDrv_multiCastParam_t gmCast_t;

//    printk("idx = %d \n ",rtl8651_ipMulticastTableIndex(mCast_t->sip, mCast_t->dip));
// rtl8651_getAsicIpMulticastTable(&gmCast_t)
//}

}
#endif


#if 0
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}


int32 rtl8198C_testDsLiteDecapIPM_ALE_HangBug_NxthopRouting(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
	hsa_param_t hsa;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteDecapIPM_ALE_HangBug_NxthopRouting(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x800 /* ->cf_ipm_spa_unmch */ );

	//cf_ipm_ip_unmch set:  0x000 cpu,0x100 drop ,0x200 flooding 	
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0x300)) | 0x200 /* ->cf_ipm_ip_unmch */ );


{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	
/**input packet**/  // same vlan ttl=2 expect ttl-1

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 2;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

//**Expect packet **/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktLen_Expect,0x0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 1;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IPMIP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,"33-33-00-00-88-8a"),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"01-00-5e-28-02-02"),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	{
		int egressPort;
		for(egressPort=0;egressPort<6;egressPort++)
		{
			if(((1<<egressPort)&0x69) != 0)
			{
				pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
				rxPort = 1<<egressPort;
				memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
				if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
				{

					RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
					RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
					PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
				}else{

					printk("virtualMacOutput FAILED \n");
					return FAILED;
				}
			}
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

}

	return SUCCESS;

}

#endif //ALE_HANG_BUG


#define IPM_selectDestIf 1
#if IPM_selectDestIf

int32 rtl8198C_test_IPMv4_selectDestIf(void)
{

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	int i=0;


	/* setup environment */
	ether_addr_t	multicast_stream_smac;
	ether_addr_t	multicast_stream_dmac;
	ipaddr_t			multicast_stream_sip;
	ipaddr_t			multicast_stream_dip;	
	ether_addr_t	wan_gmac;


	strtomac(&multicast_stream_smac,RTL865xC_TEST_WAN1_HOST_MAC);
	strtomac(&multicast_stream_dmac,"01-00-5e-00-00-03");
	strtoip(&multicast_stream_sip, RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&multicast_stream_dip, "224.0.0.3");
	strtomac(&wan_gmac,RTL865xC_TEST_WAN1_GMAC);

	default_register(); 
	rtl8651_clearAsicPvid();

	rtl8651_setAsicPvid(0,LAN1_VID);
	rtl8651_setAsicPvid(1,LAN0_VID);
	rtl8651_setAsicPvid(2,LAN0_VID);
	rtl8651_setAsicPvid(3,LAN0_VID);
	rtl8651_setAsicPvid(4,LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	//opne IPM function
	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU |CF_IPMV4DIF_EN);
//	WRITE_MEM32(FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU );

	
	/* TTL control reg: enable TTL-1 operation */
//	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

#if 0
{
	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "192.168.1.1");
	routet.ipMask = 0xffffff;
	routet.process = PROCESS_INDIRECT; //PROCESS_INDIRECT //PROCESS_DIRECT
	routet.vidx= rtl865xc_netIfIndex(RTL865xC_TEST_WAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);
}
#endif



	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-BB-BB-BB");
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-AA-AA-AA");
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, "00-00-11-AA-BB-AA");
	netif.vid = LAN2_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(6,&netif);
	}

	{

		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0xe;
		vlant.untagPortMask = 0xe;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN0_VID,&vlant);

		
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask = 0x1f1;
		vlant.untagPortMask = 0x1f1;
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN1_VID,&vlant);


	}

//IPM table 
#if 1
{

	ether_addr_t macAddr;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;


	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	mCast_t.dip= htonl(multicast_stream_dip);
	mCast_t.sip= htonl(multicast_stream_sip);
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0x6;  //010,101010
	mCast_t.port = 0;	 //notice  cf_ipm_spa_unmch
	mCast_t.difidx =6;

	
	rtl8651_setAsicIpMulticastTable(&mCast_t);


}
#endif

	//cf_ipm_spa_unmch set: 0x000 cpu,0x400 drop ,0x800 flooding 
	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0xc00)) | 0x400 /* ->cf_ipm_spa_unmch */ );

	//cf_ipm_ip_unmch set:  0x000 cpu,0x100 drop ,0x200 flooding 	
//	WRITE_MEM32(0xbb804428, (READ_MEM32(0xbb804428)&(~0x300)) | 0x000 /* ->cf_ipm_ip_unmch */ );


	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	memcpy(conf.conf_smac,&multicast_stream_smac,ETHER_ADDR_LEN);
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */	
	
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	/* Input */
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(/*portID*/0,pktBuf, pktLen+4));
	/* Output , and ckeck output port */
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;

	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{
		rtlglue_printf("virtualMacOutput success  rxPort=%x\n",rxPort);
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		
	}else{
		rtlglue_printf("virtualMacOutput fail  rxPort=%x\n",rxPort);
	}

	rxPort = 1<<2;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{
		rtlglue_printf("virtualMacOutput success  rxPort=%x\n",rxPort);
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		
	}else{
		rtlglue_printf("virtualMacOutput fail  rxPort=%x\n",rxPort);
	}


	/* Generate and input a UDP-multicast packet*/
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType						= _PKT_TYPE_UDP;	
	conf.ip.id							= 0xa;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= RTL865xC_TEST_STREAM0_PORT_REM;
	conf.conf_sport 				= RTL865xC_TEST_STREAM0_PORT_INT;
	conf.payload.length 			= RTL865xC_TEST_STREAM0_PAYLOAD_LEN;
	conf.payload.content				= pkt_payload_Data;
	conf.conf_sip						= multicast_stream_sip;
	conf.conf_dip						= multicast_stream_dip; 
	
	strtomac(&conf.conf_smac, "00-00-11-AA-BB-AA");
	memcpy(conf.conf_dmac,&multicast_stream_dmac,ETHER_ADDR_LEN);

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */	

	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
		
	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		//0xf - 0x1  vlan members - input port 
		if(hsa.dp == 0x6)
			return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
		else
			return FAILED;

	}

	
}




int32  layer2ConfigIPMv6_selectDestIf( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register(); 
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	WRITE_MEM32(V6CTR0,((READ_MEM32(V6CTR0)& ~CF_IPM_IP_UNMCH_V6_MSK)& ~CF_IPM_SPA_UNMCH_V6_MSK) |2<<CF_IPM_SPA_UNMCH_V6 |1<<CF_IPM_IP_UNMCH_V6 |CF_IPMV6DIF_EN  );

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN2_MAC);
	netif.vid = LAN2_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(6,&netif);


	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);



{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(GW_LAN1_V6IPMIP);
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	


}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all 
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 0;//hit all
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

#if 1
{
//	int i=0;
	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastGetp;

	v6mcastp.ageTime = 0x7;
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = TEST_V6MC_PORT_MASK;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =0 ;
	v6mcastp.v6rdTbIdx =0 ;
	v6mcastp.difidx=6;
	
//	while(1<10000){
	rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
//	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
	rtl8198C_getAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastGetp);
	if(v6mcastGetp.difidx != v6mcastp.difidx)
	{
		printk("v6mcastGetp.difidx=%d  v6mcastp.difidx=%d \n",v6mcastGetp.difidx, v6mcastp.difidx);
		return FAILED;
	}
//	printk("test=%d\n",i);
//	i++;
//	}


}
#endif



return 0;

}


int32 rtl8198C_testIPMv6_selectDestIf(void)
{
		ether_addr_t mac;
	
		uint32 intPort, remPort;
	
	
		rtl8651_PktConf_t conf;
		int32 pktLen;  
		int32 pktLen_Expect;  
		uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
		uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
		uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
		enum PORT_MASK rxPort;	
		if(layer2ConfigIPMv6_selectDestIf()==FAILED){
			printk("setting layer2ConfigIPMv6_selectDestIf  FAILED \n");
			return FAILED;
		}
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	
	
	
#if 1
	{
		int i;
		for(i=0;i<1;i++){
			printk("times =%d\n",i);
			remPort=0x1111;
			intPort=0x2222;

			//Outbound
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_V6UDP;	
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
			in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
		//	conf.pppoe.type 				= 0x0800;
		//	conf.pppoe.session				= 0;
		//	conf.l2Flag 					= 0;
			
			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
			RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet

			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.ipv6.hoplmt				= 254;
			conf.payload.content			= pkt_payload_Data;
			in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
			in6_pton(GW_LAN1_V6IPMIP ,-1,(&conf.conf_v6dip),-1,NULL );
			memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN2_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_IPMV6_MAC),sizeof(ether_addr_t));
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			{
				int egressPort;
				for(egressPort=0;egressPort<6;egressPort++)
				{
					if(((1<<egressPort)&TEST_V6MC_PORT_MASK) != 0)
					{
						pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
						rxPort = 1<<egressPort;
						if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
						{

							RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
							RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
							PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
						}else{

							printk("virtualMacOutput FAILED \n");
							return FAILED;
						}
					}
				}
			}
		}

	}
#endif
	
		assert_equal(rtl_check_virtual_mac(),SUCCESS);

		return SUCCESS;

}

int32 rtl8198C_testIPMv4v6_DestSelectIf_StressTest(void){

	uint32 testTimes=1000000;
	int i;
	uint32 _V6CTR0,_FFCR;

	for(i=0;i<testTimes;i++){
		if(i%1000 == 0){
			printk("testTimes =%d \n",i);
		}
		WRITE_MEM32(V6CTR0,0);
		
		_V6CTR0 = READ_MEM32(V6CTR0);
		if (_V6CTR0!=0)
		{
			printk("times %d  _V6CTR0 =%d !=0 READ_FAILED\n",testTimes,_V6CTR0);
			return FAILED;
		}
		WRITE_MEM32(V6CTR0, 2<<CF_IPM_SPA_UNMCH_V6 |1<<CF_IPM_IP_UNMCH_V6 |CF_IPMV6DIF_EN  );
		_V6CTR0 = READ_MEM32(V6CTR0);
		if(_V6CTR0 !=(2<<CF_IPM_SPA_UNMCH_V6 |1<<CF_IPM_IP_UNMCH_V6 |CF_IPMV6DIF_EN)){
			printk("times %d  _V6CTR0 =%d !=%d  READ_FAILED\n",i,_V6CTR0,(2<<CF_IPM_SPA_UNMCH_V6 |1<<CF_IPM_IP_UNMCH_V6 |CF_IPMV6DIF_EN));
			return FAILED;
		}
		
	}



	for(i=0;i<testTimes;i++){
		if(i%1000 == 0){
			printk("testTimes =%d \n",i);
		}
		WRITE_MEM32(FFCR,0);
		
		_FFCR = READ_MEM32(FFCR);
		if (_FFCR!=0)
		{
			printk("times %d  _FFCR =%d !=0 READ_FAILED\n",testTimes,_FFCR);
			return FAILED;
		}
		WRITE_MEM32(FFCR,  IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU |CF_IPMV4DIF_EN );
		_FFCR = READ_MEM32(FFCR);
		if(_FFCR != (IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU |CF_IPMV4DIF_EN)){
			printk("times %d  _FFCR =%d !=%d	READ_FAILED\n",i,_FFCR, IPMltCstCtrl_Enable |EN_UNMCAST_TOCPU |CF_IPMV4DIF_EN);
			return FAILED;
		}
		
	}

	
{

	ether_addr_t macAddr;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_t;
	rtl865x_tblAsicDrv_multiCastParam_t mCast_tGet;

	memset(&mCast_t,0,sizeof(mCast_t));
	mCast_t.age=0x7;
	strtoip(&mCast_t.sip,RTL865xC_TEST_WAN1_HOST_IP);
	strtoip(&mCast_t.dip,"224.0.0.3");
	mCast_t.extIdx = 0;
	mCast_t.mbr = 0x6;	//010,101010
	mCast_t.port = 0;	 //notice  cf_ipm_spa_unmch
	mCast_t.difidx =6;

	for(i=0;i<testTimes;i++){

		if(i%1000 == 0){
			printk("testTimes =%d \n",i);
		}

		memset(&mCast_tGet,0,sizeof(mCast_tGet));

		rtl8651_delAsicIpMulticastTable(&mCast_t);
		rtl8651_setAsicIpMulticastTable(&mCast_t);
		rtl8651_getAsicIpMulticastTable(rtl8651_ipMulticastTableIndex(mCast_t.sip,mCast_t.dip),&mCast_tGet);
		if(mCast_tGet.difidx != mCast_tGet.difidx){
			printk("mCast_tGet.difidx =%d   mCast_tGet.difidx=%d testtimes=%d\n",mCast_tGet.difidx,mCast_tGet.difidx,testTimes);
			return FAILED;
		}
	}

}


{
	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
	rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastGetp;
	memset(&v6mcastp,0,sizeof(v6mcastp));

	v6mcastp.ageTime = 0x7;
	in6_pton(GW_LAN1_V6IPMIP ,-1,&(v6mcastp.destIPAddr),-1,NULL );
	v6mcastp.extPortMember = 0;//0x7;
	v6mcastp.portMember = 0x0e;
	in6_pton(HOST3_V6IP ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
	v6mcastp.srcPort =0;
	v6mcastp.toCPU =0;
	v6mcastp.v6rdEngress =0 ;
	v6mcastp.v6rdTbIdx =0 ;
	v6mcastp.difidx=6;
	
	for(i=0 ;i<testTimes;i++){
		
		if(i%1000 == 0){
			printk("testTimes =%d \n",i);
		}
		
		memset(&v6mcastGetp,0,sizeof(v6mcastGetp));
		rtl8198C_delAsicIpMulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
		rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
	//	printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
		rtl8198C_getAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastGetp);
		if(v6mcastGetp.difidx != v6mcastp.difidx)
		{
			printk("v6mcastGetp.difidx=%d  v6mcastp.difidx=%d testtimes=%d\n",v6mcastGetp.difidx, v6mcastp.difidx);
			return FAILED;
		}
	}
}

	return SUCCESS;


}


#endif//IPM_selectDestIf



#define IPv6_l4hsbCheckErrorBug 1
#if IPv6_l4hsbCheckErrorBug


int32  layer2ConfigV6Lanswitching_l4hsbCheckErrorBug( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	//set netif table  
   {

   rtl865x_tblAsicDrv_intfParam_t netif;
   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN0_MAC);
   netif.mtu = 1500;
   netif.vid = LAN0_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= 9;
   netif.inAclStart=8;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(0,&netif);



   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN1_MAC);
   netif.mtu = 1500;
   netif.vid = LAN1_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
   netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(1,&netif);



   }


	return 0;
	
}


#define V6_EXTENDSION_LAN (10) //unit 4byte

/*LAN L2 test*/
int32 rtl8198C_testV6L2_l4hsbCheckErrorBug(void)

{

	ether_addr_t mac;
	uint32  intPort, remPort;
	hsb_param_t hsb;
	uint32 failFlag=0;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigV6Lanswitching_l4hsbCheckErrorBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);


	
	remPort=0x1111;
	intPort=0x2222;

/*

int in6_pton	
(	
	const char * 	src,
	int 	srclen,
	u8 * 	dst,
	int 	delim,
	const char ** 	end 
)	

in6_pton - convert an IPv6 address from literal to binary representation 
		{
			src: the start of the IPv6 address string 
			srclen: the length of the string, -1 means strlen(src) 
			dst: the binary (u8[16] array) representation of the IPv6 address 
			delim: the delimiter of the IPv6 address in , -1 means no delimiter 
			end: A pointer to the end of the parsed string will be placed here
		}
*/

// UDP case
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 2;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	conf.extHdr=hopbyhopHdr|DesHdr|AutHdr|DesHdr2|FraHdr;

	/*  hopbyhopHdr(16) DesHdr(16) AutHdr(20) DesHdr2(16) FraHdr(8) */


	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));



	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	rtl865xC_virtualMacGetHsb( &hsb );

	if(hsb.l4csok==1){
		printk("UDP checksum OK hsb.l4csok==%d\n",hsb.l4csok);
	}else{
		printk("UDP checksum FAIL hsb.l4csok==%d\n",hsb.l4csok);
		failFlag=1;
	}

// TCP case
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
	conf.pktType					= _PKT_TYPE_V6TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 2;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid					= LAN1_VID;
	conf.extHdr=hopbyhopHdr|DesHdr|AutHdr|DesHdr2|FraHdr;
/*	hopbyhopHdr(16) DesHdr(16) AutHdr(20) DesHdr2(16) FraHdr(8) */

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	rtl865xC_virtualMacGetHsb( &hsb );

	if(hsb.l4csok==1){
		printk("TCP checksum OK hsb.l4csok==%d\n",hsb.l4csok);
	}else{
		printk("TCP checksum FAIL hsb.l4csok==%d\n",hsb.l4csok);
		failFlag=1;
	}


	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	if(failFlag==1){
		return FAILED;
	}else{
		return SUCCESS;
	}

}

#endif  //End IPv6_l4hsbCheckErrorBug



#define TESTING_NIC_VirtualMAC 1

#if TESTING_NIC_VirtualMAC //we will try using nic direct tx to send packet and 

int32  layer2ConfigLanswitching_NicDirectTx( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);


}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));

	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	return 0;
	
}

/*LAN L2 test*/
int32 rtl8198C_testL2_NicDirectTx(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	layer2ConfigLanswitching_NicDirectTx(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;


	memset(&nicTx,0,sizeof(nicTx));

	
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.vid=RTL_LANVLANID;
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
//	rtl_direct_txInfo(1<<1,&nicTx);
	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}


#endif



#define checkSumOffLoad_HwLookUp 1
#if checkSumOffLoad_HwLookUp

int32  layer2ConfigLanswitching_checkSumOffLoad_HwLookUp( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);


}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));

	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	return 0;
	
}





/*LAN L2 test*/
int32 rtl8198C_testL2_checkSumOffLoad_HwLookUp(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	layer2ConfigLanswitching_checkSumOffLoad_HwLookUp(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;


	memset(&nicTx,0,sizeof(nicTx));

	
	{ /*  Offload ipv4 UDP L3/L4  */
		printk("Offload ipv4 UDP L3/L4\n");
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+10)=0xff;*(pktBuf+14+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+20+6)=0xff;*(pktBuf+14+20+7)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	{ /*  Offload ipv4 TCP L3/L4  */
		
		printk("Offload ipv4 TCP L3/L4\n");
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+10)=0xff;*(pktBuf+14+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+20+16)=0xff;*(pktBuf+14+20+17)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	{ /*  Offload ipv4 ICMP L3/L4  */
		
		printk("Offload ipv4 ICMP L3/L4\n");
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_ICMP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+10)=0xff;*(pktBuf+14+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+20+2)=0xff;*(pktBuf+14+20+3)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	{ /*  Offload ipv4 IGMP L3/L4  */
		ether_addr_t macAddr;
		rtl865x_tblAsicDrv_multiCastParam_t mCast_t;

		memset(&mCast_t,0,sizeof(mCast_t));
		mCast_t.age=0x7;
		strtoip(&mCast_t.dip,HOST2_IPMIP);
		strtoip(&mCast_t.sip,HOST1_IP);
		mCast_t.extIdx = 0;
		mCast_t.mbr = 0x6;	//010,101010
		mCast_t.port = 0x7;	 //0x7=cpu port   notice  cf_ipm_spa_unmch
		mCast_t.difidx =6;
		
		rtl8651_setAsicIpMulticastTable(&mCast_t);

		memset(&mCast_t,0,sizeof(mCast_t));
		strtoip(&mCast_t.dip,HOST2_IPMIP);
		strtoip(&mCast_t.sip,HOST1_IP);
		if(rtl8651_getAsicIpMulticastTable(rtl8651_ipMulticastTableIndex(mCast_t.sip, mCast_t.dip),&mCast_t)!=SUCCESS){
			printk("hello get fail haha.. line:%d \n",__LINE__);
		}else{
			printk("hello get SUCCESS haha.. line:%d mCast_t.port=%d\n",__LINE__,mCast_t.port);

		}

		
		printk(" Offload ipv4 IGMP L3/L4\n");
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_IGMP;
		conf.igmp.ver					= 2;
		conf.igmp.type					= 0x11;
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IPMIP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_v4IPM_MAC),sizeof(ether_addr_t));

		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+10)=0xff;*(pktBuf+14+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+24+2)=0xff;*(pktBuf+14+24+3)=0xff;	//set igmp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,1);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IPMIP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_v4IPM_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);

		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<2;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<2);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);

		{
			hsa_param_t hsa;
			memset(&hsa,0,sizeof(hsa));
			rtl865xC_virtualMacGetHsa(&hsa);
			//0xf - 0x1  vlan members - input port 
			if(hsa.dp == 0x6){
				printk("SUCCESS hsa.dp=%d\n",hsa.dp);
				//return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
			}else{
				printk("FAILED hsa.dp=%d\n",hsa.dp);
				return FAILED;
			}
		}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

		
	}


	{/*  Offload ipv6 UDP L4  */
	printk(" Offload ipv6 UDP L4\n");

	//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	//	conf.pppoe.type 				= 0x0800;
	//	conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	*(pktBuf+14+40+6)=0xff;*(pktBuf+14+40+7)=0xff;	//set udp checksum=0xff


	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	{/*  Offload ipv6 TCP L4  */
	printk(" Offload ipv6 TCP L4 \n");

	//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	//	conf.pppoe.type 				= 0x0800;
	//	conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	*(pktBuf+14+40+16)=0xff;*(pktBuf+14+40+17)=0xff;	//set udp checksum=0xff


	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	}

	{/*  Offload ipv6 ICMP L4  */
	printk("  Offload ipv6 ICMP L4 \n");

	//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6ICMP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	//	conf.pppoe.type 				= 0x0800;
	//	conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid					= LAN1_VID;

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	*(pktBuf+14+40+2)=0xff;*(pktBuf+14+40+3)=0xff;	//set udp checksum=0xff


	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.vid=RTL_LANVLANID;

	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
	in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	}


/* IPV6 IGMP ->ICMP MLD  */
#if 0
{/*  Offload ipv6 IGMP L4  */

	{
	
	
		rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
		v6mcastp.ageTime = 0x7;
		in6_pton("ffff:0db8:85a3:08d3:1319:8a2e:0370:2222" ,-1,&(v6mcastp.destIPAddr),-1,NULL );
		v6mcastp.extPortMember = 0;//0x7;
		v6mcastp.portMember = 0x0e;
		in6_pton("2001:0db8:85a3:08d3:1319:8a2e:0001:1111" ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
		v6mcastp.srcPort =8; //extPort 1
		v6mcastp.toCPU =0;
		v6mcastp.v6rdEngress =0 ;
		v6mcastp.v6rdTbIdx =0 ;
		rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
		printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
	
	
	}

	char packetInputBuf[]={	
					0x33	,0x33  ,0x00  ,0x00  ,0x00  ,0x40  ,0x00  ,0x00    ,0x00  ,0x00  ,0x00  ,0x50  ,0x86  ,0xDD  ,0x60  ,0x00,
					0x00  ,0x00  ,0x00  ,0x08  ,0x02  ,0x7F  ,0x20  ,0x01    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x00  ,0x01  ,0x11  ,0x11  ,0xFF  ,0xFF    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x03  ,0x70  ,0x22  ,0x22  ,0x16  ,0x00    ,0xff/*error chksum*/  ,0xff/*error chksum*/  ,0xE0  ,0x00  ,0x00  ,0x02  ,0x17  ,0x31,
					0xAA  ,0xDF	}; //include crc

	

	char packetBuf[]={	
					0x33	,0x33  ,0x00  ,0x00  ,0x00  ,0x40  ,0x00  ,0x00    ,0x00  ,0x00  ,0x00  ,0x50  ,0x86  ,0xDD  ,0x60  ,0x00,
					0x00  ,0x00  ,0x00  ,0x08  ,0x02  ,0x7F  ,0x20  ,0x01    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x00  ,0x01  ,0x11  ,0x11  ,0xFF  ,0xFF    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x03  ,0x70  ,0x22  ,0x22  ,0x16  ,0x00    ,0x2C  ,0xFC  ,0xE0  ,0x00  ,0x00  ,0x02  ,0x17  ,0x31,
					0xAA  ,0xDF	}; //include crc


		skb=alloc_skb(pktLen+100,0);
		skb->data=packetInputBuf;
		skb->len = sizeof(packetBuf)-4;
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;
	
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,2);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

	

		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(packetBuf,pktBuf,sizeof(packetBuf),pktLen,__func__,__LINE__);
		
		{
			hsa_param_t hsa;
			memset(&hsa,0,sizeof(hsa));
			rtl865xC_virtualMacGetHsa(&hsa);
			//0xf - 0x1  vlan members - input port 
			if(hsa.dp == 0x0e){
				printk("SUCCESS hsa.dp=%d\n",hsa.dp);
				//return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
			}else{
				printk("FAILED hsa.dp=%d\n",hsa.dp);
				return FAILED;
			}
		}



}
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}

#endif



#define CONFIG_DIREECTTX_UNTAG_VID_PRI 1
#if CONFIG_DIREECTTX_UNTAG_VID_PRI

int32  layer2ConfigLanswitching_NicDirectTx_VLANADD( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);


}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));

	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	return 0;
	
}




/* vlan_untag packet direct tx -> vlna_tag packet */
int32 rtl8198C_testL2_NicDirectTx_VLANADD(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	layer2ConfigLanswitching_NicDirectTx_VLANADD(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;


	memset(&nicTx,0,sizeof(nicTx));

	
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid 					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.replaceTxDesc=1;
	nicTx.vid=0xff;
	nicTx._priority=0x1;
	nicTx.txCVlanTagAutoAdd = 1<<1;
	nicTx.pktType=PKTHDR_UDP;
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid 					= 0xff;
	conf.vlan.prio					= 0x1;

	
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);


	return SUCCESS;
}
#endif


#define checkSumOffLoad_DirectTx 1
#if checkSumOffLoad_DirectTx


int32  layer2ConfigV6Lanswitching_l4hsbCheckErrorBug_chkOffload( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}


	return 0;
	
}


int32  layer3Config_DsLiteDecap_NxthopRouting_chkOffload( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0, CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 		//enble 6rd mode
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1; 
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);

{
	rtl865x_tblAsicDrv_arpParam_t arpt ;
	uint32 ip32;
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);


}

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}

int32  layer3Config_V6RdDecap_ArpRouting_OffloadChk( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN2_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,READ_MEM32(V6RDCTR0)|CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_INV_MAC);
	netif.vid = LAN1_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_MAC);
	netif.vid = LAN2_VID;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
	#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
	#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
	#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
//	strtomac(&l2t.macAddr, CE_INV_MAC);
//	l2t.memberPortMask = (1<<hp[0]);
//	l2t.nhFlag = 1;
//	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(CE_INV_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan CE_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	

}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN2_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

	/*	delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_INV_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_INV_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}
#endif

return 0;


}


int32  layer2ConfigLanswitching_checkSumOffLoad_DirectTx( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);


}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));

	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);



	{

	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	memset(&pppoet,0,sizeof(pppoet));
	pppoet.age=0xff;
	pppoet.sessionId=10;
	rtl8651_setAsicPppoe(2,&pppoet);


	}



	return 0;
	
}



/*LAN L2 test*/
#define VLAN_TAG 1
int32 rtl8198C_testL2_checkSumOffLoad_DirectTx(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;
	int i;
	int vlanBytes=0;

	TEST_MODEL_DONOT_DIRECT_TX=0;
	layer2ConfigLanswitching_checkSumOffLoad_DirectTx(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;
	DumpSwNicTxRx_debug=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=1;
#endif
	mdelay(100);

	for(i=0;i<2;i++){
		{ /*  Offload ipv4 UDP L3/L4  */
		printk("\nOffload ipv4 UDP L3/L4\n");	
		memset(&nicTx,0,sizeof(nicTx));
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;

		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid 					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+20+6)=0xff;*(pktBuf+14+vlanBytes+20+7)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//	rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);


		}


#if 1
		{

		/*  Offload ipv4 PPPOE UDP L3/L4  */
		printk("\nOffload ipv4 PPPOE UDP L3/L4\n");
		memset(&nicTx,0,sizeof(nicTx));
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 			= ETH_P_PPP_SES;
		conf.pppoe.session			= 10;
		conf.l2Flag 				= L2_PPPoE;
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+vlanBytes+8+10)=0xff;*(pktBuf+14+vlanBytes+8+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+8+20+6)=0xff;*(pktBuf+14+vlanBytes+8+20+7)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.pppeTagged=1;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP|PKTHDR_PPPOE_AUTOADD;
		nicTx.pppoeIdx = 2;
		nicTx.l3v4v6HdrFlag=v4FIRST|v4HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//	rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);

		}
#endif

 		{ /*  Offload ipv4 TCP L3/L4  */

		printk("\nOffload ipv4 TCP L3/L4\n");
		memset(&nicTx,0,sizeof(nicTx));
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+20+16)=0xff;*(pktBuf+14+vlanBytes+20+17)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType= PKTHDR_TCP;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//	rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
		}

 #if 1
		{ /*  Offload ipv4 PPPOE TCP L3/L4  */

		printk("\nOffload ipv4 PPPOE TCP L3/L4\n");
		memset(&nicTx,0,sizeof(nicTx));
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 			= ETH_P_PPP_SES;
		conf.pppoe.session			= 10;
		conf.l2Flag 				= L2_PPPoE;
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		*(pktBuf+14+vlanBytes+8+10)=0xff;*(pktBuf+14+vlanBytes+8+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+8+20+16)=0xff;*(pktBuf+14+vlanBytes+8+20+17)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType= PKTHDR_TCP;
		nicTx.pppeTagged=1;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP|PKTHDR_PPPOE_AUTOADD;
		nicTx.pppoeIdx = 2;
		nicTx.l3v4v6HdrFlag=v4FIRST|v4HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//	rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
		}
#endif

 		{ /*  Offload ipv4 ICMP L3/L4  */

			printk("\nOffload ipv4 ICMP L3/L4\n");
			memset(&nicTx,0,sizeof(nicTx));
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_ICMP;	
			conf.ip.id						= 0x0a;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			conf.pppoe.type 				= 0x0800;
			conf.pppoe.session				= 0;
			if(i==VLAN_TAG){
				conf.l2Flag 					|= L2_VLAN;
				conf.vlan.vid					= LAN1_VID;
				vlanBytes=4;
			}else{
				vlanBytes=0;

			}


			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

			*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
			*(pktBuf+14+vlanBytes+20+2)=0xff;*(pktBuf+14+vlanBytes+20+3)=0xff;	//set udp checksum=0xff

			skb=alloc_skb(pktLen+100,0);
			skb->data=pktBuf;
			skb->len = pktLen;
			bzero(&nicTx,sizeof(nicTx));
			nicTx.out_skb=skb;
			nicTx.flags=CSUM_IP|CSUM_TCPUDP;
			nicTx.replaceTxDesc=1;
			nicTx.pktType = PKTHDR_ETHERNET;
			if(i==VLAN_TAG){
				nicTx.vlanTagged=1;
				nicTx.txCVlanTagAutoAdd=1<<1;
				nicTx.vid=LAN1_VID;
				nicTx._priority=0;
			}

			/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
			rtl_direct_txInfo(1<<1,&nicTx);
			//	rtl_hwLookup_txInfo(&nicTx,0);
			swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
			mdelay(100);

			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);
		}

 		{ /*  Offload ipv4 IGMP L3/L4  */
			ether_addr_t macAddr;
			rtl865x_tblAsicDrv_multiCastParam_t mCast_t;
			memset(&nicTx,0,sizeof(nicTx));

			memset(&mCast_t,0,sizeof(mCast_t));
			mCast_t.age=0x7;
			strtoip(&mCast_t.dip,HOST2_IPMIP);
			strtoip(&mCast_t.sip,HOST1_IP);
			mCast_t.extIdx = 0;
			mCast_t.mbr = 0x6;	//010,101010
			mCast_t.port = 0x7;	 //0x7=cpu port   notice  cf_ipm_spa_unmch
			mCast_t.difidx =6;

			rtl8651_setAsicIpMulticastTable(&mCast_t);

			memset(&mCast_t,0,sizeof(mCast_t));
			strtoip(&mCast_t.dip,HOST2_IPMIP);
			strtoip(&mCast_t.sip,HOST1_IP);
			if(rtl8651_getAsicIpMulticastTable(rtl8651_ipMulticastTableIndex(mCast_t.sip, mCast_t.dip),&mCast_t)!=SUCCESS){
				printk("hello get fail haha.. line:%d \n",__LINE__);
			}else{
				printk("hello get SUCCESS haha.. line:%d mCast_t.port=%d\n",__LINE__,mCast_t.port);
			}


			printk(" \nOffload ipv4 IGMP L3/L4\n");
			memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
			conf.pktType					= _PKT_TYPE_IGMP;
			conf.igmp.ver					= 2;
			conf.igmp.type					= 0x11;
			conf.ip.id						= 0x0a;
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IPMIP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_v4IPM_MAC),sizeof(ether_addr_t));
			if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
			}else{
			vlanBytes=0;

			}

			pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
			RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

			*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
			*(pktBuf+14+vlanBytes+24+2)=0xff;*(pktBuf+14+vlanBytes+24+3)=0xff;	//set igmp checksum=0xff

			skb=alloc_skb(pktLen+100,0);
			skb->data=pktBuf;
			skb->len = pktLen;
			bzero(&nicTx,sizeof(nicTx));
			nicTx.out_skb=skb;
			nicTx.flags=CSUM_IP|CSUM_TCPUDP;
			nicTx.replaceTxDesc=1;
			nicTx.pktType=PKTHDR_ETHERNET;
			if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
			}

			/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
			rtl_direct_txInfo(0xe,&nicTx);
			//	rtl_hwLookup_txInfo(&nicTx,1);
			swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
			mdelay(100);

			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IPMIP)); 
			memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
			memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_v4IPM_MAC),sizeof(ether_addr_t));
			//Output packet
			{
				int egressPort;
				for(egressPort=0;egressPort<6;egressPort++)
				{
					if(((1<<egressPort)&0xe)!=0)
					{
						if((i==VLAN_TAG) && (egressPort!=1))
							conf.l2Flag = 0;
						pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
							
						pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
						rxPort = 1<<egressPort;
						RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
						RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
						RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<egressPort);
						PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);

						{
							hsa_param_t hsa;
							memset(&hsa,0,sizeof(hsa));
							rtl865xC_virtualMacGetHsa(&hsa);
							//0xf - 0x1  vlan members - input port 
							if(hsa.dp == 0xe){
								printk("SUCCESS hsa.dp=%d\n",hsa.dp);
								//return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
							}else{
								printk("FAILED hsa.dp=%d\n",hsa.dp);
								return FAILED;
							}
						}
					}
				}
			}
		}

		{/*  Offload ipv6 UDP L4  */
		printk(" \nOffload ipv6 UDP L4\n");
		memset(&nicTx,0,sizeof(nicTx));

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_V6UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		*(pktBuf+14+vlanBytes+40+6)=0xff;*(pktBuf+14+vlanBytes+40+7)=0xff;	//set udp checksum=0xff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}		
		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		}
#if 1
		{/*  Offload ipv6 PPPOE UDP L4  */
		printk(" \nOffload PPPOE ipv6 UDP L4\n");
		memset(&nicTx,0,sizeof(nicTx));

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_V6UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 			= ETH_P_PPP_SES;
		conf.pppoe.session			= 10;
		conf.l2Flag 				= L2_PPPoE;
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

		*(pktBuf+14+vlanBytes+8+40+6)=0xff;*(pktBuf+14+vlanBytes+8+40+7)=0xff;	//set udp checksum=0xff


		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		nicTx.pppeTagged=1;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP|PKTHDR_PPPOE_AUTOADD;
		nicTx.pppoeIdx = 2;
		nicTx.l3v4v6HdrFlag=v4FIRST|v4HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}	

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		}
#endif
 		{/*  Offload ipv6 TCP L4  */
		printk(" \nOffload ipv6 TCP L4 \n");
		memset(&nicTx,0,sizeof(nicTx));

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_V6TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		if(i==VLAN_TAG){
		conf.l2Flag 					|= L2_VLAN;
		conf.vlan.vid					= LAN1_VID;
		vlanBytes=4;
		}else{
		vlanBytes=0;

		}


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

		*(pktBuf+14+vlanBytes+40+16)=0xff;*(pktBuf+14+vlanBytes+40+17)=0xff;	//set udp checksum=0xff


		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_TCP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<1;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
		}	


		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		}
#if 1
		{/*  Offload ipv6 TCP L4  */
		printk(" \nOffload PPPOE ipv6 TCP L4 \n");
		memset(&nicTx,0,sizeof(nicTx));

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_V6TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 			= ETH_P_PPP_SES;
		conf.pppoe.session			= 10;
		conf.l2Flag 				= L2_PPPoE;
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

		*(pktBuf+14+vlanBytes+8+40+16)=0xff;*(pktBuf+14+vlanBytes+8+40+17)=0xff;	//set tcp checksum=0xff


		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_TCP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		nicTx.pppeTagged=1;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP|PKTHDR_PPPOE_AUTOADD;
		nicTx.pppoeIdx = 2;
		nicTx.l3v4v6HdrFlag=v4FIRST|v4HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}	


		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		}
#endif


		{/*  Offload ipv6 ICMP L4  */
		printk("\nOffload ipv6 ICMP L4 \n");
		memset(&nicTx,0,sizeof(nicTx));

		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_V6ICMP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}


		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

		*(pktBuf+14+vlanBytes+40+2)=0xff;*(pktBuf+14+vlanBytes+40+3)=0xff;	//set udp checksum=0xff


		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_ICMP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}	


		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL );
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		}

 #if 1
		{/*6rd checksum Offload*/

		ether_addr_t mac;

		uint32 intPort, remPort;


		rtl8651_PktConf_t conf;
		int32 pktLen;  
		int32 pktLen_Expect;

		uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
		uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
		uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
		enum PORT_MASK rxPort;	

		layer3Config_V6RdDecap_ArpRouting_OffloadChk(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
		printk("\n 6rd l3/l4 checksum Offload\n");
		memset(&nicTx,0,sizeof(nicTx));


		remPort=0x1111;
		intPort=0x2222;


		memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 

		conf.pktType					= _PKT_TYPE_V6UDP;	
		conf.ipv6.hoplmt				= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		memset(pkt_payload_Data,0xdd,conf.payload.length);
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

		memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);	
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x00;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(CE_IP));
		conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
		pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

		memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
		/* change l3 ip protocol and checksum*/
		l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
		pktLen_Expect +=20 ; //add ipv4 header
		pktLen =pktLen_Expect;
		memcpy(pktBuf,pktBuf_Expect,pktLen);
		l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);

		if(i ==VLAN_TAG){
			vlanBytes=4;
			pktLen+=4;
			memmove(pktBuf+12+vlanBytes,pktBuf+12,pktLen+4-vlanBytes-12);
			*(pktBuf+12)=0x81;
			*(pktBuf+13)=0x00;
			*(pktBuf+14)=0x00;
			*(pktBuf+15)=0x0b;
			conf.l2Flag 					|= L2_VLAN;
			l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
		}else{
			vlanBytes=0;

		}
		memcpy(pktBuf_Expect,pktBuf,pktLen);
		*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+20+40+6)=0xff;*(pktBuf+14+vlanBytes+20+40+7)=0xff;	//set udp checksum=0xff

		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG|v4FIRST|v4HDR_FLAG;
		nicTx.v6HdrLen=40;
		if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<1;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
		}	

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		/*Expect packet*/

		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
		{

			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}else{

			printk("virtualMacOutput FAILED \n");
			return FAILED;
		}



		}
#endif

 		/* Ds-lite (4in6) l3/l4 Offload   */
		{

		ether_addr_t mac;

		uint32 intPort, remPort;


		rtl8651_PktConf_t conf;
		int32 pktLen;  
		int32 pktLen_Expect;

		uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
		uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
		uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
		enum PORT_MASK rxPort;	

		layer3Config_DsLiteDecap_NxthopRouting_chkOffload(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
		printk("\nDs-lite L3/l4 checksum Offload \n");
		memset(&nicTx,0,sizeof(nicTx));

		remPort=0x1111;
		intPort=0x2222;


		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

		/**input packet**/

		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
		//		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
		//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

		pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

		memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


		conf.pktType					= _PKT_TYPE_V6UDP;	
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
		conf.ipv6.hoplmt				= 128;
		//		conf.ipv6.nxthdr				= 0x04;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

		memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
		memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
		pktLen_Expect +=40 ; //add ipv6 header
		pktLen=pktLen_Expect;
		memcpy(pktBuf,pktBuf_Expect,pktLen);
		l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
		if(i ==VLAN_TAG){
			vlanBytes=4;
			pktLen+=4;
			memmove(pktBuf+12+vlanBytes,pktBuf+12,pktLen+4-vlanBytes-12);
			*(pktBuf+12)=0x81;
			*(pktBuf+13)=0x00;
			*(pktBuf+14)=0x00;
			*(pktBuf+15)=0x0b;
			conf.l2Flag 					|= L2_VLAN;
			l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
		}else{
			vlanBytes=0;
		}

		memcpy(pktBuf_Expect,pktBuf,pktLen);
		*(pktBuf+14+vlanBytes+40+10)=0xff;*(pktBuf+14+vlanBytes+40+11)=0xff;	//set ip checksum =0xff
		*(pktBuf+14+vlanBytes+40+20+6)=0xff;*(pktBuf+14+vlanBytes+40+20+7)=0xff;	//set udp checksum=0xff
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG|v4HDR_FLAG;
		nicTx.v6HdrLen=40;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<0;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}	

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<0,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);


		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<0;
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
		{

			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
		}else{

			printk("virtualMacOutput FAILED \n");
			return FAILED;
		}

 		}

		//Ipv6 extension header L4 chksum Offload
		{

		ether_addr_t mac;
		uint32  intPort, remPort;
		hsb_param_t hsb;
		uint32 failFlag=0;
		rtl8651_PktConf_t conf;
		int32 pktLen;  
		int32 pktLen_Expect;  
		uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
		uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
		uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
		enum PORT_MASK rxPort;	

		//	_rtl8651_enableEnhancedHash1();
		layer2ConfigV6Lanswitching_l4hsbCheckErrorBug_chkOffload(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



		remPort=0x1111;
		intPort=0x2222;

		/*

		int in6_pton	
		(	
		const char * 	src,
		int 	srclen,
		u8 * 	dst,
		int 	delim,
		const char ** 	end 
		)	

		in6_pton - convert an IPv6 address from literal to binary representation 
			{
				src: the start of the IPv6 address string 
				srclen: the length of the string, -1 means strlen(src) 
				dst: the binary (u8[16] array) representation of the IPv6 address 
				delim: the delimiter of the IPv6 address in , -1 means no delimiter 
				end: A pointer to the end of the parsed string will be placed here
			}
		*/

		// UDP case
		//host1(port0) to host2(port1) forward
		printk("\n ipv6 extension header Offload L4 UDP chksum \n");
		memset(&nicTx,0,sizeof(nicTx));
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
		memset(pkt_payload_Data,0xdd,RTL865xC_TEST_SHARE_PKT_LEN);
		conf.pktType					= _PKT_TYPE_V6UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 2;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.extHdr=hopbyhopHdr|DesHdr|AutHdr|DesHdr2|FraHdr;
		/*  hopbyhopHdr(16) DesHdr(16) AutHdr(20) DesHdr2(16) FraHdr(8) */
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


		memcpy(pktBuf_Expect,pktBuf,pktLen);
		*(pktBuf+14+vlanBytes+40+(/*extension header*/ 16+16+20+16+8)+6)=0xff;
		*(pktBuf+14+vlanBytes+40+(/*extension header*/ 16+16+20+16+8)+7)=0xff;	//set udp checksum=0xffff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_UDP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		if(i==VLAN_TAG){
			nicTx.vlanTagged=1;
			nicTx.txCVlanTagAutoAdd=1<<1;
			nicTx.vid=LAN1_VID;
			nicTx._priority=0;
		}	

		//	nicTx.v6HdrLen=40+(/*extension header*/ 16+16+20+16+8);

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);



		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;

		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);



		// TCP case
		//host1(port0) to host2(port1) forward
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		memset(pktBuf_Expect,0,RTL865xC_TEST_SHARE_PKT_LEN);
		conf.pktType					= _PKT_TYPE_V6TCP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 2;
		conf.payload.content			= pkt_payload_Data;
		in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
		in6_pton(HOST2_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		//	conf.pppoe.type 				= 0x0800;
		//	conf.pppoe.session				= 0;
		//	conf.l2Flag 					= L2_VLAN;
		//	conf.vlan.vid					= LAN1_VID;
		conf.extHdr=hopbyhopHdr|DesHdr|AutHdr|DesHdr2|FraHdr;
		/*	hopbyhopHdr(16) DesHdr(16) AutHdr(20) DesHdr2(16) FraHdr(8) */
		if(i==VLAN_TAG){
			conf.l2Flag 					|= L2_VLAN;
			conf.vlan.vid					= LAN1_VID;
			vlanBytes=4;
		}else{
			vlanBytes=0;

		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


		memcpy(pktBuf_Expect,pktBuf,pktLen);
		*(pktBuf+14+vlanBytes+40+(/*extension header*/ 16+16+20+16+8)+16)=0xff;
		*(pktBuf+14+vlanBytes+40+(/*extension header*/ 16+16+20+16+8)+17)=0xff;	//set udp checksum=0xffff

		skb=alloc_skb(pktLen+100,0);
		skb->data=pktBuf;
		skb->len = pktLen;
		bzero(&nicTx,sizeof(nicTx));
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.replaceTxDesc=1;
		nicTx.pktType=PKTHDR_TCP;
		nicTx.l3v4v6HdrFlag = v6HDR_FLAG;
		//	nicTx.v6HdrLen=40+(/*extension header*/ 16+16+20+16+8);
		if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<1;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
		}	

		/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
		rtl_direct_txInfo(1<<1,&nicTx);
		//		rtl_hwLookup_txInfo(&nicTx,0);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = 1<<1;

		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


		}

 
}//end for

/* IPV6 IGMP ->ICMP MLD  */
#if 0
{/*  Offload ipv6 IGMP L4  */

	{
	
	
		rtl8198C_tblAsicDrv_IPv6multiCastParam_t v6mcastp;
		v6mcastp.ageTime = 0x7;
		in6_pton("ffff:0db8:85a3:08d3:1319:8a2e:0370:2222" ,-1,&(v6mcastp.destIPAddr),-1,NULL );
		v6mcastp.extPortMember = 0;//0x7;
		v6mcastp.portMember = 0x0e;
		in6_pton("2001:0db8:85a3:08d3:1319:8a2e:0001:1111" ,-1,&(v6mcastp.srcIPAddr),-1,NULL);
		v6mcastp.srcPort =8; //extPort 1
		v6mcastp.toCPU =0;
		v6mcastp.v6rdEngress =0 ;
		v6mcastp.v6rdTbIdx =0 ;
		rtl8198C_setAsicIpv6MulticastTable(rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr),&v6mcastp);
		printk(" mcast idx =%d \n ",rtl8198C_ipMulticastv6TableIndex(0,v6mcastp.srcIPAddr,v6mcastp.destIPAddr));
	
	
	}

	char packetInputBuf[]={	
					0x33	,0x33  ,0x00  ,0x00  ,0x00  ,0x40  ,0x00  ,0x00    ,0x00  ,0x00  ,0x00  ,0x50  ,0x86  ,0xDD  ,0x60  ,0x00,
					0x00  ,0x00  ,0x00  ,0x08  ,0x02  ,0x7F  ,0x20  ,0x01    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x00  ,0x01  ,0x11  ,0x11  ,0xFF  ,0xFF    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x03  ,0x70  ,0x22  ,0x22  ,0x16  ,0x00    ,0xff/*error chksum*/  ,0xff/*error chksum*/  ,0xE0  ,0x00  ,0x00  ,0x02  ,0x17  ,0x31,
					0xAA  ,0xDF	}; //include crc

	

	char packetBuf[]={	
					0x33	,0x33  ,0x00  ,0x00  ,0x00  ,0x40  ,0x00  ,0x00    ,0x00  ,0x00  ,0x00  ,0x50  ,0x86  ,0xDD  ,0x60  ,0x00,
					0x00  ,0x00  ,0x00  ,0x08  ,0x02  ,0x7F  ,0x20  ,0x01    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x00  ,0x01  ,0x11  ,0x11  ,0xFF  ,0xFF    ,0x0D  ,0xB8  ,0x85  ,0xA3  ,0x08  ,0xD3  ,0x13  ,0x19,
					0x8A  ,0x2E  ,0x03  ,0x70  ,0x22  ,0x22  ,0x16  ,0x00    ,0x2C  ,0xFC  ,0xE0  ,0x00  ,0x00  ,0x02  ,0x17  ,0x31,
					0xAA  ,0xDF	}; //include crc


		skb=alloc_skb(pktLen+100,0);
		skb->data=packetInputBuf;
		skb->len = sizeof(packetBuf)-4;
		nicTx.out_skb=skb;
		nicTx.flags=CSUM_IP|CSUM_TCPUDP;
		nicTx.vid=RTL_LANVLANID;
	
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	//	rtl_direct_txInfo(1<<1,&nicTx);
		rtl_hwLookup_txInfo(&nicTx,2);
		swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
		mdelay(100);

	

		rxPort = 1<<1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(packetBuf,pktBuf,sizeof(packetBuf),pktLen,__func__,__LINE__);
		
		{
			hsa_param_t hsa;
			memset(&hsa,0,sizeof(hsa));
			rtl865xC_virtualMacGetHsa(&hsa);
			//0xf - 0x1  vlan members - input port 
			if(hsa.dp == 0x0e){
				printk("SUCCESS hsa.dp=%d\n",hsa.dp);
				//return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;
			}else{
				printk("FAILED hsa.dp=%d\n",hsa.dp);
				return FAILED;
			}
		}



}
#endif

	mdelay(100);
	DumpSwNicTxRx_debug=0;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=0;
#endif

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return SUCCESS;
}

#endif


#define PORT_CONTER_ADD_SUBTRACT 1
#if PORT_CONTER_ADD_SUBTRACT
#define LIMITMAX 2000
#define ADD_ONE_TIMES 1111
#define SUB_ONE_TIMES 666
#define SETTO		  777

int32 rtl8198C_testLearningLimit_SWAddSubCounter(void)
{
	int i;
	int port=0;

	for(port=0;port<=8;port++){
		rt8198C_setAsicPortLearningLimit(port,LIMITMAX,1);
		for(i=0;i<ADD_ONE_TIMES;i++){
			rt8198C_AsicPortLearningCounter_AddOne(port);
		}
		if(rt8198C_getAsicPortLearningCount(port)==ADD_ONE_TIMES){
			printk("Port:%d ADD SUCCESS  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
		}else{
			printk("Port:%d  ADD FAILED  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
			return FAILED;

		}

		for(i=0;i<SUB_ONE_TIMES;i++){
			rt8198C_AsicPortLearningCounter_subtractOne(port);
		}
		if(rt8198C_getAsicPortLearningCount(port)==(ADD_ONE_TIMES-SUB_ONE_TIMES)){
			printk("Port:%d  SUBTRACT SUCCESS  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
		}else{
			printk("Port:%d  SUBTRACT FAILED  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
			return FAILED;
		}
		
		rt8198C_AsicPortLearningCounter_setTo(port,SETTO);
		if(rt8198C_getAsicPortLearningCount(port)==SETTO){
			printk("Port:%d  SETTO SUCCESS  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
		}else{
			printk("Port:%d  SETTO FAILED  Counter=%d\n",port,rt8198C_getAsicPortLearningCount(port));
			return FAILED;
		}
		rt8198C_delAsicPortLearningLimit(port);

	}

	return SUCCESS;

	
}

#endif


#define NAT_FWRD_TRAP_CONFIG 1
#if NAT_FWRD_TRAP_CONFIG


int32  layer4ConfigNatOutbound( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);



	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

	 /* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	}

	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, GW_WAN1_IP);
	ipt.nat = 1;
	rtl8651_setAsicExtIntIpTable(1, &ipt);
	return 0;
	
}


int32 rtl8198C_testNATOutbound(void)
{

	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	{	

		_rtl8651_enableEnhancedHash1();
		layer4ConfigNatOutbound(); 	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
		WRITE_MEM32( SWTCR1, READ_MEM32( SWTCR1 ) | L4EnHash1 |L4EnPerFlow );   //enable perfolw and enhancehash1

		intPort=0x1111;
		extPort=0x1111;
		remPort=0x5555;


		//Outbound to CPU
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
		conf.ip.id						= 0xfe0b;
		conf.ip.ttl 					= 128;
		conf.ip.mf						= 1;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		TEST_MODEL_DONOT_DIRECT_TX=1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

		{
			hsa_param_t hsa;
			memset(&hsa,0,sizeof(hsa));
			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x40){
				printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
			}else{
				printk("FAILED hsa.dp=%x\n",hsa.dp);
				return FAILED;
			}
		}

		//Outbound forward
		WRITE_MEM32( SWTCR1, READ_MEM32( SWTCR1 ) | L4EnHash1 |IpfNatFw |L4EnPerFlow );	 //enable perfolw and enhancehash1
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
//		conf.ip.id						= 0x0a;
		conf.ip.id						= 0xfe0b;
		conf.ip.ttl 					= 128;
		conf.ip.mf						= 1;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));


		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 					= 127;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

		{
			hsa_param_t hsa;
			memset(&hsa,0,sizeof(hsa));
			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x1){
				printk("SUCCESS to P0 hsa.dp=%x\n",hsa.dp);
			}else{
				printk("FAILED hsa.dp=%x\n",hsa.dp);
				return FAILED;
			}
		}



	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}



#endif


#define ACL_PRAGMENT_APCKET 1
#if ACL_PRAGMENT_APCKET

int32  layer2ConfigLanswitching_aclFragmentPkt( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow
	//unknow da

}





{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=8;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);

	return 0;
	
}


/*LAN L2 test*/
int32 rtl8198C_testL2_aclFragmentPkt(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer2ConfigLanswitching_aclFragmentPkt(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=1111;
	intPort=2222;


/* UDP hit acl rule 8*/
printk("UDP hit first packet acl rule 8\n");
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
#if 0
	aclRule.ruleType_ = RTL865X_ACL_IP;
	aclRule.un_ty.L3L4.is.ip._FOP = 0; //0:Apply this rule only to packets with offset = 0, 1:Apply this rule only to packets with offset > 0
	aclRule.un_ty.L3L4.is.ip._FOM = 1; //1:Depends on FOP
#else
	aclRule.ruleType_ = RTL865X_ACL_UDP;
	aclRule.ipfragApply=1;
	aclRule.un_ty.L3L4.is.udp._srcPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.udp._srcPortLowerBound=1000;
	aclRule.un_ty.L3L4.is.udp._dstPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.udp._dstPortLowerBound=1000;
#endif
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

 }
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=0;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						= 1;
	conf.ip.offset					= 0x50;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=0;
	conf.ip.offset					=100;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

/* UDP all not hit acl rule 8*/
printk("UDP all not hit acl rule 8\n");
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
#if 0
	aclRule.ruleType_ = RTL865X_ACL_IP;
	aclRule.un_ty.L3L4.is.ip._FOP = 1; //0:Apply this rule only to packets with offset = 0, 1:Apply this rule only to packets with offset > 0
	aclRule.un_ty.L3L4.is.ip._FOM = 1; //1:Depends on FOP
#else
	aclRule.ruleType_ = RTL865X_ACL_UDP;
	aclRule.ipfragApply=0;
	aclRule.un_ty.L3L4.is.udp._srcPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.udp._srcPortLowerBound=1000;
	aclRule.un_ty.L3L4.is.udp._dstPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.udp._dstPortLowerBound=1000;
#endif
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

 }

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=0;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to DROP hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=50;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to Drop hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=0;
	conf.ip.offset					=100;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to Drop hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

printk(" TCP all  hit acl rule 8 rule \n");
/* TCP all  hit acl rule 8*/
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
#if 0
	aclRule.ruleType_ = RTL865X_ACL_IP;
	aclRule.un_ty.L3L4.is.ip._FOP = 0; //0:Apply this rule only to packets with offset = 0, 1:Apply this rule only to packets with offset > 0
	aclRule.un_ty.L3L4.is.ip._FOM = 1; //1:Depends on FOP
#else
	aclRule.ruleType_ = RTL865X_ACL_TCP;
	aclRule.ipfragApply=1;
	aclRule.un_ty.L3L4.is.tcp._srcPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.tcp._srcPortLowerBound=1000;
	aclRule.un_ty.L3L4.is.tcp._dstPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.tcp._dstPortLowerBound=1000;
#endif
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

 }
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=0;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=50;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=0;
	conf.ip.offset					=100;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x40){
			printk("SUCCESS to CPU hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

printk("TCP all not hit acl rule 8\n");

/* TCP all not hit acl rule 8*/
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
#if 0
	aclRule.ruleType_ = RTL865X_ACL_IP;
	aclRule.un_ty.L3L4.is.ip._FOP = 1; //0:Apply this rule only to packets with offset = 0, 1:Apply this rule only to packets with offset > 0
	aclRule.un_ty.L3L4.is.ip._FOM = 1; //1:Depends on FOP
#else
	aclRule.ruleType_ = RTL865X_ACL_TCP;
	aclRule.ipfragApply=0;
	aclRule.un_ty.L3L4.is.tcp._srcPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.tcp._srcPortLowerBound=1000;
	aclRule.un_ty.L3L4.is.tcp._dstPortUpperBound=3000;
	aclRule.un_ty.L3L4.is.tcp._dstPortLowerBound=1000;
#endif
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

 }
		
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=0;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to DROP hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=1;
	conf.ip.offset					=50;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to Drop hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}
	
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_TCP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.ip.mf						=0;
	conf.ip.offset					=100;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	TEST_MODEL_DONOT_DIRECT_TX=1;
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	{
		hsa_param_t hsa;
		memset(&hsa,0,sizeof(hsa));
		rtl865xC_virtualMacGetHsa(&hsa);
		if(hsa.dp == 0x0){
			printk("SUCCESS to Drop hsa.dp=%x\n",hsa.dp);
		}else{
			printk("FAILED hsa.dp=%x\n",hsa.dp);
			return FAILED;
		}
	}

	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;
}

#endif //ACL_PRAGMENT_APCKET


#define ACL2kL2_REDIREC_PPPOE_NETIF 1
#if ACL2kL2_REDIREC_PPPOE_NETIF

int32  layer2ConfigLanswitching_acl2kl2( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);

	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	



{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = ((1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]));
	vlanp.untagPortMask =  ((1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]));
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]);
	vlanp.untagPortMask =  (1<<hp[0]);
	rtl8651_setAsicVlan(LAN0_VID,&vlanp);
}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.mtu = 1500;
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=7;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);



	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= 9;
	netif.inAclStart=7;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);

	/* lan HOST6_MAC */
	strtomac(&l2t.macAddr, "0-0-0-0-3-cb");
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr("0-0-0-0-3-cb"), 0, &l2t);


	return 0;
}


/* should be routing ,different vlan ,netif and DMac==GWMac */
int32 rtl8198C_testL2_acl2kl2(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer2ConfigLanswitching_acl2kl2(); 	
	WRITE_MEM32(SWTCR0,(READ_MEM32(SWTCR0)&(~WANRouteMode_MASK))|WANRouteMode_Forward);
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;

#if 1
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

//	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);

	memset(&aclRule,0,sizeof(aclRule));
	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_REDIRECT_ETHER;
	//aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.L2Idx_ =(getL2TableRowFromMacStr("0-0-0-0-3-cb")<<2);
	aclRule.netifIdx_ =1;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);

	memset(&aclRule,0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));
	dumphs();

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"0-0-0-0-3-cb"),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
#endif

/*  acl redirect pppoe*/
{
	rtl865x_AclRule_t aclRule;
	memset(&aclRule,0x0,sizeof(aclRule));

//	memcpy(aclt->un_ty.srcMac_.octet, intf.macAddr.octet, 6);

	aclRule.aclIdx = 8;
	aclRule.actionType_ = RTL865X_ACL_REDIRECT_PPPOE;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.L2Idx_ =(getL2TableRowFromMacStr("0-0-0-0-3-cb")<<2);
	aclRule.netifIdx_ =1;
	aclRule.pppoeIdx_ =1;

	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
	
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;


	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);
}

{
	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	memset(&pppoet,0,sizeof(pppoet));
	pppoet.age=0xff;
	pppoet.sessionId=5;
	rtl8651_setAsicPppoe(1,&pppoet);
}

	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);
	RTL_TESTMODEL_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,"0-0-0-0-3-cb"),sizeof(ether_addr_t));
	conf.pppoe.type 				= ETH_P_PPP_SES;
	conf.pppoe.session				= 5;
	conf.l2Flag 					= L2_PPPoE;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

	return SUCCESS;
}

#endif




#define DIRECT_TX_VLAN_AUTOADD 1
#if DIRECT_TX_VLAN_AUTOADD

int32  layer2ConfigLanswitching_NicDirectTx_VLANADD_Test( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();

	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(5,LAN1_VID);
	rtl8651_setAsicPvid(6,LAN1_VID);
	rtl8651_setAsicPvid(7,LAN1_VID);
	rtl8651_setAsicPvid(8,LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

{
	uint8 aclDefPermitAll= RTL865X_ACLTBL_PERMIT_ALL;
	
	//set def acl permitall
		WRITE_MEM32(DACLRCR,aclDefPermitAll| (aclDefPermitAll<<8)| (aclDefPermitAll<<16)| (aclDefPermitAll<<24));
	//clear vlan filter bit 8_0
		WRITE_MEM32(0xbb804a00, (READ_MEM32(0xbb804a00)&(~0x1ff)) | 0x0);
	//L4ChkSErrAllow L3ChkSErrAllow L2CRCErrAllow

}


{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) |(1<<hp[5]);
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);


}

//set netif table  
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));

	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);



	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);


	return 0;
	
}

/*
tag packet + autoAdd:1 = modify vlan tag and priority
tag packet + autoAdd:0 = remove vlan tag
untag packet + autoAdd:1 = add vlan tag
untag packet + autoAdd:0 = non action(keep)
*/
int32 rtl8198C_testL2_NicDirectTx_VLANADD_Test(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	layer2ConfigLanswitching_NicDirectTx_VLANADD_Test(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	remPort=0x1111;
	intPort=0x2222;

	DumpSwNicTxRx_debug=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=1;
#endif
	mdelay(100);

/* untag packet -> tag packet */
	printk("\n untag packet -> tag packet \n");
	memset(&nicTx,0,sizeof(nicTx));
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
//	conf.l2Flag 					= L2_VLAN;
//	conf.vlan.vid					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.replaceTxDesc=1;
	nicTx.vid=0xff;
	nicTx.pktType=
	nicTx._priority=0x1;
	nicTx.txCVlanTagAutoAdd = 1<<1;
	nicTx.flags= CSUM_IP | CSUM_TCPUDP;
	nicTx.pktType=PKTHDR_UDP;
	
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= 0xff;
	conf.vlan.prio					= 0x1;

	
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);



/* untag packet -> untag packet  keep*/
	printk("\n untag packet -> untag packet  keep \n");
	memset(&nicTx,0,sizeof(nicTx));
//host1(port0) to host2(port1) forward
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));

	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.replaceTxDesc=1;
//		nicTx.vid=0xff;
//		nicTx._priority=0x1;
//		nicTx.txCVlanTagAutoAdd = 1<<1;
	nicTx.flags= CSUM_IP | CSUM_TCPUDP;
	nicTx.pktType=PKTHDR_UDP;
	
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
//		conf.l2Flag 					= L2_VLAN;
//		conf.vlan.vid					= 0xff;
//		conf.vlan.prio					= 0x1;

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);


	/*tag packet + autoAdd:1 = modify vlan tag and priority */
	printk("\n tag packet + autoAdd:1 = modify vlan tag and priority\n");
	memset(&nicTx,0,sizeof(nicTx));
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid 					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.vlanTagged=1;
	nicTx.flags= CSUM_IP | CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.vid=0xff;
	nicTx._priority=0x1;
	nicTx.txCVlanTagAutoAdd = 1<<1;
	nicTx.l3v4v6HdrFlag =v4FIRST|v4HDR_FLAG;
	nicTx.pktType=PKTHDR_UDP;
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid 					= 0xff;
	conf.vlan.prio					= 0x1;
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);




	/*tag packet + autoAdd:0 = remove vlan tag and priority */
	
	printk("\n tag packet + autoAdd:0 = remove vlan tag and priority\n");
	memset(&nicTx,0,sizeof(nicTx));
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= L2_VLAN;
	conf.vlan.vid					= LAN1_VID;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.vlanTagged=1;
	nicTx.flags= CSUM_IP | CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
//	nicTx.vid=0xff;
//	nicTx._priority=0x1;
//	nicTx.txCVlanTagAutoAdd = 1<<1;
	nicTx.l3v4v6HdrFlag =v4FIRST|v4HDR_FLAG;
	nicTx.pktType=PKTHDR_UDP;
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	conf.l2Flag 					= 0;
//	conf.vlan.vid					= 0xff;
//	conf.vlan.prio					= 0x1;
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen,__func__,__LINE__);


	mdelay(100);
	DumpSwNicTxRx_debug=0;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=0;
#endif

	return SUCCESS;
}
#endif //DIRECT_TX_VLAN_AUTOADD



#define DirectTx_6RD_DSLITE_BUG 1
#if DirectTx_6RD_DSLITE_BUG 

int32  layer3Config_V6RdDecap_ArpRouting_OffloadChk_directBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN2_VID);
	rtl8651_setAsicPvid(hp[0],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,READ_MEM32(V6RDCTR0)|CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_INV_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, CE_MAC);
	netif.vid = LAN2_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN2_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
//	strtomac(&l2t.macAddr, CE_INV_MAC);
//	l2t.memberPortMask = (1<<hp[0]);
//	l2t.nhFlag = 1;
//	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(CE_INV_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

{

	
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan CE_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
	

}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN2_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
#if 1
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

	/*	delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_INV_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_INV_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}
#endif

return 0;


}

int32 rtl8198C_DirectTx_6RD_DSLITE_BUG(void)
{

	rtl_nicTx_info nicTx;
	ether_addr_t mac;
	uint32 intPort, remPort;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;
	int i =1,vlanBytes=0;
	struct sk_buff* skb;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	


/* 6rd egress */

/* 6rd ingress */
{
	layer3Config_V6RdDecap_ArpRouting_OffloadChk_directBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	printk("\n 6rd l3/l4 checksum Offload\n");
	memset(&nicTx,0,sizeof(nicTx));


	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.hoplmt				= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);	
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);
	pktLen_Expect +=20 ; //add ipv4 header
	pktLen =pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);

	if(i ==VLAN_TAG){
		vlanBytes=4;
		pktLen+=4;
		memmove(pktBuf+12+vlanBytes,pktBuf+12,pktLen+4-vlanBytes-12);
		*(pktBuf+12)=0x81;
		*(pktBuf+13)=0x00;
		*(pktBuf+14)=0x00;
		*(pktBuf+15)=0x0b;
		conf.l2Flag 					|= L2_VLAN;
		l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	}else{
		vlanBytes=0;

	}
	memcpy(pktBuf_Expect,pktBuf,pktLen);
	*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
	*(pktBuf+14+vlanBytes+20+40+6)=0xff;*(pktBuf+14+vlanBytes+20+40+7)=0xff;	//set udp checksum=0xff

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.pktType=PKTHDR_UDP;
	nicTx.l3v4v6HdrFlag = v6HDR_FLAG|v4FIRST|v4HDR_FLAG;
	nicTx.v6HdrLen=40;
if(i==VLAN_TAG){
	nicTx.vlanTagged=1;
	nicTx.txCVlanTagAutoAdd=1<<1;
	nicTx.vid=LAN1_VID;
	nicTx._priority=0;
}	

/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//		rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


/*Expect packet*/

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
		

}

/* ds-lite egress */

/* dslite ingress*/
{

	layer3Config_DsLiteDecap_NxthopRouting_chkOffload();	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	printk("\nDs-lite L3/l4 checksum Offload \n");
	memset(&nicTx,0,sizeof(nicTx));

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
/**input packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);		//nxthdr = 0x04 IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	if(i ==VLAN_TAG){
		vlanBytes=4;
		pktLen+=4;
		memmove(pktBuf+12+vlanBytes,pktBuf+12,pktLen+4-vlanBytes-12);
		*(pktBuf+12)=0x81;
		*(pktBuf+13)=0x00;
		*(pktBuf+14)=0x00;
		*(pktBuf+15)=0x0b;
		conf.l2Flag 					|= L2_VLAN;
		l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	}else{
		vlanBytes=0;
	}

	memcpy(pktBuf_Expect,pktBuf,pktLen);
	*(pktBuf+14+vlanBytes+40+10)=0xff;*(pktBuf+14+vlanBytes+40+11)=0xff;	//set ip checksum =0xff
	*(pktBuf+14+vlanBytes+40+20+6)=0xff;*(pktBuf+14+vlanBytes+40+20+7)=0xff;	//set udp checksum=0xff
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.pktType=PKTHDR_UDP;
	nicTx.l3v4v6HdrFlag = v6HDR_FLAG|v4HDR_FLAG;
	nicTx.v6HdrLen=40;
	if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<0;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
	}	

/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<0,&nicTx);
//		rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
		


}






	return SUCCESS;
}






int32  layer3Config_DsLiteDecap_NxthopRouting_directBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0, CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 		//enble 6rd mode
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);

{
	rtl865x_tblAsicDrv_arpParam_t arpt ;
	uint32 ip32;
	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));

	
	/* lan HOST1_IP */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST3_MAC);
	strtoip(&ip32, HOST3_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);


}

	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);

	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;

	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}


int32 rtl8198C_testDsLiteDecap_NxthopRouting_directBug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
	int i =1,vlanBytes=0;
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteDecap_NxthopRouting_directBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	DumpSwNicTxRx_debug=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=1;
#endif



#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	
/**input packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
	pktLen=pktLen_Expect;
	memcpy(pktBuf,pktBuf_Expect,pktLen);
	l2FormCrc((conf.l2Flag  & L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
#if 1
	l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IPV6 | L4_UDP | (conf.extHdr & ehMASK) |(conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	if(i ==VLAN_TAG){
		vlanBytes=4;
		pktLen+=4;
		memmove(pktBuf+12+vlanBytes,pktBuf+12,pktLen+4-vlanBytes-12);
		*(pktBuf+12)=0x81;
		*(pktBuf+13)=0x00;
		*(pktBuf+14)=0x00;
		*(pktBuf+15)=0x0b;
		conf.l2Flag 					|= L2_VLAN;
		l2FormCrc((conf.l2Flag	& L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK) ,pktBuf ,pktLen);
	}else{
		vlanBytes=0;
	}

	memcpy(pktBuf_Expect,pktBuf,pktLen);
	*(pktBuf+14+vlanBytes+40+10)=0xff;*(pktBuf+14+vlanBytes+40+11)=0xff;	//set ip checksum =0xff
	*(pktBuf+14+vlanBytes+40+20+6)=0xff;*(pktBuf+14+vlanBytes+40+20+7)=0xff;	//set udp checksum=0xff
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.pktType=PKTHDR_UDP;
	nicTx.l3v4v6HdrFlag = v6HDR_FLAG|v4HDR_FLAG;
	nicTx.v6HdrLen=40;
	if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<0;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
	}	

/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_direct_txInfo*/
	rtl_direct_txInfo(1<<0,&nicTx);
//		rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);

#else
	
	virtualMacInput(1/*port ID*/,pktBuf, pktLen+4);

	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);

	//Expect packet
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,128);
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST3_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

#endif

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<0);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif

	DumpSwNicTxRx_debug=0;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=0;
#endif


	return SUCCESS;

}

int32  layer3Config_V6RdEncap_ArpRouting_directBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	WRITE_MEM32(V6RDCTR0,CF_6RD_EN|CF_ACPT_BR_ONLY| (128 <<CF_6RD_IPV4_TTL)); 		//enble 6rd mode

	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

	{
		rtl865x_tblAsicDrv_vlanParam_t vlant;
		memset( &vlant,0, sizeof(vlant) );
		vlant.memberPortMask =(1<<hp[0]);
		vlant.untagPortMask = (1<<hp[0]);
		vlant.fid=0;
		rtl8651_setAsicVlan(LAN0_VID,&vlant);
	}
 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}
 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, BR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(BR_MAC), 0, &l2t);

{
	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
	uint8 v6ip[16];
	
	/* config arp table */
	
	/* lan HOST1_IP */
	bzero((void*) &v6arp, sizeof(v6arp));
	v6arp.nextHopRow = getL2TableRowFromMacStr(BR_MAC);
	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
	v6arp.subnetIdx = 1; //L3 table idx
	v6arp.age = 0;
	rtl8198C_setAsicArp6 (&v6arp);
}



#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN0_VID);
	v6routet.subnetIdx = 0; //L3 table idx
	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_ARP;
	v6routet.netif = rtl865xc_netIfIndex(LAN1_VID);
	v6routet.subnetIdx = 1; //L3 table idx
	v6routet.v6rdeg =1;
	v6routet.v6rdIdx =1;
	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif


//setting v6rd table
{
//int32 rtl8198C_setAsicV6Rd(uint32 index, rtl8198C_tblAsicDrv_v6RDParam_t *v6rdp);
	rtl8198C_tblAsicDrv_v6RDParam_t v6rdt;
	uint8 v6rdPrefixAry[16];
	in6_pton(HOST3_V6IP ,-1,&(v6rdPrefixAry),-1,NULL);
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));

/*  delegated  = 32 +8 */
	v6rdt.ipBR = ntohl(inet_addr(BR_IP));
	v6rdt.maskBRNum = 24;
	v6rdt.ipCE = ntohl(inet_addr(CE_IP));
	v6rdt.ipMaskCENum = 8;
	memcpy(&(v6rdt.v6rdPrefix),&(v6rdPrefixAry[0]),sizeof(v6rdt.v6rdPrefix));
	v6rdt.maskPrefixNum = 31;
	v6rdt.v6RDmtu = 1500;

	rtl8198C_setAsicV6Rd(1,&v6rdt);

	
}


return 0;


}



int32 rtl8198C_testV6RdEncap_ArpRouting_directBug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
	int i =1,vlanBytes=0;
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_V6RdEncap_ArpRouting_directBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	DumpSwNicTxRx_debug=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=1;
#endif


#if 1
{

	remPort=0x1111;
	intPort=0x2222;


	memset(&conf, 0, sizeof(rtl8651_PktConf_t)); 
	
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	memset(pkt_payload_Data,0xdd,conf.payload.length);
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	
//		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
//		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));


#if 1

	if(i==VLAN_TAG){
		conf.l2Flag 					|= L2_VLAN;
		conf.vlan.vid					= LAN1_VID;
		vlanBytes=4;
	}else{
		vlanBytes=0;

	}
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	memcpy(pktBuf_Expect,pktBuf,pktLen);
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);

	*(pktBuf+14+vlanBytes+40+6)=0xff;*(pktBuf+14+vlanBytes+40+7)=0xff;	//set udp checksum=0xff

	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<1;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
	}
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.pktType=PKTHDR_UDP;
	nicTx.l3v4v6HdrFlag =v6HDR_FLAG;
/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);

#else
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				= 254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
//		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
//		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data,pktBuf_Expect+14,pktLen_Expect-14);
			
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x00;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //subtract  L2 and L4(udp)
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(CE_IP));
	conf.conf_dip					= ntohl(inet_addr(BR_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,BR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */
	
	memcpy(pktBuf_Expect+34,pkt_payload_Data,pktLen_Expect-14);
	/* change l3 ip protocol and checksum*/
	l3FormIpProtocol((conf.l2Flag  & L2_MASK) | L3_IP | L4_UDP | (conf.ErrFlag&CTL_MASK),((int8 *)pktBuf_Expect),0x29);


	pktLen_Expect +=20 ; //add ipv4 header
#endif
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif


	DumpSwNicTxRx_debug=0;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=0;
#endif

	return SUCCESS;

}



int32  layer3Config_DsLiteEncap_NxthopRouting_directBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);


	//enble Ds-Lite mode
	WRITE_MEM32(DSLITECTR0,CF_DSLITE_EN | (1500 <<CF_DSL_MTU) | CF_STA_DSLMTU_EN | CF_DSLITE_NATEN); 
	WRITE_MEM32(DSLITECTR1,(128 << CF_DSL_HOPLIMIT) ); 	
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}
	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, AFTR_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(AFTR_MAC), 0, &l2t);


	{

	rtl865x_tblAsicDrv_routingParam_t routet;


	 /* route to lan 0 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN0_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN0_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.nhNum =2;		
	routet.nhStart =0;
	routet.nhNxt = 0;
	routet.nhAlgo =2;
	routet.ipDomain =0 ;
	routet.internal=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	routet.DSLiteEgress =1 ;
	routet.DSLiteIdx = 1;
#endif
	rtl8651_setAsicRouting(1, &routet);



	}

/*setting DSLite table*/
#if 1 
{
//	int32 rtl8198C_setAsicDSLite(uint32 index, rtl8198C_tblAsicDrv_DSLiteParam_t *dslp)

	rtl8198C_tblAsicDrv_DSLiteParam_t dslt;
	dslt.dslMtu = 1500 ;
	in6_pton(GW_LAN1_V6IP ,-1,(&(dslt.hostIP)),-1,NULL);
	dslt.hostIPMaskNum = 112 ;
	in6_pton(AFTR_V6IP ,-1,(&(dslt.ipAFTR)),-1,NULL);
	dslt.ipMaskAFTRNum = 112;

	rtl8198C_setAsicDSLite(1,&dslt);

}
#endif


#if 1
{
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;

	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(AFTR_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 0; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       


}
#endif


return 0;


}



int32 rtl8198C_testDsLiteEncap_NxthopRouting_directBug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;
	int i =1,vlanBytes=0;
	struct sk_buff* skb;
	rtl_nicTx_info nicTx;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3Config_DsLiteEncap_NxthopRouting_directBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

//		
//		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
//		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
//		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);

	DumpSwNicTxRx_debug=1;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=1;
#endif


#if 1 

	if(i==VLAN_TAG){
		conf.l2Flag 					|= L2_VLAN;
		conf.vlan.vid					= LAN1_VID;
		vlanBytes=4;
	}else{
		vlanBytes=0;

	}
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	memcpy(pktBuf_Expect,pktBuf,pktLen);


	*(pktBuf+14+vlanBytes+10)=0xff;*(pktBuf+14+vlanBytes+11)=0xff;	//set ip checksum =0xff
	*(pktBuf+14+vlanBytes+20+6)=0xff;*(pktBuf+14+vlanBytes+20+7)=0xff;	//set udp checksum=0xff
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen+4);


	skb=alloc_skb(pktLen+100,0);
	skb->data=pktBuf;
	skb->len = pktLen;
	bzero(&nicTx,sizeof(nicTx));
	nicTx.out_skb=skb;
	if(i==VLAN_TAG){
		nicTx.vlanTagged=1;
		nicTx.txCVlanTagAutoAdd=1<<1;
		nicTx.vid=LAN1_VID;
		nicTx._priority=0;
	}
	nicTx.flags=CSUM_IP|CSUM_TCPUDP;
	nicTx.replaceTxDesc=1;
	nicTx.pktType=PKTHDR_UDP;
	nicTx.l3v4v6HdrFlag =v6HDR_FLAG;
	/* if hwlookup mode call rtl_hwLookup_txInfo , if direct tx mode call rtl_hwLookup_txInfo*/
	rtl_direct_txInfo(1<<1,&nicTx);
	//	rtl_hwLookup_txInfo(&nicTx,0);
	swNic_send((void*)skb,skb->data,skb->len,&nicTx) ;
	mdelay(100);


#else
/**Expect packet**/

	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST3_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));

	pktLen_Expect = pktGen(&conf,pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pkt_payload_Data ,pktBuf_Expect+14 ,pktLen_Expect-14 );


	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= pktLen_Expect-14-8;  //+v4 header
	conf.ipv6.hoplmt				= 128;
//		conf.ipv6.nxthdr				= 0x04;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(GW_LAN1_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(AFTR_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,AFTR_MAC),sizeof(ether_addr_t));
	pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */

	memcpy(pktBuf_Expect+54,pkt_payload_Data,pktLen_Expect-14);
	memset(pktBuf_Expect+20,0x04,1);  		//nxthdr = 0x04	IP-in-IP	IP-Within-IP (encapsulation)	RFC 2003
	pktLen_Expect +=40 ; //add ipv6 header
#endif
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}

	DumpSwNicTxRx_debug=0;
#if defined(CONFIG_RTL_8685S_HWNAT)
	DumpSwNicTxRx_debug_pkt=0;
#endif


	return SUCCESS;

}


#endif//DirectTx_6RD_DSLITE_BUG

#define ACL_COMB_8ALIGN_BUG 1
#define ACL_TABLE 256

#if ACL_COMB_8ALIGN_BUG
int32  acl_config_comb8Align( void )
{
	rtl865x_AclRule_t aclRule,getAcl;
	int i;
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 9;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb=1;

	for(i=0;i<ACL_TABLE;i++){
		
		aclRule.aclIdx= i;
		_rtl865x_setAclToAsic(i,&aclRule);
		memset(&getAcl,0x0,sizeof(getAcl));
		getAcl.aclIdx=i;
		_rtl865x_getAclFromAsic	(i,&getAcl);
		if (getAcl.comb ==0){
			printk("%d  ",i);
		}
		
	}
	printk("\n set failed \n");	

}





int32  layer3ConfigV6NxthopRouting_AclV6Comb8AlignBug( void )
{
	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];

	rtl8651_clearAsicPvid();
	rtl8651_setAsicPvid(hp[0],LAN0_VID);
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[2],LAN1_VID);
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);
	rtl8651_setAsicPvid(hp[5],LAN1_VID);
	default_register();


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(3);
//	WRITE_MEM32(MSCR,READ_MEM32(MSCR)|(EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(MSCR,(Ingress_ACL|EN_L2|EN_L3|EN_L4));
	WRITE_MEM32(V6CTR1,CF_ENHOTLT);

	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* lan 0 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN0_MAC);
	netif.vid = LAN0_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=3;
	netif.inAclStart=0;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(0,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[0]);
	vlant.untagPortMask = (1<<hp[0]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN0_VID,&vlant);

}




 /* lan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.mtu = 1500;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

	}

 
{
	rtl865x_tblAsicDrv_vlanParam_t vlant;
	memset( &vlant,0, sizeof(vlant) );
	vlant.memberPortMask =(1<<hp[1]);
	vlant.untagPortMask = (1<<hp[1]);
	vlant.fid=0;
	rtl8651_setAsicVlan(LAN1_VID,&vlant);

}

	
	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	
	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST3_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST3_MAC), 0, &l2t);

	/* lan HOST2_MAC */
	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.nhFlag = 1;
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

//{

//	
//	rtl8198C_tblAsicDrv_v6NeighParam_t v6arp;
//	uint8 v6ip[16];
//	
//	/* config arp table */
//	
//	/* lan HOST1_IP */
//	bzero((void*) &v6arp, sizeof(v6arp));
//	v6arp.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
//	in6_pton(HOST1_V6IP ,-1,&(v6ip),-1,NULL);
//	memcpy(&(v6arp.hostID),&(v6ip[8]),sizeof(v6arp.hostID));
//	v6arp.subnetIdx = 1; //L3 table idx
//	v6arp.age =  0x1f;
//	rtl8198C_setAsicArp6 (&v6arp);
//	


//}


/*  set ACL table */
{
	rtl865x_AclRule_t aclRule;

//===============================rule set chanin ==================================



	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 0;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;	//unimportant
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =1;
	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
//	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);


	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 1;
//	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT; //end of chain
//	aclRule.nexthopIdx_ =30;
	aclRule.actionType_ = RTL865X_ACL_TOCPU;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =0;									//end of chain
//	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);


//===============================rule end chanin ==================================



//expect hit but will not hit
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 2;
//	aclRule.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT; //end of chain
//	aclRule.nexthopIdx_ =30;
	aclRule.actionType_ = RTL865X_ACL_PERMIT;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	aclRule.comb =0;									//end of chain
//	strtomac(&(aclRule.un_ty.MAC._dstMac),GW_LAN0_MAC);
//	strtomac(&(aclRule.un_ty.MAC._dstMacMask),GW_LAN0_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMac),HOST3_MAC);
	strtomac(&(aclRule.un_ty.MAC._srcMacMask), HOST3_MAC);
	aclRule.un_ty.MAC._typeLen = 0;
	aclRule.un_ty.MAC._typeLenMask =  0;		
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);




//===============================rule set chanin END==================================


// last result trap to cpu
	memset(&aclRule,0x0,sizeof(aclRule));
	aclRule.aclIdx = 3;
	aclRule.actionType_ = RTL865X_ACL_DROP;
	aclRule.pktOpApp_ = RTL865X_ACL_ALL_LAYER;	
	aclRule.ruleType_ = RTL865X_ACL_MAC;
	_rtl865x_setAclToAsic(aclRule.aclIdx , &aclRule);



}


#if 1
	{

	rtl8198C_tblAsicDrv_ipv6routingParam_t v6routet;

	 /* route to lan 0 */
	bzero((void*) &v6routet, sizeof(v6routet));

	in6_pton(GW_LAN0_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
	v6routet.nhStart = 0 ;
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(0, &v6routet);


	 /* route to lan 1 */
	bzero((void*) &v6routet, sizeof(v6routet));
	in6_pton(GW_LAN1_V6IP ,-1,&(v6routet.ipAddr),-1,NULL);
	v6routet.ipMaskNum = 112;
	v6routet.process = PROCESS_NXT_HOP;
	v6routet.nhStart = 30;
//	v6routet.nhStart = 0; //haha....it's error nexthop
	v6routet.nhNum =2 ;
	v6routet.nhAlgo = 2 ;
	v6routet.nhNxt = 0 ;

	rtl8198C_setAsicIpv6Routing(1, &v6routet);
	

	}
#endif

/*nextHop table setting*/
#if 1
{
	rtl8198C_tblAsicDrv_v6NexthopParam_t nxthop;


	bzero((void*) &nxthop, sizeof(nxthop));
	nxthop.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthop.destVlanIdx = rtl865xc_netIfIndex(LAN1_VID);
	rtl8198C_setAsicNexthop6(30,&nxthop);
	rtl8198C_setAsicNexthop6(31,&nxthop);


}
#endif



return 0;


}

int32 rtl8198C_testV6NxthopRouting_AclV6Comb8AlignBug(void)
{

	ether_addr_t mac;

	uint32 intPort, remPort;


	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  

	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	layer3ConfigV6NxthopRouting_AclV6Comb8AlignBug(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);



#if 1
{

	remPort=0x1111;
	intPort=0x2222;

	//Outbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_V6UDP;	
	conf.ipv6.pldlen				=128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST3_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN0_MAC),sizeof(ether_addr_t));
//	conf.pppoe.type 				= 0x0800;
//	conf.pppoe.session				= 0;
//	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

	memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
	//Expect packet

	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.ipv6.hoplmt				=254;
	conf.payload.content			= pkt_payload_Data;
	in6_pton(HOST3_V6IP ,-1,(&conf.conf_v6sip),-1,NULL);
	in6_pton(HOST1_V6IP ,-1,(&conf.conf_v6dip),-1,NULL );
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		

	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<1;
	if(virtualMacOutput( &rxPort,pktBuf, &pktLen)==SUCCESS)
	{

		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
	}else{

		printk("virtualMacOutput FAILED \n");
		return FAILED;
	}
	

}
#endif



	return SUCCESS;

}

#endif



int directIxia=0;
unsigned int bandwidth=0; //unit kbps
int pakcet_size=0; //safe range 64-1400
int initTimer=0;
struct timer_list timer;
#define TIME_ROUND 100  //ms
struct sk_buff *skb_p;


void bandwidthControl(unsigned long data )
{
	int32 pps; //packet per sec
	int i;	
	rtl_nicTx_info nicTx;
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	int tx_retry;
	rtl8651_PktConf_t conf;
	int32 pktLen;
	ether_addr_t mac;


	if(directIxia==0){
		del_timer(&timer);
		initTimer=0;
		kfree_skb(skb_p);
		return;
	}
	//bandwidth/8*1000  byte per sec
	pps= bandwidth/8*1000/pakcet_size;
	memset(&nicTx,0,sizeof(nicTx));
	nicTx.out_skb=skb_p;
	nicTx.replaceTxDesc=1;
	rtl_direct_txInfo(1<<0,&nicTx);

//gen a nermal packet		
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0x0a;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= 0x1111;
	conf.conf_sport 				= 0x2222;
	conf.payload.length 			= pakcet_size-18-20-8;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		

//	alloc a new skb

	
	for(i=0;i<(pps/(1000/TIME_ROUND));i++){	

		tx_retry=3;
		skb_p=alloc_skb(pakcet_size,0);
		memcpy(skb_p->data ,pktBuf,pktLen+4);
		skb_p->len = pktLen;
		while (--tx_retry && (swNic_send((void *)skb_p, skb_p->data, skb_p->len, &nicTx) < 0)) {
			swNic_txDone(nicTx.txIdx);
		}
		if (!tx_retry) 
		{
			//cp->net_stats.tx_dropped++;
			__kfree_skb(skb_p);
		}
	}	
	mod_timer(&timer,jiffies+msecs_to_jiffies(TIME_ROUND));
	return;
}

void directIxia_init(void)
{


	//init timer
	if(initTimer==0){
		setup_timer(&timer,bandwidthControl,0);
		mod_timer(&timer,jiffies+msecs_to_jiffies(TIME_ROUND));
	
		initTimer=1;
		printk("init sucess\n");
	}
	return;
}



#endif //Test2KL2 end CONFIG_RTL_8685S_RL6405_HWNAT




#define NEXTHOP_NAPT 0

int32  layer4ConfigNaptHash1( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
//	struct rtl865x_netif_s netif;
	rtl865x_tblAsicDrv_l2Param_t l2t;
//	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
//	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();
	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{


	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
	l2t.nhFlag = 1;


	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);


	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));
	/* lan 1 host 0 */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	{

	 rtl865x_tblAsicDrv_routingParam_t routet;


#if NEXTHOP_NAPT 
	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 0;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 0; //per-source  !! hash1 should be zero
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);
#else
	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_ARP;
	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.arpStart= 8;
	 routet.arpEnd= 8;
	 routet.internal=0;
	 routet.arpIpIdx=1;
	 rtl8651_setAsicRouting(1, &routet);


	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	strtoip(&ip32, HOST4_IP);
	rtl8651_setAsicArp(8 + (ip32 & 0x7), &arpt);

#endif

	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
//	routet.arpEnd= 8;
//	routet.arpEnd= 31;
//	routet.arpEnd= 32;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);

	}


	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */

#if NEXTHOP_NAPT
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       
#endif

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);
	return 0;
	
}




int32 rtl8198C_testNAPTHash1(void)
{
	ether_addr_t mac;
	uint32 hash1Idx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	
	layer4ConfigNaptHash1(); 	
	_rtl8651_disableEnhancedHash1();
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
//		extPort=0x2222;

	remPort=0x5555;
	hash1Idx = rtl8651_naptTcpUdpTableIndex(0, ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	extPort= (1<<10) + hash1Idx;

	printk("hash1Idx=%d extPort=%d\n",hash1Idx,extPort);

	memset(&asic_nat, 0, sizeof(asic_nat)); 	

	//napt entry
{
	
	memset(&asic_nat, 0, sizeof(asic_nat)); 
	asic_nat.insideLocalIpAddr 			= ntohl(inet_addr(HOST1_IP));
	asic_nat.insideLocalPort 	= intPort;
	asic_nat.isCollision		= 1;
	asic_nat.isCollision2		= 1;
	asic_nat.isDedicated		= 0;
	asic_nat.isStatic			= 1;
	asic_nat.isTcp				= 0; 
	asic_nat.offset				= 1;		// (offset << 10) + hash1Idx =extPort
	asic_nat.selEIdx			= 0;		//dont care
	asic_nat.selExtIPIdx		= 0;		//dont care
	asic_nat.tcpFlag			= 0x2;		//dont care
	asic_nat.ageSec				= 0x3f;
	asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
	asic_nat.isValid=1;

	rtl8651_setAsicNaptTcpUdpTable(1,hash1Idx, &asic_nat);
}

	//outBound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1,pktBuf, pktLen+4));

	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,1<<0);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);



	//Inbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	conf.ip.ttl 					= 127;
	conf.conf_dport 				= intPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


}


	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}

extern int32 rtl865x_setNatEnhancedHash1(int32 enable);
int32 rtl8198C_testNAPTHash1_APItest(void)
{
	ether_addr_t mac;
	uint32 hash1Idx , intPort, extPort, remPort,ret;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

{	

	
	layer4ConfigNaptHash1(); 	
	rtl865x_setNatEnhancedHash1(0);
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

	intPort=0x1111;
	remPort=0x5555;
	
	hash1Idx = rtl8651_naptTcpUdpTableIndex(0, ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
	extPort=(((ntohl(inet_addr(HOST1_IP))+intPort+ntohl(inet_addr(HOST4_IP))+remPort+0/*protocol*/)&0x3f)<<10)+hash1Idx;


	ret=rtl865x_addNaptConnection(ntohl(inet_addr(HOST1_IP)),intPort,ntohl(inet_addr(HOST4_IP)),remPort,ntohl(inet_addr(GW_WAN1_IP)),extPort,0,0/*protocol*/,1,1,0/*pri_valid*/,0/*pri_value*/,0/*isUpstream*/,0,0);
	if(ret==SUCCESS){
		printk("ERROR  \n");
	}

	rtl865x_addNaptConnection(ntohl(inet_addr(HOST1_IP)),intPort,ntohl(inet_addr(HOST4_IP)),remPort,ntohl(inet_addr(GW_WAN1_IP)),extPort,0,0/*protocol*/,1,1,0/*pri_valid*/,0/*pri_value*/,1/*isUpstream*/,0,0);


	//outBound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= intPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(1,pktBuf, pktLen+4));

	conf.ip.ttl 					= 127;
	conf.conf_dport 				= remPort;
	conf.conf_sport 				= extPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(GW_WAN1_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST4_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = 1<<0;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,1<<0);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);



	//Inbound
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
	conf.pktType					= _PKT_TYPE_UDP;	
	conf.ip.id						= 0xa;
	conf.ip.ttl 					= 128;
	conf.conf_dport 				= extPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
	conf.pppoe.type 				= 0x0800;
	conf.pppoe.session				= 0;
	conf.l2Flag 					= 0;
	
	pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
	RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
	RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0,pktBuf, pktLen+4));

	conf.ip.ttl 					= 127;
	conf.conf_dport 				= intPort;
	conf.conf_sport 				= remPort;
	conf.payload.length 			= 128;
	conf.payload.content			= pkt_payload_Data;
	conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
	conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
	memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
	memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
	pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
	//Output packet
	pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
	rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
	RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
	RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
	RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
	PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);


}


	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}







int32  layer2ConfigLanswitching_learnLimit_l2hashFull( void )
{

	int ret;
	rtl865x_tblAsicDrv_l2Param_t l2t;
	hp = port_number_of_host[0];
	default_register();
	rtl8651_clearAsicPvid();
	
	rtl8651_setAsicPvid(hp[0],LAN1_VID);//bb804a08
	rtl8651_setAsicPvid(hp[1],LAN1_VID);//bb804a0c
	rtl8651_setAsicPvid(hp[2],LAN1_VID);//bb804a10
	rtl8651_setAsicPvid(hp[3],LAN1_VID);
	rtl8651_setAsicPvid(hp[4],LAN1_VID);



	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
//	rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));//bb804410

	
	/* TTL control reg: enable l3 TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);		//bb80440c
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));	//bb80441c


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804104
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );//0xbb804108
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	



{
	rtl865x_tblAsicDrv_vlanParam_t	vlanp;

	vlanp.fid=0;
	vlanp.memberPortMask = (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	vlanp.untagPortMask =  (1<<hp[0]) | (1<<hp[1]) |(1<<hp[2]) |(1<<hp[3]) |(1<<hp[4]) ;
	rtl8651_setAsicVlan(LAN1_VID,&vlanp);
}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=150;
	l2t.auth=1;
	l2t.isStatic=1;

	/* lan HOST1_MAC */
	strtomac(&l2t.macAddr, HOST2_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	l2t.nhFlag = 1;
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST2_MAC), 0, &l2t);	


//set netif table  
   {

   rtl865x_tblAsicDrv_intfParam_t netif;
   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN0_MAC);
   netif.mtu = 1500;
   netif.vid = LAN0_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= 9;
   netif.inAclStart=8;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(0,&netif);



   memset(&netif,0,sizeof(netif));
   strtomac(&netif.macAddr, GW_LAN1_MAC);
   netif.mtu = 1500;
   netif.vid = LAN1_VID;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.enablev6Route=1;  
   #endif
   netif.enableRoute =1;
   netif.inAclEnd= RTL865X_ACLTBL_PERMIT_ALL;
   netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
   netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
   #if defined(CONFIG_RTL_8685S_HWNAT)  
   netif.v6mtu=1500;  
   #endif
   netif.valid=1;
   netif.macAddrNumber= 1;
   rtl8651_setAsicNetInterface(1,&netif);



   }



	return 0;
	
}

int32 rtl8198C_testL2_learnLimitToCpu_L2Hashfull(void)
{

	ether_addr_t mac;
	rtl865x_tblAsicDrv_l2Param_t l2t;

	uint32 intPort, remPort,idx1=100,idx2=101,cidx1=0,cidx2=0;
	static int increaseNum=0;
	int i;
	hsa_param_t hsa;
	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

//	_rtl8651_enableEnhancedHash1();
	layer2ConfigLanswitching_learnLimit_l2hashFull(); 	
	//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);
	rt8198C_setAsicPortLearningLimit(/*portID*/0,/*limitNum*/7,/*action*/2);
	memset(&conf, 0, sizeof(rtl8651_PktConf_t));  


	
	remPort=0x1111;
	intPort=0x2222;
	for(i=0 ;i<7; i++)
	{
	//host1(port0) to host2(port1) forward

		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0x0a;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= remPort;
		conf.conf_sport 				= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST2_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
	//	conf.l2Flag 					= L2_VLAN;
	//	conf.vlan.vid 					= LAN1_VID;

		while(1){
			conf.conf_smac[5]++;
			if(conf.conf_smac[5]=0xff)
				conf.conf_smac[4]++;

			if(idx1==rtl8651_filterDbIndex(&conf.conf_smac,0) && cidx1<=3){
				cidx1++;
				break;
			}else if(idx2==rtl8651_filterDbIndex(&conf.conf_smac,0) && cidx2<=2){
				cidx2++;
				break;
			}
		}

		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		TEST_MODEL_DONOT_DIRECT_TX=1;
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(0/*port ID*/,pktBuf, pktLen+4));

		if(i<LEARN_LIMIT)
		{
			memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
			//Expect packet
			conf.ip.ttl 					= 128;
			conf.conf_dport 				= remPort;
			conf.conf_sport 				= intPort;
			conf.payload.length 			= 128;
			conf.payload.content			= pkt_payload_Data;
			conf.conf_sip					= ntohl(inet_addr(HOST1_IP));
			conf.conf_dip					= ntohl(inet_addr(HOST2_IP)); 
			pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
			//Output packet
			pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
			rxPort = 1<<1;
			RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
			RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
			RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort/*mask*/,1<<1);
			PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning SUCCESS\n");
			}
			else
			{ 
				printk("learning FAILED \n");
				return FAILED;
			}
		}
		else{ //out of limit

			memset(&l2t,0,sizeof(l2t));
			rtl8651_getAsicL2Table(rtl8651_filterDbIndex(&(conf.conf_smac),0),0,&l2t);
			if(memcmp(&(conf.conf_smac),&(l2t.macAddr),sizeof(conf.conf_smac))== 0 )
			{
				printk("learning FAILED\n");
				return FAILED;
			}
			else
			{ 
				printk("Top CPU not learn  SUCCESS \n");
			}


			rtl865xC_virtualMacGetHsa(&hsa);
			if(hsa.dp == 0x40){
				printk("To CPU SUCCESS dp=%x \n",hsa.dp );
			}else{
				printk("not To CPU FAILED!! dp=%x\n",hsa.dp );
				return FAILED;
			}

		}

	}
	assert_equal(rtl_check_virtual_mac(),SUCCESS);
	TEST_MODEL_DONOT_DIRECT_TX=0;

	return SUCCESS;
}

#if 1 //defined(CONFIG_RTL8685SB) && defined(CONFIG_RTL_HW_NAPT_4KENTRY)
int32  layer4ConfigNaptOutbound4KEntry( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
	rtl865x_tblAsicDrv_l2Param_t l2t;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
	rtl8651_clearAsicPvid();
	default_register();	
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);
	//	rtl8651_setAsicNetInterface(,)

		}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{

	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);
	//		rtl8651_setAsicNetInterface( uint32 idx, rtl865x_tblAsicDrv_intfParam_t *intfp )

	}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}

	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
//	l2t.nhFlag = 1;
	l2t.nhFlag = 0;

	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);

	{

	 rtl865x_tblAsicDrv_routingParam_t routet;

	 /* config routing table */
	 bzero((void*) &routet, sizeof(routet));
	 /* route to wan 1 */
	 strtoip(&routet.ipAddr, GW_WAN1_IP);
	 routet.ipMask = 0xfffffffC;
	 routet.process = PROCESS_NXT_HOP;
//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	 routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	 routet.nhStart = 0;
	 routet.nhNum = 2; //index 0-1
	 routet.nhNxt = 0;
	 routet.nhAlgo = 2; //per-source
	 routet.ipDomain = 0;
	 routet.internal=0;
	 rtl8651_setAsicRouting(1, &routet);

	 /* route to lan 1 */

	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;

	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);
	}
	
	 /* config next hop table */
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

	return 0;
	
}

int32 rtl8198C_testNAPTOutbound4KEntry(void)
{

	ether_addr_t mac;
	uint32 i,inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
	uint32 testedEntryBitmap[4096/32];
	int testedEntryNum=0;
	int sip;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptOutbound4KEntry(); 	

    for(intPort=0x1055;intPort<65536;intPort++,remPort++)
    {	
		//rtl865x_acl_control_set_mode(RTL865X_ACL_Mode_Always_Permit);

		extPort=0x2222;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);

		if(outIdx==inIdx) 
			continue;
		if((testedEntryBitmap[outIdx>>5]&(0x1<<(outIdx%0x1f)))!=0)
			continue;
		
		printk("outIdx =%d inIdx=%d (%d/4096 verified)\n",outIdx,inIdx,testedEntryNum);

		//UP-stream
		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		asic_nat.insideLocalIpAddr= ntohl(inet_addr(HOST1_IP));
		asic_nat.insideLocalPort = intPort;
		asic_nat.isCollision		= 1;
		asic_nat.isValid                = 1;
		asic_nat.isCollision2		= 1;
		asic_nat.isDedicated		= 0;
		asic_nat.isStatic		= 1;
		asic_nat.isTcp                  = 0; 
		asic_nat.offset			= (extPort&0xffff)>>12;
		asic_nat.selEIdx		= (extPort&0x3ff);
		asic_nat.selEIdxExt		= (extPort>>10)&0x3;
		asic_nat.selExtIPIdx		= 0;		/* for upstream(outbound), the selExtIPIdx is useless.....*/													
		asic_nat.tcpFlag		= 0x3;		/*	bit0 :	0:inbound					1 : outbound	
												 bit1 :  0:the napt flow use 1 entry	1 : the napt flow use 2 entries  
												 bit2 :  0:trap SYN/FIN/RST 		1 : do not trap 
												(enhanced hash1 doesn't support outbound/inbound share one connection) */
		asic_nat.ageSec			= 0x3f;
		asic_nat.priValid		= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
		rtl8651_setAsicNaptTcpUdpTable(1,outIdx, &asic_nat);


		//Outbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType				= _PKT_TYPE_UDP;	
//		conf.ip.id                              = 0x0a;
		conf.ip.id				= 0xfe0b;
		conf.ip.ttl 				= 128;
		conf.conf_dport 			= remPort;
		conf.conf_sport 			= intPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip				= ntohl(inet_addr(HOST1_IP));
		conf.conf_dip				= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 			= 0x0800;
		conf.pppoe.session			= 0;
		conf.l2Flag 				= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		//RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_LAN_HOST1_PHYPORT,pktBuf, pktLen+4));

		memset(pktBuf,0,RTL865xC_TEST_SHARE_PKT_LEN);
		//Expect packet
		conf.ip.ttl 				= 127;
		conf.conf_dport 			= remPort;
		conf.conf_sport 			= extPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip				= ntohl(inet_addr(GW_WAN1_IP));
		conf.conf_dip				= ntohl(inet_addr(HOST4_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_WAN_HOST_PHYPORT_MASK;
		RTL_TESTMODEL_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		//RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_WAN_HOST_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
                
        if((testedEntryBitmap[outIdx>>5]&(0x1<<(outIdx%0x1f)))==0)
        {
            testedEntryNum++;
            testedEntryBitmap[outIdx/32] |= (0x1<<(outIdx%0x1f));
        }
#if 0
        if((testedEntryBitmap[inIdx>>5]&(0x1<<(inIdx%0x1f)))==0)
        {
            testedEntryNum++;
            testedEntryBitmap[inIdx/32] |= (0x1<<(inIdx%0x1f));
        }
#endif
        if(testedEntryNum>=4096)
            break;
            
	}
    for(i=0;i<(4096/32);i++)
    {
        assert_equal(testedEntryBitmap[i],0xffffffff);
    }

	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}

extern int RTL_FPGA_DEBUG_TABLE;
int32  layer4ConfigNaptInbound4KEntry( void )
{

	int ret;
	rtl865x_tblAsicDrv_extIntIpParam_t ipt;	
//	struct rtl865x_netif_s netif;
	rtl865x_tblAsicDrv_l2Param_t l2t;
//	rtl865x_tblAsicDrv_pppoeParam_t pppoet;
	rtl865x_tblAsicDrv_arpParam_t arpt;
//	rtl865x_tblAsicDrv_routingParam_t routet;
	rtl865x_tblAsicDrv_nextHopParam_t nxthpt;
	ipaddr_t ip32;
	hp = port_number_of_host[0];
//	rtl8651_clearRegister();

	rtl8651_clearAsicPvid();
	default_register();
	rtl8651_setAsicPvid(hp[1],LAN1_VID);
	rtl8651_setAsicPvid(hp[0],WAN1_VID);


	/* module switch control reg: enable L2/L3/L4/STP, trap 802.1D/GARP to CPU */
	//rtl8651_setAsicOperationLayer(4);
	WRITE_MEM32(MSCR,(EN_L2|EN_L3|EN_L4));
	
	/* TTL control reg: enable TTL-1 operation */
	WRITE_MEM32(ALECR,READ_MEM32(ALECR)|(uint32)EN_TTL1);	
	WRITE_MEM32(SWTCR1,READ_MEM32(SWTCR1)&(~EN_51B_CPU_REASON));


	//set ports forwarding state
	WRITE_MEM32( PCRP0, (READ_MEM32(PCRP0)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP1, (READ_MEM32(PCRP1)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP2, (READ_MEM32(PCRP2)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP3, (READ_MEM32(PCRP3)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP4, (READ_MEM32(PCRP4)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP5, (READ_MEM32(PCRP5)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP6, (READ_MEM32(PCRP6)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP7, (READ_MEM32(PCRP7)&~STP_PortST_MASK)|STP_PortST_FORWARDING );
	WRITE_MEM32( PCRP8, (READ_MEM32(PCRP8)&~STP_PortST_MASK)|STP_PortST_FORWARDING );	

	/* config vlan table */
	 /* wan 1 */	
	{

	
	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_WAN1_MAC);
	netif.mtu = 1500;
	netif.vid = WAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;
	rtl8651_setAsicNetInterface(1,&netif);

	}

	if(rtl865x_addVlan(WAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(WAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(WAN1_VID,(1<<hp[0]),(1<<hp[0]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	
	/* lan 1 */
	{
	rtl865x_tblAsicDrv_intfParam_t netif;
	memset(&netif,0,sizeof(netif));
	strtomac(&netif.macAddr, GW_LAN1_MAC);
	netif.mtu = 1500;
	netif.vid = LAN1_VID;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.enablev6Route=1;  
#endif
	netif.enableRoute =1;
	netif.inAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.inAclStart=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclEnd=RTL865X_ACLTBL_PERMIT_ALL;
	netif.outAclStart=RTL865X_ACLTBL_PERMIT_ALL;
#if defined(CONFIG_RTL_8685S_HWNAT)  
	netif.v6mtu=1500;  
#endif
	netif.valid=1;
	netif.macAddrNumber= 1;

	rtl8651_setAsicNetInterface(0,&netif);

		}

	if(rtl865x_addVlan(LAN1_VID)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_setVlanFilterDatabase(LAN1_VID,0)!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}
	if(rtl865x_modVlanPortMember(LAN1_VID,(1<<hp[2])|(1<<hp[1])|(1<<hp[3]),(1<<hp[2])|(1<<hp[1])|(1<<hp[3]))!=SUCCESS)
	{
		DBG_TESTMODEL_L34_TEST_PRK("Leave %s @ %d \n",__func__,__LINE__);
		return FAILED;
	}


	/* config l2 table */
	bzero((void*) &l2t, sizeof(l2t));
	l2t.ageSec=500;
	l2t.auth=1;
	l2t.isStatic=1;
	/* wan 1 host */
	strtomac(&l2t.macAddr, HOST4_MAC);
	l2t.memberPortMask = (1<<hp[0]);
	l2t.nhFlag = 1;
	ret = rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST4_MAC), 0, &l2t);
	/* lan 1 host 0 */
	l2t.nhFlag = 1;


	strtomac(&l2t.macAddr, HOST1_MAC);
	l2t.memberPortMask = (1<<hp[1]);
	rtl8651_setAsicL2Table(getL2TableRowFromMacStr(HOST1_MAC), 0, &l2t);


	/* config arp table */
	bzero((void*) &arpt, sizeof(arpt));
	/* lan 1 host 0 */
	arpt.aging = 0x1f;
	arpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	strtoip(&ip32, HOST1_IP);
	rtl8651_setAsicArp(0 + (ip32 & 0x7), &arpt);

	{

	rtl865x_tblAsicDrv_routingParam_t routet;

	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_WAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//	 routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(1, &routet);

#if 1	//napt inbound arp
	 /* route to lan 1 */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_INDIRECT;
	routet.vidx= rtl865xc_netIfIndex(LAN1_VID);
	routet.arpStart= 0;
	routet.arpEnd= 0;
//	routet.arpEnd= 8;
//	routet.arpEnd= 31;
//	routet.arpEnd= 32;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);
#else  //napt inbound nexthop
	/* config routing table */
	bzero((void*) &routet, sizeof(routet));
	/* route to wan 1 */
	strtoip(&routet.ipAddr, GW_LAN1_IP);
	routet.ipMask = 0xfffffffC;
	routet.process = PROCESS_NXT_HOP;
	//routet.vidx= rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 30;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=1;
	rtl8651_setAsicRouting(0, &routet);


#endif
	}

//default route
#if 0
	/* default route to wan 0: direct to modem */
	bzero((void*) &routet, sizeof(routet));
	strtoip(&routet.ipAddr, "0.0.0.0");
	strtoip(&routet.ipMask, "0.0.0.0");
	routet.process = PROCESS_NXT_HOP;
	routet.vidx = rtl865xc_netIfIndex(WAN1_VID);
	routet.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	routet.nhStart = 0;
	routet.nhNum = 2; //index 0-1
	routet.nhNxt = 0;
	routet.nhAlgo = 2; //per-source
	routet.ipDomain = 0;
	routet.internal=0;
	rtl8651_setAsicRouting(7, &routet);
#endif
	
	 /* config next hop table */
	 /* wan 0: load balance traffic through isp0 & isp1 as 3:1 */
	/* isp 0 occupies 3 entries */

#if 1	//napt inbound arp
	bzero((void*) &nxthpt, sizeof(nxthpt));	 
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);       
	rtl8651_setAsicNextHopTable(1, &nxthpt);       
#else	//napt inbound nexthop
	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST4_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(WAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(0, &nxthpt);	   
	rtl8651_setAsicNextHopTable(1, &nxthpt);   

	bzero((void*) &nxthpt, sizeof(nxthpt));  
	nxthpt.nextHopRow = getL2TableRowFromMacStr(HOST1_MAC);
	nxthpt.pppoeIdx = 0; 
	nxthpt.dvid = rtl865xc_netIfIndex(LAN1_VID);
	nxthpt.extIntIpIdx = 1; 
	nxthpt.isPppoe = 0;
	rtl8651_setAsicNextHopTable(30, &nxthpt);	   
	rtl8651_setAsicNextHopTable(31, &nxthpt);   

#endif

	
	/* config ip table */
	bzero((void*) &ipt, sizeof(ipt));
	/* wan 0 napt */
//	strtoip(&ipt.intIpAddr, "0.0.0.0");
//	strtoip(&ipt.extIpAddr, WAN0_ISP_PUBLIC_IP);
//	rtl8651_setAsicExtIntIpTable(0, &ipt);
	/* wan 1 nat */
//	strtoip(&ipt.intIpAddr, HOST1_IP);
	strtoip(&ipt.extIpAddr, WAN1_ISP_PUBLIC_IP);
	ipt.nat = 0;
	rtl8651_setAsicExtIntIpTable(1, &ipt);

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return 0;
	
}


int32 rtl8198C_testNAPTInbound4KEntry(void)
{
	ether_addr_t mac;
	uint32 inIdx, outIdx , intPort, extPort, remPort;
	rtl865x_tblAsicDrv_naptTcpUdpParam_t asic_nat;
	uint32 testedEntryBitmap[4096/32];
	int i,testedEntryNum=0;

	rtl8651_PktConf_t conf;
	int32 pktLen;  
	int32 pktLen_Expect;  
	uint8 *pktBuf			= RTL865xC_Test_SharedPkt[0];	
	uint8 *pktBuf_Expect		= RTL865xC_Test_SharedPkt[1];
	uint8 *pkt_payload_Data = RTL865xC_Test_SharedPkt[2];	
	enum PORT_MASK rxPort;	

	_rtl8651_enableEnhancedHash1();
	layer4ConfigNaptInbound4KEntry(); 	

    for(extPort=0x2222;extPort<65536;extPort++,remPort++)
	{	
		intPort=0x1111;
		remPort=0x5555;
		outIdx = rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST1_IP)), intPort, ntohl(inet_addr(HOST4_IP)), remPort);
		inIdx	= rtl8651_naptTcpUdpTableIndex((0|HASH_FOR_VERI), ntohl(inet_addr(HOST4_IP)), remPort, ntohl(inet_addr(GW_WAN1_IP)), extPort);

		if(inIdx==outIdx) 
			continue;
		if((testedEntryBitmap[inIdx>>5]&(0x1<<(inIdx%0x1f)))!=0)
			continue;
		
		printk("outIdx =%d inIdx=%d (%d/4096 verified)\n",outIdx,inIdx,testedEntryNum);

		memset(&asic_nat, 0, sizeof(asic_nat)); 	

		//Down-stream
		{
			uint16 very;

			very = rtl8651_naptTcpUdpTableIndex(((uint8)0) |HASH_FOR_VERI , ntohl(inet_addr(HOST4_IP)), remPort, 0, 0);
			
			memset(&asic_nat, 0, sizeof(asic_nat)); 
			asic_nat.insideLocalIpAddr 			= ntohl(inet_addr(HOST1_IP));
			asic_nat.insideLocalPort 	= intPort;
			asic_nat.isCollision		= 1;
			asic_nat.isCollision2		= 1;
			asic_nat.isDedicated		= 0;
			asic_nat.isStatic			= 1;
			asic_nat.isTcp				= 0; 
			asic_nat.offset				= (extPort & 0xf);
			asic_nat.selEIdx			= very & 0x3ff;
			asic_nat.selEIdxExt			= (very>>10)&0x3;
			asic_nat.selExtIPIdx		= (extPort & 0xff) >> 4;
			asic_nat.tcpFlag			= 0x2;
			asic_nat.ageSec 			= 0x3f;
			asic_nat.priValid			= FALSE; /* we use acl to set flow priority , so we do not need napt base ipqos */
			asic_nat.isValid=1;

			rtl8651_setAsicNaptTcpUdpTable(1,inIdx, &asic_nat);
		}


		//Inbound
		memset(&conf, 0, sizeof(rtl8651_PktConf_t));  
		conf.pktType					= _PKT_TYPE_UDP;	
		conf.ip.id						= 0xa;
		conf.ip.ttl 					= 128;
		conf.conf_dport 				= extPort;
		conf.conf_sport 				= remPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
		conf.conf_dip					= ntohl(inet_addr(GW_WAN1_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,HOST4_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,GW_WAN1_MAC),sizeof(ether_addr_t));
		conf.pppoe.type 				= 0x0800;
		conf.pppoe.session				= 0;
		conf.l2Flag 					= 0;
		
		pktLen = pktGen(&conf,pktBuf);				/* generate pkt in buff */		
		RTL_TESTMODEL_DUMP_PACKET("INPUT",pktBuf,pktLen);
		RTL_TESTMODEL_INIT_CHECK(virtualMacInput(RTL865xC_TEST_WAN_HOST_PHYPORT,pktBuf, pktLen+4));

		conf.ip.ttl 					= 127;
		conf.conf_dport 				= intPort;
		conf.conf_sport 				= remPort;
		conf.payload.length 			= 128;
		conf.payload.content			= pkt_payload_Data;
		conf.conf_sip					= ntohl(inet_addr(HOST4_IP));
		conf.conf_dip					= ntohl(inet_addr(HOST1_IP)); 
		memcpy(conf.conf_smac,(void*)strtomac(&mac,GW_LAN1_MAC),sizeof(ether_addr_t));
		memcpy(conf.conf_dmac,(void*)strtomac(&mac,HOST1_MAC),sizeof(ether_addr_t));
		pktLen_Expect = pktGen(&conf, pktBuf_Expect);				/* generate pkt in buff */		
		//Output packet
		pktLen = RTL865xC_TEST_SHARE_PKT_LEN;
		rxPort = RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK;
		RTL_TESTMODEL_INIT_CHECK(virtualMacOutput( &rxPort,pktBuf, &pktLen));
		RTL_TESTMODEL_DUMP_PACKET("OUTPUT",pktBuf,pktLen);
		RTL_TESTMODEL_IS_EQUAL("Pakcet forward to ... ", rxPort,RTL865xC_TEST_LAN_HOST1_PHYPORT_MASK);
		PKT_CMP(pktBuf_Expect,pktBuf,pktLen_Expect,pktLen-4,__func__,__LINE__);
#if 0
	   if((testedEntryBitmap[outIdx>>5]&(0x1<<(outIdx%0x1f)))==0)
		{
			testedEntryNum++;
			testedEntryBitmap[outIdx/32] |= (0x1<<(outIdx%0x1f));
		}
#endif
		if((testedEntryBitmap[inIdx>>5]&(0x1<<(inIdx%0x1f)))==0)
		{
			testedEntryNum++;
			testedEntryBitmap[inIdx/32] |= (0x1<<(inIdx%0x1f));
		}
		if(testedEntryNum>=4096)
			break;
    
	}
    for(i=0;i<(4096/32);i++)
    {
        assert_equal(testedEntryBitmap[i],0xffffffff);
    }

//	assert_equal(rtl_check_virtual_mac(),SUCCESS);

	return RTL_TESTMODEL_TESTCASE_RUN_SUCCESS;

}

#endif