/*
* Copyright c                  Realtek Semiconductor Corporation, 2002  
* All rights reserved.
* 
* Program : Header File for Virtual MAC
* Abstract : 
* Author : Louis Yung-Chieh Lo (yjlou@realtek.com.tw)               
* $Id: testModel.c,v 1.3 2012/10/24 04:49:43 ikevin362 Exp $
*/

#include <linux/delay.h>
#include "testModel.h"
#include "virtualMac.h"
#include "../AsicDriver/rtl865xc_asicregs.h"
#include "rtl865xc_testModel_L34_test.h"
#include "rtl8198c_IPv6_test.h"

#include <linux/jiffies.h>
#include <linux/time.h>

char dbgMsg[1024];


#define MODEL_TEST_CASE( case_no, func, group_mask ) \
	{ \
		no: case_no, \
		name: #func, \
		fp: func, \
		group: group_mask, \
	}

/****************************************************************************
 ****__*****__*************                                                ** 
 ***|  |***|  |****__******                                                ** 
 ***|  |***|  |***|  |*****                                                ** 
 ***|  |***|  |***|__|*****                                                ** 
 ***|  |***|  |************      Add Your Model Test Cases HERE !!!        ** 
 ***|   ___   |****__******                                                ** 
 ***|  |***|  |***|  |*****                                                ** 
 ***|  |***|  |***|  |*****                                                ** 
 ***|  |***|  |***|  |*****                                                ** 
 ***|  |***|  |***|  |*****                                                ** 
 ***|__|***|__|***|__|*****                                                **
 ****************************************************************************/
extern int32  layer3Config_V6RdDecap_ArpRouting( void );

static MODEL_TEST_CASE_T modelTestCase[] =
{	

	/*------------------------------test area------------------------------*/
	MODEL_TEST_CASE(		20000, rtl8198C_testFillTable, GRP_ALL | GRP_L34 ),
//	MODEL_TEST_CASE(		20100, rtl8198c_dumpRegs, GRP_ALL | GRP_L34 ),
	MODEL_TEST_CASE(   		100, rtl8198C_testL2learnLimit, GRP_ALL | GRP_L34 ),
	MODEL_TEST_CASE(		200, layer3Config_V6RdDecap_ArpRouting, GRP_ALL | GRP_L34 ),
	
	
	/*------------------------------verify test case------------------------------*/
	/** sample code here **/
	MODEL_TEST_CASE(		40001, rtl8198C_testArpRouting, GRP_ALL | GRP_L34), 	//40001 done
	MODEL_TEST_CASE(		40002, rtl8198C_testNxthopRouting, GRP_ALL | GRP_L34),	//40002 done
	MODEL_TEST_CASE(		40003, rtl8198C_testL2, GRP_ALL | GRP_L2),				//40003 done
	MODEL_TEST_CASE(		40004, rtl8198C_testV6ArpRouting, GRP_ALL | GRP_L34),	//40004 done
	MODEL_TEST_CASE(		40005, rtl8198C_testV6NxthopRouting, GRP_ALL | GRP_L34),//40005 done
	MODEL_TEST_CASE(		40006, rtl8198C_testV6L2, GRP_ALL | GRP_L34),			//40006 done
	MODEL_TEST_CASE(		40007, rtl8198C_testNAPTOutbound, GRP_ALL | GRP_L34),	//40007 done	
	MODEL_TEST_CASE(		40008, rtl8198C_testNAPTInbound, GRP_ALL | GRP_L34),	//40008 done
	MODEL_TEST_CASE(		40009, rtl8198C_testV6RdEncap_ArpRouting, GRP_ALL | GRP_L34),				//40009 done
	MODEL_TEST_CASE(		40010, rtl8198C_testV6RdDecap_ArpRouting, GRP_ALL | GRP_L34),				//40010 done
	MODEL_TEST_CASE(		40011, rtl8198C_testDsLiteEncap_NxthopRouting, GRP_ALL | GRP_L34),			//40011 done
	MODEL_TEST_CASE(		40012, rtl8198C_testDsLiteDecap_NxthopRouting, GRP_ALL | GRP_L34),			//40012 done	
	MODEL_TEST_CASE(		40013, rtl8198C_testNAPTOutboundAclRedirect, GRP_ALL | GRP_L34),			//40013 done  	
	MODEL_TEST_CASE(		40014, rtl8198C_testNAPTOutboundAclRedirectChain, GRP_ALL | GRP_L34),		//40014 done	
	MODEL_TEST_CASE(		40015, rtl8198C_testPktIPMulticast_txRemarkVid, GRP_ALL | GRP_L34), 		//40015 done	
	MODEL_TEST_CASE(		40016, rtl8198C_testNAPTInbound_4way, GRP_ALL | GRP_L34),					//40016  done
	MODEL_TEST_CASE(		40017, rtl8198C_testNAPTOutbound_4way, GRP_ALL | GRP_L34),					//40017  done	
	MODEL_TEST_CASE(		40018, rtl8198C_testMultipleWAN, GRP_ALL | GRP_L34),						//40018 done
	MODEL_TEST_CASE(		40019, rtl8198C_testMultipleWAN1, GRP_ALL | GRP_L34),						//40019 done
	MODEL_TEST_CASE(		40020, rtl8198C_testV6NxthopRouting_AclV6CombRedirect, GRP_ALL | GRP_L34),	//40020 done
#if defined(CONFIG_RTL_8685S_HWNAT) 
	MODEL_TEST_CASE(		40021, rtl8198C_testV6Mcast, GRP_ALL | GRP_L34),							//40021 done
	/*nic direct tx and hwlookup */
	MODEL_TEST_CASE(		40025, rtl8198C_testL2_NicDirectTx, GRP_ALL | GRP_L34),						//40025 done
	/*NAPT outbound using ARP table*/
	MODEL_TEST_CASE(		40026, rtl8198C_testNAPTOutbound_ARP, GRP_ALL | GRP_L34),					//40026 done
	/*40027: Direct tx auto add vlan and 802.1p priority  , 40028: vlan_autoAdd modify and remove*/
	MODEL_TEST_CASE(		40027, rtl8198C_testL2_NicDirectTx_VLANADD, GRP_ALL | GRP_L34),				//40027 done
	MODEL_TEST_CASE(		40028, rtl8198C_testL2_NicDirectTx_VLANADD_Test, GRP_ALL | GRP_L34),		//40028 done
	/* sample "NAT" flow */
	MODEL_TEST_CASE(		40029, rtl8198C_testNATOutbound, GRP_ALL | GRP_L34),						//40028 done

#endif

	/** verify test case here **/
	//IPM source port unmuch and IPM table unmuch flooding bug
	MODEL_TEST_CASE(		41000, rtl8198C_testPktIPMulticastL2, GRP_ALL | GRP_L34 ),						//41000 done 
	//L4 perflow test
	MODEL_TEST_CASE(		41100, rtl8198C_testNAPTOutboundPerflow, GRP_ALL | GRP_L34),					//41100 done 
	// L3/L4 check=0xffff bug
	MODEL_TEST_CASE(		41200, rtl8198C_testl3CheckSum, GRP_ALL | GRP_L34), 							//41200 done 
	MODEL_TEST_CASE(		41300, rtl8198C_testl4CheckSum, GRP_ALL | GRP_L34), 							//41300 done 
	MODEL_TEST_CASE(		43100, rtl8198C_testl4TCPCheckSum, GRP_ALL | GRP_L34), 							//43100 done
	MODEL_TEST_CASE(		43200, rtl8198C_testNxthopRouting_checksumbug, GRP_ALL | GRP_L34),				//43200 done
	// 6rd egress+IPM MTU bug
	MODEL_TEST_CASE(		41400, rtl8198C_testV6RdEncapIPM_ArpRouting, GRP_ALL | GRP_L34),				// 41400 done
	// 6rd/dsl ingress MTU bug
	MODEL_TEST_CASE(		41500, rtl8198C_testV6RdDecapMtuBug_ArpRouting, GRP_ALL | GRP_L34), 			// 41500 done
	MODEL_TEST_CASE(		41600, rtl8198C_testDsLiteDecapMtuBug_NxthopRouting, GRP_ALL | GRP_L34),		// 41600 done 
	// 6rd/dsl+IPM TTL bug
	MODEL_TEST_CASE(		41700, rtl8198C_testV6RdEncapIPMTtlBug_ArpRouting, GRP_ALL | GRP_L34),			// 41700 done
	MODEL_TEST_CASE(		41800, rtl8198C_testV6RdDecapIPMTtlBug_ArpRouting, GRP_ALL | GRP_L34),			// 41800 done
	MODEL_TEST_CASE(		41900, rtl8198C_testDsLiteDecapIPMTtlBug_NxthopRouting, GRP_ALL | GRP_L34), 	// 41900 done
	//SNAP MTU bug
	MODEL_TEST_CASE(		42000, rtl8198C_testArpRouting_SnapMtuBug, GRP_ALL | GRP_L34),					// 42000 done
	//Acl change Vlan Bug
	MODEL_TEST_CASE(		42100, rtl8198C_testL2AclChangeVlanBug, GRP_ALL | GRP_L34), 					// 42100 done
	//1 TODO:Testing ME
	//learning port limit  those case can't retest,one reboot one testing.
	MODEL_TEST_CASE(		42300, rtl8198C_testL2_learnLimitForwardNotLearn, GRP_ALL | GRP_L34),			// 42300 done
	MODEL_TEST_CASE(		42400, rtl8198C_testL2_learnLimitToCpu, GRP_ALL | GRP_L34), 					// 42400 done
	MODEL_TEST_CASE(		42500, rtl8198C_testL2_learnLimitForwardNotLearnCopyToCpu, GRP_ALL | GRP_L34),	// 42500 done
	MODEL_TEST_CASE(		42900, rtl8198C_testL2_learnLimitDropAndAgingOut, GRP_ALL | GRP_L34),			// 42900 done
	MODEL_TEST_CASE(		43000, rtl8198C_testL2_learnLimitDropAndClloision, GRP_ALL | GRP_L34),			// 43000 done
	//new feature unknow_da/unknow_sa/unmuch_sa  trap to cpu
	MODEL_TEST_CASE(		42600, rtl8198C_testL2UnknowSADA, GRP_ALL | GRP_L34),							// 42300 done 
	//Acl comb with ipv6 Bug
	MODEL_TEST_CASE(		42700, rtl8198C_testV6NxthopRouting_AclV6CombBug, GRP_ALL | GRP_L34),			//42700 done

	MODEL_TEST_CASE(		45700, rtl8198C_testL2_learnLimitToCpu_L2Hashfull, GRP_ALL | GRP_L34), 			


/* RL6405 Test */
#if defined(CONFIG_RTL_8685S_HWNAT)  
	/* IPM hit v6l3 ALE hang bug*/
	MODEL_TEST_CASE(		43300, rtl8198C_testV6Mcast, GRP_ALL | GRP_L34),								//43300 done
	MODEL_TEST_CASE(		43400, rtl8198C_testDsLiteDecapIPM_ALE_HangBug_NxthopRouting, GRP_ALL | GRP_L34),//43400 done
	/* ipv6 extension len > (l4+data) cause hsb.l4checksum=0 bug (both TCP and UDP) */
	MODEL_TEST_CASE(		43500, rtl8198C_testV6L2_l4hsbCheckErrorBug, GRP_ALL | GRP_L34),				//43500 done
	/* new feature nic hwlookup mode support to OffLoad IPv4 IPv6 L3/L4/TCP/UPD/ICMP/IGMP */
	MODEL_TEST_CASE(		43600, rtl8198C_testL2_checkSumOffLoad_HwLookUp, GRP_ALL | GRP_L34),			//43600 done
	MODEL_TEST_CASE(		43700, rtl8198C_testL2_checkSumOffLoad_DirectTx, GRP_ALL | GRP_L34),			//43700 done
	/* new feature add l2 learning limitation  control counter +1  -1 */
	MODEL_TEST_CASE(		43800, rtl8198C_testLearningLimit_SWAddSubCounter, GRP_ALL | GRP_L34),			//43800 done
	/* new feature	IPM routing select DMac*/
	MODEL_TEST_CASE(		43900, rtl8198C_testIPMv6_selectDestIf, GRP_ALL | GRP_L34), 				//43900 done
	MODEL_TEST_CASE(		44000, rtl8198C_test_IPMv4_selectDestIf, GRP_ALL | GRP_L34),				//44000 done
	/* ip fragment pakcet ation change*/
	MODEL_TEST_CASE(		44100, rtl8198C_testL2_aclFragmentPkt, GRP_ALL | GRP_L34),					//44100 done
	/* 2kL2 alc redirect interface and pppor*/
	MODEL_TEST_CASE(		44200, rtl8198C_testL2_acl2kl2, GRP_ALL | GRP_L34),							//44200 done
	/*vlan packet + direct tx vlan autoadd + checksum offload bug  6rd/dslite  ingress/egress */
	MODEL_TEST_CASE(		44300, rtl8198C_DirectTx_6RD_DSLITE_BUG, GRP_ALL | GRP_L34), 				//44300
	MODEL_TEST_CASE(		44400, rtl8198C_testDsLiteDecap_NxthopRouting_directBug, GRP_ALL | GRP_L34), 				//44400
	MODEL_TEST_CASE(		44500, rtl8198C_testV6RdEncap_ArpRouting_directBug, GRP_ALL | GRP_L34), 					//44500
	MODEL_TEST_CASE(		44600, rtl8198C_testDsLiteEncap_NxthopRouting_directBug, GRP_ALL | GRP_L34), 				//44600
	/* acl 8 align bug*/
	MODEL_TEST_CASE(		44700, acl_config_comb8Align, GRP_ALL | GRP_L34), 				//44600
	MODEL_TEST_CASE(		44800, rtl8198C_testV6NxthopRouting_AclV6Comb8AlignBug, GRP_ALL | GRP_L34), 				//44600
	/*IPMv4 vlan and dscp remarking for 5 port chip test case*/
	MODEL_TEST_CASE(		44900, rtl8198C_testPktIPMulticastL3, GRP_ALL | GRP_L34 | GRP_IPMC),
	MODEL_TEST_CASE(		45000, rtl8198C_testPktIPMulticastUnmatchSPA, GRP_ALL | GRP_L34 | GRP_IPMC),
	MODEL_TEST_CASE(		45100, rtl8198C_testPktIPMulticastPPPoERouing, GRP_ALL | GRP_L34 | GRP_IPMC),
	
	/* testing  hash-1  */
	MODEL_TEST_CASE(		45500, rtl8198C_testNAPTHash1, GRP_ALL | GRP_L34 | GRP_IPMC),
	MODEL_TEST_CASE(		45600, rtl8198C_testNAPTHash1_APItest, GRP_ALL | GRP_L34 | GRP_IPMC),	
#endif
	

	/*pass auto test case*/ 
	MODEL_TEST_CASE(/*50000*/	50000, rtl8198C_testNAPTOutbound, GRP_ALL | GRP_L34),					//40007 done
	MODEL_TEST_CASE(/*50001*/	AUTO_CASE_NO, rtl8198C_testNAPTInbound, GRP_ALL | GRP_L34), 			//40008 done
	MODEL_TEST_CASE(/*50002*/	AUTO_CASE_NO, rtl8198C_testL2, GRP_ALL | GRP_L2),						//40003 done
	MODEL_TEST_CASE(/*50003*/	AUTO_CASE_NO, rtl8198C_testNxthopRouting, GRP_ALL | GRP_L34),			//40002 done
	MODEL_TEST_CASE(/*50004*/	AUTO_CASE_NO, rtl8198C_testArpRouting, GRP_ALL | GRP_L34),				//40001 done
	MODEL_TEST_CASE(/*50005*/	AUTO_CASE_NO, rtl8198C_testV6ArpRouting, GRP_ALL | GRP_L34),			//40004 done
	MODEL_TEST_CASE(/*50006*/	AUTO_CASE_NO, rtl8198C_testV6NxthopRouting, GRP_ALL | GRP_L34), 		//40005 done
	MODEL_TEST_CASE(/*50007*/	AUTO_CASE_NO, rtl8198C_testNAPTOutboundAclRedirect, GRP_ALL | GRP_L34), //40013 done
	MODEL_TEST_CASE(/*50008*/	AUTO_CASE_NO, rtl8198C_testNAPTOutboundAclRedirectChain, GRP_ALL | GRP_L34),//40014 done
	MODEL_TEST_CASE(/*50009*/	AUTO_CASE_NO, rtl8198C_testPktIPMulticast_txRemarkVid, GRP_ALL | GRP_L34),	//40015 done
	MODEL_TEST_CASE(/*50010*/	AUTO_CASE_NO, rtl8198C_testV6RdEncap_ArpRouting, GRP_ALL | GRP_L34),		//40009 done
	MODEL_TEST_CASE(/*50011*/	AUTO_CASE_NO, rtl8198C_testV6RdDecap_ArpRouting, GRP_ALL | GRP_L34),		//40010 done
	MODEL_TEST_CASE(/*50012*/	AUTO_CASE_NO, rtl8198C_testDsLiteEncap_NxthopRouting, GRP_ALL | GRP_L34),	//40011 done
	MODEL_TEST_CASE(/*50013*/	AUTO_CASE_NO, rtl8198C_testDsLiteDecap_NxthopRouting, GRP_ALL | GRP_L34),	//40012 done
	MODEL_TEST_CASE(/*50014*/	AUTO_CASE_NO, rtl8198C_testPktIPMulticastL2, GRP_ALL | GRP_L34 ),			//41000 done
	MODEL_TEST_CASE(/*50015*/	AUTO_CASE_NO, rtl8198C_testl3CheckSum, GRP_ALL | GRP_L34),					//41200 done
	MODEL_TEST_CASE(/*50016*/	AUTO_CASE_NO, rtl8198C_testl4CheckSum, GRP_ALL | GRP_L34),					//41300 done
	MODEL_TEST_CASE(/*50017*/	AUTO_CASE_NO, rtl8198C_testV6RdEncapIPM_ArpRouting, GRP_ALL | GRP_L34), 	//41400 done
	MODEL_TEST_CASE(/*50018*/	AUTO_CASE_NO, rtl8198C_testArpRouting_SnapMtuBug, GRP_ALL | GRP_L34),		//42000 done
	MODEL_TEST_CASE(/*50019*/	AUTO_CASE_NO, rtl8198C_testV6RdEncapIPMTtlBug_ArpRouting, GRP_ALL | GRP_L34),		//41700 done
	MODEL_TEST_CASE(/*50020*/	AUTO_CASE_NO, rtl8198C_testV6RdDecapIPMTtlBug_ArpRouting, GRP_ALL | GRP_L34),		//41800 done
	MODEL_TEST_CASE(/*50021*/	AUTO_CASE_NO, rtl8198C_testDsLiteDecapIPMTtlBug_NxthopRouting, GRP_ALL | GRP_L34),	//41900 done
	MODEL_TEST_CASE(/*50022*/	AUTO_CASE_NO, rtl8198C_testL2AclChangeVlanBug, GRP_ALL | GRP_L34), 					//42100 done
	MODEL_TEST_CASE(/*50023*/	AUTO_CASE_NO, rtl8198C_testL2UnknowSADA, GRP_ALL | GRP_L34),						//42300 done 
	MODEL_TEST_CASE(/*50024*/	AUTO_CASE_NO, rtl8198C_testV6RdDecapMtuBug_ArpRouting, GRP_ALL | GRP_L34),			//41500 done
	MODEL_TEST_CASE(/*50025*/	AUTO_CASE_NO, rtl8198C_testDsLiteDecapMtuBug_NxthopRouting, GRP_ALL | GRP_L34),		//41600 done 
	MODEL_TEST_CASE(/*50026*/	AUTO_CASE_NO, rtl8198C_testV6NxthopRouting_AclV6CombBug, GRP_ALL | GRP_L34),		//42700 done
	MODEL_TEST_CASE(/*50027*/	AUTO_CASE_NO, rtl8198C_testNAPTInbound_4way, GRP_ALL | GRP_L34),					//40016 done
	MODEL_TEST_CASE(/*50028*/	AUTO_CASE_NO, rtl8198C_testNAPTOutbound_4way, GRP_ALL | GRP_L34),					//40017 done
	MODEL_TEST_CASE(/*50029*/	AUTO_CASE_NO, rtl8198C_testMultipleWAN, GRP_ALL | GRP_L34), 						//40018 done
	MODEL_TEST_CASE(/*50030*/	AUTO_CASE_NO, rtl8198C_testMultipleWAN1, GRP_ALL | GRP_L34),						//40019 done
	MODEL_TEST_CASE(/*50031*/	AUTO_CASE_NO, rtl8198C_testV6NxthopRouting_AclV6CombRedirect, GRP_ALL | GRP_L34),	//40020 done
	MODEL_TEST_CASE(/*50032*/	AUTO_CASE_NO, rtl8198C_testNAPTOutboundPerflow, GRP_ALL | GRP_L34),					//41100 done
#if defined(CONFIG_RTL_8685S_HWNAT)
	MODEL_TEST_CASE(/*50033*/	AUTO_CASE_NO, rtl8198C_testV6Mcast, GRP_ALL | GRP_L34),							//40021 done
	MODEL_TEST_CASE(/*50034*/	AUTO_CASE_NO, rtl8198C_testL2_NicDirectTx, GRP_ALL | GRP_L34), 					//40025 done
	MODEL_TEST_CASE(/*50035*/	AUTO_CASE_NO, rtl8198C_testNAPTOutbound_ARP, GRP_ALL | GRP_L34),				//40026 done
	MODEL_TEST_CASE(/*50036*/	AUTO_CASE_NO, rtl8198C_testL2_NicDirectTx_VLANADD, GRP_ALL | GRP_L34), 			//40027 done
	MODEL_TEST_CASE(/*50037*/	AUTO_CASE_NO, rtl8198C_testL2_NicDirectTx_VLANADD_Test, GRP_ALL | GRP_L34),		//40028 done
	MODEL_TEST_CASE(/*50038*/	AUTO_CASE_NO, rtl8198C_testNATOutbound, GRP_ALL | GRP_L34),						//40028 done
	MODEL_TEST_CASE(/*50039*/	AUTO_CASE_NO, rtl8198C_testDsLiteDecapIPM_ALE_HangBug_NxthopRouting, GRP_ALL | GRP_L34),//43400 done
	MODEL_TEST_CASE(/*50040*/	AUTO_CASE_NO, rtl8198C_testV6L2_l4hsbCheckErrorBug, GRP_ALL | GRP_L34),					//43500 done
	MODEL_TEST_CASE(/*50041*/	AUTO_CASE_NO, rtl8198C_testL2_checkSumOffLoad_HwLookUp, GRP_ALL | GRP_L34),				//43600 done
	MODEL_TEST_CASE(/*50042*/	AUTO_CASE_NO, rtl8198C_testL2_checkSumOffLoad_DirectTx, GRP_ALL | GRP_L34),				//43700 done
	MODEL_TEST_CASE(/*50043*/	AUTO_CASE_NO, rtl8198C_testLearningLimit_SWAddSubCounter, GRP_ALL | GRP_L34),			//43800 done
	MODEL_TEST_CASE(/*50044*/	AUTO_CASE_NO, rtl8198C_testIPMv6_selectDestIf, GRP_ALL | GRP_L34), 						//43900 done
	MODEL_TEST_CASE(/*50045*/	AUTO_CASE_NO, rtl8198C_test_IPMv4_selectDestIf, GRP_ALL | GRP_L34),						//44000 done
	MODEL_TEST_CASE(/*50046*/	AUTO_CASE_NO, rtl8198C_testL2_aclFragmentPkt, GRP_ALL | GRP_L34),						//44100 done
	MODEL_TEST_CASE(/*50047*/	AUTO_CASE_NO, rtl8198C_testL2_acl2kl2, GRP_ALL | GRP_L34), 								//44200 done
	MODEL_TEST_CASE(/*50048*/	AUTO_CASE_NO, rtl8198C_DirectTx_6RD_DSLITE_BUG, GRP_ALL | GRP_L34), 					//44300 done
	MODEL_TEST_CASE(/*50049*/	AUTO_CASE_NO, rtl8198C_testDsLiteDecap_NxthopRouting_directBug, GRP_ALL | GRP_L34),		//44400 done
	MODEL_TEST_CASE(/*50050*/	AUTO_CASE_NO, rtl8198C_testV6RdEncap_ArpRouting_directBug, GRP_ALL | GRP_L34),			//44500 done
	MODEL_TEST_CASE(/*50051*/	AUTO_CASE_NO, rtl8198C_testDsLiteEncap_NxthopRouting_directBug, GRP_ALL | GRP_L34), 	//44600 done


#endif
	MODEL_TEST_CASE(/*AUTO_CASE_NO end*/   AUTO_CASE_NO, rtl8198C_testV6L2, GRP_ALL | GRP_L34),						//40006 done
	

/* these test cases  need  time to run*/
#if defined(CONFIG_RTL_8685S_HWNAT)  
	//new feature stress test IPM routing select DMac
	MODEL_TEST_CASE( 50200, rtl8198C_testIPMv4v6_DestSelectIf_StressTest, GRP_ALL | GRP_L34),	//40024 done
	//new feature 2k l2 basic test
	MODEL_TEST_CASE( 50201, rtl8198C_test2KL2_basic, GRP_ALL | GRP_L34),
#endif

#if defined(CONFIG_RTL_HW_NAPT_4KENTRY)
	MODEL_TEST_CASE( 60001, rtl8198C_testNAPTOutbound4KEntry, GRP_ALL | GRP_L34),
	MODEL_TEST_CASE( 60002, rtl8198C_testNAPTInbound4KEntry, GRP_ALL | GRP_L34),
#endif
		/* Final case, DO NOT remove it */
	MODEL_TEST_CASE(	 100000, NULL, GRP_ALL ),

};


#if 0 

int rtl_testModel_testEnhancedGRE( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testEnhancedGRE();
#else
	#error please implement your platform here
#endif
}


int rtl_testModel_testIpOther( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testIpOther();
#else
	#error please implement your platform here
#endif
}




int rtl_testModel_testLayer3RoutingToCpu( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testLayer3RoutingToCpu();
#else
	#error please implement your platform here
#endif
}
int rtl_testModel_testIPMulticast( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testIPMulticast();
#else
	#error please implement your platform here
#endif
}

int rtl_testModel_testLayer3MTU( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testLayer3MTU();
#else
	#error please implement your platform here
#endif
}


int rtl_testModel_testPktIPMulticastL2( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testPktIPMulticastL2();
#else
	#error please implement your platform here
#endif
}

int rtl_testModel_testPktIPMulticastL3( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testPktIPMulticastL3();
#else
	#error please implement your platform here
#endif
}

int rtl_testModel_testPktIPMulticastPPPoE( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testPktIPMulticastPPPoE();
#else
	#error please implement your platform here
#endif
}

int rtl_testModel_testLayer3Routing( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testLayer3Routing();
#else
	#error please implement your platform here
#endif
}

int rtl_testModel_testLayer3GuestVLAN( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl865xC_testLayer3GuestVLAN();
#else
	#error please implement your platform here
#endif
}

#endif


int rtl_testModel_8198C_testPktIPMulticastL2( void )
{
#ifdef CONFIG_RTL_8676HWNAT
	return rtl8198C_testPktIPMulticastL2();
#else
	#error please implement your platform here
#endif
}






void rtl_testModel_run(int testcase_id)
{
	int i,j;
	int32 caseNoSeq = 1; /* to generate auto-increased case number. */
	uint32 groupmask = 0xffffffff;
	int totalCase=0;
	int retval;
//	char *testCaseString;
//	int32 testCaseInint=1 ;
	struct timeval tv, tv2;
	do_gettimeofday(&tv);
	printk("##### Enter %s test id:%d @ %d\n",__func__,testcase_id,__LINE__);


	//just testing api 
	if(testcase_id<10000)
	{
		
		for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++)
		{
		MODEL_TEST_CASE_T *pCase = &modelTestCase[i];
			if(pCase->no==testcase_id){
				printk( "Running Model Test Case %d: %s() ...\n", pCase->no, pCase->name ); 
		retval = pCase->fp();
			}
		}
		if(retval==SUCCESS)
			printk("set success \n");
		else
			printk("set Error\n");
		
	}else{
	
	
		/* generate auto-increased pCase->no */
		for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
		{
			MODEL_TEST_CASE_T *pCase = &modelTestCase[i];
			MODEL_TEST_CASE_T *pCase_pre ;
	
			if  ( pCase->no == AUTO_CASE_NO )
			{
				pCase_pre = &modelTestCase[i-1];

				pCase->no =pCase_pre->no+1 ;

			}
	
		}

	//	for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ ){
	//		MODEL_TEST_CASE_T *pCase = &modelTestCase[i];
	//		printk("pCase -> no = %d \n",pCase->no);

	//	}

	
		for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
		{	
			MODEL_TEST_CASE_T *pCase = &modelTestCase[i];	
		
			if ( ( pCase->group & groupmask ) == 0 ) 
				continue;
			if ( pCase->fp == NULL ) 
				continue;
			if( (pCase->no >= testcase_id+100) ||  (pCase->no <testcase_id))
				continue;
	
			totalCase++;		
			printk( "Running Model Test Case %d: %s() ...\n", pCase->no, pCase->name );		
		
	
			/* Prepare virtualMac environment */
			//WRITE_MEM32( SSIR, READ_MEM32(SSIR)|FULL_RST);	
			//mdelay(50);	
			virtualMacInit();		
	
			retval = pCase->fp();
	
			if (retval == RTL_TESTMODEL_TESTCASE_RUN_SUCCESS )
			{
				printk("\033[0;32m %d:%s Pass! \033[m\n",pCase->no,pCase->name);	
			}
			else
			{
				//force linkdown fordebug if failed
				int32 port=0;
				for( port = PHY0; port<=RTL8651_MAC_NUMBER; port++ )
				{
					uint32 config;
					config = READ_MEM32( PCRP0+port*4 );

					config &= (BYPASS_TCRC|MIIcfg_CRS|MIIcfg_COL|MIIcfg_RXER|GMIIcfg_CRS|BCSC_Types_MASK|
						           EnLoopBack|PauseFlowControl_MASK|DisBKP|STP_PortST_MASK|AcptMaxLen_MASK); /* keep value */
						
					config |= ((port<<ExtPHYID_OFFSET)|ForceSpeed100M|ForceDuplex|
									PauseFlowControlEtxErx|MacSwReset);	

					WRITE_MEM32( PCRP0+port*4, config );
						mdelay(10);
				}
				printk("\033[0;31m %d %s Failed! \033[m\n",pCase->no,pCase->name);
				return FAILED;
			}	
			}

	}

	if(i==sizeof(modelTestCase)/sizeof(modelTestCase[0]))
			{
		/* Haha time */
		do_gettimeofday(&tv2);
		printk("                          ==================\n");
		printk("total %3d test case using | %3u.%u sec |   \n",totalCase,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))/1000000
			,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))%1000000  );
		printk("                          ==================\n");
		printk("%d test case all pass !\n",totalCase);
		}
}
		
	
void rtl_testModel_run_range(int testcase_id_start, int testcase_id_end,uint32 repeatTimes)
{
	int i,j;
	int32 caseNoSeq = 1; /* to generate auto-increased case number. */
	uint32 groupmask = 0xffffffff;
	int totalCase=0;
	int retval;
	int pass_case_cnt=0;
	struct timeval tv, tv2;
	do_gettimeofday(&tv);

	printk("##### Enter %s test_id %d~%d @ %d\n",__func__,testcase_id_start,testcase_id_end,__LINE__);
		/* generate auto-increased pCase->no */
		for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
		{
			MODEL_TEST_CASE_T *pCase = &modelTestCase[i];
			MODEL_TEST_CASE_T *pCase_pre ;
			
			if  ( pCase->no == AUTO_CASE_NO )
			{
				pCase_pre = &modelTestCase[i-1];
	
				pCase->no =pCase_pre->no+1 ;
	
			}
	
		}
	
	
		for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
		{	
		for(j=0;j<repeatTimes;j++)
		{

			MODEL_TEST_CASE_T *pCase = &modelTestCase[i];	
		
			if ( ( pCase->group & groupmask ) == 0 ) 
				continue;
			if ( pCase->fp == NULL ) 
				continue;
			if( (pCase->no > testcase_id_end) ||  (pCase->no < testcase_id_start))
				continue;
	
			printk("\033[0;31m running times %d/%d \033[m\n",j,repeatTimes);
			totalCase++;		
			printk( "Running Model Test Case %d: %s() ...\n", pCase->no, pCase->name );		
	
			
	
			/* Prepare virtualMac environment */
			//WRITE_MEM32( SSIR, READ_MEM32(SSIR)|FULL_RST);	
			//mdelay(50);	
			virtualMacInit();		
	
	
			retval = pCase->fp();
			
			if (retval == RTL_TESTMODEL_TESTCASE_RUN_SUCCESS )
			{
				pass_case_cnt++;
				printk("\033[0;32m %d:%s Pass! \033[m\n",pCase->no,pCase->name);	
			}
			else
			{
				printk("\033[0;31m %d %s Failed! \033[m\n",pCase->no,pCase->name);
				return -1;
			}
		}
	}

	if(i==sizeof(modelTestCase)/sizeof(modelTestCase[0]))
	{
		/* Haha time */
		do_gettimeofday(&tv2);
		printk("                          ==================\n");
		printk("total %3d test case using | %3u.%u sec |   \n",totalCase,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))/1000000
			,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))%1000000  );
		printk("                          ==================\n");
		printk("\033[0;35m Total %d cases.\033[m \033[0;32m %d Pass.\033[m \033[0;31m %d Failed! \033[m\n",totalCase,pass_case_cnt,totalCase-pass_case_cnt);
	}
}

void rtl_testModel_run_grp(char *group)
{
	int i,j;
	int32 caseNoSeq = 1; /* to generate auto-increased case number. */
	uint32 groupmask = 0xffffffff;
	int totalCase=0;
	int pass_case_cnt=0;
	int retval;

	struct timeval tv, tv2;
	do_gettimeofday(&tv);

//	rtl_reset_all_tables();

	/* generate auto-increased pCase->no */
	for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
	{
		MODEL_TEST_CASE_T *pCase = &modelTestCase[i];
		MODEL_TEST_CASE_T *pCase_pre ;

		if	( pCase->no == AUTO_CASE_NO )
		{
			pCase_pre = &modelTestCase[i-1];

			pCase->no =pCase_pre->no+1 ;

		}

	}

	if(!strncmp(group,"all",strlen(group)-1))
	{
		groupmask = 0xffffffff;
	}
	else if(!strncmp(group,"l2",strlen(group)-1))
			{
		groupmask = GRP_L2;
	}
	else if(!strncmp(group,"l34",strlen(group)-1))
	{
		groupmask = GRP_L34;
			}	
	else if(!strncmp(group,"ipmc",strlen(group)-1))
			{
		groupmask = GRP_IPMC;
			}
			else
			{
		printk("[Error] group=[%s]\n",group);
		return;
			}


	for( i = 0; i < sizeof(modelTestCase)/sizeof(modelTestCase[0]); i++ )
	{	
		MODEL_TEST_CASE_T *pCase = &modelTestCase[i];	

		if ( ( pCase->group & groupmask ) == 0 ) 
			continue;
		if ( pCase->fp == NULL ) 
			continue;

		totalCase++;		
		printk( "Running Model Test Case %d: %s() ...\n", pCase->no, pCase->name ); 	

		/* Prepare virtualMac environment */
		virtualMacInit();		

		retval = pCase->fp();
		
		if (retval == RTL_TESTMODEL_TESTCASE_RUN_SUCCESS )
		{
			pass_case_cnt++;
			printk("\033[0;32m %d:%s Pass! \033[m\n",pCase->no,pCase->name);	
		}
		else
		{
			printk("\033[0;31m %d %s Failed! \033[m\n",pCase->no,pCase->name);
		}
	}

	if(i==sizeof(modelTestCase)/sizeof(modelTestCase[0]))
	{
		/* Haha time */
		do_gettimeofday(&tv2);
		printk("\033[0;34m ====================================================================== \033[m\n");
		printk("\033[0;34m |Total %3d test case using | %3u.%u sec | \033[m  ",totalCase,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))/1000000
			,((tv2.tv_sec*1000000+tv2.tv_usec)-(tv.tv_sec*1000000+tv.tv_usec))%1000000  );
		printk("\033[0;32m %d [Pass]\033[m \033[0;31m %d [Failed]\033[m \033[0;35m|\033[m\n",pass_case_cnt,totalCase-pass_case_cnt);
		printk("\033[0;34m ====================================================================== \033[m\n");
	}
}

void rtl_testModel_dumpPacket(char* data,int len)
{
	int i;	
	printk("-- len:%d --\n",len);
	for (i=0; i<len; i++)
	{
		printk("%02X ",data[i]&0xFF);
		if(i%16==15)
			printk("\n");
		else if(i%8==7)
			printk("  ");
	}
	printk("\n");
}