aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c')
-rw-r--r--target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c2061
1 files changed, 0 insertions, 2061 deletions
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c b/target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c
deleted file mode 100644
index 75e5a5e740..0000000000
--- a/target/linux/mediatek/files-5.4/drivers/net/phy/rtk/rtl8367c/acl.c
+++ /dev/null
@@ -1,2061 +0,0 @@
-/*
- * Copyright (C) 2013 Realtek Semiconductor Corp.
- * All Rights Reserved.
- *
- * Unless you and Realtek execute a separate written software license
- * agreement governing use of this software, this software is licensed
- * to you under the terms of the GNU General Public License version 2,
- * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
- *
- * $Revision: 76306 $
- * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
- *
- * Purpose : RTK switch high-level API for RTL8367/RTL8367C
- * Feature : Here is a list of all functions and variables in ACL module.
- *
- */
-
-#include <rtk_switch.h>
-#include <rtk_error.h>
-#include <acl.h>
-#include <vlan.h>
-#include <svlan.h>
-#include <rate.h>
-#include <string.h>
-
-#include <rtl8367c_asicdrv.h>
-#include <rtl8367c_asicdrv_acl.h>
-#include <rtl8367c_asicdrv_hsb.h>
-#include <rtl8367c_asicdrv_vlan.h>
-#include <rtl8367c_asicdrv_svlan.h>
-#include <rtl8367c_asicdrv_cputag.h>
-#include <rtl8367c_asicdrv_mib.h>
-
-CONST_T rtk_uint8 filter_templateField[RTL8367C_ACLTEMPLATENO][RTL8367C_ACLRULEFIELDNO] = {
- {ACL_DMAC0, ACL_DMAC1, ACL_DMAC2, ACL_SMAC0, ACL_SMAC1, ACL_SMAC2, ACL_ETHERTYPE, ACL_FIELD_SELECT15},
- {ACL_IP4SIP0, ACL_IP4SIP1, ACL_IP4DIP0, ACL_IP4DIP1, ACL_FIELD_SELECT13, ACL_FIELD_SELECT14, ACL_FIELD_SELECT02, ACL_FIELD_SELECT15},
- {ACL_IP6SIP0WITHIPV4, ACL_IP6SIP1WITHIPV4,ACL_FIELD_SELECT03, ACL_FIELD_SELECT04, ACL_FIELD_SELECT05, ACL_FIELD_SELECT06, ACL_FIELD_SELECT07, ACL_FIELD_SELECT08},
- {ACL_IP6DIP0WITHIPV4, ACL_IP6DIP1WITHIPV4,ACL_FIELD_SELECT09, ACL_FIELD_SELECT10, ACL_FIELD_SELECT11, ACL_FIELD_SELECT12, ACL_FIELD_SELECT13, ACL_FIELD_SELECT14},
- {ACL_VIDRANGE, ACL_IPRANGE, ACL_PORTRANGE, ACL_CTAG, ACL_STAG, ACL_FIELD_SELECT13, ACL_FIELD_SELECT14, ACL_FIELD_SELECT15}
-};
-
-CONST_T rtk_uint8 filter_advanceCaretagField[RTL8367C_ACLTEMPLATENO][2] = {
- {TRUE, 7},
- {TRUE, 7},
- {FALSE, 0},
- {FALSE, 0},
- {TRUE, 7},
-};
-
-
-CONST_T rtk_uint8 filter_fieldTemplateIndex[FILTER_FIELD_END][RTK_FILTER_FIELD_USED_MAX] = {
- {0x00, 0x01,0x02},
- {0x03, 0x04,0x05},
- {0x06},
- {0x43},
- {0x44},
- {0x10, 0x11},
- {0x12, 0x13},
- {0x24},
- {0x25},
- {0x35},
- {0x35},
- {0x20, 0x21,0x22,0x23},
- {0x30, 0x31,0x32,0x33},
- {0x26},
- {0x27},
- {0x14},
- {0x15},
- {0x16},
- {0x14},
- {0x15},
- {0x14},
- {0x14},
- {0x14},
-
- {0x40},
- {0x41},
- {0x42},
-
- {0x14},
- {0x15},
- {0x16},
- {0x22},
- {0x23},
- {0x24},
- {0x25},
- {0x26},
- {0x27},
- {0x32},
- {0x33},
- {0x34},
- {0x35},
- {0x36},
- {0x37},
- {0x47},
-
- {0xFF} /* Pattern Match */
-};
-
-CONST_T rtk_uint8 filter_fieldSize[FILTER_FIELD_END] = {
- 3, 3, 1, 1, 1,
- 2, 2, 1, 1, 1, 1, 4, 4, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 8
-};
-
-CONST_T rtk_uint16 field_selector[RTL8367C_FIELDSEL_FORMAT_NUMBER][2] =
-{
- {FIELDSEL_FORMAT_DEFAULT, 0}, /* Field Selector 0 */
- {FIELDSEL_FORMAT_DEFAULT, 0}, /* Field Selector 1 */
- {FIELDSEL_FORMAT_IPPAYLOAD, 12}, /* Field Selector 2 */
- {FIELDSEL_FORMAT_IPV6, 10}, /* Field Selector 3 */
- {FIELDSEL_FORMAT_IPV6, 8}, /* Field Selector 4 */
- {FIELDSEL_FORMAT_IPV4, 0}, /* Field Selector 5 */
- {FIELDSEL_FORMAT_IPV4, 8}, /* Field Selector 6 */
- {FIELDSEL_FORMAT_IPV6, 0}, /* Field Selector 7 */
- {FIELDSEL_FORMAT_IPV6, 6}, /* Field Selector 8 */
- {FIELDSEL_FORMAT_IPV6, 26}, /* Field Selector 9 */
- {FIELDSEL_FORMAT_IPV6, 24}, /* Field Selector 10 */
- {FIELDSEL_FORMAT_DEFAULT, 0}, /* Field Selector 11 */
- {FIELDSEL_FORMAT_IPV4, 6}, /* Field Selector 12 */
- {FIELDSEL_FORMAT_IPPAYLOAD, 0}, /* Field Selector 13 */
- {FIELDSEL_FORMAT_IPPAYLOAD, 2}, /* Field Selector 14 */
- {FIELDSEL_FORMAT_DEFAULT, 0} /* Field Selector 15 */
-};
-
-
-static rtk_api_ret_t _rtk_filter_igrAcl_writeDataField(rtl8367c_aclrule *aclRule, rtk_filter_field_t *fieldPtr);
-
-
-/* Function Name:
- * rtk_filter_igrAcl_init
- * Description:
- * ACL initialization function
- * Input:
- * None
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
- * Note:
- * This function enable and intialize ACL function
- */
-rtk_api_ret_t rtk_filter_igrAcl_init(void)
-{
- rtl8367c_acltemplate_t aclTemp;
- rtk_uint32 i, j;
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if ((ret = rtk_filter_igrAcl_cfg_delAll()) != RT_ERR_OK)
- return ret;
-
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- for(j = 0; j < RTL8367C_ACLRULEFIELDNO;j++)
- aclTemp.field[j] = filter_templateField[i][j];
-
- if ((ret = rtl8367c_setAsicAclTemplate(i, &aclTemp)) != RT_ERR_OK)
- return ret;
- }
-
- for(i = 0; i < RTL8367C_FIELDSEL_FORMAT_NUMBER; i++)
- {
- if ((ret = rtl8367c_setAsicFieldSelector(i, field_selector[i][0], field_selector[i][1])) != RT_ERR_OK)
- return ret;
- }
-
- RTK_SCAN_ALL_PHY_PORTMASK(i)
- {
- if ((ret = rtl8367c_setAsicAcl(i, TRUE)) != RT_ERR_OK)
- return ret;
-
- if ((ret = rtl8367c_setAsicAclUnmatchedPermit(i, TRUE)) != RT_ERR_OK)
- return ret;
- }
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_field_add
- * Description:
- * Add comparison rule to an ACL configuration
- * Input:
- * pFilter_cfg - The ACL configuration that this function will add comparison rule
- * pFilter_field - The comparison rule that will be added.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function add a comparison rule (*pFilter_field) to an ACL configuration (*pFilter_cfg).
- * Pointer pFilter_cfg points to an ACL configuration structure, this structure keeps multiple ACL
- * comparison rules by means of linked list. Pointer pFilter_field will be added to linked
- * list keeped by structure that pFilter_cfg points to.
- */
-rtk_api_ret_t rtk_filter_igrAcl_field_add(rtk_filter_cfg_t* pFilter_cfg, rtk_filter_field_t* pFilter_field)
-{
- rtk_uint32 i;
- rtk_filter_field_t *tailPtr;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pFilter_cfg || NULL == pFilter_field)
- return RT_ERR_NULL_POINTER;
-
- if(pFilter_field->fieldType >= FILTER_FIELD_END)
- return RT_ERR_ENTRY_INDEX;
-
-
- if(0 == pFilter_field->fieldTemplateNo)
- {
- pFilter_field->fieldTemplateNo = filter_fieldSize[pFilter_field->fieldType];
-
- for(i = 0; i < pFilter_field->fieldTemplateNo; i++)
- {
- pFilter_field->fieldTemplateIdx[i] = filter_fieldTemplateIndex[pFilter_field->fieldType][i];
- }
- }
-
- if(NULL == pFilter_cfg->fieldHead)
- {
- pFilter_cfg->fieldHead = pFilter_field;
- }
- else
- {
- if (pFilter_cfg->fieldHead->next == NULL)
- {
- pFilter_cfg->fieldHead->next = pFilter_field;
- }
- else
- {
- tailPtr = pFilter_cfg->fieldHead->next;
- while( tailPtr->next != NULL)
- {
- tailPtr = tailPtr->next;
- }
- tailPtr->next = pFilter_field;
- }
- }
-
- return RT_ERR_OK;
-}
-
-static rtk_api_ret_t _rtk_filter_igrAcl_writeDataField(rtl8367c_aclrule *aclRule, rtk_filter_field_t *fieldPtr)
-{
- rtk_uint32 i, tempIdx,fieldIdx, ipValue, ipMask;
- rtk_uint32 ip6addr[RTK_IPV6_ADDR_WORD_LENGTH];
- rtk_uint32 ip6mask[RTK_IPV6_ADDR_WORD_LENGTH];
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
-
- aclRule[tempIdx].valid = TRUE;
- }
-
- switch (fieldPtr->fieldType)
- {
- /* use DMAC structure as representative for mac structure */
- case FILTER_FIELD_DMAC:
- case FILTER_FIELD_SMAC:
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.mac.value.octet[5 - i*2] | (fieldPtr->filter_pattern_union.mac.value.octet[5 - (i*2 + 1)] << 8);
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.mac.mask.octet[5 - i*2] | (fieldPtr->filter_pattern_union.mac.mask.octet[5 - (i*2 + 1)] << 8);
- }
- break;
- case FILTER_FIELD_ETHERTYPE:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.etherType.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.etherType.mask;
- }
- break;
- case FILTER_FIELD_IPV4_SIP:
- case FILTER_FIELD_IPV4_DIP:
-
- ipValue = fieldPtr->filter_pattern_union.sip.value;
- ipMask = fieldPtr->filter_pattern_union.sip.mask;
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = (0xFFFF & (ipValue >> (i*16)));
- aclRule[tempIdx].care_bits.field[fieldIdx] = (0xFFFF & (ipMask >> (i*16)));
- }
- break;
- case FILTER_FIELD_IPV4_TOS:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.ipTos.value & 0xFF;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.ipTos.mask & 0xFF;
- }
- break;
- case FILTER_FIELD_IPV4_PROTOCOL:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.protocol.value & 0xFF;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.protocol.mask & 0xFF;
- }
- break;
- case FILTER_FIELD_IPV6_SIPV6:
- case FILTER_FIELD_IPV6_DIPV6:
- for(i = 0; i < RTK_IPV6_ADDR_WORD_LENGTH; i++)
- {
- ip6addr[i] = fieldPtr->filter_pattern_union.sipv6.value.addr[i];
- ip6mask[i] = fieldPtr->filter_pattern_union.sipv6.mask.addr[i];
- }
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- if(i < 2)
- {
- aclRule[tempIdx].data_bits.field[fieldIdx] = ((ip6addr[0] & (0xFFFF << (i * 16))) >> (i * 16));
- aclRule[tempIdx].care_bits.field[fieldIdx] = ((ip6mask[0] & (0xFFFF << (i * 16))) >> (i * 16));
- }
- else
- {
- /*default acl template for ipv6 address supports MSB 32-bits and LSB 32-bits only*/
- aclRule[tempIdx].data_bits.field[fieldIdx] = ((ip6addr[3] & (0xFFFF << ((i&1) * 16))) >> ((i&1) * 16));
- aclRule[tempIdx].care_bits.field[fieldIdx] = ((ip6mask[3] & (0xFFFF << ((i&1) * 16))) >> ((i&1) * 16));
- }
- }
-
- break;
- case FILTER_FIELD_CTAG:
- case FILTER_FIELD_STAG:
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.l2tag.pri.value << 13) | (fieldPtr->filter_pattern_union.l2tag.cfi.value << 12) | fieldPtr->filter_pattern_union.l2tag.vid.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.l2tag.pri.mask << 13) | (fieldPtr->filter_pattern_union.l2tag.cfi.mask << 12) | fieldPtr->filter_pattern_union.l2tag.vid.mask;
- }
- break;
- case FILTER_FIELD_IPV4_FLAG:
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] &= 0x1FFF;
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.xf.value << 15);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.df.value << 14);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.mf.value << 13);
-
- aclRule[tempIdx].care_bits.field[fieldIdx] &= 0x1FFF;
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.xf.mask << 15);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.df.mask << 14);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.ipFlag.mf.mask << 13);
- }
-
- break;
- case FILTER_FIELD_IPV4_OFFSET:
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] &= 0xE000;
- aclRule[tempIdx].data_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.inData.value;
-
- aclRule[tempIdx].care_bits.field[fieldIdx] &= 0xE000;
- aclRule[tempIdx].care_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.inData.mask;
- }
-
- break;
-
- case FILTER_FIELD_IPV6_TRAFFIC_CLASS:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.inData.value << 4)&0x0FF0;
- aclRule[tempIdx].care_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.inData.mask << 4)&0x0FF0;
- }
- break;
- case FILTER_FIELD_IPV6_NEXT_HEADER:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.inData.value << 8;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.inData.mask << 8;
- }
- break;
- case FILTER_FIELD_TCP_SPORT:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.tcpSrcPort.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.tcpSrcPort.mask;
- }
- break;
- case FILTER_FIELD_TCP_DPORT:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.tcpDstPort.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.tcpDstPort.mask;
- }
- break;
- case FILTER_FIELD_TCP_FLAG:
-
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.cwr.value << 7);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.ece.value << 6);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.urg.value << 5);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.ack.value << 4);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.psh.value << 3);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.rst.value << 2);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.syn.value << 1);
- aclRule[tempIdx].data_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.tcpFlag.fin.value;
-
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.cwr.mask << 7);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.ece.mask << 6);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.urg.mask << 5);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.ack.mask << 4);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.psh.mask << 3);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.rst.mask << 2);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.tcpFlag.syn.mask << 1);
- aclRule[tempIdx].care_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.tcpFlag.fin.mask;
- }
- break;
- case FILTER_FIELD_UDP_SPORT:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.udpSrcPort.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.udpSrcPort.mask;
- }
- break;
- case FILTER_FIELD_UDP_DPORT:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.udpDstPort.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.udpDstPort.mask;
- }
- break;
- case FILTER_FIELD_ICMP_CODE:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] &= 0xFF00;
- aclRule[tempIdx].data_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.icmpCode.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] &= 0xFF00;
- aclRule[tempIdx].care_bits.field[fieldIdx] |= fieldPtr->filter_pattern_union.icmpCode.mask;
- }
- break;
- case FILTER_FIELD_ICMP_TYPE:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] &= 0x00FF;
- aclRule[tempIdx].data_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.icmpType.value << 8);
- aclRule[tempIdx].care_bits.field[fieldIdx] &= 0x00FF;
- aclRule[tempIdx].care_bits.field[fieldIdx] |= (fieldPtr->filter_pattern_union.icmpType.mask << 8);
- }
- break;
- case FILTER_FIELD_IGMP_TYPE:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.igmpType.value << 8);
- aclRule[tempIdx].care_bits.field[fieldIdx] = (fieldPtr->filter_pattern_union.igmpType.mask << 8);
- }
- break;
- case FILTER_FIELD_PATTERN_MATCH:
- for(i = 0; i < fieldPtr->fieldTemplateNo; i++)
- {
- tempIdx = (fieldPtr->fieldTemplateIdx[i] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[i] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = ((fieldPtr->filter_pattern_union.pattern.value[i/2] >> (16 * (i%2))) & 0x0000FFFF );
- aclRule[tempIdx].care_bits.field[fieldIdx] = ((fieldPtr->filter_pattern_union.pattern.mask[i/2] >> (16 * (i%2))) & 0x0000FFFF );
- }
- break;
- case FILTER_FIELD_VID_RANGE:
- case FILTER_FIELD_IP_RANGE:
- case FILTER_FIELD_PORT_RANGE:
- default:
- tempIdx = (fieldPtr->fieldTemplateIdx[0] & 0xF0) >> 4;
- fieldIdx = fieldPtr->fieldTemplateIdx[0] & 0x0F;
-
- aclRule[tempIdx].data_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.inData.value;
- aclRule[tempIdx].care_bits.field[fieldIdx] = fieldPtr->filter_pattern_union.inData.mask;
- break;
- }
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_cfg_add
- * Description:
- * Add an ACL configuration to ASIC
- * Input:
- * filter_id - Start index of ACL configuration.
- * pFilter_cfg - The ACL configuration that this function will add comparison rule
- * pFilter_action - Action(s) of ACL configuration.
- * Output:
- * ruleNum - number of rules written in acl table
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_ENTRY_INDEX - Invalid filter_id .
- * RT_ERR_NULL_POINTER - Pointer pFilter_action or pFilter_cfg point to NULL.
- * RT_ERR_FILTER_INACL_ACT_NOT_SUPPORT - Action is not supported in this chip.
- * RT_ERR_FILTER_INACL_RULE_NOT_SUPPORT - Rule is not supported.
- * Note:
- * This function store pFilter_cfg, pFilter_action into ASIC. The starting
- * index(es) is filter_id.
- */
-rtk_api_ret_t rtk_filter_igrAcl_cfg_add(rtk_filter_id_t filter_id, rtk_filter_cfg_t* pFilter_cfg, rtk_filter_action_t* pFilter_action, rtk_filter_number_t *ruleNum)
-{
- rtk_api_ret_t retVal;
- rtk_uint32 careTagData, careTagMask;
- rtk_uint32 i,vidx, svidx, actType, ruleId;
- rtk_uint32 aclActCtrl;
- rtk_uint32 cpuPort;
- rtk_filter_field_t* fieldPtr;
- rtl8367c_aclrule aclRule[RTL8367C_ACLTEMPLATENO];
- rtl8367c_aclrule tempRule;
- rtl8367c_acl_act_t aclAct;
- rtk_uint32 noRulesAdd;
- rtk_uint32 portmask;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(filter_id > RTL8367C_ACLRULEMAX )
- return RT_ERR_ENTRY_INDEX;
-
- if((NULL == pFilter_cfg) || (NULL == pFilter_action) || (NULL == ruleNum))
- return RT_ERR_NULL_POINTER;
-
- fieldPtr = pFilter_cfg->fieldHead;
-
- /* init RULE */
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- memset(&aclRule[i], 0, sizeof(rtl8367c_aclrule));
-
- aclRule[i].data_bits.type= i;
- aclRule[i].care_bits.type= 0x7;
- }
-
- while(NULL != fieldPtr)
- {
- _rtk_filter_igrAcl_writeDataField(aclRule, fieldPtr);
-
- fieldPtr = fieldPtr->next;
- }
-
- /*set care tag mask in User Defined Field 15*/
- /*Follow care tag should not be used while ACL template and User defined fields are fully control by system designer*/
- /*those advanced packet type care tag is used in default template design structure only*/
- careTagData = 0;
- careTagMask = 0;
-
- for(i = CARE_TAG_TCP; i < CARE_TAG_END; i++)
- {
- if(pFilter_cfg->careTag.tagType[i].mask)
- careTagMask = careTagMask | (1 << (i-CARE_TAG_TCP));
-
- if(pFilter_cfg->careTag.tagType[i].value)
- careTagData = careTagData | (1 << (i-CARE_TAG_TCP));
- }
-
- if(careTagData || careTagMask)
- {
- i = 0;
- while(i < RTL8367C_ACLTEMPLATENO)
- {
- if(aclRule[i].valid == 1 && filter_advanceCaretagField[i][0] == TRUE)
- {
-
- aclRule[i].data_bits.field[filter_advanceCaretagField[i][1]] = careTagData & 0xFFFF;
- aclRule[i].care_bits.field[filter_advanceCaretagField[i][1]] = careTagMask & 0xFFFF;
- break;
- }
- i++;
- }
- /*none of previous used template containing field 15*/
- if(i == RTL8367C_ACLTEMPLATENO)
- {
- i = 0;
- while(i < RTL8367C_ACLTEMPLATENO)
- {
- if(filter_advanceCaretagField[i][0] == TRUE)
- {
- aclRule[i].data_bits.field[filter_advanceCaretagField[i][1]] = careTagData & 0xFFFF;
- aclRule[i].care_bits.field[filter_advanceCaretagField[i][1]] = careTagMask & 0xFFFF;
- aclRule[i].valid = 1;
- break;
- }
- i++;
- }
- }
- }
-
- /*Check rule number*/
- noRulesAdd = 0;
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- if(1 == aclRule[i].valid)
- {
- noRulesAdd ++;
- }
- }
-
- *ruleNum = noRulesAdd;
-
- if((filter_id + noRulesAdd - 1) > RTL8367C_ACLRULEMAX)
- {
- return RT_ERR_ENTRY_INDEX;
- }
-
- /*set care tag mask in TAG Indicator*/
- careTagData = 0;
- careTagMask = 0;
-
- for(i = 0; i <= CARE_TAG_IPV6;i++)
- {
- if(0 == pFilter_cfg->careTag.tagType[i].mask )
- {
- careTagMask &= ~(1 << i);
- }
- else
- {
- careTagMask |= (1 << i);
- if(0 == pFilter_cfg->careTag.tagType[i].value )
- careTagData &= ~(1 << i);
- else
- careTagData |= (1 << i);
- }
- }
-
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- aclRule[i].data_bits.tag_exist = (careTagData) & ACL_RULE_CARETAG_MASK;
- aclRule[i].care_bits.tag_exist = (careTagMask) & ACL_RULE_CARETAG_MASK;
- }
-
- RTK_CHK_PORTMASK_VALID(&pFilter_cfg->activeport.value);
- RTK_CHK_PORTMASK_VALID(&pFilter_cfg->activeport.mask);
-
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- if(TRUE == aclRule[i].valid)
- {
- if(rtk_switch_portmask_L2P_get(&pFilter_cfg->activeport.value, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
-
- aclRule[i].data_bits.active_portmsk = portmask;
-
- if(rtk_switch_portmask_L2P_get(&pFilter_cfg->activeport.mask, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
-
- aclRule[i].care_bits.active_portmsk = portmask;
- }
- }
-
- if(pFilter_cfg->invert >= FILTER_INVERT_END )
- return RT_ERR_INPUT;
-
-
- /*Last action gets high priority if actions are the same*/
- memset(&aclAct, 0, sizeof(rtl8367c_acl_act_t));
- aclActCtrl = 0;
- for(actType = 0; actType < FILTER_ENACT_END; actType ++)
- {
- if(pFilter_action->actEnable[actType])
- {
- switch (actType)
- {
- case FILTER_ENACT_CVLAN_INGRESS:
- if(pFilter_action->filterCvlanVid > RTL8367C_EVIDMAX)
- return RT_ERR_INPUT;
-
- if((retVal = rtk_vlan_checkAndCreateMbr(pFilter_action->filterCvlanVid, &vidx)) != RT_ERR_OK)
- {
- return retVal;
- }
- aclAct.cact = FILTER_ENACT_CVLAN_TYPE(actType);
- aclAct.cvidx_cact = vidx;
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_TAGONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_VLANONLY;
- }
-
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_CVLAN_EGRESS:
- if(pFilter_action->filterCvlanVid > RTL8367C_EVIDMAX)
- return RT_ERR_INPUT;
-
- if((retVal = rtk_vlan_checkAndCreateMbr(pFilter_action->filterCvlanVid, &vidx)) != RT_ERR_OK)
- return retVal;
-
- aclAct.cact = FILTER_ENACT_CVLAN_TYPE(actType);
- aclAct.cvidx_cact = vidx;
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_TAGONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_VLANONLY;
- }
-
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_CVLAN_SVID:
-
- aclAct.cact = FILTER_ENACT_CVLAN_TYPE(actType);
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_TAGONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_VLANONLY;
- }
-
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_POLICING_1:
- if(pFilter_action->filterPolicingIdx[1] >= (RTK_METER_NUM + RTL8367C_MAX_LOG_CNT_NUM))
- return RT_ERR_INPUT;
-
- aclAct.cact = FILTER_ENACT_CVLAN_TYPE(actType);
- aclAct.cvidx_cact = pFilter_action->filterPolicingIdx[1];
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_TAGONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_VLANONLY;
- }
-
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
-
- case FILTER_ENACT_SVLAN_INGRESS:
- case FILTER_ENACT_SVLAN_EGRESS:
-
- if((retVal = rtk_svlan_checkAndCreateMbr(pFilter_action->filterSvlanVid, &svidx)) != RT_ERR_OK)
- return retVal;
-
- aclAct.sact = FILTER_ENACT_SVLAN_TYPE(actType);
- aclAct.svidx_sact = svidx;
- aclActCtrl |= FILTER_ENACT_SVLAN_MASK;
- break;
- case FILTER_ENACT_SVLAN_CVID:
-
- aclAct.sact = FILTER_ENACT_SVLAN_TYPE(actType);
- aclActCtrl |= FILTER_ENACT_SVLAN_MASK;
- break;
- case FILTER_ENACT_POLICING_2:
- if(pFilter_action->filterPolicingIdx[2] >= (RTK_METER_NUM + RTL8367C_MAX_LOG_CNT_NUM))
- return RT_ERR_INPUT;
-
- aclAct.sact = FILTER_ENACT_SVLAN_TYPE(actType);
- aclAct.svidx_sact = pFilter_action->filterPolicingIdx[2];
- aclActCtrl |= FILTER_ENACT_SVLAN_MASK;
- break;
- case FILTER_ENACT_POLICING_0:
- if(pFilter_action->filterPolicingIdx[0] >= (RTK_METER_NUM + RTL8367C_MAX_LOG_CNT_NUM))
- return RT_ERR_INPUT;
-
- aclAct.aclmeteridx = pFilter_action->filterPolicingIdx[0];
- aclActCtrl |= FILTER_ENACT_POLICING_MASK;
- break;
- case FILTER_ENACT_PRIORITY:
- case FILTER_ENACT_1P_REMARK:
- if(pFilter_action->filterPriority > RTL8367C_PRIMAX)
- return RT_ERR_INPUT;
-
- aclAct.priact = FILTER_ENACT_PRI_TYPE(actType);
- aclAct.pridx = pFilter_action->filterPriority;
- aclActCtrl |= FILTER_ENACT_PRIORITY_MASK;
- break;
- case FILTER_ENACT_DSCP_REMARK:
- if(pFilter_action->filterPriority > RTL8367C_DSCPMAX)
- return RT_ERR_INPUT;
-
- aclAct.priact = FILTER_ENACT_PRI_TYPE(actType);
- aclAct.pridx = pFilter_action->filterPriority;
- aclActCtrl |= FILTER_ENACT_PRIORITY_MASK;
- break;
- case FILTER_ENACT_POLICING_3:
- if(pFilter_action->filterPriority >= (RTK_METER_NUM + RTL8367C_MAX_LOG_CNT_NUM))
- return RT_ERR_INPUT;
-
- aclAct.priact = FILTER_ENACT_PRI_TYPE(actType);
- aclAct.pridx = pFilter_action->filterPolicingIdx[3];
- aclActCtrl |= FILTER_ENACT_PRIORITY_MASK;
- break;
- case FILTER_ENACT_DROP:
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(FILTER_ENACT_REDIRECT);
- aclAct.fwdact_ext = FALSE;
-
- aclAct.fwdpmask = 0;
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
- case FILTER_ENACT_REDIRECT:
- RTK_CHK_PORTMASK_VALID(&pFilter_action->filterPortmask);
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(actType);
- aclAct.fwdact_ext = FALSE;
-
- if(rtk_switch_portmask_L2P_get(&pFilter_action->filterPortmask, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
- aclAct.fwdpmask = portmask;
-
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
-
- case FILTER_ENACT_ADD_DSTPORT:
- RTK_CHK_PORTMASK_VALID(&pFilter_action->filterPortmask);
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(actType);
- aclAct.fwdact_ext = FALSE;
-
- if(rtk_switch_portmask_L2P_get(&pFilter_action->filterPortmask, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
- aclAct.fwdpmask = portmask;
-
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
- case FILTER_ENACT_MIRROR:
- RTK_CHK_PORTMASK_VALID(&pFilter_action->filterPortmask);
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(actType);
- aclAct.cact_ext = FALSE;
-
- if(rtk_switch_portmask_L2P_get(&pFilter_action->filterPortmask, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
- aclAct.fwdpmask = portmask;
-
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
- case FILTER_ENACT_TRAP_CPU:
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(actType);
- aclAct.fwdact_ext = FALSE;
-
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
- case FILTER_ENACT_COPY_CPU:
- if((retVal = rtl8367c_getAsicCputagTrapPort(&cpuPort)) != RT_ERR_OK)
- return retVal;
-
- aclAct.fwdact = FILTER_ENACT_FWD_TYPE(FILTER_ENACT_MIRROR);
- aclAct.fwdact_ext = FALSE;
-
- aclAct.fwdpmask = 1 << cpuPort;
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
- case FILTER_ENACT_ISOLATION:
- RTK_CHK_PORTMASK_VALID(&pFilter_action->filterPortmask);
-
- aclAct.fwdact_ext = TRUE;
-
- if(rtk_switch_portmask_L2P_get(&pFilter_action->filterPortmask, &portmask) != RT_ERR_OK)
- return RT_ERR_PORT_MASK;
- aclAct.fwdpmask = portmask;
-
- aclActCtrl |= FILTER_ENACT_FWD_MASK;
- break;
-
- case FILTER_ENACT_INTERRUPT:
-
- aclAct.aclint = TRUE;
- aclActCtrl |= FILTER_ENACT_INTGPIO_MASK;
- break;
- case FILTER_ENACT_GPO:
-
- aclAct.gpio_en = TRUE;
- aclAct.gpio_pin = pFilter_action->filterPin;
- aclActCtrl |= FILTER_ENACT_INTGPIO_MASK;
- break;
- case FILTER_ENACT_EGRESSCTAG_TAG:
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_VLANONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_TAGONLY;
- }
- aclAct.tag_fmt = FILTER_CTAGFMT_TAG;
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_EGRESSCTAG_UNTAG:
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_VLANONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_TAGONLY;
- }
- aclAct.tag_fmt = FILTER_CTAGFMT_UNTAG;
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_EGRESSCTAG_KEEP:
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_VLANONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_TAGONLY;
- }
- aclAct.tag_fmt = FILTER_CTAGFMT_KEEP;
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- case FILTER_ENACT_EGRESSCTAG_KEEPAND1PRMK:
-
- if(aclActCtrl &(FILTER_ENACT_CVLAN_MASK))
- {
- if(aclAct.cact_ext == FILTER_ENACT_CACTEXT_VLANONLY)
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_BOTHVLANTAG;
- }
- else
- {
- aclAct.cact_ext = FILTER_ENACT_CACTEXT_TAGONLY;
- }
- aclAct.tag_fmt = FILTER_CTAGFMT_KEEP1PRMK;
- aclActCtrl |= FILTER_ENACT_CVLAN_MASK;
- break;
- default:
- return RT_ERR_FILTER_INACL_ACT_NOT_SUPPORT;
- }
- }
- }
-
-
- /*check if free ACL rules are enough*/
- for(i = filter_id; i < (filter_id + noRulesAdd); i++)
- {
- if((retVal = rtl8367c_getAsicAclRule(i, &tempRule)) != RT_ERR_OK )
- return retVal;
-
- if(tempRule.valid == TRUE)
- {
- return RT_ERR_TBL_FULL;
- }
- }
-
- ruleId = 0;
- for(i = 0; i < RTL8367C_ACLTEMPLATENO; i++)
- {
- if(aclRule[i].valid == TRUE)
- {
- /* write ACL action control */
- if((retVal = rtl8367c_setAsicAclActCtrl(filter_id + ruleId, aclActCtrl)) != RT_ERR_OK )
- return retVal;
- /* write ACL action */
- if((retVal = rtl8367c_setAsicAclAct(filter_id + ruleId, &aclAct)) != RT_ERR_OK )
- return retVal;
-
- /* write ACL not */
- if((retVal = rtl8367c_setAsicAclNot(filter_id + ruleId, pFilter_cfg->invert)) != RT_ERR_OK )
- return retVal;
- /* write ACL rule */
- if((retVal = rtl8367c_setAsicAclRule(filter_id + ruleId, &aclRule[i])) != RT_ERR_OK )
- return retVal;
-
- /* only the first rule will be written with input action control, aclActCtrl of other rules will be zero */
- aclActCtrl = 0;
- memset(&aclAct, 0, sizeof(rtl8367c_acl_act_t));
-
- ruleId ++;
- }
- }
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_cfg_del
- * Description:
- * Delete an ACL configuration from ASIC
- * Input:
- * filter_id - Start index of ACL configuration.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_FILTER_ENTRYIDX - Invalid filter_id.
- * Note:
- * This function delete a group of ACL rules starting from filter_id.
- */
-rtk_api_ret_t rtk_filter_igrAcl_cfg_del(rtk_filter_id_t filter_id)
-{
- rtl8367c_aclrule initRule;
- rtl8367c_acl_act_t initAct;
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(filter_id > RTL8367C_ACLRULEMAX )
- return RT_ERR_FILTER_ENTRYIDX;
-
- memset(&initRule, 0, sizeof(rtl8367c_aclrule));
- memset(&initAct, 0, sizeof(rtl8367c_acl_act_t));
-
- if((ret = rtl8367c_setAsicAclRule(filter_id, &initRule)) != RT_ERR_OK)
- return ret;
- if((ret = rtl8367c_setAsicAclActCtrl(filter_id, FILTER_ENACT_INIT_MASK))!= RT_ERR_OK)
- return ret;
- if((ret = rtl8367c_setAsicAclAct(filter_id, &initAct)) != RT_ERR_OK)
- return ret;
- if((ret = rtl8367c_setAsicAclNot(filter_id, DISABLED)) != RT_ERR_OK )
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_cfg_delAll
- * Description:
- * Delete all ACL entries from ASIC
- * Input:
- * None
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * Note:
- * This function delete all ACL configuration from ASIC.
- */
-rtk_api_ret_t rtk_filter_igrAcl_cfg_delAll(void)
-{
- rtk_uint32 i;
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- for(i = 0; i < RTL8367C_ACLRULENO; i++)
- {
- if((ret = rtl8367c_setAsicAclActCtrl(i, FILTER_ENACT_INIT_MASK))!= RT_ERR_OK)
- return ret;
- if((ret = rtl8367c_setAsicAclNot(i, DISABLED)) != RT_ERR_OK )
- return ret;
- }
-
- return rtl8367c_setAsicRegBit(RTL8367C_REG_ACL_RESET_CFG, RTL8367C_ACL_RESET_CFG_OFFSET, TRUE);;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_cfg_get
- * Description:
- * Get one ingress acl configuration from ASIC.
- * Input:
- * filter_id - Start index of ACL configuration.
- * Output:
- * pFilter_cfg - buffer pointer of ingress acl data
- * pFilter_action - buffer pointer of ingress acl action
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - Pointer pFilter_action or pFilter_cfg point to NULL.
- * RT_ERR_FILTER_ENTRYIDX - Invalid entry index.
- * Note:
- * This function get configuration from ASIC.
- */
-rtk_api_ret_t rtk_filter_igrAcl_cfg_get(rtk_filter_id_t filter_id, rtk_filter_cfg_raw_t *pFilter_cfg, rtk_filter_action_t *pAction)
-{
- rtk_api_ret_t retVal;
- rtk_uint32 i, tmp;
- rtl8367c_aclrule aclRule;
- rtl8367c_acl_act_t aclAct;
- rtk_uint32 cpuPort;
- rtl8367c_acltemplate_t type;
- rtl8367c_svlan_memconf_t svlan_cfg;
- rtl8367c_vlanconfiguser vlanMC;
- rtk_uint32 phyPmask;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pFilter_cfg || NULL == pAction)
- return RT_ERR_NULL_POINTER;
-
- if(filter_id > RTL8367C_ACLRULEMAX)
- return RT_ERR_ENTRY_INDEX;
-
- if ((retVal = rtl8367c_getAsicAclRule(filter_id, &aclRule)) != RT_ERR_OK)
- return retVal;
-
- /* Check valid */
- if(aclRule.valid == 0)
- {
- pFilter_cfg->valid = DISABLED;
- return RT_ERR_OK;
- }
-
- phyPmask = aclRule.data_bits.active_portmsk;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pFilter_cfg->activeport.value)) != RT_ERR_OK)
- return RT_ERR_FAILED;
-
- phyPmask = aclRule.care_bits.active_portmsk;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pFilter_cfg->activeport.mask)) != RT_ERR_OK)
- return RT_ERR_FAILED;
-
- for(i = 0; i <= CARE_TAG_IPV6; i++)
- {
- if(aclRule.data_bits.tag_exist & (1 << i))
- pFilter_cfg->careTag.tagType[i].value = 1;
- else
- pFilter_cfg->careTag.tagType[i].value = 0;
-
- if (aclRule.care_bits.tag_exist & (1 << i))
- pFilter_cfg->careTag.tagType[i].mask = 1;
- else
- pFilter_cfg->careTag.tagType[i].mask = 0;
- }
-
- if(filter_advanceCaretagField[aclRule.data_bits.type][0] == TRUE)
- {
- /* Advanced Care tag setting */
- for(i = CARE_TAG_TCP; i < CARE_TAG_END; i++)
- {
- if(aclRule.data_bits.field[filter_advanceCaretagField[aclRule.data_bits.type][1]] & (0x0001 << (i-CARE_TAG_TCP)) )
- pFilter_cfg->careTag.tagType[i].value = 1;
- else
- pFilter_cfg->careTag.tagType[i].value = 0;
-
- if(aclRule.care_bits.field[filter_advanceCaretagField[aclRule.care_bits.type][1]] & (0x0001 << (i-CARE_TAG_TCP)) )
- pFilter_cfg->careTag.tagType[i].mask = 1;
- else
- pFilter_cfg->careTag.tagType[i].mask = 0;
- }
- }
-
- for(i = 0; i < RTL8367C_ACLRULEFIELDNO; i++)
- {
- pFilter_cfg->careFieldRaw[i] = aclRule.care_bits.field[i];
- pFilter_cfg->dataFieldRaw[i] = aclRule.data_bits.field[i];
- }
-
- if ((retVal = rtl8367c_getAsicAclNot(filter_id, &tmp))!= RT_ERR_OK)
- return retVal;
-
- pFilter_cfg->invert = tmp;
-
- pFilter_cfg->valid = aclRule.valid;
-
- memset(pAction, 0, sizeof(rtk_filter_action_t));
-
- if ((retVal = rtl8367c_getAsicAclActCtrl(filter_id, &tmp))!= RT_ERR_OK)
- return retVal;
-
- if ((retVal = rtl8367c_getAsicAclAct(filter_id, &aclAct)) != RT_ERR_OK)
- return retVal;
-
- if(tmp & FILTER_ENACT_FWD_MASK)
- {
- if(TRUE == aclAct.fwdact_ext)
- {
- pAction->actEnable[FILTER_ENACT_ISOLATION] = TRUE;
-
- phyPmask = aclAct.fwdpmask;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pAction->filterPortmask)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- }
- else if(aclAct.fwdact == RTL8367C_ACL_FWD_TRAP)
- {
- pAction->actEnable[FILTER_ENACT_TRAP_CPU] = TRUE;
- }
- else if (aclAct.fwdact == RTL8367C_ACL_FWD_MIRRORFUNTION )
- {
- pAction->actEnable[FILTER_ENACT_MIRROR] = TRUE;
-
- phyPmask = aclAct.fwdpmask;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pAction->filterPortmask)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- }
- else if (aclAct.fwdact == RTL8367C_ACL_FWD_REDIRECT)
- {
- if(aclAct.fwdpmask == 0 )
- pAction->actEnable[FILTER_ENACT_DROP] = TRUE;
- else
- {
- pAction->actEnable[FILTER_ENACT_REDIRECT] = TRUE;
-
- phyPmask = aclAct.fwdpmask;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pAction->filterPortmask)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- }
- }
- else if (aclAct.fwdact == RTL8367C_ACL_FWD_MIRROR)
- {
- if((retVal = rtl8367c_getAsicCputagTrapPort(&cpuPort)) != RT_ERR_OK)
- return retVal;
- if (aclAct.fwdpmask == (1 << cpuPort))
- {
- pAction->actEnable[FILTER_ENACT_COPY_CPU] = TRUE;
- }
- else
- {
- pAction->actEnable[FILTER_ENACT_ADD_DSTPORT] = TRUE;
-
- phyPmask = aclAct.fwdpmask;
- if(rtk_switch_portmask_P2L_get(phyPmask,&(pAction->filterPortmask)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- }
- }
- else
- {
- return RT_ERR_FAILED;
- }
- }
-
- if(tmp & FILTER_ENACT_POLICING_MASK)
- {
- pAction->actEnable[FILTER_ENACT_POLICING_0] = TRUE;
- pAction->filterPolicingIdx[0] = aclAct.aclmeteridx;
- }
-
- if(tmp & FILTER_ENACT_PRIORITY_MASK)
- {
- if(aclAct.priact == FILTER_ENACT_PRI_TYPE(FILTER_ENACT_PRIORITY))
- {
- pAction->actEnable[FILTER_ENACT_PRIORITY] = TRUE;
- pAction->filterPriority = aclAct.pridx;
- }
- else if(aclAct.priact == FILTER_ENACT_PRI_TYPE(FILTER_ENACT_1P_REMARK))
- {
- pAction->actEnable[FILTER_ENACT_1P_REMARK] = TRUE;
- pAction->filterPriority = aclAct.pridx;
- }
- else if(aclAct.priact == FILTER_ENACT_PRI_TYPE(FILTER_ENACT_DSCP_REMARK))
- {
- pAction->actEnable[FILTER_ENACT_DSCP_REMARK] = TRUE;
- pAction->filterPriority = aclAct.pridx;
- }
- else if(aclAct.priact == FILTER_ENACT_PRI_TYPE(FILTER_ENACT_POLICING_3))
- {
- pAction->actEnable[FILTER_ENACT_POLICING_3] = TRUE;
- pAction->filterPolicingIdx[3] = aclAct.pridx;
- }
- }
-
- if(tmp & FILTER_ENACT_SVLAN_MASK)
- {
- if(aclAct.sact == FILTER_ENACT_SVLAN_TYPE(FILTER_ENACT_SVLAN_INGRESS))
- {
- if((retVal = rtl8367c_getAsicSvlanMemberConfiguration(aclAct.svidx_sact, &svlan_cfg)) != RT_ERR_OK)
- return retVal;
-
- pAction->actEnable[FILTER_ENACT_SVLAN_INGRESS] = TRUE;
- pAction->filterSvlanIdx = aclAct.svidx_sact;
- pAction->filterSvlanVid = svlan_cfg.vs_svid;
- }
- else if(aclAct.sact == FILTER_ENACT_SVLAN_TYPE(FILTER_ENACT_SVLAN_EGRESS))
- {
- if((retVal = rtl8367c_getAsicSvlanMemberConfiguration(aclAct.svidx_sact, &svlan_cfg)) != RT_ERR_OK)
- return retVal;
-
- pAction->actEnable[FILTER_ENACT_SVLAN_EGRESS] = TRUE;
- pAction->filterSvlanIdx = aclAct.svidx_sact;
- pAction->filterSvlanVid = svlan_cfg.vs_svid;
- }
- else if(aclAct.sact == FILTER_ENACT_SVLAN_TYPE(FILTER_ENACT_SVLAN_CVID))
- pAction->actEnable[FILTER_ENACT_SVLAN_CVID] = TRUE;
- else if(aclAct.sact == FILTER_ENACT_SVLAN_TYPE(FILTER_ENACT_POLICING_2))
- {
- pAction->actEnable[FILTER_ENACT_POLICING_2] = TRUE;
- pAction->filterPolicingIdx[2] = aclAct.svidx_sact;
- }
- }
-
-
- if(tmp & FILTER_ENACT_CVLAN_MASK)
- {
- if(FILTER_ENACT_CACTEXT_TAGONLY == aclAct.cact_ext ||
- FILTER_ENACT_CACTEXT_BOTHVLANTAG == aclAct.cact_ext )
- {
- if(FILTER_CTAGFMT_UNTAG == aclAct.tag_fmt)
- {
- pAction->actEnable[FILTER_ENACT_EGRESSCTAG_UNTAG] = TRUE;
- }
- else if(FILTER_CTAGFMT_TAG == aclAct.tag_fmt)
- {
- pAction->actEnable[FILTER_ENACT_EGRESSCTAG_TAG] = TRUE;
- }
- else if(FILTER_CTAGFMT_KEEP == aclAct.tag_fmt)
- {
- pAction->actEnable[FILTER_ENACT_EGRESSCTAG_KEEP] = TRUE;
- }
- else if(FILTER_CTAGFMT_KEEP1PRMK== aclAct.tag_fmt)
- {
- pAction->actEnable[FILTER_ENACT_EGRESSCTAG_KEEPAND1PRMK] = TRUE;
- }
-
- }
-
- if(FILTER_ENACT_CACTEXT_VLANONLY == aclAct.cact_ext ||
- FILTER_ENACT_CACTEXT_BOTHVLANTAG == aclAct.cact_ext )
- {
- if(aclAct.cact == FILTER_ENACT_CVLAN_TYPE(FILTER_ENACT_CVLAN_INGRESS))
- {
- if((retVal = rtl8367c_getAsicVlanMemberConfig(aclAct.cvidx_cact, &vlanMC)) != RT_ERR_OK)
- return retVal;
-
- pAction->actEnable[FILTER_ENACT_CVLAN_INGRESS] = TRUE;
- pAction->filterCvlanIdx = aclAct.cvidx_cact;
- pAction->filterCvlanVid = vlanMC.evid;
- }
- else if(aclAct.cact == FILTER_ENACT_CVLAN_TYPE(FILTER_ENACT_CVLAN_EGRESS))
- {
- if((retVal = rtl8367c_getAsicVlanMemberConfig(aclAct.cvidx_cact, &vlanMC)) != RT_ERR_OK)
- return retVal;
-
- pAction->actEnable[FILTER_ENACT_CVLAN_EGRESS] = TRUE;
- pAction->filterCvlanIdx = aclAct.cvidx_cact;
- pAction->filterCvlanVid = vlanMC.evid;
- }
- else if(aclAct.cact == FILTER_ENACT_CVLAN_TYPE(FILTER_ENACT_CVLAN_SVID))
- {
- pAction->actEnable[FILTER_ENACT_CVLAN_SVID] = TRUE;
- }
- else if(aclAct.cact == FILTER_ENACT_CVLAN_TYPE(FILTER_ENACT_POLICING_1))
- {
- pAction->actEnable[FILTER_ENACT_POLICING_1] = TRUE;
- pAction->filterPolicingIdx[1] = aclAct.cvidx_cact;
- }
- }
- }
-
- if(tmp & FILTER_ENACT_INTGPIO_MASK)
- {
- if(TRUE == aclAct.aclint)
- {
- pAction->actEnable[FILTER_ENACT_INTERRUPT] = TRUE;
- }
-
- if(TRUE == aclAct.gpio_en)
- {
- pAction->actEnable[FILTER_ENACT_GPO] = TRUE;
- pAction->filterPin = aclAct.gpio_pin;
- }
- }
-
- /* Get field type of RAW data */
- if ((retVal = rtl8367c_getAsicAclTemplate(aclRule.data_bits.type, &type))!= RT_ERR_OK)
- return retVal;
-
- for(i = 0; i < RTL8367C_ACLRULEFIELDNO; i++)
- {
- pFilter_cfg->fieldRawType[i] = type.field[i];
- }/* end of for(i...) */
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_unmatchAction_set
- * Description:
- * Set action to packets when no ACL configuration match
- * Input:
- * port - Port id.
- * action - Action.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port id.
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function sets action of packets when no ACL configruation matches.
- */
-rtk_api_ret_t rtk_filter_igrAcl_unmatchAction_set(rtk_port_t port, rtk_filter_unmatch_action_t action)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- /* Check port valid */
- RTK_CHK_PORT_VALID(port);
-
- if(action >= FILTER_UNMATCH_END)
- return RT_ERR_INPUT;
-
- if((ret = rtl8367c_setAsicAclUnmatchedPermit(rtk_switch_port_L2P_get(port), action)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_unmatchAction_get
- * Description:
- * Get action to packets when no ACL configuration match
- * Input:
- * port - Port id.
- * Output:
- * pAction - Action.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port id.
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function gets action of packets when no ACL configruation matches.
- */
-rtk_api_ret_t rtk_filter_igrAcl_unmatchAction_get(rtk_port_t port, rtk_filter_unmatch_action_t* pAction)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pAction)
- return RT_ERR_NULL_POINTER;
-
- /* Check port valid */
- RTK_CHK_PORT_VALID(port);
-
- if((ret = rtl8367c_getAsicAclUnmatchedPermit(rtk_switch_port_L2P_get(port), pAction)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_state_set
- * Description:
- * Set state of ingress ACL.
- * Input:
- * port - Port id.
- * state - Ingress ACL state.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port id.
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function gets action of packets when no ACL configruation matches.
- */
-rtk_api_ret_t rtk_filter_igrAcl_state_set(rtk_port_t port, rtk_filter_state_t state)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- /* Check port valid */
- RTK_CHK_PORT_VALID(port);
-
- if(state >= RTK_ENABLE_END)
- return RT_ERR_INPUT;
-
- if((ret = rtl8367c_setAsicAcl(rtk_switch_port_L2P_get(port), state)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_state_get
- * Description:
- * Get state of ingress ACL.
- * Input:
- * port - Port id.
- * Output:
- * pState - Ingress ACL state.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port id.
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function gets action of packets when no ACL configruation matches.
- */
-rtk_api_ret_t rtk_filter_igrAcl_state_get(rtk_port_t port, rtk_filter_state_t* pState)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pState)
- return RT_ERR_NULL_POINTER;
-
- /* Check port valid */
- RTK_CHK_PORT_VALID(port);
-
- if((ret = rtl8367c_getAsicAcl(rtk_switch_port_L2P_get(port), pState)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-/* Function Name:
- * rtk_filter_igrAcl_template_set
- * Description:
- * Set template of ingress ACL.
- * Input:
- * template - Ingress ACL template
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * Note:
- * This function set ACL template.
- */
-rtk_api_ret_t rtk_filter_igrAcl_template_set(rtk_filter_template_t *aclTemplate)
-{
- rtk_api_ret_t retVal;
- rtk_uint32 idxField;
- rtl8367c_acltemplate_t aclType;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(aclTemplate->index >= RTK_MAX_NUM_OF_FILTER_TYPE)
- return RT_ERR_INPUT;
-
- for(idxField = 0; idxField < RTK_MAX_NUM_OF_FILTER_FIELD; idxField++)
- {
- if(aclTemplate->fieldType[idxField] < FILTER_FIELD_RAW_DMAC_15_0 ||
- (aclTemplate->fieldType[idxField] > FILTER_FIELD_RAW_CTAG && aclTemplate->fieldType[idxField] < FILTER_FIELD_RAW_IPV4_SIP_15_0 ) ||
- (aclTemplate->fieldType[idxField] > FILTER_FIELD_RAW_IPV4_DIP_31_16 && aclTemplate->fieldType[idxField] < FILTER_FIELD_RAW_IPV6_SIP_15_0 ) ||
- (aclTemplate->fieldType[idxField] > FILTER_FIELD_RAW_IPV6_DIP_31_16 && aclTemplate->fieldType[idxField] < FILTER_FIELD_RAW_VIDRANGE ) ||
- (aclTemplate->fieldType[idxField] > FILTER_FIELD_RAW_FIELD_VALID && aclTemplate->fieldType[idxField] < FILTER_FIELD_RAW_FIELD_SELECT00 ) ||
- aclTemplate->fieldType[idxField] >= FILTER_FIELD_RAW_END)
- {
- return RT_ERR_INPUT;
- }
- }
-
- for(idxField = 0; idxField < RTK_MAX_NUM_OF_FILTER_FIELD; idxField++)
- {
- aclType.field[idxField] = aclTemplate->fieldType[idxField];
- }
-
- if((retVal = rtl8367c_setAsicAclTemplate(aclTemplate->index, &aclType)) != RT_ERR_OK)
- return retVal;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_template_get
- * Description:
- * Get template of ingress ACL.
- * Input:
- * template - Ingress ACL template
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * Note:
- * This function gets template of ACL.
- */
-rtk_api_ret_t rtk_filter_igrAcl_template_get(rtk_filter_template_t *aclTemplate)
-{
- rtk_api_ret_t ret;
- rtk_uint32 idxField;
- rtl8367c_acltemplate_t aclType;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == aclTemplate)
- return RT_ERR_NULL_POINTER;
-
- if(aclTemplate->index >= RTK_MAX_NUM_OF_FILTER_TYPE)
- return RT_ERR_INPUT;
-
- if((ret = rtl8367c_getAsicAclTemplate(aclTemplate->index, &aclType)) != RT_ERR_OK)
- return ret;
-
- for(idxField = 0; idxField < RTK_MAX_NUM_OF_FILTER_FIELD; idxField ++)
- {
- aclTemplate->fieldType[idxField] = aclType.field[idxField];
- }
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_field_sel_set
- * Description:
- * Set user defined field selectors in HSB
- * Input:
- * index - index of field selector 0-15
- * format - Format of field selector
- * offset - Retrieving data offset
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * Note:
- * System support 16 user defined field selctors.
- * Each selector can be enabled or disable.
- * User can defined retrieving 16-bits in many predefiend
- * standard l2/l3/l4 payload.
- */
-rtk_api_ret_t rtk_filter_igrAcl_field_sel_set(rtk_uint32 index, rtk_field_sel_t format, rtk_uint32 offset)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(index >= RTL8367C_FIELDSEL_FORMAT_NUMBER)
- return RT_ERR_OUT_OF_RANGE;
-
- if(format >= FORMAT_END)
- return RT_ERR_OUT_OF_RANGE;
-
- if(offset > RTL8367C_FIELDSEL_MAX_OFFSET)
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_setAsicFieldSelector(index, (rtk_uint32)format, offset)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAcl_field_sel_get
- * Description:
- * Get user defined field selectors in HSB
- * Input:
- * index - index of field selector 0-15
- * Output:
- * pFormat - Format of field selector
- * pOffset - Retrieving data offset
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * Note:
- * None.
- */
-rtk_api_ret_t rtk_filter_igrAcl_field_sel_get(rtk_uint32 index, rtk_field_sel_t *pFormat, rtk_uint32 *pOffset)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pFormat || NULL == pOffset)
- return RT_ERR_NULL_POINTER;
-
- if(index >= RTL8367C_FIELDSEL_FORMAT_NUMBER)
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_getAsicFieldSelector(index, pFormat, pOffset)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_iprange_set
- * Description:
- * Set IP Range check
- * Input:
- * index - index of IP Range 0-15
- * type - IP Range check type, 0:Delete a entry, 1: IPv4_SIP, 2: IPv4_DIP, 3:IPv6_SIP, 4:IPv6_DIP
- * upperIp - The upper bound of IP range
- * lowerIp - The lower Bound of IP range
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * RT_ERR_INPUT - Input error
- * Note:
- * upperIp must be larger or equal than lowerIp.
- */
-rtk_api_ret_t rtk_filter_iprange_set(rtk_uint32 index, rtk_filter_iprange_t type, ipaddr_t upperIp, ipaddr_t lowerIp)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if(type >= IPRANGE_END)
- return RT_ERR_OUT_OF_RANGE;
-
- if(lowerIp > upperIp)
- return RT_ERR_INPUT;
-
- if((ret = rtl8367c_setAsicAclIpRange(index, type, upperIp, lowerIp)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_iprange_get
- * Description:
- * Set IP Range check
- * Input:
- * index - index of IP Range 0-15
- * Output:
- * pType - IP Range check type, 0:Delete a entry, 1: IPv4_SIP, 2: IPv4_DIP, 3:IPv6_SIP, 4:IPv6_DIP
- * pUpperIp - The upper bound of IP range
- * pLowerIp - The lower Bound of IP range
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * Note:
- * None.
- */
-rtk_api_ret_t rtk_filter_iprange_get(rtk_uint32 index, rtk_filter_iprange_t *pType, ipaddr_t *pUpperIp, ipaddr_t *pLowerIp)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if((NULL == pType) || (NULL == pUpperIp) || (NULL == pLowerIp))
- return RT_ERR_NULL_POINTER;
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_getAsicAclIpRange(index, pType, pUpperIp, pLowerIp)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_vidrange_set
- * Description:
- * Set VID Range check
- * Input:
- * index - index of VID Range 0-15
- * type - IP Range check type, 0:Delete a entry, 1: CVID, 2: SVID
- * upperVid - The upper bound of VID range
- * lowerVid - The lower Bound of VID range
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * RT_ERR_INPUT - Input error
- * Note:
- * upperVid must be larger or equal than lowerVid.
- */
-rtk_api_ret_t rtk_filter_vidrange_set(rtk_uint32 index, rtk_filter_vidrange_t type, rtk_uint32 upperVid, rtk_uint32 lowerVid)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if(type >= VIDRANGE_END)
- return RT_ERR_OUT_OF_RANGE;
-
- if(lowerVid > upperVid)
- return RT_ERR_INPUT;
-
- if( (upperVid > RTL8367C_VIDMAX) || (lowerVid > RTL8367C_VIDMAX))
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_setAsicAclVidRange(index, type, upperVid, lowerVid)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_vidrange_get
- * Description:
- * Get VID Range check
- * Input:
- * index - index of VID Range 0-15
- * Output:
- * pType - IP Range check type, 0:Unused, 1: CVID, 2: SVID
- * pUpperVid - The upper bound of VID range
- * pLowerVid - The lower Bound of VID range
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * Note:
- * None.
- */
-rtk_api_ret_t rtk_filter_vidrange_get(rtk_uint32 index, rtk_filter_vidrange_t *pType, rtk_uint32 *pUpperVid, rtk_uint32 *pLowerVid)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if((NULL == pType) || (NULL == pUpperVid) || (NULL == pLowerVid))
- return RT_ERR_NULL_POINTER;
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_getAsicAclVidRange(index, pType, pUpperVid, pLowerVid)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_portrange_set
- * Description:
- * Set Port Range check
- * Input:
- * index - index of Port Range 0-15
- * type - IP Range check type, 0:Delete a entry, 1: Source Port, 2: Destnation Port
- * upperPort - The upper bound of Port range
- * lowerPort - The lower Bound of Port range
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * RT_ERR_INPUT - Input error
- * Note:
- * upperPort must be larger or equal than lowerPort.
- */
-rtk_api_ret_t rtk_filter_portrange_set(rtk_uint32 index, rtk_filter_portrange_t type, rtk_uint32 upperPort, rtk_uint32 lowerPort)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if(type >= PORTRANGE_END)
- return RT_ERR_OUT_OF_RANGE;
-
- if(lowerPort > upperPort)
- return RT_ERR_INPUT;
-
- if(upperPort > RTL8367C_ACL_PORTRANGEMAX)
- return RT_ERR_INPUT;
-
- if(lowerPort > RTL8367C_ACL_PORTRANGEMAX)
- return RT_ERR_INPUT;
-
- if((ret = rtl8367c_setAsicAclPortRange(index, type, upperPort, lowerPort)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_portrange_get
- * Description:
- * Set Port Range check
- * Input:
- * index - index of Port Range 0-15
- * Output:
- * pType - IP Range check type, 0:Delete a entry, 1: Source Port, 2: Destnation Port
- * pUpperPort - The upper bound of Port range
- * pLowerPort - The lower Bound of Port range
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_OUT_OF_RANGE - The parameter is out of range
- * RT_ERR_INPUT - Input error
- * Note:
- * None.
- */
-rtk_api_ret_t rtk_filter_portrange_get(rtk_uint32 index, rtk_filter_portrange_t *pType, rtk_uint32 *pUpperPort, rtk_uint32 *pLowerPort)
-{
- rtk_api_ret_t ret;
-
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if((NULL == pType) || (NULL == pUpperPort) || (NULL == pLowerPort))
- return RT_ERR_NULL_POINTER;
-
- if(index > RTL8367C_ACLRANGEMAX)
- return RT_ERR_OUT_OF_RANGE;
-
- if((ret = rtl8367c_getAsicAclPortRange(index, pType, pUpperPort, pLowerPort)) != RT_ERR_OK)
- return ret;
-
- return RT_ERR_OK;
-}
-
-/* Function Name:
- * rtk_filter_igrAclPolarity_set
- * Description:
- * Set ACL Goip control palarity
- * Input:
- * polarity - 1: High, 0: Low
- * Output:
- * None
- * Return:
- * RT_ERR_OK - Success
- * RT_ERR_SMI - SMI access error
- * Note:
- * none
- */
-rtk_api_ret_t rtk_filter_igrAclPolarity_set(rtk_uint32 polarity)
-{
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(polarity > 1)
- return RT_ERR_OUT_OF_RANGE;
- return rtl8367c_setAsicAclGpioPolarity(polarity);
-}
-/* Function Name:
- * rtk_filter_igrAclPolarity_get
- * Description:
- * Get ACL Goip control palarity
- * Input:
- * pPolarity - 1: High, 0: Low
- * Output:
- * None
- * Return:
- * RT_ERR_OK - Success
- * RT_ERR_SMI - SMI access error
- * Note:
- * none
- */
-rtk_api_ret_t rtk_filter_igrAclPolarity_get(rtk_uint32* pPolarity)
-{
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
-
- if(NULL == pPolarity)
- return RT_ERR_NULL_POINTER;
-
- return rtl8367c_getAsicAclGpioPolarity(pPolarity);
-}
-
-
-
-