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