123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124 |
- /*
- * 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 VLAN module.
- *
- */
- #include <rtk_switch.h>
- #include <rtk_error.h>
- #include <vlan.h>
- #include <rate.h>
- #include <string.h>
- #include <rtl8367c_asicdrv.h>
- #include <rtl8367c_asicdrv_vlan.h>
- #include <rtl8367c_asicdrv_dot1x.h>
- typedef enum vlan_mbrCfgType_e
- {
- MBRCFG_UNUSED = 0,
- MBRCFG_USED_BY_VLAN,
- MBRCFG_END
- }vlan_mbrCfgType_t;
- static rtk_vlan_t vlan_mbrCfgVid[RTL8367C_CVIDXNO];
- static vlan_mbrCfgType_t vlan_mbrCfgUsage[RTL8367C_CVIDXNO];
- /* Function Name:
- * rtk_vlan_init
- * Description:
- * Initialize VLAN.
- * Input:
- * None
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * Note:
- * VLAN is disabled by default. User has to call this API to enable VLAN before
- * using it. And It will set a default VLAN(vid 1) including all ports and set
- * all ports PVID to the default VLAN.
- */
- rtk_api_ret_t rtk_vlan_init(void)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 i;
- rtl8367c_user_vlan4kentry vlan4K;
- rtl8367c_vlanconfiguser vlanMC;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Clean Database */
- memset(vlan_mbrCfgVid, 0x00, sizeof(rtk_vlan_t) * RTL8367C_CVIDXNO);
- memset(vlan_mbrCfgUsage, 0x00, sizeof(vlan_mbrCfgType_t) * RTL8367C_CVIDXNO);
- /* clean 32 VLAN member configuration */
- for (i = 0; i <= RTL8367C_CVIDXMAX; i++)
- {
- vlanMC.evid = 0;
- vlanMC.mbr = 0;
- vlanMC.fid_msti = 0;
- vlanMC.envlanpol = 0;
- vlanMC.meteridx = 0;
- vlanMC.vbpen = 0;
- vlanMC.vbpri = 0;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(i, &vlanMC)) != RT_ERR_OK)
- return retVal;
- }
- /* Set a default VLAN with vid 1 to 4K table for all ports */
- memset(&vlan4K, 0, sizeof(rtl8367c_user_vlan4kentry));
- vlan4K.vid = 1;
- vlan4K.mbr = RTK_PHY_PORTMASK_ALL;
- vlan4K.untag = RTK_PHY_PORTMASK_ALL;
- vlan4K.fid_msti = 0;
- if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- /* Also set the default VLAN to 32 member configuration index 0 */
- memset(&vlanMC, 0, sizeof(rtl8367c_vlanconfiguser));
- vlanMC.evid = 1;
- vlanMC.mbr = RTK_PHY_PORTMASK_ALL;
- vlanMC.fid_msti = 0;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(0, &vlanMC)) != RT_ERR_OK)
- return retVal;
- /* Set all ports PVID to default VLAN and tag-mode to original */
- RTK_SCAN_ALL_PHY_PORTMASK(i)
- {
- if ((retVal = rtl8367c_setAsicVlanPortBasedVID(i, 0, 0)) != RT_ERR_OK)
- return retVal;
- if ((retVal = rtl8367c_setAsicVlanEgressTagMode(i, EG_TAG_MODE_ORI)) != RT_ERR_OK)
- return retVal;
- }
- /* Updata Databse */
- vlan_mbrCfgUsage[0] = MBRCFG_USED_BY_VLAN;
- vlan_mbrCfgVid[0] = 1;
- /* Enable Ingress filter */
- RTK_SCAN_ALL_PHY_PORTMASK(i)
- {
- if ((retVal = rtl8367c_setAsicVlanIngressFilter(i, ENABLED)) != RT_ERR_OK)
- return retVal;
- }
- /* enable VLAN */
- if ((retVal = rtl8367c_setAsicVlanFilter(ENABLED)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_set
- * Description:
- * Set a VLAN entry.
- * Input:
- * vid - VLAN ID to configure.
- * pVlanCfg - VLAN Configuration
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_L2_FID - Invalid FID.
- * RT_ERR_VLAN_PORT_MBR_EXIST - Invalid member port mask.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_set(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 phyMbrPmask;
- rtk_uint32 phyUntagPmask;
- rtl8367c_user_vlan4kentry vlan4K;
- rtl8367c_vlanconfiguser vlanMC;
- rtk_uint32 idx;
- rtk_uint32 empty_index = 0xffff;
- rtk_uint32 update_evid = 0;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* vid must be 0~8191 */
- if (vid > RTL8367C_EVIDMAX)
- return RT_ERR_VLAN_VID;
- /* Null pointer check */
- if(NULL == pVlanCfg)
- return RT_ERR_NULL_POINTER;
- /* Check port mask valid */
- RTK_CHK_PORTMASK_VALID(&(pVlanCfg->mbr));
- if (vid <= RTL8367C_VIDMAX)
- {
- /* Check untag port mask valid */
- RTK_CHK_PORTMASK_VALID(&(pVlanCfg->untag));
- }
- /* IVL_EN */
- if(pVlanCfg->ivl_en >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- /* fid must be 0~15 */
- if(pVlanCfg->fid_msti > RTL8367C_FIDMAX)
- return RT_ERR_L2_FID;
- /* Policing */
- if(pVlanCfg->envlanpol >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- /* Meter ID */
- if(pVlanCfg->meteridx > RTK_MAX_METER_ID)
- return RT_ERR_INPUT;
- /* VLAN based priority */
- if(pVlanCfg->vbpen >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- /* Priority */
- if(pVlanCfg->vbpri > RTL8367C_PRIMAX)
- return RT_ERR_INPUT;
- /* Get physical port mask */
- if(rtk_switch_portmask_L2P_get(&(pVlanCfg->mbr), &phyMbrPmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- if(rtk_switch_portmask_L2P_get(&(pVlanCfg->untag), &phyUntagPmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- if (vid <= RTL8367C_VIDMAX)
- {
- /* update 4K table */
- memset(&vlan4K, 0, sizeof(rtl8367c_user_vlan4kentry));
- vlan4K.vid = vid;
- vlan4K.mbr = (phyMbrPmask & 0xFFFF);
- vlan4K.untag = (phyUntagPmask & 0xFFFF);
- vlan4K.ivl_svl = pVlanCfg->ivl_en;
- vlan4K.fid_msti = pVlanCfg->fid_msti;
- vlan4K.envlanpol = pVlanCfg->envlanpol;
- vlan4K.meteridx = pVlanCfg->meteridx;
- vlan4K.vbpen = pVlanCfg->vbpen;
- vlan4K.vbpri = pVlanCfg->vbpri;
- if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- /* Update Member configuration if exist */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
- {
- if(vlan_mbrCfgVid[idx] == vid)
- {
- /* Found! Update */
- if(phyMbrPmask == 0x00)
- {
- /* Member port = 0x00, delete this VLAN from Member Configuration */
- memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- /* Clear Database */
- vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
- vlan_mbrCfgVid[idx] = 0;
- }
- else
- {
- /* Normal VLAN config, update to member configuration */
- vlanMC.evid = vid;
- vlanMC.mbr = vlan4K.mbr;
- vlanMC.fid_msti = vlan4K.fid_msti;
- vlanMC.meteridx = vlan4K.meteridx;
- vlanMC.envlanpol= vlan4K.envlanpol;
- vlanMC.vbpen = vlan4K.vbpen;
- vlanMC.vbpri = vlan4K.vbpri;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- }
- break;
- }
- }
- }
- }
- else
- {
- /* vid > 4095 */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
- {
- if(vlan_mbrCfgVid[idx] == vid)
- {
- /* Found! Update */
- if(phyMbrPmask == 0x00)
- {
- /* Member port = 0x00, delete this VLAN from Member Configuration */
- memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- /* Clear Database */
- vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
- vlan_mbrCfgVid[idx] = 0;
- }
- else
- {
- /* Normal VLAN config, update to member configuration */
- vlanMC.evid = vid;
- vlanMC.mbr = phyMbrPmask;
- vlanMC.fid_msti = pVlanCfg->fid_msti;
- vlanMC.meteridx = pVlanCfg->meteridx;
- vlanMC.envlanpol= pVlanCfg->envlanpol;
- vlanMC.vbpen = pVlanCfg->vbpen;
- vlanMC.vbpri = pVlanCfg->vbpri;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- break;
- }
- update_evid = 1;
- }
- }
- if(vlan_mbrCfgUsage[idx] == MBRCFG_UNUSED)
- {
- if(0xffff == empty_index)
- empty_index = idx;
- }
- }
- /* doesn't find out same EVID entry and there is empty index in member configuration */
- if( (phyMbrPmask != 0x00) && (update_evid == 0) && (empty_index != 0xFFFF) )
- {
- vlanMC.evid = vid;
- vlanMC.mbr = phyMbrPmask;
- vlanMC.fid_msti = pVlanCfg->fid_msti;
- vlanMC.meteridx = pVlanCfg->meteridx;
- vlanMC.envlanpol= pVlanCfg->envlanpol;
- vlanMC.vbpen = pVlanCfg->vbpen;
- vlanMC.vbpri = pVlanCfg->vbpri;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_index, &vlanMC)) != RT_ERR_OK)
- return retVal;
- vlan_mbrCfgUsage[empty_index] = MBRCFG_USED_BY_VLAN;
- vlan_mbrCfgVid[empty_index] = vid;
- }
- }
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_get
- * Description:
- * Get a VLAN entry.
- * Input:
- * vid - VLAN ID to configure.
- * Output:
- * pVlanCfg - VLAN Configuration
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_get(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 phyMbrPmask;
- rtk_uint32 phyUntagPmask;
- rtl8367c_user_vlan4kentry vlan4K;
- rtl8367c_vlanconfiguser vlanMC;
- rtk_uint32 idx;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* vid must be 0~8191 */
- if (vid > RTL8367C_EVIDMAX)
- return RT_ERR_VLAN_VID;
- /* Null pointer check */
- if(NULL == pVlanCfg)
- return RT_ERR_NULL_POINTER;
- if (vid <= RTL8367C_VIDMAX)
- {
- vlan4K.vid = vid;
- if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- phyMbrPmask = vlan4K.mbr;
- phyUntagPmask = vlan4K.untag;
- if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pVlanCfg->mbr)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- if(rtk_switch_portmask_P2L_get(phyUntagPmask, &(pVlanCfg->untag)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- pVlanCfg->ivl_en = vlan4K.ivl_svl;
- pVlanCfg->fid_msti = vlan4K.fid_msti;
- pVlanCfg->envlanpol = vlan4K.envlanpol;
- pVlanCfg->meteridx = vlan4K.meteridx;
- pVlanCfg->vbpen = vlan4K.vbpen;
- pVlanCfg->vbpri = vlan4K.vbpri;
- }
- else
- {
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
- {
- if(vlan_mbrCfgVid[idx] == vid)
- {
- if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- phyMbrPmask = vlanMC.mbr;
- if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pVlanCfg->mbr)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- pVlanCfg->untag.bits[0] = 0;
- pVlanCfg->ivl_en = 0;
- pVlanCfg->fid_msti = vlanMC.fid_msti;
- pVlanCfg->envlanpol = vlanMC.envlanpol;
- pVlanCfg->meteridx = vlanMC.meteridx;
- pVlanCfg->vbpen = vlanMC.vbpen;
- pVlanCfg->vbpri = vlanMC.vbpri;
- }
- }
- }
- }
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_egrFilterEnable_set
- * Description:
- * Set VLAN egress filter.
- * Input:
- * egrFilter - Egress filtering
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_ENABLE - Invalid input parameters.
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_egrFilterEnable_set(rtk_enable_t egrFilter)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(egrFilter >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- /* enable VLAN */
- if ((retVal = rtl8367c_setAsicVlanFilter((rtk_uint32)egrFilter)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_egrFilterEnable_get
- * Description:
- * Get VLAN egress filter.
- * Input:
- * pEgrFilter - Egress filtering
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - NULL Pointer.
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_egrFilterEnable_get(rtk_enable_t *pEgrFilter)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 state;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(NULL == pEgrFilter)
- return RT_ERR_NULL_POINTER;
- /* enable VLAN */
- if ((retVal = rtl8367c_getAsicVlanFilter(&state)) != RT_ERR_OK)
- return retVal;
- *pEgrFilter = (rtk_enable_t)state;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_mbrCfg_set
- * Description:
- * Set a VLAN Member Configuration entry by index.
- * Input:
- * idx - Index of VLAN Member Configuration.
- * pMbrcfg - VLAN member Configuration.
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- * Set a VLAN Member Configuration entry by index.
- */
- rtk_api_ret_t rtk_vlan_mbrCfg_set(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 phyMbrPmask;
- rtl8367c_vlanconfiguser mbrCfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Error check */
- if(pMbrcfg == NULL)
- return RT_ERR_NULL_POINTER;
- if(idx > RTL8367C_CVIDXMAX)
- return RT_ERR_INPUT;
- if(pMbrcfg->evid > RTL8367C_EVIDMAX)
- return RT_ERR_INPUT;
- if(pMbrcfg->fid_msti > RTL8367C_FIDMAX)
- return RT_ERR_L2_FID;
- if(pMbrcfg->envlanpol >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- if(pMbrcfg->meteridx > RTK_MAX_METER_ID)
- return RT_ERR_FILTER_METER_ID;
- if(pMbrcfg->vbpen >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- if(pMbrcfg->vbpri > RTL8367C_PRIMAX)
- return RT_ERR_QOS_INT_PRIORITY;
- /* Check port mask valid */
- RTK_CHK_PORTMASK_VALID(&(pMbrcfg->mbr));
- mbrCfg.evid = pMbrcfg->evid;
- mbrCfg.fid_msti = pMbrcfg->fid_msti;
- mbrCfg.envlanpol = pMbrcfg->envlanpol;
- mbrCfg.meteridx = pMbrcfg->meteridx;
- mbrCfg.vbpen = pMbrcfg->vbpen;
- mbrCfg.vbpri = pMbrcfg->vbpri;
- if(rtk_switch_portmask_L2P_get(&(pMbrcfg->mbr), &phyMbrPmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- mbrCfg.mbr = phyMbrPmask;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &mbrCfg)) != RT_ERR_OK)
- return retVal;
- /* Update Database */
- if( (mbrCfg.evid == 0) && (mbrCfg.mbr == 0) )
- {
- vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
- vlan_mbrCfgVid[idx] = 0;
- }
- else
- {
- vlan_mbrCfgUsage[idx] = MBRCFG_USED_BY_VLAN;
- vlan_mbrCfgVid[idx] = mbrCfg.evid;
- }
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_mbrCfg_get
- * Description:
- * Get a VLAN Member Configuration entry by index.
- * Input:
- * idx - Index of VLAN Member Configuration.
- * Output:
- * pMbrcfg - VLAN member Configuration.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- * Get a VLAN Member Configuration entry by index.
- */
- rtk_api_ret_t rtk_vlan_mbrCfg_get(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 phyMbrPmask;
- rtl8367c_vlanconfiguser mbrCfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Error check */
- if(pMbrcfg == NULL)
- return RT_ERR_NULL_POINTER;
- if(idx > RTL8367C_CVIDXMAX)
- return RT_ERR_INPUT;
- memset(&mbrCfg, 0x00, sizeof(rtl8367c_vlanconfiguser));
- if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &mbrCfg)) != RT_ERR_OK)
- return retVal;
- pMbrcfg->evid = mbrCfg.evid;
- pMbrcfg->fid_msti = mbrCfg.fid_msti;
- pMbrcfg->envlanpol = mbrCfg.envlanpol;
- pMbrcfg->meteridx = mbrCfg.meteridx;
- pMbrcfg->vbpen = mbrCfg.vbpen;
- pMbrcfg->vbpri = mbrCfg.vbpri;
- phyMbrPmask = mbrCfg.mbr;
- if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pMbrcfg->mbr)) != RT_ERR_OK)
- return RT_ERR_FAILED;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portPvid_set
- * Description:
- * Set port to specified VLAN ID(PVID).
- * Input:
- * port - Port id.
- * pvid - Specified VLAN ID.
- * priority - 802.1p priority for the PVID.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_VLAN_PRIORITY - Invalid priority.
- * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN entry not found.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- * The API is used for Port-based VLAN. The untagged frame received from the
- * port will be classified to the specified VLAN and assigned to the specified priority.
- */
- rtk_api_ret_t rtk_vlan_portPvid_set(rtk_port_t port, rtk_vlan_t pvid, rtk_pri_t priority)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 index;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- /* vid must be 0~8191 */
- if (pvid > RTL8367C_EVIDMAX)
- return RT_ERR_VLAN_VID;
- /* priority must be 0~7 */
- if (priority > RTL8367C_PRIMAX)
- return RT_ERR_VLAN_PRIORITY;
- if((retVal = rtk_vlan_checkAndCreateMbr(pvid, &index)) != RT_ERR_OK)
- return retVal;
- if ((retVal = rtl8367c_setAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port), index, priority)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portPvid_get
- * Description:
- * Get VLAN ID(PVID) on specified port.
- * Input:
- * port - Port id.
- * Output:
- * pPvid - Specified VLAN ID.
- * pPriority - 802.1p priority for the PVID.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * The API can get the PVID and 802.1p priority for the PVID of Port-based VLAN.
- */
- rtk_api_ret_t rtk_vlan_portPvid_get(rtk_port_t port, rtk_vlan_t *pPvid, rtk_pri_t *pPriority)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 index, pri;
- rtl8367c_vlanconfiguser mbrCfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pPvid)
- return RT_ERR_NULL_POINTER;
- if(NULL == pPriority)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port), &index, &pri)) != RT_ERR_OK)
- return retVal;
- memset(&mbrCfg, 0x00, sizeof(rtl8367c_vlanconfiguser));
- if ((retVal = rtl8367c_getAsicVlanMemberConfig(index, &mbrCfg)) != RT_ERR_OK)
- return retVal;
- *pPvid = mbrCfg.evid;
- *pPriority = pri;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portIgrFilterEnable_set
- * Description:
- * Set VLAN ingress for each port.
- * Input:
- * port - Port id.
- * igr_filter - VLAN ingress function enable status.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number
- * RT_ERR_ENABLE - Invalid enable input
- * Note:
- * The status of vlan ingress filter is as following:
- * - DISABLED
- * - ENABLED
- * While VLAN function is enabled, ASIC will decide VLAN ID for each received frame and get belonged member
- * ports from VLAN table. If received port is not belonged to VLAN member ports, ASIC will drop received frame if VLAN ingress function is enabled.
- */
- rtk_api_ret_t rtk_vlan_portIgrFilterEnable_set(rtk_port_t port, rtk_enable_t igr_filter)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (igr_filter >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- if ((retVal = rtl8367c_setAsicVlanIngressFilter(rtk_switch_port_L2P_get(port), igr_filter)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portIgrFilterEnable_get
- * Description:
- * Get VLAN Ingress Filter
- * Input:
- * port - Port id.
- * Output:
- * pIgr_filter - VLAN ingress function enable status.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * The API can Get the VLAN ingress filter status.
- * The status of vlan ingress filter is as following:
- * - DISABLED
- * - ENABLED
- */
- rtk_api_ret_t rtk_vlan_portIgrFilterEnable_get(rtk_port_t port, rtk_enable_t *pIgr_filter)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pIgr_filter)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanIngressFilter(rtk_switch_port_L2P_get(port), pIgr_filter)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portAcceptFrameType_set
- * Description:
- * Set VLAN accept_frame_type
- * Input:
- * port - Port id.
- * accept_frame_type - accept frame type
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type.
- * Note:
- * The API is used for checking 802.1Q tagged frames.
- * The accept frame type as following:
- * - ACCEPT_FRAME_TYPE_ALL
- * - ACCEPT_FRAME_TYPE_TAG_ONLY
- * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
- */
- rtk_api_ret_t rtk_vlan_portAcceptFrameType_set(rtk_port_t port, rtk_vlan_acceptFrameType_t accept_frame_type)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (accept_frame_type >= ACCEPT_FRAME_TYPE_END)
- return RT_ERR_VLAN_ACCEPT_FRAME_TYPE;
- if ((retVal = rtl8367c_setAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port), (rtl8367c_accframetype)accept_frame_type)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portAcceptFrameType_get
- * Description:
- * Get VLAN accept_frame_type
- * Input:
- * port - Port id.
- * Output:
- * pAccept_frame_type - accept frame type
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * The API can Get the VLAN ingress filter.
- * The accept frame type as following:
- * - ACCEPT_FRAME_TYPE_ALL
- * - ACCEPT_FRAME_TYPE_TAG_ONLY
- * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
- */
- rtk_api_ret_t rtk_vlan_portAcceptFrameType_get(rtk_port_t port, rtk_vlan_acceptFrameType_t *pAccept_frame_type)
- {
- rtk_api_ret_t retVal;
- rtl8367c_accframetype acc_frm_type;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pAccept_frame_type)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port), &acc_frm_type)) != RT_ERR_OK)
- return retVal;
- *pAccept_frame_type = (rtk_vlan_acceptFrameType_t)acc_frm_type;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_protoAndPortBasedVlan_add
- * Description:
- * Add the protocol-and-port-based vlan to the specified port of device.
- * Input:
- * port - Port id.
- * pInfo - Protocol and port based VLAN configuration information.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * RT_ERR_VLAN_PRIORITY - Invalid priority.
- * RT_ERR_TBL_FULL - Table is full.
- * RT_ERR_OUT_OF_RANGE - input out of range.
- * Note:
- * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
- * The frame type is shown in the following:
- * - FRAME_TYPE_ETHERNET
- * - FRAME_TYPE_RFC1042
- * - FRAME_TYPE_LLCOTHER
- */
- rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_add(rtk_port_t port, rtk_vlan_protoAndPortInfo_t *pInfo)
- {
- rtk_api_ret_t retVal, i;
- rtk_uint32 exist, empty, used, index;
- rtl8367c_protocolgdatacfg ppb_data_cfg;
- rtl8367c_protocolvlancfg ppb_vlan_cfg;
- rtl8367c_provlan_frametype tmp;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pInfo)
- return RT_ERR_NULL_POINTER;
- if (pInfo->proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
- return RT_ERR_OUT_OF_RANGE;
- if (pInfo->frame_type >= FRAME_TYPE_END)
- return RT_ERR_OUT_OF_RANGE;
- if (pInfo->cvid > RTL8367C_VIDMAX)
- return RT_ERR_VLAN_VID;
- if (pInfo->cpri > RTL8367C_PRIMAX)
- return RT_ERR_VLAN_PRIORITY;
- exist = 0xFF;
- empty = 0xFF;
- for (i = RTL8367C_PROTOVLAN_GIDX_MAX; i >= 0; i--)
- {
- if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- tmp = (rtl8367c_provlan_frametype)pInfo->frame_type;
- if (ppb_data_cfg.etherType == pInfo->proto_type && ppb_data_cfg.frameType == tmp)
- {
- /*Already exist*/
- exist = i;
- break;
- }
- else if (ppb_data_cfg.etherType == 0 && ppb_data_cfg.frameType == 0)
- {
- /*find empty index*/
- empty = i;
- }
- }
- used = 0xFF;
- /*No empty and exist index*/
- if (0xFF == exist && 0xFF == empty)
- return RT_ERR_TBL_FULL;
- else if (exist<RTL8367C_PROTOVLAN_GROUPNO)
- {
- /*exist index*/
- used = exist;
- }
- else if (empty<RTL8367C_PROTOVLAN_GROUPNO)
- {
- /*No exist index, but have empty index*/
- ppb_data_cfg.frameType = (rtl8367c_provlan_frametype)pInfo->frame_type;
- ppb_data_cfg.etherType = pInfo->proto_type;
- if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(empty, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- used = empty;
- }
- else
- return RT_ERR_FAILED;
- if((retVal = rtk_vlan_checkAndCreateMbr(pInfo->cvid, &index)) != RT_ERR_OK)
- return retVal;
- ppb_vlan_cfg.vlan_idx = index;
- ppb_vlan_cfg.valid = TRUE;
- ppb_vlan_cfg.priority = pInfo->cpri;
- if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), used, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_protoAndPortBasedVlan_get
- * Description:
- * Get the protocol-and-port-based vlan to the specified port of device.
- * Input:
- * port - Port id.
- * proto_type - protocol-and-port-based vlan protocol type.
- * frame_type - protocol-and-port-based vlan frame type.
- * Output:
- * pInfo - Protocol and port based VLAN configuration information.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_OUT_OF_RANGE - input out of range.
- * RT_ERR_TBL_FULL - Table is full.
- * Note:
- * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
- * The frame type is shown in the following:
- * - FRAME_TYPE_ETHERNET
- * - FRAME_TYPE_RFC1042
- * - FRAME_TYPE_LLCOTHER
- */
- rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_get(rtk_port_t port, rtk_vlan_proto_type_t proto_type, rtk_vlan_protoVlan_frameType_t frame_type, rtk_vlan_protoAndPortInfo_t *pInfo)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 i;
- rtk_uint32 ppb_idx;
- rtl8367c_protocolgdatacfg ppb_data_cfg;
- rtl8367c_protocolvlancfg ppb_vlan_cfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
- return RT_ERR_OUT_OF_RANGE;
- if (frame_type >= FRAME_TYPE_END)
- return RT_ERR_OUT_OF_RANGE;
- ppb_idx = 0;
- for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
- {
- if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- if ( (ppb_data_cfg.frameType == (rtl8367c_provlan_frametype)frame_type) && (ppb_data_cfg.etherType == proto_type) )
- {
- ppb_idx = i;
- break;
- }
- else if (RTL8367C_PROTOVLAN_GIDX_MAX == i)
- return RT_ERR_TBL_FULL;
- }
- if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- if (FALSE == ppb_vlan_cfg.valid)
- return RT_ERR_FAILED;
- pInfo->frame_type = frame_type;
- pInfo->proto_type = proto_type;
- pInfo->cvid = vlan_mbrCfgVid[ppb_vlan_cfg.vlan_idx];
- pInfo->cpri = ppb_vlan_cfg.priority;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_protoAndPortBasedVlan_del
- * Description:
- * Delete the protocol-and-port-based vlan from the specified port of device.
- * Input:
- * port - Port id.
- * proto_type - protocol-and-port-based vlan protocol type.
- * frame_type - protocol-and-port-based vlan frame type.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_OUT_OF_RANGE - input out of range.
- * RT_ERR_TBL_FULL - Table is full.
- * Note:
- * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
- * The frame type is shown in the following:
- * - FRAME_TYPE_ETHERNET
- * - FRAME_TYPE_RFC1042
- * - FRAME_TYPE_LLCOTHER
- */
- rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_del(rtk_port_t port, rtk_vlan_proto_type_t proto_type, rtk_vlan_protoVlan_frameType_t frame_type)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 i, bUsed;
- rtk_uint32 ppb_idx;
- rtl8367c_protocolgdatacfg ppb_data_cfg;
- rtl8367c_protocolvlancfg ppb_vlan_cfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
- return RT_ERR_OUT_OF_RANGE;
- if (frame_type >= FRAME_TYPE_END)
- return RT_ERR_OUT_OF_RANGE;
- ppb_idx = 0;
- for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
- {
- if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- if ( (ppb_data_cfg.frameType == (rtl8367c_provlan_frametype)frame_type) && (ppb_data_cfg.etherType == proto_type) )
- {
- ppb_idx = i;
- ppb_vlan_cfg.valid = FALSE;
- ppb_vlan_cfg.vlan_idx = 0;
- ppb_vlan_cfg.priority = 0;
- if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- }
- }
- bUsed = FALSE;
- RTK_SCAN_ALL_PHY_PORTMASK(i)
- {
- if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(i, ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- if (TRUE == ppb_vlan_cfg.valid)
- {
- bUsed = TRUE;
- break;
- }
- }
- if (FALSE == bUsed) /*No Port use this PPB Index, Delete it*/
- {
- ppb_data_cfg.etherType=0;
- ppb_data_cfg.frameType=0;
- if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(ppb_idx, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- }
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_protoAndPortBasedVlan_delAll
- * Description:
- * Delete all protocol-and-port-based vlans from the specified port of device.
- * Input:
- * port - Port id.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_OUT_OF_RANGE - input out of range.
- * Note:
- * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
- * Delete all flow table protocol-and-port-based vlan entries.
- */
- rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_delAll(rtk_port_t port)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 i, j, bUsed[4];
- rtl8367c_protocolgdatacfg ppb_data_cfg;
- rtl8367c_protocolvlancfg ppb_vlan_cfg;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
- {
- ppb_vlan_cfg.valid = FALSE;
- ppb_vlan_cfg.vlan_idx = 0;
- ppb_vlan_cfg.priority = 0;
- if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), i, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- }
- bUsed[0] = FALSE;
- bUsed[1] = FALSE;
- bUsed[2] = FALSE;
- bUsed[3] = FALSE;
- RTK_SCAN_ALL_PHY_PORTMASK(i)
- {
- for (j = 0; j <= RTL8367C_PROTOVLAN_GIDX_MAX; j++)
- {
- if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(i,j, &ppb_vlan_cfg)) != RT_ERR_OK)
- return retVal;
- if (TRUE == ppb_vlan_cfg.valid)
- {
- bUsed[j] = TRUE;
- }
- }
- }
- for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
- {
- if (FALSE == bUsed[i]) /*No Port use this PPB Index, Delete it*/
- {
- ppb_data_cfg.etherType=0;
- ppb_data_cfg.frameType=0;
- if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
- return retVal;
- }
- }
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_tagMode_set
- * Description:
- * Set CVLAN egress tag mode
- * Input:
- * port - Port id.
- * tag_mode - The egress tag mode.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_INPUT - Invalid input parameter.
- * RT_ERR_ENABLE - Invalid enable input.
- * Note:
- * The API can set Egress tag mode. There are 4 mode for egress tag:
- * - VLAN_TAG_MODE_ORIGINAL,
- * - VLAN_TAG_MODE_KEEP_FORMAT,
- * - VLAN_TAG_MODE_PRI.
- * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
- */
- rtk_api_ret_t rtk_vlan_tagMode_set(rtk_port_t port, rtk_vlan_tagMode_t tag_mode)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (tag_mode >= VLAN_TAG_MODE_END)
- return RT_ERR_PORT_ID;
- if ((retVal = rtl8367c_setAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port), (rtl8367c_egtagmode)tag_mode)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_tagMode_get
- * Description:
- * Get CVLAN egress tag mode
- * Input:
- * port - Port id.
- * Output:
- * pTag_mode - The egress tag mode.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * The API can get Egress tag mode. There are 4 mode for egress tag:
- * - VLAN_TAG_MODE_ORIGINAL,
- * - VLAN_TAG_MODE_KEEP_FORMAT,
- * - VLAN_TAG_MODE_PRI.
- * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
- */
- rtk_api_ret_t rtk_vlan_tagMode_get(rtk_port_t port, rtk_vlan_tagMode_t *pTag_mode)
- {
- rtk_api_ret_t retVal;
- rtl8367c_egtagmode mode;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pTag_mode)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port), &mode)) != RT_ERR_OK)
- return retVal;
- *pTag_mode = (rtk_vlan_tagMode_t)mode;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_transparent_set
- * Description:
- * Set VLAN transparent mode
- * Input:
- * egr_port - Egress Port id.
- * pIgr_pmask - Ingress Port Mask.
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * None.
- */
- rtk_api_ret_t rtk_vlan_transparent_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 pmask;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(egr_port);
- if(NULL == pIgr_pmask)
- return RT_ERR_NULL_POINTER;
- RTK_CHK_PORTMASK_VALID(pIgr_pmask);
- if(rtk_switch_portmask_L2P_get(pIgr_pmask, &pmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- if ((retVal = rtl8367c_setAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port), pmask)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_transparent_get
- * Description:
- * Get VLAN transparent mode
- * Input:
- * egr_port - Egress Port id.
- * Output:
- * pIgr_pmask - Ingress Port Mask
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * None.
- */
- rtk_api_ret_t rtk_vlan_transparent_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 pmask;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(egr_port);
- if(NULL == pIgr_pmask)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port), &pmask)) != RT_ERR_OK)
- return retVal;
- if(rtk_switch_portmask_P2L_get(pmask, pIgr_pmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_keep_set
- * Description:
- * Set VLAN egress keep mode
- * Input:
- * egr_port - Egress Port id.
- * pIgr_pmask - Ingress Port Mask.
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * None.
- */
- rtk_api_ret_t rtk_vlan_keep_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 pmask;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(egr_port);
- if(NULL == pIgr_pmask)
- return RT_ERR_NULL_POINTER;
- RTK_CHK_PORTMASK_VALID(pIgr_pmask);
- if(rtk_switch_portmask_L2P_get(pIgr_pmask, &pmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- if ((retVal = rtl8367c_setAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port), pmask)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_keep_get
- * Description:
- * Get VLAN egress keep mode
- * Input:
- * egr_port - Egress Port id.
- * Output:
- * pIgr_pmask - Ingress Port Mask
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port number.
- * Note:
- * None.
- */
- rtk_api_ret_t rtk_vlan_keep_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 pmask;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(egr_port);
- if(NULL == pIgr_pmask)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port), &pmask)) != RT_ERR_OK)
- return retVal;
- if(rtk_switch_portmask_P2L_get(pmask, pIgr_pmask) != RT_ERR_OK)
- return RT_ERR_FAILED;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_stg_set
- * Description:
- * Set spanning tree group instance of the vlan to the specified device
- * Input:
- * vid - Specified VLAN ID.
- * stg - spanning tree group instance.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_MSTI - Invalid msti parameter
- * RT_ERR_INPUT - Invalid input parameter.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- * The API can set spanning tree group instance of the vlan to the specified device.
- */
- rtk_api_ret_t rtk_vlan_stg_set(rtk_vlan_t vid, rtk_stp_msti_id_t stg)
- {
- rtk_api_ret_t retVal;
- rtl8367c_user_vlan4kentry vlan4K;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* vid must be 0~4095 */
- if (vid > RTL8367C_VIDMAX)
- return RT_ERR_VLAN_VID;
- /* priority must be 0~15 */
- if (stg > RTL8367C_MSTIMAX)
- return RT_ERR_MSTI;
- /* update 4K table */
- vlan4K.vid = vid;
- if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- vlan4K.fid_msti= stg;
- if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_stg_get
- * Description:
- * Get spanning tree group instance of the vlan to the specified device
- * Input:
- * vid - Specified VLAN ID.
- * Output:
- * pStg - spanning tree group instance.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_VLAN_VID - Invalid VID parameter.
- * Note:
- * The API can get spanning tree group instance of the vlan to the specified device.
- */
- rtk_api_ret_t rtk_vlan_stg_get(rtk_vlan_t vid, rtk_stp_msti_id_t *pStg)
- {
- rtk_api_ret_t retVal;
- rtl8367c_user_vlan4kentry vlan4K;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* vid must be 0~4095 */
- if (vid > RTL8367C_VIDMAX)
- return RT_ERR_VLAN_VID;
- if(NULL == pStg)
- return RT_ERR_NULL_POINTER;
- /* update 4K table */
- vlan4K.vid = vid;
- if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- *pStg = vlan4K.fid_msti;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portFid_set
- * Description:
- * Set port-based filtering database
- * Input:
- * port - Port id.
- * enable - ebable port-based FID
- * fid - Specified filtering database.
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_L2_FID - Invalid fid.
- * RT_ERR_INPUT - Invalid input parameter.
- * RT_ERR_PORT_ID - Invalid port ID.
- * Note:
- * The API can set port-based filtering database. If the function is enabled, all input
- * packets will be assigned to the port-based fid regardless vlan tag.
- */
- rtk_api_ret_t rtk_vlan_portFid_set(rtk_port_t port, rtk_enable_t enable, rtk_fid_t fid)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (enable>=RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- /* fid must be 0~4095 */
- if (fid > RTK_FID_MAX)
- return RT_ERR_L2_FID;
- if ((retVal = rtl8367c_setAsicPortBasedFidEn(rtk_switch_port_L2P_get(port), enable))!=RT_ERR_OK)
- return retVal;
- if ((retVal = rtl8367c_setAsicPortBasedFid(rtk_switch_port_L2P_get(port), fid))!=RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_portFid_get
- * Description:
- * Get port-based filtering database
- * Input:
- * port - Port id.
- * Output:
- * pEnable - ebable port-based FID
- * pFid - Specified filtering database.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Invalid input parameters.
- * RT_ERR_PORT_ID - Invalid port ID.
- * Note:
- * The API can get port-based filtering database status. If the function is enabled, all input
- * packets will be assigned to the port-based fid regardless vlan tag.
- */
- rtk_api_ret_t rtk_vlan_portFid_get(rtk_port_t port, rtk_enable_t *pEnable, rtk_fid_t *pFid)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if(NULL == pEnable)
- return RT_ERR_NULL_POINTER;
- if(NULL == pFid)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicPortBasedFidEn(rtk_switch_port_L2P_get(port), pEnable))!=RT_ERR_OK)
- return retVal;
- if ((retVal = rtl8367c_getAsicPortBasedFid(rtk_switch_port_L2P_get(port), pFid))!=RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_UntagDscpPriorityEnable_set
- * Description:
- * Set Untag DSCP priority assign
- * Input:
- * enable - state of Untag DSCP priority assign
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_ENABLE - Invalid input parameters.
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_set(rtk_enable_t enable)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(enable >= RTK_ENABLE_END)
- return RT_ERR_ENABLE;
- if ((retVal = rtl8367c_setAsicVlanUntagDscpPriorityEn((rtk_uint32)enable)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_UntagDscpPriorityEnable_get
- * Description:
- * Get Untag DSCP priority assign
- * Input:
- * None
- * Output:
- * pEnable - state of Untag DSCP priority assign
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - Null pointer
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_get(rtk_enable_t *pEnable)
- {
- rtk_api_ret_t retVal;
- rtk_uint32 value;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(NULL == pEnable)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicVlanUntagDscpPriorityEn(&value)) != RT_ERR_OK)
- return retVal;
- *pEnable = (rtk_enable_t)value;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_stp_mstpState_set
- * Description:
- * Configure spanning tree state per each port.
- * Input:
- * port - Port id
- * msti - Multiple spanning tree instance.
- * stp_state - Spanning tree state for msti
- * Output:
- * None
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_MSTI - Invalid msti parameter.
- * RT_ERR_MSTP_STATE - Invalid STP state.
- * Note:
- * System supports per-port multiple spanning tree state for each msti.
- * There are four states supported by ASIC.
- * - STP_STATE_DISABLED
- * - STP_STATE_BLOCKING
- * - STP_STATE_LEARNING
- * - STP_STATE_FORWARDING
- */
- rtk_api_ret_t rtk_stp_mstpState_set(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t stp_state)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (msti > RTK_MAX_NUM_OF_MSTI)
- return RT_ERR_MSTI;
- if (stp_state >= STP_STATE_END)
- return RT_ERR_MSTP_STATE;
- if ((retVal = rtl8367c_setAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port), msti, stp_state)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_stp_mstpState_get
- * Description:
- * Get spanning tree state per each port.
- * Input:
- * port - Port id.
- * msti - Multiple spanning tree instance.
- * Output:
- * pStp_state - Spanning tree state for msti
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_PORT_ID - Invalid port number.
- * RT_ERR_MSTI - Invalid msti parameter.
- * Note:
- * System supports per-port multiple spanning tree state for each msti.
- * There are four states supported by ASIC.
- * - STP_STATE_DISABLED
- * - STP_STATE_BLOCKING
- * - STP_STATE_LEARNING
- * - STP_STATE_FORWARDING
- */
- rtk_api_ret_t rtk_stp_mstpState_get(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t *pStp_state)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* Check Port Valid */
- RTK_CHK_PORT_VALID(port);
- if (msti > RTK_MAX_NUM_OF_MSTI)
- return RT_ERR_MSTI;
- if(NULL == pStp_state)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port), msti, pStp_state)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_checkAndCreateMbr
- * Description:
- * Check and create Member configuration and return index
- * Input:
- * vid - VLAN id.
- * Output:
- * pIndex - Member configuration index
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_VLAN_VID - Invalid VLAN ID.
- * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN not found
- * RT_ERR_TBL_FULL - Member Configuration table full
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_checkAndCreateMbr(rtk_vlan_t vid, rtk_uint32 *pIndex)
- {
- rtk_api_ret_t retVal;
- rtl8367c_user_vlan4kentry vlan4K;
- rtl8367c_vlanconfiguser vlanMC;
- rtk_uint32 idx;
- rtk_uint32 empty_idx = 0xFFFF;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- /* vid must be 0~8191 */
- if (vid > RTL8367C_EVIDMAX)
- return RT_ERR_VLAN_VID;
- /* Null pointer check */
- if(NULL == pIndex)
- return RT_ERR_NULL_POINTER;
- /* Get 4K VLAN */
- if (vid <= RTL8367C_VIDMAX)
- {
- memset(&vlan4K, 0x00, sizeof(rtl8367c_user_vlan4kentry));
- vlan4K.vid = vid;
- if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
- return retVal;
- }
- /* Search exist entry */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
- {
- if(vlan_mbrCfgVid[idx] == vid)
- {
- /* Found! return index */
- *pIndex = idx;
- return RT_ERR_OK;
- }
- }
- }
- /* Not found, Read H/W Member Configuration table to update database */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- if( (vlanMC.evid == 0) && (vlanMC.mbr == 0x00))
- {
- vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
- vlan_mbrCfgVid[idx] = 0;
- }
- else
- {
- vlan_mbrCfgUsage[idx] = MBRCFG_USED_BY_VLAN;
- vlan_mbrCfgVid[idx] = vlanMC.evid;
- }
- }
- /* Search exist entry again */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
- {
- if(vlan_mbrCfgVid[idx] == vid)
- {
- /* Found! return index */
- *pIndex = idx;
- return RT_ERR_OK;
- }
- }
- }
- /* try to look up an empty index */
- for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
- {
- if(vlan_mbrCfgUsage[idx] == MBRCFG_UNUSED)
- {
- empty_idx = idx;
- break;
- }
- }
- if(empty_idx == 0xFFFF)
- {
- /* No empty index */
- return RT_ERR_TBL_FULL;
- }
- if (vid > RTL8367C_VIDMAX)
- {
- /* > 4K, there is no 4K entry, create on member configuration directly */
- memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
- vlanMC.evid = vid;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- }
- else
- {
- /* Copy from 4K table */
- vlanMC.evid = vid;
- vlanMC.mbr = vlan4K.mbr;
- vlanMC.fid_msti = vlan4K.fid_msti;
- vlanMC.meteridx= vlan4K.meteridx;
- vlanMC.envlanpol= vlan4K.envlanpol;
- vlanMC.vbpen = vlan4K.vbpen;
- vlanMC.vbpri = vlan4K.vbpri;
- if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_idx, &vlanMC)) != RT_ERR_OK)
- return retVal;
- }
- /* Update Database */
- vlan_mbrCfgUsage[empty_idx] = MBRCFG_USED_BY_VLAN;
- vlan_mbrCfgVid[empty_idx] = vid;
- *pIndex = empty_idx;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_reservedVidAction_set
- * Description:
- * Set Action of VLAN ID = 0 & 4095 tagged packet
- * Input:
- * action_vid0 - Action for VID 0.
- * action_vid4095 - Action for VID 4095.
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Error Input
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_reservedVidAction_set(rtk_vlan_resVidAction_t action_vid0, rtk_vlan_resVidAction_t action_vid4095)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(action_vid0 >= RESVID_ACTION_END)
- return RT_ERR_INPUT;
- if(action_vid4095 >= RESVID_ACTION_END)
- return RT_ERR_INPUT;
- if ((retVal = rtl8367c_setReservedVidAction((rtk_uint32)action_vid0, (rtk_uint32)action_vid4095)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_reservedVidAction_get
- * Description:
- * Get Action of VLAN ID = 0 & 4095 tagged packet
- * Input:
- * pAction_vid0 - Action for VID 0.
- * pAction_vid4095 - Action for VID 4095.
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_NULL_POINTER - NULL Pointer
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_reservedVidAction_get(rtk_vlan_resVidAction_t *pAction_vid0, rtk_vlan_resVidAction_t *pAction_vid4095)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(pAction_vid0 == NULL)
- return RT_ERR_NULL_POINTER;
- if(pAction_vid4095 == NULL)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getReservedVidAction((rtk_uint32 *)pAction_vid0, (rtk_uint32 *)pAction_vid4095)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_realKeepRemarkEnable_set
- * Description:
- * Set Real keep 1p remarking feature
- * Input:
- * enabled - State of 1p remarking at real keep packet
- * Output:
- * None.
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Error Input
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_set(rtk_enable_t enabled)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(enabled >= RTK_ENABLE_END)
- return RT_ERR_INPUT;
- if ((retVal = rtl8367c_setRealKeepRemarkEn((rtk_uint32)enabled)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_realKeepRemarkEnable_get
- * Description:
- * Get Real keep 1p remarking feature
- * Input:
- * None.
- * Output:
- * pEnabled - State of 1p remarking at real keep packet
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Error Input
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_get(rtk_enable_t *pEnabled)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if(NULL == pEnabled)
- return RT_ERR_NULL_POINTER;
- if ((retVal = rtl8367c_getRealKeepRemarkEn((rtk_uint32 *)pEnabled)) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
- /* Function Name:
- * rtk_vlan_reset
- * Description:
- * Reset VLAN
- * Input:
- * None.
- * Output:
- * pEnabled - State of 1p remarking at real keep packet
- * Return:
- * RT_ERR_OK - OK
- * RT_ERR_FAILED - Failed
- * RT_ERR_SMI - SMI access error
- * RT_ERR_INPUT - Error Input
- * Note:
- *
- */
- rtk_api_ret_t rtk_vlan_reset(void)
- {
- rtk_api_ret_t retVal;
- /* Check initialization state */
- RTK_CHK_INIT_STATE();
- if ((retVal = rtl8367c_resetVlan()) != RT_ERR_OK)
- return retVal;
- return RT_ERR_OK;
- }
|