summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/drivers/net/rtl819x/l3Driver
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/realtek/files/drivers/net/rtl819x/l3Driver')
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l3Driver/Makefile2
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_arp.c45
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multicast.c44
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multipleWan.c800
4 files changed, 70 insertions, 821 deletions
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/Makefile b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/Makefile
index ad10ae661..6db70aca1 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/Makefile
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/Makefile
@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile...
#Add mips16 Support
-DIR_RTLASIC = $(TOPDIR)/drivers/net/rtl819x/
+DIR_RTLASIC = $(DIR_LINUX)/drivers/net/rtl819x/
ifdef CONFIG_RTL865X_KERNEL_MIPS16_LAYERDRIVER
CFLAGS_rtl865x_arp.o = -mips16
CFLAGS_rtl865x_ip.o = -mips16
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_arp.c b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_arp.c
index fab41bcc2..9786c6d9d 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_arp.c
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_arp.c
@@ -379,6 +379,43 @@ static int32 rtl865x_getArpFid(ipaddr_t ip, uint16 *fid)
*fid = vlan->fid;
return SUCCESS;
}
+
+#if 1//#if defined(CONFIG_RTL_AVOID_ADDING_WLAN_PKT_TO_HW_NAT)
+int32 rtl865x_isEthArp(ipaddr_t ip)
+{
+ uint32 hash;
+
+ //memset(mac, 0, sizeof(ether_addr_t));
+
+ if(rtl865x_arp_hash(ip, &hash)!=SUCCESS)
+ {
+ return FALSE;
+ }
+
+ if(arpTables.mappings[hash].ip!=ip)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+int32 rtl865x_isEthPortMask(uint32 portMask)
+{
+ int i;
+ for(i=0; i <=RTL8651_PHY_NUMBER; i++)
+ {
+
+ if((1<<i) & portMask)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+#endif
+
#if defined(CONFIG_RTL_MULTIPLE_WAN)
int32 rtl_set_callback_for_ps_arp(int (*call_back_fn)(u32 ip,rtl865x_arpMapping_entry_t *entry))
{
@@ -475,6 +512,14 @@ int32 rtl865x_addArp(ipaddr_t ip, ether_addr_t * mac)
{
continue;
}
+
+ #if 1//#if defined(CONFIG_RTL_AVOID_ADDING_WLAN_PKT_TO_HW_NAT)
+ if(rtl865x_isEthPortMask(fdbEntry.memberPortMask)==FALSE)
+ {
+ continue;
+ }
+ #endif
+
/*indicate new arp mapping*/
if((oldArpMapping.ip!=ip) ||(memcmp(&(oldArpMapping.mac),mac, 6)!=0))
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multicast.c b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multicast.c
index 872073807..b519fc1f4 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multicast.c
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multicast.c
@@ -1,19 +1,11 @@
-
-
-/* @doc RTL_LAYEREDDRV_API
-
- @module rtl865x_multicast.c - RTL865x Home gateway controller Layered driver API documentation |
- This document explains the API interface of the table driver module. Functions with rtl865x prefix
- are external functions.
- @normal Hyking Liu (Hyking_liu@realsil.com.cn) <date>
-
- Copyright <cp>2008 Realtek<tm> Semiconductor Cooperation, All Rights Reserved.
-
- @head3 List of Symbols |
- Here is a list of all functions and variables in this module.
-
- @index | RTL_LAYEREDDRV_API
-*/
+/*
+ *
+ * Copyright (c) 2011 Realtek Semiconductor Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
#ifdef __linux__
#include <linux/config.h>
@@ -382,6 +374,7 @@ static uint16 rtl865x_genMCastEntryCpuFlag(rtl865x_tblDrv_mCast_t *mCastEntry)
return cpuFlag;
}
+#if defined (CONFIG_RTL_IGMP_SNOOPING)
/*for linux bridge level igmp snooping usage*/
static uint32 rtl865x_getMCastEntryDescPortMask(rtl865x_tblDrv_mCast_t *mCastEntry)
{
@@ -400,7 +393,7 @@ static uint32 rtl865x_getMCastEntryDescPortMask(rtl865x_tblDrv_mCast_t *mCastEnt
return descPortMask;
}
-
+#endif
/*=======================================
* Multicast Table APIs
*=======================================*/
@@ -936,7 +929,9 @@ int32 rtl865x_addMulticastEntry(ipaddr_t mAddr, ipaddr_t sip, uint16 svid, uint1
rtl865x_tblDrv_mCast_t *mCast_t;
uint32 hashIndex = rtl8651_ipMulticastTableIndex(sip, mAddr);
+ #if defined (CONFIG_RTL_IGMP_SNOOPING)
struct rtl_groupInfo groupInfo;
+ #endif
/*windows xp upnp:239.255.255.0*/
if(mAddr==0xEFFFFFFA)
{
@@ -1003,7 +998,7 @@ int32 rtl865x_addMulticastEntry(ipaddr_t mAddr, ipaddr_t sip, uint16 svid, uint1
mCast_t->flag |= RTL865X_MULTICAST_EXTIP_SET;
else
mCast_t->flag &= ~RTL865X_MULTICAST_EXTIP_SET;
-
+ #if defined (CONFIG_RTL_IGMP_SNOOPING)
rtl_getGroupInfo(mAddr, &groupInfo);
if(groupInfo.ownerMask==0)
{
@@ -1013,7 +1008,7 @@ int32 rtl865x_addMulticastEntry(ipaddr_t mAddr, ipaddr_t sip, uint16 svid, uint1
{
mCast_t->unKnownMCast=FALSE;
}
-
+ #endif
_rtl865x_patchPppoeWeak(mCast_t);
_rtl865x_arrangeMulticast(hashIndex);
return SUCCESS;
@@ -1306,6 +1301,7 @@ static int32 _rtl865x_mCastFwdDescDequeue(mcast_fwd_descriptor_head_t * queueHea
static int32 rtl865x_multicastCallbackFn(void *param)
{
+ #if defined (CONFIG_RTL_IGMP_SNOOPING)
uint32 index;
uint32 oldDescPortMask,newDescPortMask;/*for device decriptor forwarding usage*/
@@ -1339,7 +1335,11 @@ static int32 rtl865x_multicastCallbackFn(void *param)
/*case 1:this is multicast event from bridge(br0) */
/*sync wlan and ethernet*/
//hyking:[Fix me] the RTL_BR_NAME...
+#ifdef CONFIG_RTK_VLAN_WAN_TAG_SUPPORT
+ if(memcmp(mcastEventContext.devName,RTL_BR_NAME,3)==0 || memcmp(mcastEventContext.devName,RTL_BR1_NAME,3)==0)
+#else
if(memcmp(mcastEventContext.devName,RTL_BR_NAME,3)==0)
+#endif
{
for (index=0; index< RTL8651_MULTICASTTBL_SIZE; index++)
@@ -1402,7 +1402,11 @@ static int32 rtl865x_multicastCallbackFn(void *param)
/*case 2:this is multicast event from ethernet (eth0)*/
/*update ethernet forwarding port mask*/
+#ifdef CONFIG_RTK_VLAN_WAN_TAG_SUPPORT
+ if(memcmp(mcastEventContext.devName,"eth*",4)==0 || memcmp(mcastEventContext.devName,RTL_PS_ETH_NAME_ETH2,4)==0)
+#else
if(memcmp(mcastEventContext.devName,"eth*",4)==0)
+#endif
{
#ifdef CONFIG_RTL865X_MUTLICAST_DEBUG
printk("%s:%d,multicast event from ethernet (%s),mcastEventContext.groupAddr[0] is 0x%x\n",__FUNCTION__,__LINE__,mcastEventContext.devName,mcastEventContext.groupAddr[0]);
@@ -1491,7 +1495,7 @@ static int32 rtl865x_multicastCallbackFn(void *param)
}
}
-
+ #endif
return EVENT_CONTINUE_EXECUTE;
}
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multipleWan.c b/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multipleWan.c
deleted file mode 100644
index d10e3d845..000000000
--- a/target/linux/realtek/files/drivers/net/rtl819x/l3Driver/rtl865x_multipleWan.c
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
-* Copyright c Realtek Semiconductor Corporation, 2010
-* All rights reserved.
-*
-* Program : multiple wan
-* Abstract :
-* Author : hyking (hyking_liu@realsil.com.cn)
-*/
-
-/* @doc RTL_LAYEREDDRV_API
-
- @module rtl865x_multipleWan.c - RTL865x Home gateway controller Layered driver API documentation |
- This document explains the API interface of the table driver module. Functions with rtl865x prefix
- are external functions.
- @normal Hyking Liu (Hyking_liu@realsil.com.cn) <date>
-
- Copyright <cp>2010 Realtek<tm> Semiconductor Cooperation, All Rights Reserved.
-
- @head3 List of Symbols |
- Here is a list of all functions and variables in this module.
-
- @index | RTL_LAYEREDDRV_API
-*/
-#include <linux/proc_fs.h>
-//#include <linux/seq_file.h>
-
-
-#include <net/rtl/rtl_types.h>
-#include <net/rtl/rtl_glue.h>
-#include "common/rtl_errno.h"
-#include <net/rtl/rtl865x_netif.h>
-#include "common/rtl865x_netif_local.h"
-#include "rtl865x_ppp_local.h"
-#include "rtl865x_route.h"
-#include "rtl865x_nexthop.h"
-#include <net/rtl/rtl865x_arp_api.h>
-#include "rtl865x_arp.h"
-
-#include <net/rtl/rtl865x_multipleWan_api.h>
-#include "rtl865x_multipleWan.h"
-
-#include "AsicDriver/rtl865x_asicCom.h"
-#include "AsicDriver/asicRegs.h"
-#include "AsicDriver/rtl865x_asicBasic.h"
-
-
-
-static rtl_advRoute_entry_t rtl_advRt_table[RTL_ADVRT_MAX_NUM];
-static enum ENUM_NETDEC_POLICY oldNetDecision;
-static struct proc_dir_entry *adv_rt_entry;
-extern int32 rtl865x_getAsicFun(uint32 *enable);
-
-static void rtl_show_advRoute(rtl_advRoute_entry_t *rule)
-{
- switch(rule->ruleType_)
- {
- case RTL_ADVRT_MAC:
- printk("rule type: %s\n", "MAC based");
- printk("\tether type: %x ether type mask: %x\n", rule->advrt_typeLen_, rule->advrt_typeLenMask_);
- printk("\tDMAC: %x:%x:%x:%x:%x:%x DMACM: %x:%x:%x:%x:%x:%x\n",
- rule->advrt_dstMac_.octet[0], rule->advrt_dstMac_.octet[1], rule->advrt_dstMac_.octet[2],
- rule->advrt_dstMac_.octet[3], rule->advrt_dstMac_.octet[4], rule->advrt_dstMac_.octet[5],
- rule->advrt_dstMacMask_.octet[0], rule->advrt_dstMacMask_.octet[1], rule->advrt_dstMacMask_.octet[2],
- rule->advrt_dstMacMask_.octet[3], rule->advrt_dstMacMask_.octet[4], rule->advrt_dstMacMask_.octet[5]
- );
-
- printk( "\tSMAC: %x:%x:%x:%x:%x:%x SMACM: %x:%x:%x:%x:%x:%x\n",
- rule->advrt_srcMac_.octet[0], rule->advrt_srcMac_.octet[1], rule->advrt_srcMac_.octet[2],
- rule->advrt_srcMac_.octet[3], rule->advrt_srcMac_.octet[4], rule->advrt_srcMac_.octet[5],
- rule->advrt_srcMacMask_.octet[0], rule->advrt_srcMacMask_.octet[1], rule->advrt_srcMacMask_.octet[2],
- rule->advrt_srcMacMask_.octet[3], rule->advrt_srcMacMask_.octet[4], rule->advrt_srcMacMask_.octet[5]
- );
- break;
-
- case RTL_ADVRT_IP:
- printk("rule type: %s\n", "IP");
- printk( "\tdip: %d.%d.%d.%d dipM: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsip: %d.%d.%d.%d sipM: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x ipProto: %x ipProtoM: %x ipFlag: %x ipFlagM: %x\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_ipProto_, rule->advrt_ipProtoMask_, rule->advrt_ipFlag_, rule->advrt_ipFlagMask_
- );
-
- printk("\t<FOP:%x> <FOM:%x> <http:%x> <httpM:%x> <IdentSdip:%x> <IdentSdipM:%x> \n",
- rule->advrt_ipFOP_, rule->advrt_ipFOM_, rule->advrt_ipHttpFilter_, rule->advrt_ipHttpFilterM_, rule->advrt_ipIdentSrcDstIp_,
- rule->advrt_ipIdentSrcDstIpM_
- );
- printk( "\t<DF:%x> <MF:%x>\n", rule->advrt_ipDF_, rule->advrt_ipMF_);
- break;
-
- case RTL_ADVRT_IP_RANGE:
- printk("rule type: %s \n", "IP Range");
- printk("\tdipU: %d.%d.%d.%d dipL: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsipU: %d.%d.%d.%d sipL: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x ipProto: %x ipProtoM: %x ipFlag: %x ipFlagM: %x\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_ipProto_, rule->advrt_ipProtoMask_, rule->advrt_ipFlag_, rule->advrt_ipFlagMask_
- );
- printk("\t<FOP:%x> <FOM:%x> <http:%x> <httpM:%x> <IdentSdip:%x> <IdentSdipM:%x> \n",
- rule->advrt_ipFOP_, rule->advrt_ipFOM_, rule->advrt_ipHttpFilter_, rule->advrt_ipHttpFilterM_, rule->advrt_ipIdentSrcDstIp_,
- rule->advrt_ipIdentSrcDstIpM_
- );
- printk("\t<DF:%x> <MF:%x>\n", rule->advrt_ipDF_, rule->advrt_ipMF_);
- break;
- case RTL_ADVRT_ICMP:
- printk("rule type: %s\n", "ICMP");
- printk("\tdip: %d.%d.%d.%d dipM: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsip: %d.%d.%d.%d sipM: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x type: %x typeM: %x code: %x codeM: %x\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_icmpType_, rule->advrt_icmpTypeMask_,
- rule->advrt_icmpCode_, rule->advrt_icmpCodeMask_);
- break;
- case RTL_ADVRT_ICMP_IPRANGE:
- printk("rule type: %s\n","ICMP IP RANGE");
- printk("\tdipU: %d.%d.%d.%d dipL: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsipU: %d.%d.%d.%d sipL: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x type: %x typeM: %x code: %x codeM: %x\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_icmpType_, rule->advrt_icmpTypeMask_,
- rule->advrt_icmpCode_, rule->advrt_icmpCodeMask_);
- break;
- case RTL_ADVRT_IGMP:
- printk("rule type: %s\n", "IGMP");
- printk("\tdip: %d.%d.%d.%d dipM: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsip: %d.%d.%d.%d sipM: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x type: %x typeM: %x\n", rule->advrt_tos_, rule->advrt_tosMask_,
- rule->advrt_igmpType_, rule->advrt_igmpTypeMask_
- );
- break;
-
-
- case RTL_ADVRT_IGMP_IPRANGE:
- printk(" rule type: %s\n", "IGMP IP RANGE");
- printk("\tdipU: %d.%d.%d.%d dipL: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsipU: %d.%d.%d.%d sipL: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos: %x TosM: %x type: %x typeM: %x\n", rule->advrt_tos_, rule->advrt_tosMask_,
- rule->advrt_igmpType_, rule->advrt_igmpTypeMask_
- );
- break;
-
- case RTL_ADVRT_TCP:
- printk("rule type: %s\n","TCP");
- printk("\tdip: %d.%d.%d.%d dipM: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsip: %d.%d.%d.%d sipM: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos:%x TosM:%x sportL:%d sportU:%d dportL:%d dportU:%d\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_tcpSrcPortLB_, rule->advrt_tcpSrcPortUB_,
- rule->advrt_tcpDstPortLB_, rule->advrt_tcpDstPortUB_
- );
- printk("\tflag: %x flagM: %x <URG:%x> <ACK:%x> <PSH:%x> <RST:%x> <SYN:%x> <FIN:%x>\n",
- rule->advrt_tcpFlag_, rule->advrt_tcpFlagMask_, rule->advrt_tcpURG_, rule->advrt_tcpACK_,
- rule->advrt_tcpPSH_, rule->advrt_tcpRST_, rule->advrt_tcpSYN_, rule->advrt_tcpFIN_
- );
- break;
- case RTL_ADVRT_TCP_IPRANGE:
- printk("rule type: %s\n","TCP IP RANGE");
- printk("\tdipU: %d.%d.%d.%d dipL: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsipU: %d.%d.%d.%d sipL: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos:%x TosM:%x sportL:%d sportU:%d dportL:%d dportU:%d\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_tcpSrcPortLB_, rule->advrt_tcpSrcPortUB_,
- rule->advrt_tcpDstPortLB_, rule->advrt_tcpDstPortUB_
- );
- printk("\tflag: %x flagM: %x <URG:%x> <ACK:%x> <PSH:%x> <RST:%x> <SYN:%x> <FIN:%x>\n",
- rule->advrt_tcpFlag_, rule->advrt_tcpFlagMask_, rule->advrt_tcpURG_, rule->advrt_tcpACK_,
- rule->advrt_tcpPSH_, rule->advrt_tcpRST_, rule->advrt_tcpSYN_, rule->advrt_tcpFIN_
- );
- break;
-
- case RTL_ADVRT_UDP:
- printk("rule type: %s\n","UDP");
- printk("\tdip: %d.%d.%d.%d dipM: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsip: %d.%d.%d.%d sipM: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos:%x TosM:%x sportL:%d sportU:%d dportL:%d dportU:%d\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_udpSrcPortLB_, rule->advrt_udpSrcPortUB_,
- rule->advrt_udpDstPortLB_, rule->advrt_udpDstPortUB_
- );
- break;
- case RTL_ADVRT_UDP_IPRANGE:
- printk("rule type: %s\n","UDP IP RANGE");
- printk("\tdipU: %d.%d.%d.%d dipL: %d.%d.%d.%d\n", (rule->advrt_dstIpAddr_>>24),
- ((rule->advrt_dstIpAddr_&0x00ff0000)>>16), ((rule->advrt_dstIpAddr_&0x0000ff00)>>8),
- (rule->advrt_dstIpAddr_&0xff), (rule->advrt_dstIpAddrMask_>>24), ((rule->advrt_dstIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_dstIpAddrMask_&0x0000ff00)>>8), (rule->advrt_dstIpAddrMask_&0xff)
- );
- printk("\tsipU: %d.%d.%d.%d sipL: %d.%d.%d.%d\n", (rule->advrt_srcIpAddr_>>24),
- ((rule->advrt_srcIpAddr_&0x00ff0000)>>16), ((rule->advrt_srcIpAddr_&0x0000ff00)>>8),
- (rule->advrt_srcIpAddr_&0xff), (rule->advrt_srcIpAddrMask_>>24), ((rule->advrt_srcIpAddrMask_&0x00ff0000)>>16),
- ((rule->advrt_srcIpAddrMask_&0x0000ff00)>>8), (rule->advrt_srcIpAddrMask_&0xff)
- );
- printk("\tTos:%x TosM:%x sportL:%d sportU:%d dportL:%d dportU:%d\n",
- rule->advrt_tos_, rule->advrt_tosMask_, rule->advrt_udpSrcPortLB_, rule->advrt_udpSrcPortUB_,
- rule->advrt_udpDstPortLB_, rule->advrt_udpDstPortUB_
- );
- break;
-
- default:
- printk("rule->ruleType_(0x%x)\n", rule->ruleType_);
-
- }
-
- printk("\tNexthop(%u.%u.%u.%u),extip(%u.%u.%u.%u),outif(%s),Op(%d)\n", NIPQUAD(rule->nexthop),NIPQUAD(rule->extIp),rule->outIfName,rule->pktOpApp_);
-
-}
-void rtl_show_advRt_table(void)
-{
- rtl_advRoute_entry_t *tmp_entry;
- int i;
-
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- tmp_entry = &rtl_advRt_table[i];
- if(tmp_entry->valid_)
- {
- printk("idx(%d):\n",i);
- rtl_show_advRoute(tmp_entry);
- }
-
- }
-}
-
-static int8 _rtl_same_AdvRt_rule(rtl_advRoute_entry_t *rule1, rtl_advRoute_entry_t *rule2)
-{
-
- if (rule1->ruleType_ != rule2->ruleType_)
- return FALSE;
-
- switch(rule1->ruleType_)
- {
- case RTL_ADVRT_MAC:
- if (rule1->advrt_typeLen_ != rule2->advrt_typeLen_ || rule1->advrt_typeLenMask_ != rule2->advrt_typeLenMask_)
- return FALSE;
- if (memcmp(&rule1->advrt_dstMac_, &rule2->advrt_dstMac_, sizeof(ether_addr_t)) ||
- memcmp(&rule1->advrt_dstMacMask_, &rule2->advrt_dstMacMask_, sizeof(ether_addr_t)) ||
- memcmp(&rule1->advrt_srcMac_, &rule2->advrt_srcMac_, sizeof(ether_addr_t)) ||
- memcmp(&rule1->advrt_srcMacMask_, &rule2->advrt_srcMacMask_, sizeof(ether_addr_t)) )
- return FALSE;
- return TRUE;
- case RTL_ADVRT_IP:
- case RTL_ADVRT_IP_RANGE:
- if (rule1->advrt_ipProto_ != rule2->advrt_ipProto_ || rule1->advrt_ipProtoMask_ != rule2->advrt_ipProtoMask_ ||
- rule1->advrt_ipFlag_ != rule2->advrt_ipFlag_ || rule1->advrt_ipFlagMask_ != rule2->advrt_ipFlagMask_)
- return FALSE;
- break;
-
- case RTL_ADVRT_ICMP:
- case RTL_ADVRT_ICMP_IPRANGE:
- if (rule1->advrt_icmpType_ != rule2->advrt_icmpType_ || rule1->advrt_icmpTypeMask_ != rule2->advrt_icmpTypeMask_ ||
- rule1->advrt_icmpCode_ != rule2->advrt_icmpCode_ || rule1->advrt_icmpCodeMask_ != rule2->advrt_icmpCodeMask_)
- return FALSE;
- break;
-
- case RTL_ADVRT_IGMP:
- case RTL_ADVRT_IGMP_IPRANGE:
- if(rule1->advrt_igmpType_ != rule2->advrt_igmpType_ || rule1->advrt_igmpTypeMask_ != rule2->advrt_igmpTypeMask_)
- return FALSE;
- break;
- case RTL_ADVRT_TCP:
- case RTL_ADVRT_TCP_IPRANGE:
- if(rule1->advrt_tcpFlag_ != rule2->advrt_tcpFlag_ || rule1->advrt_tcpFlagMask_ != rule2->advrt_tcpFlagMask_ ||
- rule1->advrt_tcpSrcPortUB_ != rule2->advrt_tcpSrcPortUB_ || rule1->advrt_tcpSrcPortLB_ != rule2->advrt_tcpSrcPortLB_ ||
- rule1->advrt_tcpDstPortUB_ != rule2->advrt_tcpDstPortUB_ || rule1->advrt_tcpDstPortLB_ != rule2->advrt_tcpDstPortLB_)
- return FALSE;
- break;
- case RTL_ADVRT_UDP:
- case RTL_ADVRT_UDP_IPRANGE:
- if(rule1->advrt_udpSrcPortUB_ != rule2->advrt_udpSrcPortUB_ || rule1->advrt_udpSrcPortLB_ != rule2->advrt_udpSrcPortLB_ ||
- rule1->advrt_udpDstPortUB_ != rule2->advrt_udpDstPortUB_ || rule1->advrt_udpDstPortLB_ != rule2->advrt_udpDstPortLB_)
- return FALSE;
- break;
-
- case RTL_ADVRT_SRCFILTER:
- case RTL_ADVRT_SRCFILTER_IPRANGE:
- if((rule1->advrt_srcFilterPort_ != rule2->advrt_srcFilterPort_)||
- memcmp(&rule1->advrt_srcFilterMac_, &rule2->advrt_srcFilterMac_, sizeof(ether_addr_t)) != 0||
- memcmp(&rule1->advrt_srcFilterMacMask_, &rule2->advrt_srcFilterMacMask_,sizeof(ether_addr_t)) != 0||
- (rule1->advrt_srcFilterVlanIdx_ != rule2->advrt_srcFilterVlanIdx_)||
- (rule1->advrt_srcFilterVlanIdxMask_ != rule2->advrt_srcFilterVlanIdxMask_)||
- (rule1->advrt_srcFilterIgnoreL3L4_ != rule2->advrt_srcFilterIgnoreL3L4_)||
- (rule1->advrt_srcFilterIgnoreL4_ != rule2->advrt_srcFilterIgnoreL4_))
- {
- return FALSE;
- }
-
- if(rule1->advrt_srcFilterIgnoreL4_==0 && rule1->advrt_srcFilterIgnoreL3L4_==0)
- {
- if((rule1->advrt_srcFilterPortUpperBound_ != rule2->advrt_srcFilterPortUpperBound_)||
- (rule1->advrt_srcFilterPortLowerBound_ != rule2->advrt_srcFilterPortLowerBound_))
- return FALSE;
- }
-
- if(rule1->advrt_srcFilterIgnoreL3L4_==0)
- {
- if((rule1->advrt_srcFilterIpAddr_ != rule2->advrt_srcFilterIpAddr_)||
- (rule2->advrt_srcFilterIpAddrMask_ != rule2->advrt_srcFilterIpAddrMask_))
- return FALSE;
- }
-
- break;
-
- case RTL_ADVRT_DSTFILTER:
- case RTL_ADVRT_DSTFILTER_IPRANGE:
- if( memcmp(&rule1->advrt_dstFilterMac_, &rule2->advrt_dstFilterMac_, sizeof(ether_addr_t)) != 0||
- memcmp(&rule1->advrt_dstFilterMacMask_, &rule2->advrt_dstFilterMacMask_,sizeof(ether_addr_t)) != 0||
- (rule1->advrt_dstFilterVlanIdx_ != rule2->advrt_dstFilterVlanIdx_)||
- (rule1->advrt_dstFilterVlanIdxMask_ != rule2->advrt_dstFilterVlanIdxMask_)||
- (rule1->advrt_dstFilterIgnoreL3L4_ != rule2->advrt_dstFilterIgnoreL3L4_)||
- (rule1->advrt_dstFilterIgnoreL4_ != rule2->advrt_dstFilterIgnoreL4_))
- {
- return FALSE;
- }
-
- if(rule1->advrt_dstFilterIgnoreL4_==0 && rule1->advrt_dstFilterIgnoreL4_==0)
- {
- if((rule1->advrt_dstFilterPortUpperBound_ != rule2->advrt_dstFilterPortUpperBound_)||
- (rule1->advrt_dstFilterPortLowerBound_ != rule2->advrt_dstFilterPortLowerBound_))
- return FALSE;
- }
-
- if(rule1->advrt_dstFilterIgnoreL3L4_==0)
- {
- if((rule1->advrt_dstFilterIpAddr_ != rule2->advrt_dstFilterIpAddr_)||
- (rule2->advrt_dstFilterIpAddrMask_ != rule2->advrt_dstFilterIpAddrMask_))
- return FALSE;
- }
-
- break;
- default: return FALSE; /* Unknown rule type */
-
- }
- /* Compare common part */
- if (rule1->advrt_srcIpAddr_ != rule2->advrt_srcIpAddr_ || rule1->advrt_srcIpAddrMask_ != rule2->advrt_srcIpAddrMask_ ||
- rule1->advrt_dstIpAddr_ != rule2->advrt_dstIpAddr_ || rule1->advrt_dstIpAddrMask_ != rule2->advrt_dstIpAddrMask_ ||
- rule1->advrt_tos_ != rule2->advrt_tos_ || rule1->advrt_tosMask_ != rule2->advrt_tosMask_ )
- return FALSE;
- return TRUE;
-}
-
-static int _rtl_advRt_to_acl(rtl_advRoute_entry_t *advRt, rtl865x_AclRule_t *acl)
-{
- if(NULL == advRt || NULL == acl)
- return RTL_EINVALIDINPUT;
-
- switch(advRt->ruleType_)
- {
- case RTL_ADVRT_IP:
- case RTL_ADVRT_IP_RANGE:
- memcpy(&acl->un_ty,&advRt->un_ty,sizeof(advRt->un_ty));
- acl->pktOpApp_ = advRt->pktOpApp_;
-
- if(advRt->ruleType_ == RTL_ADVRT_IP)
- acl->ruleType_ = RTL865X_ACL_IP;
- else
- acl->ruleType_ = RTL865X_ACL_IP_RANGE;
-
- break;
- default:
- printk("ruletype(0x%x) is NOT support now!\n",advRt->ruleType_);
- }
-
- return SUCCESS;
-}
-
-static int _rtl_advRt_fullMatch_with_route(rtl_advRoute_entry_t *entry)
-{
- int retval = FAILED;
- rtl865x_netif_local_t *dstNetif;
- rtl865x_route_t rt;
-
- memset(&rt,0,sizeof(rtl865x_route_t));
-
- retval = rtl865x_getRouteEntry(entry->nexthop,&rt);
- if(SUCCESS == retval)
- {
- dstNetif = _rtl865x_getNetifByName(entry->outIfName);
- if(rt.dstNetif == dstNetif)
- return SUCCESS;
- }
-
- return FAILED;
-}
-
-static int _rtl_flush_multiWan_redirectACL(void)
-{
- rtl_advRoute_entry_t *entry;
- rtl865x_netif_local_t *netif;
- int nexthopIdx;
- int i;
-
- /*delete nexthop entry which used for redirectacl*/
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- entry = &rtl_advRt_table[i];
- if(entry->valid_)
- {
- if(SUCCESS == _rtl_advRt_fullMatch_with_route(entry))
- continue;
-
- netif = _rtl865x_getSWNetifByName(entry->outIfName);
- if(NULL == netif)
- {
- printk("====%s(%d),netif(%s) is NULL\n",__FUNCTION__,__LINE__,entry->outIfName);
- continue;
- }
-
- nexthopIdx = rtl865x_getNxtHopIdx(NEXTHOP_DEFREDIRECT_ACL,netif,entry->nexthop);
- if(nexthopIdx == -1)
- {
- printk("====%s(%d),get nxthop error, nxthop(%u.%u.%u.%u)!!\n",__FUNCTION__,__LINE__,NIPQUAD(entry->nexthop));
- continue;
- }
-
- rtl865x_delNxtHop(NEXTHOP_DEFREDIRECT_ACL,nexthopIdx);
- }
- }
-
- /*delete all acl rule*/
- rtl865x_flush_allAcl_fromChain(RTL_DRV_LAN_NETIF_NAME,RTL865X_ACL_MULTIWAN_USED,RTL865X_ACL_INGRESS);
-
- return SUCCESS;
-}
-
-static int _rtl_rearrange_multiWan_redirectACL(void)
-{
- rtl865x_AclRule_t acl_entry;
- rtl_advRoute_entry_t *entry;
- rtl865x_netif_local_t *netif;
- int nexthopIdx;
- int i,ret;
- rtl865x_arpMapping_entry_t arp;
-
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- entry = &rtl_advRt_table[i];
- if(entry->valid_)
- {
- if(SUCCESS == _rtl_advRt_fullMatch_with_route(entry))
- continue;
-
- netif = _rtl865x_getSWNetifByName(entry->outIfName);
- if(NULL == netif)
- {
- printk("====%s(%d),netif(%s) is NULL\n",__FUNCTION__,__LINE__,entry->outIfName);
- continue;
- }
-
- /*add nexthop entry*/
- rtl865x_addNxtHop(NEXTHOP_DEFREDIRECT_ACL,NULL,netif,entry->nexthop,entry->extIp);
- nexthopIdx = rtl865x_getNxtHopIdx(NEXTHOP_DEFREDIRECT_ACL,netif,entry->nexthop);
- if(nexthopIdx == -1)
- {
- printk("====%s(%d),get nxthop error, nxthop(%u.%u.%u.%u)!!\n",__FUNCTION__,__LINE__,NIPQUAD(entry->nexthop));
- continue;
- }
-
- //add acl
- memset(&acl_entry,0,sizeof(rtl865x_AclRule_t));
- _rtl_advRt_to_acl(entry,&acl_entry);
-
- acl_entry.actionType_ = RTL865X_ACL_DEFAULT_REDIRECT;
- acl_entry.nexthopIdx_ = nexthopIdx;
-
- ret = rtl865x_add_acl(&acl_entry,RTL_DRV_LAN_NETIF_NAME,RTL865X_ACL_MULTIWAN_USED);
- if(SUCCESS != ret)
- {
- rtl865x_delNxtHop(NEXTHOP_DEFREDIRECT_ACL,nexthopIdx);
- continue;
- }
-
- /*callback function for sync arp/l2*/
- memset(&arp,0,sizeof(rtl865x_arpMapping_entry_t));
- ret = rtl865x_get_ps_arpMapping(entry->nexthop,&arp);
- if(SUCCESS == ret)
- {
- rtl865x_eventHandle_addArp_for_multiWan(&arp);
- }
-
-
- }
- }
-
- return SUCCESS;
-}
-
-#if 0
-static int _rtl_get_advRt_num(void)
-{
- int cnt = 0;
- int i = 0;
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- if(rtl_advRt_table[i].valid_)
- {
- cnt++;
- }
- }
-
- return cnt;
-}
-#endif
-
-static int32 adv_rt_read( char *page, char **start, off_t off, int count, int *eof, void *data )
-{
- int len = 0;
- rtl_show_advRt_table();
- return len;
-}
-
-static int32 adv_rt_write( struct file *filp, const char *buff,unsigned long len, void *data )
-{
- char tmpbuf[128];
- char cmd[8];
- char outif_name[16];
- char netif_name[MAX_IFNAMESIZE];
- int srcip_start[4];
- int srcip_end[4];
- int dst_start[4];
- int dst_end[4];
- int ext_ip[4];
- int nexthop_ip[4];
- int num = 0;
- int retval = 0;
- rtl_advRoute_entry_t rule;
-
- if (buff && !copy_from_user(tmpbuf, buff, len))
- {
- tmpbuf[len -1] = '\0';
- num= sscanf(tmpbuf, "%s %d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d %s", cmd,
- &srcip_start[0], &srcip_start[1], &srcip_start[2], &srcip_start[3],
- &srcip_end[0], &srcip_end[1], &srcip_end[2], &srcip_end[3],
- &dst_start[0], &dst_start[1], &dst_start[2], &dst_start[3],
- &dst_end[0], &dst_end[1], &dst_end[2], &dst_end[3],
- &ext_ip[0], &ext_ip[1], &ext_ip[2], &ext_ip[3],
- &nexthop_ip[0], &nexthop_ip[1], &nexthop_ip[2], &nexthop_ip[3],
- outif_name);
-
- if (num != 26)
- return -EFAULT;
-
- if(strlen(outif_name) >= 15)
- return -EFAULT;
-
-
- retval = rtl865x_get_drvNetifName_by_psName(outif_name,netif_name);
- if(retval != SUCCESS)
- return -EFAULT;
-
- memset(&rule,0,sizeof(rtl_advRoute_entry_t));
- rule.extIp = (ext_ip[0]<<24)|(ext_ip[1]<<16)|(ext_ip[2]<<8)|(ext_ip[3]<<0);
- rule.nexthop = (nexthop_ip[0]<<24)|(nexthop_ip[1]<<16)|(nexthop_ip[2]<<8)|(nexthop_ip[3]<<0);
- rule.pktOpApp_ = 6;
- memcpy(rule.outIfName,netif_name,strlen(netif_name));
- rule.outIfName[strlen(netif_name)+1] ='\0';
-
- rule.ruleType_ = RTL_ADVRT_IP_RANGE;
- rule.valid_ = 1;
-
- rule.advrt_srcIpAddrStart_ = (srcip_start[0]<<24)|(srcip_start[1]<<16)|(srcip_start[2]<<8)|(srcip_start[3]<<0);
- rule.advrt_srcIpAddrEnd_ = (srcip_end[0]<<24)|(srcip_end[1]<<16)|(srcip_end[2]<<8)|(srcip_end[3]<<0);
- rule.advrt_dstIpAddrStart_ = (dst_start[0]<<24)|(dst_start[1]<<16)|(dst_start[2]<<8)|(dst_start[3]<<0);
- rule.advrt_dstIpAddrEnd_ = (dst_end[0]<<24)|(dst_end[1]<<16)|(dst_end[2]<<8)|(dst_end[3]<<0);
-
-
- if((strcmp(cmd, "add")==0) || (strcmp(cmd, "ADD")==0))
- {
- rtl_add_advRt_entry(&rule);
- }
- else if((strcmp(cmd, "del")==0) || (strcmp(cmd, "DEL")==0))
- {
- rtl_del_advRt_entry(&rule);
- }
-
- }
- return len;
-}
-
-int rtl_exit_advRt(void)
-{
- _rtl_flush_multiWan_redirectACL();
- /*unregist the acl chain*/
- rtl865x_unRegist_aclChain(RTL_DRV_LAN_NETIF_NAME,RTL865X_ACL_MULTIWAN_USED,RTL865X_ACL_INGRESS);
- memset(rtl_advRt_table,0,RTL_ADVRT_MAX_NUM*sizeof(rtl_advRoute_entry_t));
- /*switch back old netdecision policy*/
- rtl865xC_setNetDecisionPolicy(oldNetDecision);
- if(adv_rt_entry)
- {
- remove_proc_entry("adv_rt",NULL);
- adv_rt_entry = NULL;
- }
- return SUCCESS;
-}
-
-int rtl_init_advRt(void)
-{
-#if 1
- uint32 enable;
- rtl865x_getAsicFun(&enable);
-
- if(!(enable & ALL_NAT))
- return FAILED;
-#endif
-
- adv_rt_entry = create_proc_entry("adv_rt", 0, NULL);
- if(adv_rt_entry)
- {
- adv_rt_entry->read_proc = adv_rt_read;
- adv_rt_entry->write_proc = adv_rt_write;
-
- }
- memset(rtl_advRt_table,0,RTL_ADVRT_MAX_NUM*sizeof(rtl_advRoute_entry_t));
- rtl865x_regist_aclChain(RTL_DRV_LAN_NETIF_NAME,RTL865X_ACL_MULTIWAN_USED,RTL865X_ACL_INGRESS);
- //switch to mac based
- rtl865xC_getNetDecisionPolicy(&oldNetDecision);
- rtl865xC_setNetDecisionPolicy(NETIF_MAC_BASED );
- rtl865x_setDefACLForNetDecisionMiss(RTL865X_ACLTBL_PERMIT_ALL,RTL865X_ACLTBL_PERMIT_ALL,RTL865X_ACLTBL_PERMIT_ALL,RTL865X_ACLTBL_PERMIT_ALL);
- return SUCCESS;
-}
-
-rtl_advRoute_entry_t* rtl_get_advRt_entry_by_nexthop(ipaddr_t nexthop)
-{
- int i;
- rtl_advRoute_entry_t *tmp_entry;
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- tmp_entry = &rtl_advRt_table[i];
- if(tmp_entry->valid_)
- {
- if(tmp_entry->nexthop == nexthop)
- return tmp_entry;
- }
- }
- return NULL;
-}
-
-int rtl_add_advRt_entry(rtl_advRoute_entry_t *entry)
-{
- int i;
- rtl_advRoute_entry_t *tmp_entry,*ready_entry;
- if(NULL == entry)
- return RTL_EINVALIDINPUT;
-
- ready_entry = NULL;
-
- /*duplicate check & try to find a usable entry*/
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- tmp_entry = &rtl_advRt_table[i];
- if(tmp_entry->valid_)
- {
- if(_rtl_same_AdvRt_rule(entry,tmp_entry))
- return RTL_EENTRYALREADYEXIST;
- }
- else
- {
- if(NULL==ready_entry)
- ready_entry = &rtl_advRt_table[i];
- }
- }
-
- if(NULL == ready_entry)
- return RTL_ENOFREEBUFFER;
-
- /*flush acl firstly*/
- _rtl_flush_multiWan_redirectACL();
-
- /*add entry*/
- memcpy(ready_entry,entry,sizeof(rtl_advRoute_entry_t));
- ready_entry->valid_ = 1;
-
- _rtl_rearrange_multiWan_redirectACL();
-
- return SUCCESS;
-}
-
-int rtl_del_advRt_entry(rtl_advRoute_entry_t *entry)
-{
- int i;
- rtl_advRoute_entry_t *tmp_entry;
- if(NULL == entry)
- return RTL_EINVALIDINPUT;
-
- for(i = 0; i < RTL_ADVRT_MAX_NUM; i++)
- {
- tmp_entry = &rtl_advRt_table[i];
- if(tmp_entry->valid_)
- {
- if(_rtl_same_AdvRt_rule(entry,tmp_entry))
- break;
- }
- }
-
- if(RTL_ADVRT_MAX_NUM == i)
- return RTL_EENTRYNOTFOUND;
-
- /*flush acl firstly*/
- _rtl_flush_multiWan_redirectACL();
-
- /*delete entry*/
- memset(tmp_entry,0,sizeof(rtl_advRoute_entry_t));
-
- /*rearrange for redirect acl*/
- _rtl_rearrange_multiWan_redirectACL();
- return SUCCESS;
-}
-
-int rtl_enable_advRt_by_netifName(const char *name)
-{
- int i;
- _rtl_flush_multiWan_redirectACL();
- for(i = 0;i < RTL_ADVRT_MAX_NUM;i++)
- {
- if(strcmp(rtl_advRt_table[i].outIfName,name) == 0)
- rtl_advRt_table[i].valid_ = 1;
- }
- _rtl_rearrange_multiWan_redirectACL();
-
- return SUCCESS;
-}
-int rtl_disable_advRt_by_netifName(const char *name)
-{
- int i;
- _rtl_flush_multiWan_redirectACL();
- for(i = 0;i < RTL_ADVRT_MAX_NUM;i++)
- {
- if(strcmp(rtl_advRt_table[i].outIfName,name) == 0)
- rtl_advRt_table[i].valid_ = 0;
- }
- _rtl_rearrange_multiWan_redirectACL();
-
- return SUCCESS;
-}
-
-