summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/drivers/net/rtl819x/l2Driver
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/realtek/files/drivers/net/rtl819x/l2Driver')
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l2Driver/Makefile6
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.c352
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.h8
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_outputQueue.c25
-rw-r--r--target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_stp.c22
5 files changed, 292 insertions, 121 deletions
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/Makefile b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/Makefile
index a9702aaf5..92f43547f 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/Makefile
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/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_fdb.o = -mips16
@@ -21,7 +21,9 @@ endif
obj-y += rtl865x_outputQueue.o
endif
endif
-
+ ifdef CONFIG_RTL_HW_QOS_SUPPORT
+ obj-y += rtl865x_hw_qos_config.o
+ endif
ifeq ($(CONFIG_RTL_STP),y)
obj-y += rtl865x_stp.o
endif
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.c b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.c
index 264dcc06e..ae56f396d 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.c
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.c
@@ -1,17 +1,12 @@
-/* @doc RTL_LAYEREDDRV_API
-
- @module rtl865x_fdb.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 (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.
+ */
- 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
-*/
#include <linux/config.h>
#include <linux/module.h>
@@ -38,8 +33,18 @@
#include "rtl865x_fdb.h"
#include "common/rtl_errno.h"
+
+
#if defined(CONFIG_RTL865X_LANPORT_RESTRICTION)
lan_restrict_info lan_restrict_tbl[LAN_RESTRICT_PORT_NUMBER];
+int lan_restrict_tble_reset_port(int port)
+{
+ #if 0 //disable by jwj
+ lan_restrict_tbl[port].curr_num = 0;
+ #endif
+ return SUCCESS;
+}
+
#endif
struct rtl865x_L2Tables sw_FDB_Table;
@@ -255,6 +260,24 @@ int32 rtl_get_hw_fdb_age(uint32 fid,ether_addr_t *mac, uint32 flags)
return retval;
}
+int32 rtl865x_getPortNum(const unsigned char *addr){
+ ether_addr_t *macAddr;
+ int32 column;
+ rtl865x_tblAsicDrv_l2Param_t fdbEntry;
+ int8 port_num = -1;
+ //fdb->ageing_timer = 300*HZ;
+ macAddr = (ether_addr_t *)(addr);
+
+ if (rtl865x_Lookup_fdb_entry(RTL_LAN_FID, macAddr, FDB_DYNAMIC, &column,&fdbEntry) == SUCCESS)
+ {
+ /*find the fdb entry*/
+ port_num = rtl865x_ConvertPortMasktoPortNum(fdbEntry.memberPortMask);
+ } else {
+ /*can't find */
+ }
+ return port_num;
+}
+
int32 rtl865x_Lookup_fdb_entry(uint32 fid, ether_addr_t *mac, uint32 flags, uint32 *col_num, rtl865x_tblAsicDrv_l2Param_t *L2buff)
{
uint32 rowIdx;
@@ -387,7 +410,14 @@ int32 _rtl865x_removeFilterDatabaseEntry(uint16 fid, ether_addr_t * mac, uint32
{
rtl865x_filterDbTable_t *fdb_t = &sw_FDB_Table.filterDB[fid];
rtl865x_filterDbTableEntry_t * l2entry_t ;
-
+ /*printk("rowIdx:%dfid:%d\n",rowIdx,fid);*/
+ /*printk("\n mac address is %x %x %x %x %x %x\n", mac->octet[0],
+ mac->octet[1],
+ mac->octet[2],
+ mac->octet[3],
+ mac->octet[4],
+ mac->octet[5]);
+ */
if (SLIST_FIRST(&(fdb_t->database[rowIdx])))
{
SLIST_FOREACH(l2entry_t, &(fdb_t->database[rowIdx]), nextFDB)
@@ -707,7 +737,7 @@ int32 _rtl865x_addFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_t *
/* if (typeII == RTL8651_L2TBL_COLUMN && l2Type == RTL8651_L2_TYPEII)
return RTL_NOFREEBUFFER;
*/
- rtl865x_raiseEvent(EVENT_ADD_FDB, (void *)(l2entry_t));
+ //rtl865x_raiseEvent(EVENT_ADD_FDB, (void *)(l2entry_t));
return SUCCESS;
}
@@ -748,7 +778,7 @@ int32 _rtl865x_delFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_t *
rtl865x_filterDbTableEntry_t * l2entry_t = NULL;
rtl865x_filterDbTable_t *fdb_t = &sw_FDB_Table.filterDB[fid];
int32 found = FALSE;
-
+ //printk("[%s][%d].\n", __FUNCTION__, __LINE__);
rowIdx = rtl8651_filterDbIndex(macAddr, fid);
L2buff = &L2temp;
@@ -794,7 +824,7 @@ int32 _rtl865x_delFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_t *
nextFDB
);
SLIST_INSERT_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, l2entry_t, nextFDB);
-
+
rtl865x_raiseEvent(EVENT_DEL_FDB, (void *)(l2entry_t));
}
break;
@@ -812,7 +842,7 @@ int32 rtl865x_arrangeFdbEntry(const unsigned char *timeout_addr, int32 *port)
rtl865x_tblAsicDrv_l2Param_t fdbEntry;
rtl865x_filterDbTableEntry_t l2temp_entry;
int32 rowIdx;
-
+
macAddr = (ether_addr_t *)(timeout_addr);
rowIdx = rtl8651_filterDbIndex(macAddr, RTL_LAN_FID);
found = rtl865x_Lookup_fdb_entry(RTL_LAN_FID, macAddr, FDB_DYNAMIC, &column, &fdbEntry);
@@ -922,14 +952,14 @@ int32 rtl865x_addFDBEntry(const unsigned char *addr)
if (addr == NULL)
return RTL_EINVALIDINPUT;
-
+ //printk("[%s][%d].\n", __FUNCTION__, __LINE__);
macAddr = (ether_addr_t *)(addr);
found = rtl865x_Lookup_fdb_entry(RTL_LAN_FID, macAddr, FDB_DYNAMIC, &column, &fdbEntry);
if (found == SUCCESS )
{
port_num = rtl865x_ConvertPortMasktoPortNum(fdbEntry.memberPortMask);
-
-/* printk("\nbefore rtl865x_lookup_FilterDatabaseEntry, port is %d\n", port_num); */
+ //printk("[%s][%d].\n", __FUNCTION__, __LINE__);
+ //printk("\nbefore rtl865x_lookup_FilterDatabaseEntry, port is %d\n", port_num);
if (rtl865x_lookup_FilterDatabaseEntry(fdbEntry.fid, macAddr, &l2temp_entry) != SUCCESS)
{
l2temp_entry.l2type = (fdbEntry.nhFlag==0)?RTL865x_L2_TYPEI: RTL865x_L2_TYPEII;
@@ -949,6 +979,7 @@ int32 rtl865x_addFDBEntry(const unsigned char *addr)
}
else
{
+ //printk("[%s][%d].\n", __FUNCTION__, __LINE__);
/*add */
}
return ret;
@@ -966,7 +997,7 @@ int32 rtl865x_delLanFDBEntry(uint16 l2Type, const unsigned char *addr)
}
macAddr = (ether_addr_t *)(addr);
- ret =_rtl865x_delFilterDatabaseEntry( l2Type, RTL_LAN_FID, macAddr);
+ ret =_rtl865x_delFilterDatabaseEntry(l2Type, RTL_LAN_FID, macAddr);
return ret;
}
@@ -974,7 +1005,7 @@ int32 rtl865x_delLanFDBEntry(uint16 l2Type, const unsigned char *addr)
int32 rtl865x_ConvertPortMasktoPortNum(int32 portmask)
{
int32 i = 0;
-
+
for (i = PHY0; i < EXT3; i++)
{
if(((portmask >> i) & 0x01) == 1)
@@ -986,6 +1017,8 @@ int32 rtl865x_ConvertPortMasktoPortNum(int32 portmask)
}
#if defined(CONFIG_RTL865X_LANPORT_RESTRICTION)
+extern int rtl_delFdbByMac(const unsigned char *macAddr, const char* devName);
+char *rtl_getDevNameByPort(int32 port_num);
int32 rtl_check_fdb_entry_check_exist(uint32 fid, ether_addr_t *mac, uint32 flags)
{
uint32 rowIdx;
@@ -1045,13 +1078,11 @@ int32 lanrestrict_callbackFn_for_add_fdb(void *param)
}
fdbEntry=(rtl865x_filterDbTableEntry_t *)param;
-
port_num = rtl865x_ConvertPortMasktoPortNum(fdbEntry->memberPortMask);
if (lan_restrict_tbl[port_num].enable == TRUE)
{
-/* printk("\nadd authed port[%d], num:%d\n", port_num, lan_restrict_tbl[port_num].curr_num);*/
- lan_restrict_tbl[port_num].curr_num ++;
+ lan_restrict_tbl[port_num].curr_num ++;
}
return SUCCESS;
@@ -1068,16 +1099,15 @@ int32 lanrestrict_callbackFn_for_del_fdb(void *param)
}
fdbEntry=(rtl865x_filterDbTableEntry_t *)param;
-
port_num = rtl865x_ConvertPortMasktoPortNum(fdbEntry->memberPortMask);
if (lan_restrict_tbl[port_num].enable == TRUE)
{
-/* printk("\ndel authed port[%d], num:%d\n", port_num, lan_restrict_tbl[port_num].curr_num);*/
lan_restrict_tbl[port_num].curr_num --;
if (lan_restrict_tbl[port_num].curr_num < 0)
{
lan_restrict_tbl[port_num].curr_num = 0;
}
+ /*printk("\ndel authed port[%d], num:%d\n", port_num, lan_restrict_tbl[port_num].curr_num);*/
}
return SUCCESS;
}
@@ -1119,17 +1149,54 @@ static int32 lanrestrict_authadd_register_event(void)
eventParam.eventPriority=0;
eventParam.event_action_fn=lanrestrict_callbackFn_for_add_fdb;
rtl865x_registerEvent(&eventParam);
+
+ #if 0
+ if (rtl865x_registerEvent(&eventParam)== SUCCESS)
+ {
+ printk("register Event SUCCESS:%x\n",EVENT_ADD_AUTHED_FDB);
+ return SUCCESS;
+ }
+ else if(rtl865x_registerEvent(&eventParam)== RTL_EENTRYALREADYEXIST)
+ {
+ printk("the Event already exist\n");
+ return SUCCESS;
+ }
+ else
+ {
+ printk("register Event FAILED:%d \n",rtl865x_registerEvent(&eventParam));
+ return FAILED;
+ }
+ #endif
return SUCCESS;
}
static int32 lanrestrict_authdel_register_event(void)
{
+
rtl865x_event_Param_t eventParam;
eventParam.eventLayerId=DEFAULT_LAYER2_EVENT_LIST_ID;
eventParam.eventId=EVENT_DEL_AUTHED_FDB;
eventParam.eventPriority=0;
eventParam.event_action_fn=lanrestrict_callbackFn_for_del_fdb;
rtl865x_registerEvent(&eventParam);
+
+ #if 0
+ if (rtl865x_registerEvent(&eventParam)== SUCCESS)
+ {
+ printk("register Event SUCCESS:%x\n",EVENT_DEL_AUTHED_FDB);
+ return SUCCESS;
+ }
+ else if(rtl865x_registerEvent(&eventParam)== RTL_EENTRYALREADYEXIST)
+ {
+ printk("the Event already exist\n");
+ return SUCCESS;
+ }
+ else
+ {
+ printk("register Event FAILED:%d \n",rtl865x_registerEvent(&eventParam));
+ return FAILED;
+ }
+ #endif
return SUCCESS;
}
@@ -1159,6 +1226,7 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
int32 retval = 0;
int32 overwite_blk_flag = FALSE;
+ //printk("auth:%d,srcblk:%d\n",auth,SrcBlk);
L2buff = &l2entry_tmp;
memset(L2buff,0,sizeof(rtl865x_tblAsicDrv_l2Param_t));
rowIdx = rtl8651_filterDbIndex(macAddr, fid);
@@ -1179,6 +1247,7 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
overwite_blk_flag = TRUE;
}
found = TRUE;
+
col_tmp = colIdx;
}
else
@@ -1186,6 +1255,7 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
{
found = FALSE;
flag = TRUE;
+
}
break;
}
@@ -1199,11 +1269,12 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
else
{
/*there is still empty l2 asic entry*/
+
flag = TRUE;
break;
}
}
-
+ /*printk("found:%d,overwite_blk_flag:%d",found, overwite_blk_flag);*/
switch(l2Type) {
case RTL865x_L2_TYPEI:
nexthp_flag = FALSE;isStatic = FALSE;
@@ -1232,16 +1303,16 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
break;
default: assert(0);
}
-
+
if (found == FALSE)
{
/*no empty entry, overwrite the biggest aging time asic l2 entry*/
if(flag == FALSE)
{
/*delete the biggest aging time software entry*/
- rtl8651_getAsicL2Table(rowIdx, col_num, L2buff);
+ rtl8651_getAsicL2Table(rowIdx, col_num, L2buff);
+
_rtl865x_removeFilterDatabaseEntry(fid, &(L2buff->macAddr), rowIdx);
-
/*overwrite asic entry*/
rtl8651_setAsicL2Table_Patch(
rowIdx,
@@ -1260,6 +1331,7 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
/*portmask is different , so it should overwrite the original asic entry. Or there is empty entry, set it to asic*/
else if(flag == TRUE)
{
+
rtl8651_setAsicL2Table_Patch(
rowIdx,
colIdx,
@@ -1278,6 +1350,7 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
/*find the same asic entry, should update the aging time*/
else
{
+
rtl8651_setAsicL2Table_Patch(
rowIdx,
col_tmp,
@@ -1317,8 +1390,10 @@ int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr
*/
if (SLIST_FIRST(&sw_FDB_Table.freefdbList.filterDBentry) == NULL)
+ {
+
return RTL_ENOFREEBUFFER;
-
+ }
/*config the SW l2 entry */
l2entry_t = SLIST_FIRST(&sw_FDB_Table.freefdbList.filterDBentry);
SLIST_REMOVE_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, nextFDB);
@@ -1371,18 +1446,19 @@ check_swfdb:
tmpL2->SrcBlk = SrcBlk;
tmpL2->memberPortMask = portMask;
tmpL2->l2type = l2Type;
-/* tmpL2 ->refCount = 0;*/
+ /*tmpL2 ->refCount = 0;*/
break;
}
else
{
- goto out;
+ return SUCCESS;
+ //goto out; appear errorr:label used but not defined
}
}
/*try to check whether there is timeout sw fdb entry*/
else if(tmpL2->asicPos == col_tmp)
{
-/* if ((tmpL2->SrcBlk == TRUE) && (tmpL2->auth == FALSE))*/
+ /* if ((tmpL2->SrcBlk == TRUE) && (tmpL2->auth == FALSE))*/
{
_rtl865x_removeFilterDatabaseEntry(fid, &(tmpL2->macAddr), rowIdx);
goto check_swfdb;
@@ -1400,6 +1476,7 @@ check_swfdb:
else
{
/* l2entry_t ->refCount = 0;*/
+
SLIST_INSERT_HEAD(&(fdb_t->database[rowIdx]), l2entry_t, nextFDB);
}
@@ -1407,21 +1484,19 @@ check_swfdb:
/* if (typeII == RTL8651_L2TBL_COLUMN && l2Type == RTL8651_L2_TYPEII)
return RTL_NOFREEBUFFER;
*/
- if (!((l2entry_t->SrcBlk == TRUE) && (l2entry_t->auth == FALSE)))
- {
- rtl865x_raiseEvent(EVENT_ADD_FDB, (void *)(l2entry_t));
- }
if (overwite_blk_flag != TRUE)
{
+ /*Add a new entry*/
rtl865x_raiseEvent(EVENT_ADD_AUTHED_FDB, (void *)(l2entry_t));
}
else
{
-/* printk("\nover blk entry, no raise event\n");*/
+
+ /*printk("\nover blk entry, no raise event\n");*/
}
-
-out:
+
+//out:
return SUCCESS;
}
@@ -1505,7 +1580,8 @@ int32 _rtl865x_addAuthSWl2Entry(uint16 l2Type, uint16 fid, ether_addr_t * macAd
else
{
SLIST_INSERT_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, l2entry_t, nextFDB);
- goto out;
+ //goto out;
+ return SUCCESS;
}
}
@@ -1529,19 +1605,17 @@ int32 _rtl865x_addAuthSWl2Entry(uint16 l2Type, uint16 fid, ether_addr_t * macAd
return RTL_NOFREEBUFFER;
*/
- rtl865x_raiseEvent(EVENT_ADD_FDB, (void *)(l2entry_t));
-
-
if (overwite_blk_flag != TRUE)
{
+ //printk("\nauth:,srcblk:\n",auth,SrcBlk);
rtl865x_raiseEvent(EVENT_ADD_AUTHED_FDB, (void *)(l2entry_t));
}
else
{
-/* printk("\nover blk entry, no raise event\n");*/
+ /*printk("\nNO need to add currnum,over blk entry, no raise event\n");*/
}
-out:
+//out:
return SUCCESS;
}
@@ -1614,15 +1688,30 @@ int32 _rtl865x_delAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_
rtl865x_filterDbTableEntry_t * l2entry_t = NULL;
rtl865x_filterDbTable_t *fdb_t = &sw_FDB_Table.filterDB[fid];
int32 found = FALSE;
-
+
rowIdx = rtl8651_filterDbIndex(macAddr, fid);
-
+ /*print message
+ printk("rowIdx%d:\n",rowIdx);
+ printk("fid%d:\n",fid);
+ printk("\n the mac address is %x %x %x %x %x %x\n", macAddr->octet[0],
+ macAddr->octet[1],
+ macAddr->octet[2],
+ macAddr->octet[3],
+ macAddr->octet[4],
+ macAddr->octet[5]);*/
L2buff = &L2temp;
memset(L2buff, 0 , sizeof (rtl865x_tblAsicDrv_l2Param_t));
for(colIdx=0; colIdx<RTL8651_L2TBL_COLUMN; colIdx++)
{
if ((rtl8651_getAsicL2Table(rowIdx, colIdx, L2buff))==SUCCESS)
{
+ /*printk("\n mac address is %x %x %x %x %x %x\n", L2buff->macAddr.octet[0],
+ L2buff->macAddr.octet[1],
+ L2buff->macAddr.octet[2],
+ L2buff->macAddr.octet[3],
+ L2buff->macAddr.octet[4],
+ L2buff->macAddr.octet[5]);*/
+
/*check whether mac address has been learned to SW or not*/
if (memcmp(&(L2buff->macAddr), macAddr, 6)== 0)
{
@@ -1632,32 +1721,74 @@ int32 _rtl865x_delAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_
}
}
}
-
- SLIST_FOREACH(l2entry_t, &(fdb_t->database[rowIdx]), nextFDB)
+
+ SLIST_FOREACH(l2entry_t, &(fdb_t->database[rowIdx]), nextFDB)
+ {
+
if (!memcmp(&l2entry_t->macAddr, macAddr, sizeof(ether_addr_t)))
{
-/* l2entry_t->refCount -= 1;*/
-/* if (l2entry_t->refCount == 0)*/
+ /* l2entry_t->refCount -= 1;*/
+ /* if (l2entry_t->refCount == 0)*/
+
+ SLIST_REMOVE(
+ &(fdb_t->database[rowIdx]),
+ l2entry_t,
+ rtl865x_filterDbTableEntry_s,
+ nextFDB
+ );
+ SLIST_INSERT_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, l2entry_t, nextFDB);
+ if (found == TRUE)
{
- SLIST_REMOVE(
- &(fdb_t->database[rowIdx]),
- l2entry_t,
- rtl865x_filterDbTableEntry_s,
- nextFDB
- );
- SLIST_INSERT_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, l2entry_t, nextFDB);
- if (found == TRUE)
- {
- rtl8651_delAsicL2Table(rowIdx, colIdx);
- }
- rtl865x_raiseEvent(EVENT_DEL_FDB, (void *)(l2entry_t));
-/* printk("raise event EVENT_DEL_AUTHED_FDB : %x", l2entry_t->memberPortMask);*/
- rtl865x_raiseEvent(EVENT_DEL_AUTHED_FDB, (void *)(l2entry_t));
+ rtl8651_delAsicL2Table(rowIdx, colIdx);
+ }
+ /*printk("l2entry_t->srcblk:%d,l2entry_t->auth:%d\n", l2entry_t->SrcBlk,l2entry_t->auth);*/
+ if ((l2entry_t->SrcBlk == FALSE) && (l2entry_t->auth == TRUE))
+ {
+ uint32 memberPortMask_t;
+ memberPortMask_t=l2entry_t->memberPortMask;
+
+ /*after del an auth fdb, consider add an auth fdb*/
+ #if defined (CONFIG_RTL865X_LANPORT_RESTRICTION) && defined(CONFIG_RTL_LAYERED_DRIVER) && defined(CONFIG_RTL_LAYERED_DRIVER_L2)&& defined(CONFIG_RTL865X_SYNC_L2)
+ {
+ unsigned char swap_addr[ETHER_ADDR_LEN];
+ int32 port_num;
+ /*try to find blocked l2 entry, then set it to authed*/
+ port_num = rtl865x_ConvertPortMasktoPortNum(memberPortMask_t);
+ if (port_num != FAILED)
+ {
+ /*printk("\ntime out port num is %d\n", port_num);*/
+ if ((lan_restrict_getBlockAddr(port_num, swap_addr)) == SUCCESS)
+ {
+ //struct hlist_head *head = &br->hash[br_mac_hash(swap_addr)];
+ /*
+ printk("\n arrange block entry is %x %x %x %x %x %x\n", swap_addr[0],
+ swap_addr[1],
+ swap_addr[2],
+ swap_addr[3],
+ swap_addr[4],
+ swap_addr[5]);
+
+ */
+ rtl865x_addAuthFDBEntry(swap_addr, TRUE, port_num, FALSE);
+ }
+
+ }
+ else
+ {/*port_num==FAILED*/}
+ }
+ #endif /* #if defined (CONFIG_RTL865X_LANPORT_RESTRICTION) && defined(CONFIG_RTL_LAYERED_DRIVER) && defined(CONFIG_RTL_LAYERED_DRIVER_L2) && defined(CONFIG_RTL865X_SYNC_L2) */ //consider add an auth fdb entry
+
}
- break;
+
+ //SLIST_INSERT_HEAD(&sw_FDB_Table.freefdbList.filterDBentry, l2entry_t, nextFDB);
+ rtl865x_raiseEvent(EVENT_DEL_FDB, (void *)(l2entry_t));
+ //if(lanrestrict_authdel_register_event()==SUCCESS);
+ rtl865x_raiseEvent(EVENT_DEL_AUTHED_FDB, (void *)(l2entry_t));
+
+ break;
}
-
+ } /*SLIST_FOREACH*/
return SUCCESS;
}
@@ -1668,17 +1799,19 @@ int32 rtl865x_check_authfdbentry_Byport(int32 port_num, const unsigned char *ma
rtl865x_tblAsicDrv_l2Param_t *L2buff, l2temp;
rtl865x_filterDbTable_t *fdb_t = &sw_FDB_Table.filterDB[0];
rtl865x_filterDbTableEntry_t * l2entry_t ;
-
+
L2buff = &l2temp;
memset(L2buff, 0, sizeof(rtl865x_tblAsicDrv_l2Param_t));
for(rowIdx=0; rowIdx<RTL8651_L2TBL_ROW; rowIdx++)
{
if (SLIST_FIRST(&(fdb_t->database[rowIdx])))
- {
+ {
+
SLIST_FOREACH(l2entry_t, &(fdb_t->database[rowIdx]), nextFDB)
{
- if ((l2entry_t ->auth == FALSE) && (l2entry_t->SrcBlk == TRUE))
+ if ( (l2entry_t->memberPortMask&(1<<port_num)) && (l2entry_t ->auth == FALSE) && (l2entry_t->SrcBlk == TRUE))
{
+
memcpy((ether_addr_t *)macAddr, &(l2entry_t->macAddr), sizeof(ether_addr_t));
#if 0
printk("\nfind block entry, rowIdx is %d, address2 is %x %x %x %x %x %x\n", rowIdx, ((ether_addr_t *)macAddr)->octet[0],
@@ -1700,7 +1833,7 @@ int32 rtl865x_check_authfdbentry_Byport(int32 port_num, const unsigned char *ma
return retval;
}
-int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port)
+int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port, int32 srcblk)
{
int32 found = FAILED;
ether_addr_t *macAddr;
@@ -1709,25 +1842,25 @@ int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port
int32 column;
rtl865x_tblAsicDrv_l2Param_t fdbEntry;
rtl865x_filterDbTableEntry_t l2temp_entry;
- int32 srcblk;
+ //int32 srcblk;
if (addr == NULL)
return RTL_EINVALIDINPUT;
-
macAddr = (ether_addr_t *)(addr);
found = rtl865x_Lookup_fdb_entry(RTL_LAN_FID, macAddr, FDB_DYNAMIC, &column, &fdbEntry);
- if (auth == TRUE)
+ /*if (auth == TRUE)
srcblk = FALSE;
else
- srcblk = TRUE;
+ srcblk = TRUE; */
if (found == SUCCESS )
{
port_num = rtl865x_ConvertPortMasktoPortNum(fdbEntry.memberPortMask);
-/* printk("\nbefore rtl865x_lookup_FilterDatabaseEntry, port is %d, auth is %d\n", port_num, auth); */
+ //printk("\nbefore rtl865x_lookup_FilterDatabaseEntry, port is %d, auth is %d\n", port_num, auth);
if (rtl865x_lookup_FilterDatabaseEntry(fdbEntry.fid, macAddr, &l2temp_entry) != SUCCESS)
{
+
l2temp_entry.l2type = (fdbEntry.nhFlag==0)?RTL865x_L2_TYPEI: RTL865x_L2_TYPEII;
l2temp_entry.process = FDB_TYPE_FWD;
l2temp_entry.memberPortMask = fdbEntry.memberPortMask;
@@ -1748,6 +1881,7 @@ int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port
{
if ((l2temp_entry.auth == FALSE) && (l2temp_entry.SrcBlk == TRUE))
{
+
l2temp_entry.l2type = (fdbEntry.nhFlag==0)?RTL865x_L2_TYPEI: RTL865x_L2_TYPEII;
l2temp_entry.process = FDB_TYPE_FWD;
l2temp_entry.memberPortMask = fdbEntry.memberPortMask;
@@ -1766,10 +1900,11 @@ int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port
else
{
/*just add sw l2 table */
+
l2temp_entry.l2type = RTL865x_L2_TYPEII;
l2temp_entry.process = FDB_TYPE_FWD;
-/* l2temp_entry.auth = TRUE;*/
-/* l2temp_entry.SrcBlk = FALSE;*/
+ /* l2temp_entry.auth = TRUE;*/
+ /* l2temp_entry.SrcBlk = FALSE;*/
memcpy(&(l2temp_entry.macAddr), macAddr, sizeof(ether_addr_t));
ret =_rtl865x_addAuthSWl2Entry( l2temp_entry.l2type,
0,
@@ -1783,19 +1918,45 @@ int32 rtl865x_addAuthFDBEntry(const unsigned char *addr, int32 auth, int32 port
}
+int32 rtl865x_addAuthFDBEntry_hooks(const unsigned char *addr)
+{
+ int32 port_num;
+ int32 ret;
+
+ if ((port_num=rtl865x_getPortNum(addr))!= -1)
+ {
+ ret = lan_restrict_CheckStatusByport(port_num);
+
+ if (ret == RTL_LAN_RESTRICT_STAT2)
+ {
+ //function opened, and should be authed
+ rtl865x_addAuthFDBEntry(addr, TRUE, port_num, FALSE);
+ } else if(ret == RTL_LAN_RESTRICT_STAT1)
+ {
+ //function opened, and set it to block
+ rtl865x_addAuthFDBEntry(addr, FALSE, port_num, TRUE);
+
+ }else if(ret == RTL_LAN_RESTRICT_STAT0)
+ {
+ //function not open , no need to be authed
+ rtl865x_addFDBEntry(addr);
+ }
+ }
+ return SUCCESS;
+}
+
+
int32 rtl865x_delAuthLanFDBEntry(uint16 l2Type, const unsigned char *addr)
{
int32 ret=FAILED;
ether_addr_t *macAddr;
-
if (addr == NULL)
{
return RTL_EINVALIDINPUT;
}
+
macAddr = (ether_addr_t *)(addr);
-
ret =_rtl865x_delAuthFilterDatabaseEntry( l2Type, RTL_LAN_FID, macAddr);
-
return ret;
}
@@ -1897,8 +2058,13 @@ int32 _rtl865x_ClearFDBEntryByPort(int32 port_num)
{
int i, j;
rtl865x_tblAsicDrv_l2Param_t l2entry_tmp,*L2buff;
+ #ifdef CONFIG_RTL865X_LANPORT_RESTRICTION
+ char *name;
+ #endif
+
L2buff = &l2entry_tmp;
+
for (i = 0; i < RTL8651_L2TBL_ROW; i++)
for (j = 0; j < RTL8651_L2TBL_COLUMN; j++)
{
@@ -1912,9 +2078,21 @@ int32 _rtl865x_ClearFDBEntryByPort(int32 port_num)
continue;
rtl8651_delAsicL2Table(i, j);
+ #ifdef CONFIG_RTL865X_LANPORT_RESTRICTION
+ name = rtl_getDevNameByPort(port_num);
+ if(name){
+ rtl_delFdbByMac((unsigned char *)(&(L2buff->macAddr.octet)), name);
+ }
+ #endif
+
_rtl865x_removeFilterDatabaseEntry(RTL_LAN_FID, &(L2buff->macAddr), i);
}
+ #if defined(CONFIG_RTL865X_LANPORT_RESTRICTION)
+ /*when link is down, set curr_num of port to 0 */
+ lan_restrict_tble_reset_port(port_num);
+ #endif
+
return SUCCESS;
}
@@ -1922,7 +2100,7 @@ int32 _rtl865x_ClearFDBEntryByPort(int32 port_num)
int32 rtl865x_LinkChange_Process(void)
{
uint32 i, status;
-
+
/* Check each port. */
for ( i = 0; i < RTL8651_MAC_NUMBER; i++ )
{
@@ -1932,7 +2110,9 @@ int32 rtl865x_LinkChange_Process(void)
{
/* Link is down. */
rtl8651_setAsicEthernetLinkStatus( i, FALSE );
+#if defined(CONFIG_RTL865X_LANPORT_RESTRICTION)
_rtl865x_ClearFDBEntryByPort(i);
+#endif
}
else
{
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.h b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.h
index 6c2a3e6aa..84d591cad 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.h
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_fdb.h
@@ -27,11 +27,6 @@
#define FDB_TYPE_DSTBLK 0x02
#define FDB_TYPE_TRAPCPU 0x03
-#define RTL865x_FDB_NUMBER 4
-#define RTL865x_L2_TYPEI 0x0001 /* Referenced by ARP/PPPoE */
-#define RTL865x_L2_TYPEII 0x0002 /* Referenced by Protocol */
-#define RTL865x_L2_TYPEIII 0x0004 /* Referenced by PCI/Extension Port */
-
#define RTL865X_FDBENTRY_TIMEOUT 0x1001 /*fdb entry time out*/
#define RTL865X_FDBENTRY_450SEC 0x1002 /*fdb entry 450s timing*/
#define RTL865X_FDBENTRY_300SEC 0x1004 /*fdb entry 300s timing*/
@@ -81,6 +76,9 @@ struct rtl865x_L2Tables{
SLIST_HEAD( _FreeFDBEntry, rtl865x_filterDbTableEntry_s) filterDBentry;
} freefdbList;
};
+
+// int32 rtl865x_arp_register_event(void);
+
int32 rtl865x_layer2_init(void);
int32 _rtl865x_addFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_t * macAddr, uint32 type, uint32 portMask, uint8 auth, uint8 SrcBlk);
int32 _rtl865x_addAuthFilterDatabaseEntry(uint16 l2Type, uint16 fid, ether_addr_t * macAddr, uint32 type, uint32 portMask, uint8 auth, uint8 SrcBlk);
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_outputQueue.c b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_outputQueue.c
index ce1afe969..f73099b32 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_outputQueue.c
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_outputQueue.c
@@ -1,18 +1,12 @@
+/*
+ *
+ * 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.
+ */
-/* @doc RTL_LAYEREDDRV_API
-
- @module rtl865x_outputQueue.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
-*/
#include <linux/config.h>
#include <net/rtl/rtl_types.h>
#include <net/rtl/rtl_glue.h>
@@ -77,6 +71,7 @@ static uint32 priority2HandleMapping[NETIF_NUMBER][TOTAL_VLAN_PRIORITY_NUM] = {{
static rtl_qos_mark_info_t mark2Priority[NETIF_NUMBER][MAX_MARK_NUM_PER_DEV] = {{{0}}};
rtl865x_qos_rule_t *rtl865x_qosRuleHead = NULL;
+extern int hw_qos_init_netlink(void);
static int32 _rtl865x_qosArrangeRuleByNetif(uint8 *netIfName);
int32 rtl865x_qosSetBandwidth(uint8 *netIfName, uint32 bps)
@@ -1116,6 +1111,8 @@ int __init rtl865x_initOutputQueue(uint8 **netIfName)
rtl8651_flushAsicDot1qAbsolutelyPriority();
#endif
+ hw_qos_init_netlink();
+
for(i =0; i < RTL8651_OUTPUTQUEUE_SIZE; i++)
{
for(j=PHY0;j<=CPU;j++)
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_stp.c b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_stp.c
index 2b84d8245..4980ef745 100644
--- a/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_stp.c
+++ b/target/linux/realtek/files/drivers/net/rtl819x/l2Driver/rtl865x_stp.c
@@ -1,18 +1,12 @@
-/*add by lu yang*/
-/* @doc 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.
+ */
- @module rtl865x_stp.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
-*/
//#include "rtl_utils.h"
#include <net/rtl/rtl_types.h>