vlan.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124
  1. /*
  2. * Copyright (C) 2013 Realtek Semiconductor Corp.
  3. * All Rights Reserved.
  4. *
  5. * Unless you and Realtek execute a separate written software license
  6. * agreement governing use of this software, this software is licensed
  7. * to you under the terms of the GNU General Public License version 2,
  8. * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
  9. *
  10. * $Revision: 76306 $
  11. * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
  12. *
  13. * Purpose : RTK switch high-level API for RTL8367/RTL8367C
  14. * Feature : Here is a list of all functions and variables in VLAN module.
  15. *
  16. */
  17. #include <rtk_switch.h>
  18. #include <rtk_error.h>
  19. #include <vlan.h>
  20. #include <rate.h>
  21. #include <string.h>
  22. #include <rtl8367c_asicdrv.h>
  23. #include <rtl8367c_asicdrv_vlan.h>
  24. #include <rtl8367c_asicdrv_dot1x.h>
  25. typedef enum vlan_mbrCfgType_e
  26. {
  27. MBRCFG_UNUSED = 0,
  28. MBRCFG_USED_BY_VLAN,
  29. MBRCFG_END
  30. }vlan_mbrCfgType_t;
  31. static rtk_vlan_t vlan_mbrCfgVid[RTL8367C_CVIDXNO];
  32. static vlan_mbrCfgType_t vlan_mbrCfgUsage[RTL8367C_CVIDXNO];
  33. /* Function Name:
  34. * rtk_vlan_init
  35. * Description:
  36. * Initialize VLAN.
  37. * Input:
  38. * None
  39. * Output:
  40. * None
  41. * Return:
  42. * RT_ERR_OK - OK
  43. * RT_ERR_FAILED - Failed
  44. * RT_ERR_SMI - SMI access error
  45. * Note:
  46. * VLAN is disabled by default. User has to call this API to enable VLAN before
  47. * using it. And It will set a default VLAN(vid 1) including all ports and set
  48. * all ports PVID to the default VLAN.
  49. */
  50. rtk_api_ret_t rtk_vlan_init(void)
  51. {
  52. rtk_api_ret_t retVal;
  53. rtk_uint32 i;
  54. rtl8367c_user_vlan4kentry vlan4K;
  55. rtl8367c_vlanconfiguser vlanMC;
  56. /* Check initialization state */
  57. RTK_CHK_INIT_STATE();
  58. /* Clean Database */
  59. memset(vlan_mbrCfgVid, 0x00, sizeof(rtk_vlan_t) * RTL8367C_CVIDXNO);
  60. memset(vlan_mbrCfgUsage, 0x00, sizeof(vlan_mbrCfgType_t) * RTL8367C_CVIDXNO);
  61. /* clean 32 VLAN member configuration */
  62. for (i = 0; i <= RTL8367C_CVIDXMAX; i++)
  63. {
  64. vlanMC.evid = 0;
  65. vlanMC.mbr = 0;
  66. vlanMC.fid_msti = 0;
  67. vlanMC.envlanpol = 0;
  68. vlanMC.meteridx = 0;
  69. vlanMC.vbpen = 0;
  70. vlanMC.vbpri = 0;
  71. if ((retVal = rtl8367c_setAsicVlanMemberConfig(i, &vlanMC)) != RT_ERR_OK)
  72. return retVal;
  73. }
  74. /* Set a default VLAN with vid 1 to 4K table for all ports */
  75. memset(&vlan4K, 0, sizeof(rtl8367c_user_vlan4kentry));
  76. vlan4K.vid = 1;
  77. vlan4K.mbr = RTK_PHY_PORTMASK_ALL;
  78. vlan4K.untag = RTK_PHY_PORTMASK_ALL;
  79. vlan4K.fid_msti = 0;
  80. if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  81. return retVal;
  82. /* Also set the default VLAN to 32 member configuration index 0 */
  83. memset(&vlanMC, 0, sizeof(rtl8367c_vlanconfiguser));
  84. vlanMC.evid = 1;
  85. vlanMC.mbr = RTK_PHY_PORTMASK_ALL;
  86. vlanMC.fid_msti = 0;
  87. if ((retVal = rtl8367c_setAsicVlanMemberConfig(0, &vlanMC)) != RT_ERR_OK)
  88. return retVal;
  89. /* Set all ports PVID to default VLAN and tag-mode to original */
  90. RTK_SCAN_ALL_PHY_PORTMASK(i)
  91. {
  92. if ((retVal = rtl8367c_setAsicVlanPortBasedVID(i, 0, 0)) != RT_ERR_OK)
  93. return retVal;
  94. if ((retVal = rtl8367c_setAsicVlanEgressTagMode(i, EG_TAG_MODE_ORI)) != RT_ERR_OK)
  95. return retVal;
  96. }
  97. /* Updata Databse */
  98. vlan_mbrCfgUsage[0] = MBRCFG_USED_BY_VLAN;
  99. vlan_mbrCfgVid[0] = 1;
  100. /* Enable Ingress filter */
  101. RTK_SCAN_ALL_PHY_PORTMASK(i)
  102. {
  103. if ((retVal = rtl8367c_setAsicVlanIngressFilter(i, ENABLED)) != RT_ERR_OK)
  104. return retVal;
  105. }
  106. /* enable VLAN */
  107. if ((retVal = rtl8367c_setAsicVlanFilter(ENABLED)) != RT_ERR_OK)
  108. return retVal;
  109. return RT_ERR_OK;
  110. }
  111. /* Function Name:
  112. * rtk_vlan_set
  113. * Description:
  114. * Set a VLAN entry.
  115. * Input:
  116. * vid - VLAN ID to configure.
  117. * pVlanCfg - VLAN Configuration
  118. * Output:
  119. * None
  120. * Return:
  121. * RT_ERR_OK - OK
  122. * RT_ERR_FAILED - Failed
  123. * RT_ERR_SMI - SMI access error
  124. * RT_ERR_INPUT - Invalid input parameters.
  125. * RT_ERR_L2_FID - Invalid FID.
  126. * RT_ERR_VLAN_PORT_MBR_EXIST - Invalid member port mask.
  127. * RT_ERR_VLAN_VID - Invalid VID parameter.
  128. * Note:
  129. *
  130. */
  131. rtk_api_ret_t rtk_vlan_set(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg)
  132. {
  133. rtk_api_ret_t retVal;
  134. rtk_uint32 phyMbrPmask;
  135. rtk_uint32 phyUntagPmask;
  136. rtl8367c_user_vlan4kentry vlan4K;
  137. rtl8367c_vlanconfiguser vlanMC;
  138. rtk_uint32 idx;
  139. rtk_uint32 empty_index = 0xffff;
  140. rtk_uint32 update_evid = 0;
  141. /* Check initialization state */
  142. RTK_CHK_INIT_STATE();
  143. /* vid must be 0~8191 */
  144. if (vid > RTL8367C_EVIDMAX)
  145. return RT_ERR_VLAN_VID;
  146. /* Null pointer check */
  147. if(NULL == pVlanCfg)
  148. return RT_ERR_NULL_POINTER;
  149. /* Check port mask valid */
  150. RTK_CHK_PORTMASK_VALID(&(pVlanCfg->mbr));
  151. if (vid <= RTL8367C_VIDMAX)
  152. {
  153. /* Check untag port mask valid */
  154. RTK_CHK_PORTMASK_VALID(&(pVlanCfg->untag));
  155. }
  156. /* IVL_EN */
  157. if(pVlanCfg->ivl_en >= RTK_ENABLE_END)
  158. return RT_ERR_ENABLE;
  159. /* fid must be 0~15 */
  160. if(pVlanCfg->fid_msti > RTL8367C_FIDMAX)
  161. return RT_ERR_L2_FID;
  162. /* Policing */
  163. if(pVlanCfg->envlanpol >= RTK_ENABLE_END)
  164. return RT_ERR_ENABLE;
  165. /* Meter ID */
  166. if(pVlanCfg->meteridx > RTK_MAX_METER_ID)
  167. return RT_ERR_INPUT;
  168. /* VLAN based priority */
  169. if(pVlanCfg->vbpen >= RTK_ENABLE_END)
  170. return RT_ERR_ENABLE;
  171. /* Priority */
  172. if(pVlanCfg->vbpri > RTL8367C_PRIMAX)
  173. return RT_ERR_INPUT;
  174. /* Get physical port mask */
  175. if(rtk_switch_portmask_L2P_get(&(pVlanCfg->mbr), &phyMbrPmask) != RT_ERR_OK)
  176. return RT_ERR_FAILED;
  177. if(rtk_switch_portmask_L2P_get(&(pVlanCfg->untag), &phyUntagPmask) != RT_ERR_OK)
  178. return RT_ERR_FAILED;
  179. if (vid <= RTL8367C_VIDMAX)
  180. {
  181. /* update 4K table */
  182. memset(&vlan4K, 0, sizeof(rtl8367c_user_vlan4kentry));
  183. vlan4K.vid = vid;
  184. vlan4K.mbr = (phyMbrPmask & 0xFFFF);
  185. vlan4K.untag = (phyUntagPmask & 0xFFFF);
  186. vlan4K.ivl_svl = pVlanCfg->ivl_en;
  187. vlan4K.fid_msti = pVlanCfg->fid_msti;
  188. vlan4K.envlanpol = pVlanCfg->envlanpol;
  189. vlan4K.meteridx = pVlanCfg->meteridx;
  190. vlan4K.vbpen = pVlanCfg->vbpen;
  191. vlan4K.vbpri = pVlanCfg->vbpri;
  192. if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  193. return retVal;
  194. /* Update Member configuration if exist */
  195. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  196. {
  197. if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
  198. {
  199. if(vlan_mbrCfgVid[idx] == vid)
  200. {
  201. /* Found! Update */
  202. if(phyMbrPmask == 0x00)
  203. {
  204. /* Member port = 0x00, delete this VLAN from Member Configuration */
  205. memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
  206. if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  207. return retVal;
  208. /* Clear Database */
  209. vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
  210. vlan_mbrCfgVid[idx] = 0;
  211. }
  212. else
  213. {
  214. /* Normal VLAN config, update to member configuration */
  215. vlanMC.evid = vid;
  216. vlanMC.mbr = vlan4K.mbr;
  217. vlanMC.fid_msti = vlan4K.fid_msti;
  218. vlanMC.meteridx = vlan4K.meteridx;
  219. vlanMC.envlanpol= vlan4K.envlanpol;
  220. vlanMC.vbpen = vlan4K.vbpen;
  221. vlanMC.vbpri = vlan4K.vbpri;
  222. if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  223. return retVal;
  224. }
  225. break;
  226. }
  227. }
  228. }
  229. }
  230. else
  231. {
  232. /* vid > 4095 */
  233. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  234. {
  235. if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
  236. {
  237. if(vlan_mbrCfgVid[idx] == vid)
  238. {
  239. /* Found! Update */
  240. if(phyMbrPmask == 0x00)
  241. {
  242. /* Member port = 0x00, delete this VLAN from Member Configuration */
  243. memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
  244. if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  245. return retVal;
  246. /* Clear Database */
  247. vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
  248. vlan_mbrCfgVid[idx] = 0;
  249. }
  250. else
  251. {
  252. /* Normal VLAN config, update to member configuration */
  253. vlanMC.evid = vid;
  254. vlanMC.mbr = phyMbrPmask;
  255. vlanMC.fid_msti = pVlanCfg->fid_msti;
  256. vlanMC.meteridx = pVlanCfg->meteridx;
  257. vlanMC.envlanpol= pVlanCfg->envlanpol;
  258. vlanMC.vbpen = pVlanCfg->vbpen;
  259. vlanMC.vbpri = pVlanCfg->vbpri;
  260. if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  261. return retVal;
  262. break;
  263. }
  264. update_evid = 1;
  265. }
  266. }
  267. if(vlan_mbrCfgUsage[idx] == MBRCFG_UNUSED)
  268. {
  269. if(0xffff == empty_index)
  270. empty_index = idx;
  271. }
  272. }
  273. /* doesn't find out same EVID entry and there is empty index in member configuration */
  274. if( (phyMbrPmask != 0x00) && (update_evid == 0) && (empty_index != 0xFFFF) )
  275. {
  276. vlanMC.evid = vid;
  277. vlanMC.mbr = phyMbrPmask;
  278. vlanMC.fid_msti = pVlanCfg->fid_msti;
  279. vlanMC.meteridx = pVlanCfg->meteridx;
  280. vlanMC.envlanpol= pVlanCfg->envlanpol;
  281. vlanMC.vbpen = pVlanCfg->vbpen;
  282. vlanMC.vbpri = pVlanCfg->vbpri;
  283. if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_index, &vlanMC)) != RT_ERR_OK)
  284. return retVal;
  285. vlan_mbrCfgUsage[empty_index] = MBRCFG_USED_BY_VLAN;
  286. vlan_mbrCfgVid[empty_index] = vid;
  287. }
  288. }
  289. return RT_ERR_OK;
  290. }
  291. /* Function Name:
  292. * rtk_vlan_get
  293. * Description:
  294. * Get a VLAN entry.
  295. * Input:
  296. * vid - VLAN ID to configure.
  297. * Output:
  298. * pVlanCfg - VLAN Configuration
  299. * Return:
  300. * RT_ERR_OK - OK
  301. * RT_ERR_FAILED - Failed
  302. * RT_ERR_SMI - SMI access error
  303. * RT_ERR_INPUT - Invalid input parameters.
  304. * RT_ERR_VLAN_VID - Invalid VID parameter.
  305. * Note:
  306. *
  307. */
  308. rtk_api_ret_t rtk_vlan_get(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg)
  309. {
  310. rtk_api_ret_t retVal;
  311. rtk_uint32 phyMbrPmask;
  312. rtk_uint32 phyUntagPmask;
  313. rtl8367c_user_vlan4kentry vlan4K;
  314. rtl8367c_vlanconfiguser vlanMC;
  315. rtk_uint32 idx;
  316. /* Check initialization state */
  317. RTK_CHK_INIT_STATE();
  318. /* vid must be 0~8191 */
  319. if (vid > RTL8367C_EVIDMAX)
  320. return RT_ERR_VLAN_VID;
  321. /* Null pointer check */
  322. if(NULL == pVlanCfg)
  323. return RT_ERR_NULL_POINTER;
  324. if (vid <= RTL8367C_VIDMAX)
  325. {
  326. vlan4K.vid = vid;
  327. if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  328. return retVal;
  329. phyMbrPmask = vlan4K.mbr;
  330. phyUntagPmask = vlan4K.untag;
  331. if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pVlanCfg->mbr)) != RT_ERR_OK)
  332. return RT_ERR_FAILED;
  333. if(rtk_switch_portmask_P2L_get(phyUntagPmask, &(pVlanCfg->untag)) != RT_ERR_OK)
  334. return RT_ERR_FAILED;
  335. pVlanCfg->ivl_en = vlan4K.ivl_svl;
  336. pVlanCfg->fid_msti = vlan4K.fid_msti;
  337. pVlanCfg->envlanpol = vlan4K.envlanpol;
  338. pVlanCfg->meteridx = vlan4K.meteridx;
  339. pVlanCfg->vbpen = vlan4K.vbpen;
  340. pVlanCfg->vbpri = vlan4K.vbpri;
  341. }
  342. else
  343. {
  344. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  345. {
  346. if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
  347. {
  348. if(vlan_mbrCfgVid[idx] == vid)
  349. {
  350. if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  351. return retVal;
  352. phyMbrPmask = vlanMC.mbr;
  353. if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pVlanCfg->mbr)) != RT_ERR_OK)
  354. return RT_ERR_FAILED;
  355. pVlanCfg->untag.bits[0] = 0;
  356. pVlanCfg->ivl_en = 0;
  357. pVlanCfg->fid_msti = vlanMC.fid_msti;
  358. pVlanCfg->envlanpol = vlanMC.envlanpol;
  359. pVlanCfg->meteridx = vlanMC.meteridx;
  360. pVlanCfg->vbpen = vlanMC.vbpen;
  361. pVlanCfg->vbpri = vlanMC.vbpri;
  362. }
  363. }
  364. }
  365. }
  366. return RT_ERR_OK;
  367. }
  368. /* Function Name:
  369. * rtk_vlan_egrFilterEnable_set
  370. * Description:
  371. * Set VLAN egress filter.
  372. * Input:
  373. * egrFilter - Egress filtering
  374. * Output:
  375. * None.
  376. * Return:
  377. * RT_ERR_OK - OK
  378. * RT_ERR_FAILED - Failed
  379. * RT_ERR_SMI - SMI access error
  380. * RT_ERR_ENABLE - Invalid input parameters.
  381. * Note:
  382. *
  383. */
  384. rtk_api_ret_t rtk_vlan_egrFilterEnable_set(rtk_enable_t egrFilter)
  385. {
  386. rtk_api_ret_t retVal;
  387. /* Check initialization state */
  388. RTK_CHK_INIT_STATE();
  389. if(egrFilter >= RTK_ENABLE_END)
  390. return RT_ERR_ENABLE;
  391. /* enable VLAN */
  392. if ((retVal = rtl8367c_setAsicVlanFilter((rtk_uint32)egrFilter)) != RT_ERR_OK)
  393. return retVal;
  394. return RT_ERR_OK;
  395. }
  396. /* Function Name:
  397. * rtk_vlan_egrFilterEnable_get
  398. * Description:
  399. * Get VLAN egress filter.
  400. * Input:
  401. * pEgrFilter - Egress filtering
  402. * Output:
  403. * None.
  404. * Return:
  405. * RT_ERR_OK - OK
  406. * RT_ERR_FAILED - Failed
  407. * RT_ERR_SMI - SMI access error
  408. * RT_ERR_NULL_POINTER - NULL Pointer.
  409. * Note:
  410. *
  411. */
  412. rtk_api_ret_t rtk_vlan_egrFilterEnable_get(rtk_enable_t *pEgrFilter)
  413. {
  414. rtk_api_ret_t retVal;
  415. rtk_uint32 state;
  416. /* Check initialization state */
  417. RTK_CHK_INIT_STATE();
  418. if(NULL == pEgrFilter)
  419. return RT_ERR_NULL_POINTER;
  420. /* enable VLAN */
  421. if ((retVal = rtl8367c_getAsicVlanFilter(&state)) != RT_ERR_OK)
  422. return retVal;
  423. *pEgrFilter = (rtk_enable_t)state;
  424. return RT_ERR_OK;
  425. }
  426. /* Function Name:
  427. * rtk_vlan_mbrCfg_set
  428. * Description:
  429. * Set a VLAN Member Configuration entry by index.
  430. * Input:
  431. * idx - Index of VLAN Member Configuration.
  432. * pMbrcfg - VLAN member Configuration.
  433. * Output:
  434. * None.
  435. * Return:
  436. * RT_ERR_OK - OK
  437. * RT_ERR_FAILED - Failed
  438. * RT_ERR_SMI - SMI access error
  439. * RT_ERR_INPUT - Invalid input parameters.
  440. * RT_ERR_VLAN_VID - Invalid VID parameter.
  441. * Note:
  442. * Set a VLAN Member Configuration entry by index.
  443. */
  444. rtk_api_ret_t rtk_vlan_mbrCfg_set(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg)
  445. {
  446. rtk_api_ret_t retVal;
  447. rtk_uint32 phyMbrPmask;
  448. rtl8367c_vlanconfiguser mbrCfg;
  449. /* Check initialization state */
  450. RTK_CHK_INIT_STATE();
  451. /* Error check */
  452. if(pMbrcfg == NULL)
  453. return RT_ERR_NULL_POINTER;
  454. if(idx > RTL8367C_CVIDXMAX)
  455. return RT_ERR_INPUT;
  456. if(pMbrcfg->evid > RTL8367C_EVIDMAX)
  457. return RT_ERR_INPUT;
  458. if(pMbrcfg->fid_msti > RTL8367C_FIDMAX)
  459. return RT_ERR_L2_FID;
  460. if(pMbrcfg->envlanpol >= RTK_ENABLE_END)
  461. return RT_ERR_ENABLE;
  462. if(pMbrcfg->meteridx > RTK_MAX_METER_ID)
  463. return RT_ERR_FILTER_METER_ID;
  464. if(pMbrcfg->vbpen >= RTK_ENABLE_END)
  465. return RT_ERR_ENABLE;
  466. if(pMbrcfg->vbpri > RTL8367C_PRIMAX)
  467. return RT_ERR_QOS_INT_PRIORITY;
  468. /* Check port mask valid */
  469. RTK_CHK_PORTMASK_VALID(&(pMbrcfg->mbr));
  470. mbrCfg.evid = pMbrcfg->evid;
  471. mbrCfg.fid_msti = pMbrcfg->fid_msti;
  472. mbrCfg.envlanpol = pMbrcfg->envlanpol;
  473. mbrCfg.meteridx = pMbrcfg->meteridx;
  474. mbrCfg.vbpen = pMbrcfg->vbpen;
  475. mbrCfg.vbpri = pMbrcfg->vbpri;
  476. if(rtk_switch_portmask_L2P_get(&(pMbrcfg->mbr), &phyMbrPmask) != RT_ERR_OK)
  477. return RT_ERR_FAILED;
  478. mbrCfg.mbr = phyMbrPmask;
  479. if ((retVal = rtl8367c_setAsicVlanMemberConfig(idx, &mbrCfg)) != RT_ERR_OK)
  480. return retVal;
  481. /* Update Database */
  482. if( (mbrCfg.evid == 0) && (mbrCfg.mbr == 0) )
  483. {
  484. vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
  485. vlan_mbrCfgVid[idx] = 0;
  486. }
  487. else
  488. {
  489. vlan_mbrCfgUsage[idx] = MBRCFG_USED_BY_VLAN;
  490. vlan_mbrCfgVid[idx] = mbrCfg.evid;
  491. }
  492. return RT_ERR_OK;
  493. }
  494. /* Function Name:
  495. * rtk_vlan_mbrCfg_get
  496. * Description:
  497. * Get a VLAN Member Configuration entry by index.
  498. * Input:
  499. * idx - Index of VLAN Member Configuration.
  500. * Output:
  501. * pMbrcfg - VLAN member Configuration.
  502. * Return:
  503. * RT_ERR_OK - OK
  504. * RT_ERR_FAILED - Failed
  505. * RT_ERR_SMI - SMI access error
  506. * RT_ERR_INPUT - Invalid input parameters.
  507. * RT_ERR_VLAN_VID - Invalid VID parameter.
  508. * Note:
  509. * Get a VLAN Member Configuration entry by index.
  510. */
  511. rtk_api_ret_t rtk_vlan_mbrCfg_get(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg)
  512. {
  513. rtk_api_ret_t retVal;
  514. rtk_uint32 phyMbrPmask;
  515. rtl8367c_vlanconfiguser mbrCfg;
  516. /* Check initialization state */
  517. RTK_CHK_INIT_STATE();
  518. /* Error check */
  519. if(pMbrcfg == NULL)
  520. return RT_ERR_NULL_POINTER;
  521. if(idx > RTL8367C_CVIDXMAX)
  522. return RT_ERR_INPUT;
  523. memset(&mbrCfg, 0x00, sizeof(rtl8367c_vlanconfiguser));
  524. if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &mbrCfg)) != RT_ERR_OK)
  525. return retVal;
  526. pMbrcfg->evid = mbrCfg.evid;
  527. pMbrcfg->fid_msti = mbrCfg.fid_msti;
  528. pMbrcfg->envlanpol = mbrCfg.envlanpol;
  529. pMbrcfg->meteridx = mbrCfg.meteridx;
  530. pMbrcfg->vbpen = mbrCfg.vbpen;
  531. pMbrcfg->vbpri = mbrCfg.vbpri;
  532. phyMbrPmask = mbrCfg.mbr;
  533. if(rtk_switch_portmask_P2L_get(phyMbrPmask, &(pMbrcfg->mbr)) != RT_ERR_OK)
  534. return RT_ERR_FAILED;
  535. return RT_ERR_OK;
  536. }
  537. /* Function Name:
  538. * rtk_vlan_portPvid_set
  539. * Description:
  540. * Set port to specified VLAN ID(PVID).
  541. * Input:
  542. * port - Port id.
  543. * pvid - Specified VLAN ID.
  544. * priority - 802.1p priority for the PVID.
  545. * Output:
  546. * None
  547. * Return:
  548. * RT_ERR_OK - OK
  549. * RT_ERR_FAILED - Failed
  550. * RT_ERR_SMI - SMI access error
  551. * RT_ERR_PORT_ID - Invalid port number.
  552. * RT_ERR_VLAN_PRIORITY - Invalid priority.
  553. * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN entry not found.
  554. * RT_ERR_VLAN_VID - Invalid VID parameter.
  555. * Note:
  556. * The API is used for Port-based VLAN. The untagged frame received from the
  557. * port will be classified to the specified VLAN and assigned to the specified priority.
  558. */
  559. rtk_api_ret_t rtk_vlan_portPvid_set(rtk_port_t port, rtk_vlan_t pvid, rtk_pri_t priority)
  560. {
  561. rtk_api_ret_t retVal;
  562. rtk_uint32 index;
  563. /* Check initialization state */
  564. RTK_CHK_INIT_STATE();
  565. /* Check Port Valid */
  566. RTK_CHK_PORT_VALID(port);
  567. /* vid must be 0~8191 */
  568. if (pvid > RTL8367C_EVIDMAX)
  569. return RT_ERR_VLAN_VID;
  570. /* priority must be 0~7 */
  571. if (priority > RTL8367C_PRIMAX)
  572. return RT_ERR_VLAN_PRIORITY;
  573. if((retVal = rtk_vlan_checkAndCreateMbr(pvid, &index)) != RT_ERR_OK)
  574. return retVal;
  575. if ((retVal = rtl8367c_setAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port), index, priority)) != RT_ERR_OK)
  576. return retVal;
  577. return RT_ERR_OK;
  578. }
  579. /* Function Name:
  580. * rtk_vlan_portPvid_get
  581. * Description:
  582. * Get VLAN ID(PVID) on specified port.
  583. * Input:
  584. * port - Port id.
  585. * Output:
  586. * pPvid - Specified VLAN ID.
  587. * pPriority - 802.1p priority for the PVID.
  588. * Return:
  589. * RT_ERR_OK - OK
  590. * RT_ERR_FAILED - Failed
  591. * RT_ERR_SMI - SMI access error
  592. * RT_ERR_INPUT - Invalid input parameters.
  593. * RT_ERR_PORT_ID - Invalid port number.
  594. * Note:
  595. * The API can get the PVID and 802.1p priority for the PVID of Port-based VLAN.
  596. */
  597. rtk_api_ret_t rtk_vlan_portPvid_get(rtk_port_t port, rtk_vlan_t *pPvid, rtk_pri_t *pPriority)
  598. {
  599. rtk_api_ret_t retVal;
  600. rtk_uint32 index, pri;
  601. rtl8367c_vlanconfiguser mbrCfg;
  602. /* Check initialization state */
  603. RTK_CHK_INIT_STATE();
  604. /* Check Port Valid */
  605. RTK_CHK_PORT_VALID(port);
  606. if(NULL == pPvid)
  607. return RT_ERR_NULL_POINTER;
  608. if(NULL == pPriority)
  609. return RT_ERR_NULL_POINTER;
  610. if ((retVal = rtl8367c_getAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port), &index, &pri)) != RT_ERR_OK)
  611. return retVal;
  612. memset(&mbrCfg, 0x00, sizeof(rtl8367c_vlanconfiguser));
  613. if ((retVal = rtl8367c_getAsicVlanMemberConfig(index, &mbrCfg)) != RT_ERR_OK)
  614. return retVal;
  615. *pPvid = mbrCfg.evid;
  616. *pPriority = pri;
  617. return RT_ERR_OK;
  618. }
  619. /* Function Name:
  620. * rtk_vlan_portIgrFilterEnable_set
  621. * Description:
  622. * Set VLAN ingress for each port.
  623. * Input:
  624. * port - Port id.
  625. * igr_filter - VLAN ingress function enable status.
  626. * Output:
  627. * None
  628. * Return:
  629. * RT_ERR_OK - OK
  630. * RT_ERR_FAILED - Failed
  631. * RT_ERR_SMI - SMI access error
  632. * RT_ERR_PORT_ID - Invalid port number
  633. * RT_ERR_ENABLE - Invalid enable input
  634. * Note:
  635. * The status of vlan ingress filter is as following:
  636. * - DISABLED
  637. * - ENABLED
  638. * While VLAN function is enabled, ASIC will decide VLAN ID for each received frame and get belonged member
  639. * 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.
  640. */
  641. rtk_api_ret_t rtk_vlan_portIgrFilterEnable_set(rtk_port_t port, rtk_enable_t igr_filter)
  642. {
  643. rtk_api_ret_t retVal;
  644. /* Check initialization state */
  645. RTK_CHK_INIT_STATE();
  646. /* Check Port Valid */
  647. RTK_CHK_PORT_VALID(port);
  648. if (igr_filter >= RTK_ENABLE_END)
  649. return RT_ERR_ENABLE;
  650. if ((retVal = rtl8367c_setAsicVlanIngressFilter(rtk_switch_port_L2P_get(port), igr_filter)) != RT_ERR_OK)
  651. return retVal;
  652. return RT_ERR_OK;
  653. }
  654. /* Function Name:
  655. * rtk_vlan_portIgrFilterEnable_get
  656. * Description:
  657. * Get VLAN Ingress Filter
  658. * Input:
  659. * port - Port id.
  660. * Output:
  661. * pIgr_filter - VLAN ingress function enable status.
  662. * Return:
  663. * RT_ERR_OK - OK
  664. * RT_ERR_FAILED - Failed
  665. * RT_ERR_SMI - SMI access error
  666. * RT_ERR_INPUT - Invalid input parameters.
  667. * RT_ERR_PORT_ID - Invalid port number.
  668. * Note:
  669. * The API can Get the VLAN ingress filter status.
  670. * The status of vlan ingress filter is as following:
  671. * - DISABLED
  672. * - ENABLED
  673. */
  674. rtk_api_ret_t rtk_vlan_portIgrFilterEnable_get(rtk_port_t port, rtk_enable_t *pIgr_filter)
  675. {
  676. rtk_api_ret_t retVal;
  677. /* Check initialization state */
  678. RTK_CHK_INIT_STATE();
  679. /* Check Port Valid */
  680. RTK_CHK_PORT_VALID(port);
  681. if(NULL == pIgr_filter)
  682. return RT_ERR_NULL_POINTER;
  683. if ((retVal = rtl8367c_getAsicVlanIngressFilter(rtk_switch_port_L2P_get(port), pIgr_filter)) != RT_ERR_OK)
  684. return retVal;
  685. return RT_ERR_OK;
  686. }
  687. /* Function Name:
  688. * rtk_vlan_portAcceptFrameType_set
  689. * Description:
  690. * Set VLAN accept_frame_type
  691. * Input:
  692. * port - Port id.
  693. * accept_frame_type - accept frame type
  694. * Output:
  695. * None
  696. * Return:
  697. * RT_ERR_OK - OK
  698. * RT_ERR_FAILED - Failed
  699. * RT_ERR_SMI - SMI access error
  700. * RT_ERR_PORT_ID - Invalid port number.
  701. * RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type.
  702. * Note:
  703. * The API is used for checking 802.1Q tagged frames.
  704. * The accept frame type as following:
  705. * - ACCEPT_FRAME_TYPE_ALL
  706. * - ACCEPT_FRAME_TYPE_TAG_ONLY
  707. * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
  708. */
  709. rtk_api_ret_t rtk_vlan_portAcceptFrameType_set(rtk_port_t port, rtk_vlan_acceptFrameType_t accept_frame_type)
  710. {
  711. rtk_api_ret_t retVal;
  712. /* Check initialization state */
  713. RTK_CHK_INIT_STATE();
  714. /* Check Port Valid */
  715. RTK_CHK_PORT_VALID(port);
  716. if (accept_frame_type >= ACCEPT_FRAME_TYPE_END)
  717. return RT_ERR_VLAN_ACCEPT_FRAME_TYPE;
  718. if ((retVal = rtl8367c_setAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port), (rtl8367c_accframetype)accept_frame_type)) != RT_ERR_OK)
  719. return retVal;
  720. return RT_ERR_OK;
  721. }
  722. /* Function Name:
  723. * rtk_vlan_portAcceptFrameType_get
  724. * Description:
  725. * Get VLAN accept_frame_type
  726. * Input:
  727. * port - Port id.
  728. * Output:
  729. * pAccept_frame_type - accept frame type
  730. * Return:
  731. * RT_ERR_OK - OK
  732. * RT_ERR_FAILED - Failed
  733. * RT_ERR_SMI - SMI access error
  734. * RT_ERR_INPUT - Invalid input parameters.
  735. * RT_ERR_PORT_ID - Invalid port number.
  736. * Note:
  737. * The API can Get the VLAN ingress filter.
  738. * The accept frame type as following:
  739. * - ACCEPT_FRAME_TYPE_ALL
  740. * - ACCEPT_FRAME_TYPE_TAG_ONLY
  741. * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
  742. */
  743. rtk_api_ret_t rtk_vlan_portAcceptFrameType_get(rtk_port_t port, rtk_vlan_acceptFrameType_t *pAccept_frame_type)
  744. {
  745. rtk_api_ret_t retVal;
  746. rtl8367c_accframetype acc_frm_type;
  747. /* Check initialization state */
  748. RTK_CHK_INIT_STATE();
  749. /* Check Port Valid */
  750. RTK_CHK_PORT_VALID(port);
  751. if(NULL == pAccept_frame_type)
  752. return RT_ERR_NULL_POINTER;
  753. if ((retVal = rtl8367c_getAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port), &acc_frm_type)) != RT_ERR_OK)
  754. return retVal;
  755. *pAccept_frame_type = (rtk_vlan_acceptFrameType_t)acc_frm_type;
  756. return RT_ERR_OK;
  757. }
  758. /* Function Name:
  759. * rtk_vlan_protoAndPortBasedVlan_add
  760. * Description:
  761. * Add the protocol-and-port-based vlan to the specified port of device.
  762. * Input:
  763. * port - Port id.
  764. * pInfo - Protocol and port based VLAN configuration information.
  765. * Output:
  766. * None
  767. * Return:
  768. * RT_ERR_OK - OK
  769. * RT_ERR_FAILED - Failed
  770. * RT_ERR_SMI - SMI access error
  771. * RT_ERR_PORT_ID - Invalid port number.
  772. * RT_ERR_VLAN_VID - Invalid VID parameter.
  773. * RT_ERR_VLAN_PRIORITY - Invalid priority.
  774. * RT_ERR_TBL_FULL - Table is full.
  775. * RT_ERR_OUT_OF_RANGE - input out of range.
  776. * Note:
  777. * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
  778. * The frame type is shown in the following:
  779. * - FRAME_TYPE_ETHERNET
  780. * - FRAME_TYPE_RFC1042
  781. * - FRAME_TYPE_LLCOTHER
  782. */
  783. rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_add(rtk_port_t port, rtk_vlan_protoAndPortInfo_t *pInfo)
  784. {
  785. rtk_api_ret_t retVal, i;
  786. rtk_uint32 exist, empty, used, index;
  787. rtl8367c_protocolgdatacfg ppb_data_cfg;
  788. rtl8367c_protocolvlancfg ppb_vlan_cfg;
  789. rtl8367c_provlan_frametype tmp;
  790. /* Check initialization state */
  791. RTK_CHK_INIT_STATE();
  792. /* Check Port Valid */
  793. RTK_CHK_PORT_VALID(port);
  794. if(NULL == pInfo)
  795. return RT_ERR_NULL_POINTER;
  796. if (pInfo->proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
  797. return RT_ERR_OUT_OF_RANGE;
  798. if (pInfo->frame_type >= FRAME_TYPE_END)
  799. return RT_ERR_OUT_OF_RANGE;
  800. if (pInfo->cvid > RTL8367C_VIDMAX)
  801. return RT_ERR_VLAN_VID;
  802. if (pInfo->cpri > RTL8367C_PRIMAX)
  803. return RT_ERR_VLAN_PRIORITY;
  804. exist = 0xFF;
  805. empty = 0xFF;
  806. for (i = RTL8367C_PROTOVLAN_GIDX_MAX; i >= 0; i--)
  807. {
  808. if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
  809. return retVal;
  810. tmp = (rtl8367c_provlan_frametype)pInfo->frame_type;
  811. if (ppb_data_cfg.etherType == pInfo->proto_type && ppb_data_cfg.frameType == tmp)
  812. {
  813. /*Already exist*/
  814. exist = i;
  815. break;
  816. }
  817. else if (ppb_data_cfg.etherType == 0 && ppb_data_cfg.frameType == 0)
  818. {
  819. /*find empty index*/
  820. empty = i;
  821. }
  822. }
  823. used = 0xFF;
  824. /*No empty and exist index*/
  825. if (0xFF == exist && 0xFF == empty)
  826. return RT_ERR_TBL_FULL;
  827. else if (exist<RTL8367C_PROTOVLAN_GROUPNO)
  828. {
  829. /*exist index*/
  830. used = exist;
  831. }
  832. else if (empty<RTL8367C_PROTOVLAN_GROUPNO)
  833. {
  834. /*No exist index, but have empty index*/
  835. ppb_data_cfg.frameType = (rtl8367c_provlan_frametype)pInfo->frame_type;
  836. ppb_data_cfg.etherType = pInfo->proto_type;
  837. if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(empty, &ppb_data_cfg)) != RT_ERR_OK)
  838. return retVal;
  839. used = empty;
  840. }
  841. else
  842. return RT_ERR_FAILED;
  843. if((retVal = rtk_vlan_checkAndCreateMbr(pInfo->cvid, &index)) != RT_ERR_OK)
  844. return retVal;
  845. ppb_vlan_cfg.vlan_idx = index;
  846. ppb_vlan_cfg.valid = TRUE;
  847. ppb_vlan_cfg.priority = pInfo->cpri;
  848. if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), used, &ppb_vlan_cfg)) != RT_ERR_OK)
  849. return retVal;
  850. return RT_ERR_OK;
  851. }
  852. /* Function Name:
  853. * rtk_vlan_protoAndPortBasedVlan_get
  854. * Description:
  855. * Get the protocol-and-port-based vlan to the specified port of device.
  856. * Input:
  857. * port - Port id.
  858. * proto_type - protocol-and-port-based vlan protocol type.
  859. * frame_type - protocol-and-port-based vlan frame type.
  860. * Output:
  861. * pInfo - Protocol and port based VLAN configuration information.
  862. * Return:
  863. * RT_ERR_OK - OK
  864. * RT_ERR_FAILED - Failed
  865. * RT_ERR_SMI - SMI access error
  866. * RT_ERR_PORT_ID - Invalid port number.
  867. * RT_ERR_OUT_OF_RANGE - input out of range.
  868. * RT_ERR_TBL_FULL - Table is full.
  869. * Note:
  870. * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
  871. * The frame type is shown in the following:
  872. * - FRAME_TYPE_ETHERNET
  873. * - FRAME_TYPE_RFC1042
  874. * - FRAME_TYPE_LLCOTHER
  875. */
  876. 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)
  877. {
  878. rtk_api_ret_t retVal;
  879. rtk_uint32 i;
  880. rtk_uint32 ppb_idx;
  881. rtl8367c_protocolgdatacfg ppb_data_cfg;
  882. rtl8367c_protocolvlancfg ppb_vlan_cfg;
  883. /* Check initialization state */
  884. RTK_CHK_INIT_STATE();
  885. /* Check Port Valid */
  886. RTK_CHK_PORT_VALID(port);
  887. if (proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
  888. return RT_ERR_OUT_OF_RANGE;
  889. if (frame_type >= FRAME_TYPE_END)
  890. return RT_ERR_OUT_OF_RANGE;
  891. ppb_idx = 0;
  892. for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
  893. {
  894. if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
  895. return retVal;
  896. if ( (ppb_data_cfg.frameType == (rtl8367c_provlan_frametype)frame_type) && (ppb_data_cfg.etherType == proto_type) )
  897. {
  898. ppb_idx = i;
  899. break;
  900. }
  901. else if (RTL8367C_PROTOVLAN_GIDX_MAX == i)
  902. return RT_ERR_TBL_FULL;
  903. }
  904. if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
  905. return retVal;
  906. if (FALSE == ppb_vlan_cfg.valid)
  907. return RT_ERR_FAILED;
  908. pInfo->frame_type = frame_type;
  909. pInfo->proto_type = proto_type;
  910. pInfo->cvid = vlan_mbrCfgVid[ppb_vlan_cfg.vlan_idx];
  911. pInfo->cpri = ppb_vlan_cfg.priority;
  912. return RT_ERR_OK;
  913. }
  914. /* Function Name:
  915. * rtk_vlan_protoAndPortBasedVlan_del
  916. * Description:
  917. * Delete the protocol-and-port-based vlan from the specified port of device.
  918. * Input:
  919. * port - Port id.
  920. * proto_type - protocol-and-port-based vlan protocol type.
  921. * frame_type - protocol-and-port-based vlan frame type.
  922. * Output:
  923. * None
  924. * Return:
  925. * RT_ERR_OK - OK
  926. * RT_ERR_FAILED - Failed
  927. * RT_ERR_SMI - SMI access error
  928. * RT_ERR_PORT_ID - Invalid port number.
  929. * RT_ERR_OUT_OF_RANGE - input out of range.
  930. * RT_ERR_TBL_FULL - Table is full.
  931. * Note:
  932. * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
  933. * The frame type is shown in the following:
  934. * - FRAME_TYPE_ETHERNET
  935. * - FRAME_TYPE_RFC1042
  936. * - FRAME_TYPE_LLCOTHER
  937. */
  938. 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)
  939. {
  940. rtk_api_ret_t retVal;
  941. rtk_uint32 i, bUsed;
  942. rtk_uint32 ppb_idx;
  943. rtl8367c_protocolgdatacfg ppb_data_cfg;
  944. rtl8367c_protocolvlancfg ppb_vlan_cfg;
  945. /* Check initialization state */
  946. RTK_CHK_INIT_STATE();
  947. /* Check Port Valid */
  948. RTK_CHK_PORT_VALID(port);
  949. if (proto_type > RTK_MAX_NUM_OF_PROTO_TYPE)
  950. return RT_ERR_OUT_OF_RANGE;
  951. if (frame_type >= FRAME_TYPE_END)
  952. return RT_ERR_OUT_OF_RANGE;
  953. ppb_idx = 0;
  954. for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
  955. {
  956. if ((retVal = rtl8367c_getAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
  957. return retVal;
  958. if ( (ppb_data_cfg.frameType == (rtl8367c_provlan_frametype)frame_type) && (ppb_data_cfg.etherType == proto_type) )
  959. {
  960. ppb_idx = i;
  961. ppb_vlan_cfg.valid = FALSE;
  962. ppb_vlan_cfg.vlan_idx = 0;
  963. ppb_vlan_cfg.priority = 0;
  964. if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
  965. return retVal;
  966. }
  967. }
  968. bUsed = FALSE;
  969. RTK_SCAN_ALL_PHY_PORTMASK(i)
  970. {
  971. if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(i, ppb_idx, &ppb_vlan_cfg)) != RT_ERR_OK)
  972. return retVal;
  973. if (TRUE == ppb_vlan_cfg.valid)
  974. {
  975. bUsed = TRUE;
  976. break;
  977. }
  978. }
  979. if (FALSE == bUsed) /*No Port use this PPB Index, Delete it*/
  980. {
  981. ppb_data_cfg.etherType=0;
  982. ppb_data_cfg.frameType=0;
  983. if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(ppb_idx, &ppb_data_cfg)) != RT_ERR_OK)
  984. return retVal;
  985. }
  986. return RT_ERR_OK;
  987. }
  988. /* Function Name:
  989. * rtk_vlan_protoAndPortBasedVlan_delAll
  990. * Description:
  991. * Delete all protocol-and-port-based vlans from the specified port of device.
  992. * Input:
  993. * port - Port id.
  994. * Output:
  995. * None
  996. * Return:
  997. * RT_ERR_OK - OK
  998. * RT_ERR_FAILED - Failed
  999. * RT_ERR_SMI - SMI access error
  1000. * RT_ERR_PORT_ID - Invalid port number.
  1001. * RT_ERR_OUT_OF_RANGE - input out of range.
  1002. * Note:
  1003. * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
  1004. * Delete all flow table protocol-and-port-based vlan entries.
  1005. */
  1006. rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_delAll(rtk_port_t port)
  1007. {
  1008. rtk_api_ret_t retVal;
  1009. rtk_uint32 i, j, bUsed[4];
  1010. rtl8367c_protocolgdatacfg ppb_data_cfg;
  1011. rtl8367c_protocolvlancfg ppb_vlan_cfg;
  1012. /* Check initialization state */
  1013. RTK_CHK_INIT_STATE();
  1014. /* Check Port Valid */
  1015. RTK_CHK_PORT_VALID(port);
  1016. for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
  1017. {
  1018. ppb_vlan_cfg.valid = FALSE;
  1019. ppb_vlan_cfg.vlan_idx = 0;
  1020. ppb_vlan_cfg.priority = 0;
  1021. if ((retVal = rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port), i, &ppb_vlan_cfg)) != RT_ERR_OK)
  1022. return retVal;
  1023. }
  1024. bUsed[0] = FALSE;
  1025. bUsed[1] = FALSE;
  1026. bUsed[2] = FALSE;
  1027. bUsed[3] = FALSE;
  1028. RTK_SCAN_ALL_PHY_PORTMASK(i)
  1029. {
  1030. for (j = 0; j <= RTL8367C_PROTOVLAN_GIDX_MAX; j++)
  1031. {
  1032. if ((retVal = rtl8367c_getAsicVlanPortAndProtocolBased(i,j, &ppb_vlan_cfg)) != RT_ERR_OK)
  1033. return retVal;
  1034. if (TRUE == ppb_vlan_cfg.valid)
  1035. {
  1036. bUsed[j] = TRUE;
  1037. }
  1038. }
  1039. }
  1040. for (i = 0; i<= RTL8367C_PROTOVLAN_GIDX_MAX; i++)
  1041. {
  1042. if (FALSE == bUsed[i]) /*No Port use this PPB Index, Delete it*/
  1043. {
  1044. ppb_data_cfg.etherType=0;
  1045. ppb_data_cfg.frameType=0;
  1046. if ((retVal = rtl8367c_setAsicVlanProtocolBasedGroupData(i, &ppb_data_cfg)) != RT_ERR_OK)
  1047. return retVal;
  1048. }
  1049. }
  1050. return RT_ERR_OK;
  1051. }
  1052. /* Function Name:
  1053. * rtk_vlan_tagMode_set
  1054. * Description:
  1055. * Set CVLAN egress tag mode
  1056. * Input:
  1057. * port - Port id.
  1058. * tag_mode - The egress tag mode.
  1059. * Output:
  1060. * None
  1061. * Return:
  1062. * RT_ERR_OK - OK
  1063. * RT_ERR_FAILED - Failed
  1064. * RT_ERR_SMI - SMI access error
  1065. * RT_ERR_PORT_ID - Invalid port number.
  1066. * RT_ERR_INPUT - Invalid input parameter.
  1067. * RT_ERR_ENABLE - Invalid enable input.
  1068. * Note:
  1069. * The API can set Egress tag mode. There are 4 mode for egress tag:
  1070. * - VLAN_TAG_MODE_ORIGINAL,
  1071. * - VLAN_TAG_MODE_KEEP_FORMAT,
  1072. * - VLAN_TAG_MODE_PRI.
  1073. * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
  1074. */
  1075. rtk_api_ret_t rtk_vlan_tagMode_set(rtk_port_t port, rtk_vlan_tagMode_t tag_mode)
  1076. {
  1077. rtk_api_ret_t retVal;
  1078. /* Check initialization state */
  1079. RTK_CHK_INIT_STATE();
  1080. /* Check Port Valid */
  1081. RTK_CHK_PORT_VALID(port);
  1082. if (tag_mode >= VLAN_TAG_MODE_END)
  1083. return RT_ERR_PORT_ID;
  1084. if ((retVal = rtl8367c_setAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port), (rtl8367c_egtagmode)tag_mode)) != RT_ERR_OK)
  1085. return retVal;
  1086. return RT_ERR_OK;
  1087. }
  1088. /* Function Name:
  1089. * rtk_vlan_tagMode_get
  1090. * Description:
  1091. * Get CVLAN egress tag mode
  1092. * Input:
  1093. * port - Port id.
  1094. * Output:
  1095. * pTag_mode - The egress tag mode.
  1096. * Return:
  1097. * RT_ERR_OK - OK
  1098. * RT_ERR_FAILED - Failed
  1099. * RT_ERR_SMI - SMI access error
  1100. * RT_ERR_INPUT - Invalid input parameters.
  1101. * RT_ERR_PORT_ID - Invalid port number.
  1102. * Note:
  1103. * The API can get Egress tag mode. There are 4 mode for egress tag:
  1104. * - VLAN_TAG_MODE_ORIGINAL,
  1105. * - VLAN_TAG_MODE_KEEP_FORMAT,
  1106. * - VLAN_TAG_MODE_PRI.
  1107. * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
  1108. */
  1109. rtk_api_ret_t rtk_vlan_tagMode_get(rtk_port_t port, rtk_vlan_tagMode_t *pTag_mode)
  1110. {
  1111. rtk_api_ret_t retVal;
  1112. rtl8367c_egtagmode mode;
  1113. /* Check initialization state */
  1114. RTK_CHK_INIT_STATE();
  1115. /* Check Port Valid */
  1116. RTK_CHK_PORT_VALID(port);
  1117. if(NULL == pTag_mode)
  1118. return RT_ERR_NULL_POINTER;
  1119. if ((retVal = rtl8367c_getAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port), &mode)) != RT_ERR_OK)
  1120. return retVal;
  1121. *pTag_mode = (rtk_vlan_tagMode_t)mode;
  1122. return RT_ERR_OK;
  1123. }
  1124. /* Function Name:
  1125. * rtk_vlan_transparent_set
  1126. * Description:
  1127. * Set VLAN transparent mode
  1128. * Input:
  1129. * egr_port - Egress Port id.
  1130. * pIgr_pmask - Ingress Port Mask.
  1131. * Output:
  1132. * None.
  1133. * Return:
  1134. * RT_ERR_OK - OK
  1135. * RT_ERR_FAILED - Failed
  1136. * RT_ERR_SMI - SMI access error
  1137. * RT_ERR_INPUT - Invalid input parameters.
  1138. * RT_ERR_PORT_ID - Invalid port number.
  1139. * Note:
  1140. * None.
  1141. */
  1142. rtk_api_ret_t rtk_vlan_transparent_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
  1143. {
  1144. rtk_api_ret_t retVal;
  1145. rtk_uint32 pmask;
  1146. /* Check initialization state */
  1147. RTK_CHK_INIT_STATE();
  1148. /* Check Port Valid */
  1149. RTK_CHK_PORT_VALID(egr_port);
  1150. if(NULL == pIgr_pmask)
  1151. return RT_ERR_NULL_POINTER;
  1152. RTK_CHK_PORTMASK_VALID(pIgr_pmask);
  1153. if(rtk_switch_portmask_L2P_get(pIgr_pmask, &pmask) != RT_ERR_OK)
  1154. return RT_ERR_FAILED;
  1155. if ((retVal = rtl8367c_setAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port), pmask)) != RT_ERR_OK)
  1156. return retVal;
  1157. return RT_ERR_OK;
  1158. }
  1159. /* Function Name:
  1160. * rtk_vlan_transparent_get
  1161. * Description:
  1162. * Get VLAN transparent mode
  1163. * Input:
  1164. * egr_port - Egress Port id.
  1165. * Output:
  1166. * pIgr_pmask - Ingress Port Mask
  1167. * Return:
  1168. * RT_ERR_OK - OK
  1169. * RT_ERR_FAILED - Failed
  1170. * RT_ERR_SMI - SMI access error
  1171. * RT_ERR_INPUT - Invalid input parameters.
  1172. * RT_ERR_PORT_ID - Invalid port number.
  1173. * Note:
  1174. * None.
  1175. */
  1176. rtk_api_ret_t rtk_vlan_transparent_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
  1177. {
  1178. rtk_api_ret_t retVal;
  1179. rtk_uint32 pmask;
  1180. /* Check initialization state */
  1181. RTK_CHK_INIT_STATE();
  1182. /* Check Port Valid */
  1183. RTK_CHK_PORT_VALID(egr_port);
  1184. if(NULL == pIgr_pmask)
  1185. return RT_ERR_NULL_POINTER;
  1186. if ((retVal = rtl8367c_getAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port), &pmask)) != RT_ERR_OK)
  1187. return retVal;
  1188. if(rtk_switch_portmask_P2L_get(pmask, pIgr_pmask) != RT_ERR_OK)
  1189. return RT_ERR_FAILED;
  1190. return RT_ERR_OK;
  1191. }
  1192. /* Function Name:
  1193. * rtk_vlan_keep_set
  1194. * Description:
  1195. * Set VLAN egress keep mode
  1196. * Input:
  1197. * egr_port - Egress Port id.
  1198. * pIgr_pmask - Ingress Port Mask.
  1199. * Output:
  1200. * None.
  1201. * Return:
  1202. * RT_ERR_OK - OK
  1203. * RT_ERR_FAILED - Failed
  1204. * RT_ERR_SMI - SMI access error
  1205. * RT_ERR_INPUT - Invalid input parameters.
  1206. * RT_ERR_PORT_ID - Invalid port number.
  1207. * Note:
  1208. * None.
  1209. */
  1210. rtk_api_ret_t rtk_vlan_keep_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
  1211. {
  1212. rtk_api_ret_t retVal;
  1213. rtk_uint32 pmask;
  1214. /* Check initialization state */
  1215. RTK_CHK_INIT_STATE();
  1216. /* Check Port Valid */
  1217. RTK_CHK_PORT_VALID(egr_port);
  1218. if(NULL == pIgr_pmask)
  1219. return RT_ERR_NULL_POINTER;
  1220. RTK_CHK_PORTMASK_VALID(pIgr_pmask);
  1221. if(rtk_switch_portmask_L2P_get(pIgr_pmask, &pmask) != RT_ERR_OK)
  1222. return RT_ERR_FAILED;
  1223. if ((retVal = rtl8367c_setAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port), pmask)) != RT_ERR_OK)
  1224. return retVal;
  1225. return RT_ERR_OK;
  1226. }
  1227. /* Function Name:
  1228. * rtk_vlan_keep_get
  1229. * Description:
  1230. * Get VLAN egress keep mode
  1231. * Input:
  1232. * egr_port - Egress Port id.
  1233. * Output:
  1234. * pIgr_pmask - Ingress Port Mask
  1235. * Return:
  1236. * RT_ERR_OK - OK
  1237. * RT_ERR_FAILED - Failed
  1238. * RT_ERR_SMI - SMI access error
  1239. * RT_ERR_INPUT - Invalid input parameters.
  1240. * RT_ERR_PORT_ID - Invalid port number.
  1241. * Note:
  1242. * None.
  1243. */
  1244. rtk_api_ret_t rtk_vlan_keep_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask)
  1245. {
  1246. rtk_api_ret_t retVal;
  1247. rtk_uint32 pmask;
  1248. /* Check initialization state */
  1249. RTK_CHK_INIT_STATE();
  1250. /* Check Port Valid */
  1251. RTK_CHK_PORT_VALID(egr_port);
  1252. if(NULL == pIgr_pmask)
  1253. return RT_ERR_NULL_POINTER;
  1254. if ((retVal = rtl8367c_getAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port), &pmask)) != RT_ERR_OK)
  1255. return retVal;
  1256. if(rtk_switch_portmask_P2L_get(pmask, pIgr_pmask) != RT_ERR_OK)
  1257. return RT_ERR_FAILED;
  1258. return RT_ERR_OK;
  1259. }
  1260. /* Function Name:
  1261. * rtk_vlan_stg_set
  1262. * Description:
  1263. * Set spanning tree group instance of the vlan to the specified device
  1264. * Input:
  1265. * vid - Specified VLAN ID.
  1266. * stg - spanning tree group instance.
  1267. * Output:
  1268. * None
  1269. * Return:
  1270. * RT_ERR_OK - OK
  1271. * RT_ERR_FAILED - Failed
  1272. * RT_ERR_SMI - SMI access error
  1273. * RT_ERR_MSTI - Invalid msti parameter
  1274. * RT_ERR_INPUT - Invalid input parameter.
  1275. * RT_ERR_VLAN_VID - Invalid VID parameter.
  1276. * Note:
  1277. * The API can set spanning tree group instance of the vlan to the specified device.
  1278. */
  1279. rtk_api_ret_t rtk_vlan_stg_set(rtk_vlan_t vid, rtk_stp_msti_id_t stg)
  1280. {
  1281. rtk_api_ret_t retVal;
  1282. rtl8367c_user_vlan4kentry vlan4K;
  1283. /* Check initialization state */
  1284. RTK_CHK_INIT_STATE();
  1285. /* vid must be 0~4095 */
  1286. if (vid > RTL8367C_VIDMAX)
  1287. return RT_ERR_VLAN_VID;
  1288. /* priority must be 0~15 */
  1289. if (stg > RTL8367C_MSTIMAX)
  1290. return RT_ERR_MSTI;
  1291. /* update 4K table */
  1292. vlan4K.vid = vid;
  1293. if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  1294. return retVal;
  1295. vlan4K.fid_msti= stg;
  1296. if ((retVal = rtl8367c_setAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  1297. return retVal;
  1298. return RT_ERR_OK;
  1299. }
  1300. /* Function Name:
  1301. * rtk_vlan_stg_get
  1302. * Description:
  1303. * Get spanning tree group instance of the vlan to the specified device
  1304. * Input:
  1305. * vid - Specified VLAN ID.
  1306. * Output:
  1307. * pStg - spanning tree group instance.
  1308. * Return:
  1309. * RT_ERR_OK - OK
  1310. * RT_ERR_FAILED - Failed
  1311. * RT_ERR_SMI - SMI access error
  1312. * RT_ERR_INPUT - Invalid input parameters.
  1313. * RT_ERR_VLAN_VID - Invalid VID parameter.
  1314. * Note:
  1315. * The API can get spanning tree group instance of the vlan to the specified device.
  1316. */
  1317. rtk_api_ret_t rtk_vlan_stg_get(rtk_vlan_t vid, rtk_stp_msti_id_t *pStg)
  1318. {
  1319. rtk_api_ret_t retVal;
  1320. rtl8367c_user_vlan4kentry vlan4K;
  1321. /* Check initialization state */
  1322. RTK_CHK_INIT_STATE();
  1323. /* vid must be 0~4095 */
  1324. if (vid > RTL8367C_VIDMAX)
  1325. return RT_ERR_VLAN_VID;
  1326. if(NULL == pStg)
  1327. return RT_ERR_NULL_POINTER;
  1328. /* update 4K table */
  1329. vlan4K.vid = vid;
  1330. if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  1331. return retVal;
  1332. *pStg = vlan4K.fid_msti;
  1333. return RT_ERR_OK;
  1334. }
  1335. /* Function Name:
  1336. * rtk_vlan_portFid_set
  1337. * Description:
  1338. * Set port-based filtering database
  1339. * Input:
  1340. * port - Port id.
  1341. * enable - ebable port-based FID
  1342. * fid - Specified filtering database.
  1343. * Output:
  1344. * None
  1345. * Return:
  1346. * RT_ERR_OK - OK
  1347. * RT_ERR_FAILED - Failed
  1348. * RT_ERR_SMI - SMI access error
  1349. * RT_ERR_L2_FID - Invalid fid.
  1350. * RT_ERR_INPUT - Invalid input parameter.
  1351. * RT_ERR_PORT_ID - Invalid port ID.
  1352. * Note:
  1353. * The API can set port-based filtering database. If the function is enabled, all input
  1354. * packets will be assigned to the port-based fid regardless vlan tag.
  1355. */
  1356. rtk_api_ret_t rtk_vlan_portFid_set(rtk_port_t port, rtk_enable_t enable, rtk_fid_t fid)
  1357. {
  1358. rtk_api_ret_t retVal;
  1359. /* Check initialization state */
  1360. RTK_CHK_INIT_STATE();
  1361. /* Check Port Valid */
  1362. RTK_CHK_PORT_VALID(port);
  1363. if (enable>=RTK_ENABLE_END)
  1364. return RT_ERR_ENABLE;
  1365. /* fid must be 0~4095 */
  1366. if (fid > RTK_FID_MAX)
  1367. return RT_ERR_L2_FID;
  1368. if ((retVal = rtl8367c_setAsicPortBasedFidEn(rtk_switch_port_L2P_get(port), enable))!=RT_ERR_OK)
  1369. return retVal;
  1370. if ((retVal = rtl8367c_setAsicPortBasedFid(rtk_switch_port_L2P_get(port), fid))!=RT_ERR_OK)
  1371. return retVal;
  1372. return RT_ERR_OK;
  1373. }
  1374. /* Function Name:
  1375. * rtk_vlan_portFid_get
  1376. * Description:
  1377. * Get port-based filtering database
  1378. * Input:
  1379. * port - Port id.
  1380. * Output:
  1381. * pEnable - ebable port-based FID
  1382. * pFid - Specified filtering database.
  1383. * Return:
  1384. * RT_ERR_OK - OK
  1385. * RT_ERR_FAILED - Failed
  1386. * RT_ERR_SMI - SMI access error
  1387. * RT_ERR_INPUT - Invalid input parameters.
  1388. * RT_ERR_PORT_ID - Invalid port ID.
  1389. * Note:
  1390. * The API can get port-based filtering database status. If the function is enabled, all input
  1391. * packets will be assigned to the port-based fid regardless vlan tag.
  1392. */
  1393. rtk_api_ret_t rtk_vlan_portFid_get(rtk_port_t port, rtk_enable_t *pEnable, rtk_fid_t *pFid)
  1394. {
  1395. rtk_api_ret_t retVal;
  1396. /* Check initialization state */
  1397. RTK_CHK_INIT_STATE();
  1398. /* Check Port Valid */
  1399. RTK_CHK_PORT_VALID(port);
  1400. if(NULL == pEnable)
  1401. return RT_ERR_NULL_POINTER;
  1402. if(NULL == pFid)
  1403. return RT_ERR_NULL_POINTER;
  1404. if ((retVal = rtl8367c_getAsicPortBasedFidEn(rtk_switch_port_L2P_get(port), pEnable))!=RT_ERR_OK)
  1405. return retVal;
  1406. if ((retVal = rtl8367c_getAsicPortBasedFid(rtk_switch_port_L2P_get(port), pFid))!=RT_ERR_OK)
  1407. return retVal;
  1408. return RT_ERR_OK;
  1409. }
  1410. /* Function Name:
  1411. * rtk_vlan_UntagDscpPriorityEnable_set
  1412. * Description:
  1413. * Set Untag DSCP priority assign
  1414. * Input:
  1415. * enable - state of Untag DSCP priority assign
  1416. * Output:
  1417. * None
  1418. * Return:
  1419. * RT_ERR_OK - OK
  1420. * RT_ERR_FAILED - Failed
  1421. * RT_ERR_SMI - SMI access error
  1422. * RT_ERR_ENABLE - Invalid input parameters.
  1423. * Note:
  1424. *
  1425. */
  1426. rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_set(rtk_enable_t enable)
  1427. {
  1428. rtk_api_ret_t retVal;
  1429. /* Check initialization state */
  1430. RTK_CHK_INIT_STATE();
  1431. if(enable >= RTK_ENABLE_END)
  1432. return RT_ERR_ENABLE;
  1433. if ((retVal = rtl8367c_setAsicVlanUntagDscpPriorityEn((rtk_uint32)enable)) != RT_ERR_OK)
  1434. return retVal;
  1435. return RT_ERR_OK;
  1436. }
  1437. /* Function Name:
  1438. * rtk_vlan_UntagDscpPriorityEnable_get
  1439. * Description:
  1440. * Get Untag DSCP priority assign
  1441. * Input:
  1442. * None
  1443. * Output:
  1444. * pEnable - state of Untag DSCP priority assign
  1445. * Return:
  1446. * RT_ERR_OK - OK
  1447. * RT_ERR_FAILED - Failed
  1448. * RT_ERR_SMI - SMI access error
  1449. * RT_ERR_NULL_POINTER - Null pointer
  1450. * Note:
  1451. *
  1452. */
  1453. rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_get(rtk_enable_t *pEnable)
  1454. {
  1455. rtk_api_ret_t retVal;
  1456. rtk_uint32 value;
  1457. /* Check initialization state */
  1458. RTK_CHK_INIT_STATE();
  1459. if(NULL == pEnable)
  1460. return RT_ERR_NULL_POINTER;
  1461. if ((retVal = rtl8367c_getAsicVlanUntagDscpPriorityEn(&value)) != RT_ERR_OK)
  1462. return retVal;
  1463. *pEnable = (rtk_enable_t)value;
  1464. return RT_ERR_OK;
  1465. }
  1466. /* Function Name:
  1467. * rtk_stp_mstpState_set
  1468. * Description:
  1469. * Configure spanning tree state per each port.
  1470. * Input:
  1471. * port - Port id
  1472. * msti - Multiple spanning tree instance.
  1473. * stp_state - Spanning tree state for msti
  1474. * Output:
  1475. * None
  1476. * Return:
  1477. * RT_ERR_OK - OK
  1478. * RT_ERR_FAILED - Failed
  1479. * RT_ERR_SMI - SMI access error
  1480. * RT_ERR_PORT_ID - Invalid port number.
  1481. * RT_ERR_MSTI - Invalid msti parameter.
  1482. * RT_ERR_MSTP_STATE - Invalid STP state.
  1483. * Note:
  1484. * System supports per-port multiple spanning tree state for each msti.
  1485. * There are four states supported by ASIC.
  1486. * - STP_STATE_DISABLED
  1487. * - STP_STATE_BLOCKING
  1488. * - STP_STATE_LEARNING
  1489. * - STP_STATE_FORWARDING
  1490. */
  1491. rtk_api_ret_t rtk_stp_mstpState_set(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t stp_state)
  1492. {
  1493. rtk_api_ret_t retVal;
  1494. /* Check initialization state */
  1495. RTK_CHK_INIT_STATE();
  1496. /* Check Port Valid */
  1497. RTK_CHK_PORT_VALID(port);
  1498. if (msti > RTK_MAX_NUM_OF_MSTI)
  1499. return RT_ERR_MSTI;
  1500. if (stp_state >= STP_STATE_END)
  1501. return RT_ERR_MSTP_STATE;
  1502. if ((retVal = rtl8367c_setAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port), msti, stp_state)) != RT_ERR_OK)
  1503. return retVal;
  1504. return RT_ERR_OK;
  1505. }
  1506. /* Function Name:
  1507. * rtk_stp_mstpState_get
  1508. * Description:
  1509. * Get spanning tree state per each port.
  1510. * Input:
  1511. * port - Port id.
  1512. * msti - Multiple spanning tree instance.
  1513. * Output:
  1514. * pStp_state - Spanning tree state for msti
  1515. * Return:
  1516. * RT_ERR_OK - OK
  1517. * RT_ERR_FAILED - Failed
  1518. * RT_ERR_SMI - SMI access error
  1519. * RT_ERR_PORT_ID - Invalid port number.
  1520. * RT_ERR_MSTI - Invalid msti parameter.
  1521. * Note:
  1522. * System supports per-port multiple spanning tree state for each msti.
  1523. * There are four states supported by ASIC.
  1524. * - STP_STATE_DISABLED
  1525. * - STP_STATE_BLOCKING
  1526. * - STP_STATE_LEARNING
  1527. * - STP_STATE_FORWARDING
  1528. */
  1529. rtk_api_ret_t rtk_stp_mstpState_get(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t *pStp_state)
  1530. {
  1531. rtk_api_ret_t retVal;
  1532. /* Check initialization state */
  1533. RTK_CHK_INIT_STATE();
  1534. /* Check Port Valid */
  1535. RTK_CHK_PORT_VALID(port);
  1536. if (msti > RTK_MAX_NUM_OF_MSTI)
  1537. return RT_ERR_MSTI;
  1538. if(NULL == pStp_state)
  1539. return RT_ERR_NULL_POINTER;
  1540. if ((retVal = rtl8367c_getAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port), msti, pStp_state)) != RT_ERR_OK)
  1541. return retVal;
  1542. return RT_ERR_OK;
  1543. }
  1544. /* Function Name:
  1545. * rtk_vlan_checkAndCreateMbr
  1546. * Description:
  1547. * Check and create Member configuration and return index
  1548. * Input:
  1549. * vid - VLAN id.
  1550. * Output:
  1551. * pIndex - Member configuration index
  1552. * Return:
  1553. * RT_ERR_OK - OK
  1554. * RT_ERR_FAILED - Failed
  1555. * RT_ERR_SMI - SMI access error
  1556. * RT_ERR_VLAN_VID - Invalid VLAN ID.
  1557. * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN not found
  1558. * RT_ERR_TBL_FULL - Member Configuration table full
  1559. * Note:
  1560. *
  1561. */
  1562. rtk_api_ret_t rtk_vlan_checkAndCreateMbr(rtk_vlan_t vid, rtk_uint32 *pIndex)
  1563. {
  1564. rtk_api_ret_t retVal;
  1565. rtl8367c_user_vlan4kentry vlan4K;
  1566. rtl8367c_vlanconfiguser vlanMC;
  1567. rtk_uint32 idx;
  1568. rtk_uint32 empty_idx = 0xFFFF;
  1569. /* Check initialization state */
  1570. RTK_CHK_INIT_STATE();
  1571. /* vid must be 0~8191 */
  1572. if (vid > RTL8367C_EVIDMAX)
  1573. return RT_ERR_VLAN_VID;
  1574. /* Null pointer check */
  1575. if(NULL == pIndex)
  1576. return RT_ERR_NULL_POINTER;
  1577. /* Get 4K VLAN */
  1578. if (vid <= RTL8367C_VIDMAX)
  1579. {
  1580. memset(&vlan4K, 0x00, sizeof(rtl8367c_user_vlan4kentry));
  1581. vlan4K.vid = vid;
  1582. if ((retVal = rtl8367c_getAsicVlan4kEntry(&vlan4K)) != RT_ERR_OK)
  1583. return retVal;
  1584. }
  1585. /* Search exist entry */
  1586. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  1587. {
  1588. if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
  1589. {
  1590. if(vlan_mbrCfgVid[idx] == vid)
  1591. {
  1592. /* Found! return index */
  1593. *pIndex = idx;
  1594. return RT_ERR_OK;
  1595. }
  1596. }
  1597. }
  1598. /* Not found, Read H/W Member Configuration table to update database */
  1599. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  1600. {
  1601. if ((retVal = rtl8367c_getAsicVlanMemberConfig(idx, &vlanMC)) != RT_ERR_OK)
  1602. return retVal;
  1603. if( (vlanMC.evid == 0) && (vlanMC.mbr == 0x00))
  1604. {
  1605. vlan_mbrCfgUsage[idx] = MBRCFG_UNUSED;
  1606. vlan_mbrCfgVid[idx] = 0;
  1607. }
  1608. else
  1609. {
  1610. vlan_mbrCfgUsage[idx] = MBRCFG_USED_BY_VLAN;
  1611. vlan_mbrCfgVid[idx] = vlanMC.evid;
  1612. }
  1613. }
  1614. /* Search exist entry again */
  1615. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  1616. {
  1617. if(vlan_mbrCfgUsage[idx] == MBRCFG_USED_BY_VLAN)
  1618. {
  1619. if(vlan_mbrCfgVid[idx] == vid)
  1620. {
  1621. /* Found! return index */
  1622. *pIndex = idx;
  1623. return RT_ERR_OK;
  1624. }
  1625. }
  1626. }
  1627. /* try to look up an empty index */
  1628. for (idx = 0; idx <= RTL8367C_CVIDXMAX; idx++)
  1629. {
  1630. if(vlan_mbrCfgUsage[idx] == MBRCFG_UNUSED)
  1631. {
  1632. empty_idx = idx;
  1633. break;
  1634. }
  1635. }
  1636. if(empty_idx == 0xFFFF)
  1637. {
  1638. /* No empty index */
  1639. return RT_ERR_TBL_FULL;
  1640. }
  1641. if (vid > RTL8367C_VIDMAX)
  1642. {
  1643. /* > 4K, there is no 4K entry, create on member configuration directly */
  1644. memset(&vlanMC, 0x00, sizeof(rtl8367c_vlanconfiguser));
  1645. vlanMC.evid = vid;
  1646. if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_idx, &vlanMC)) != RT_ERR_OK)
  1647. return retVal;
  1648. }
  1649. else
  1650. {
  1651. /* Copy from 4K table */
  1652. vlanMC.evid = vid;
  1653. vlanMC.mbr = vlan4K.mbr;
  1654. vlanMC.fid_msti = vlan4K.fid_msti;
  1655. vlanMC.meteridx= vlan4K.meteridx;
  1656. vlanMC.envlanpol= vlan4K.envlanpol;
  1657. vlanMC.vbpen = vlan4K.vbpen;
  1658. vlanMC.vbpri = vlan4K.vbpri;
  1659. if ((retVal = rtl8367c_setAsicVlanMemberConfig(empty_idx, &vlanMC)) != RT_ERR_OK)
  1660. return retVal;
  1661. }
  1662. /* Update Database */
  1663. vlan_mbrCfgUsage[empty_idx] = MBRCFG_USED_BY_VLAN;
  1664. vlan_mbrCfgVid[empty_idx] = vid;
  1665. *pIndex = empty_idx;
  1666. return RT_ERR_OK;
  1667. }
  1668. /* Function Name:
  1669. * rtk_vlan_reservedVidAction_set
  1670. * Description:
  1671. * Set Action of VLAN ID = 0 & 4095 tagged packet
  1672. * Input:
  1673. * action_vid0 - Action for VID 0.
  1674. * action_vid4095 - Action for VID 4095.
  1675. * Output:
  1676. * None.
  1677. * Return:
  1678. * RT_ERR_OK - OK
  1679. * RT_ERR_FAILED - Failed
  1680. * RT_ERR_SMI - SMI access error
  1681. * RT_ERR_INPUT - Error Input
  1682. * Note:
  1683. *
  1684. */
  1685. rtk_api_ret_t rtk_vlan_reservedVidAction_set(rtk_vlan_resVidAction_t action_vid0, rtk_vlan_resVidAction_t action_vid4095)
  1686. {
  1687. rtk_api_ret_t retVal;
  1688. /* Check initialization state */
  1689. RTK_CHK_INIT_STATE();
  1690. if(action_vid0 >= RESVID_ACTION_END)
  1691. return RT_ERR_INPUT;
  1692. if(action_vid4095 >= RESVID_ACTION_END)
  1693. return RT_ERR_INPUT;
  1694. if ((retVal = rtl8367c_setReservedVidAction((rtk_uint32)action_vid0, (rtk_uint32)action_vid4095)) != RT_ERR_OK)
  1695. return retVal;
  1696. return RT_ERR_OK;
  1697. }
  1698. /* Function Name:
  1699. * rtk_vlan_reservedVidAction_get
  1700. * Description:
  1701. * Get Action of VLAN ID = 0 & 4095 tagged packet
  1702. * Input:
  1703. * pAction_vid0 - Action for VID 0.
  1704. * pAction_vid4095 - Action for VID 4095.
  1705. * Output:
  1706. * None.
  1707. * Return:
  1708. * RT_ERR_OK - OK
  1709. * RT_ERR_FAILED - Failed
  1710. * RT_ERR_SMI - SMI access error
  1711. * RT_ERR_NULL_POINTER - NULL Pointer
  1712. * Note:
  1713. *
  1714. */
  1715. rtk_api_ret_t rtk_vlan_reservedVidAction_get(rtk_vlan_resVidAction_t *pAction_vid0, rtk_vlan_resVidAction_t *pAction_vid4095)
  1716. {
  1717. rtk_api_ret_t retVal;
  1718. /* Check initialization state */
  1719. RTK_CHK_INIT_STATE();
  1720. if(pAction_vid0 == NULL)
  1721. return RT_ERR_NULL_POINTER;
  1722. if(pAction_vid4095 == NULL)
  1723. return RT_ERR_NULL_POINTER;
  1724. if ((retVal = rtl8367c_getReservedVidAction((rtk_uint32 *)pAction_vid0, (rtk_uint32 *)pAction_vid4095)) != RT_ERR_OK)
  1725. return retVal;
  1726. return RT_ERR_OK;
  1727. }
  1728. /* Function Name:
  1729. * rtk_vlan_realKeepRemarkEnable_set
  1730. * Description:
  1731. * Set Real keep 1p remarking feature
  1732. * Input:
  1733. * enabled - State of 1p remarking at real keep packet
  1734. * Output:
  1735. * None.
  1736. * Return:
  1737. * RT_ERR_OK - OK
  1738. * RT_ERR_FAILED - Failed
  1739. * RT_ERR_SMI - SMI access error
  1740. * RT_ERR_INPUT - Error Input
  1741. * Note:
  1742. *
  1743. */
  1744. rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_set(rtk_enable_t enabled)
  1745. {
  1746. rtk_api_ret_t retVal;
  1747. /* Check initialization state */
  1748. RTK_CHK_INIT_STATE();
  1749. if(enabled >= RTK_ENABLE_END)
  1750. return RT_ERR_INPUT;
  1751. if ((retVal = rtl8367c_setRealKeepRemarkEn((rtk_uint32)enabled)) != RT_ERR_OK)
  1752. return retVal;
  1753. return RT_ERR_OK;
  1754. }
  1755. /* Function Name:
  1756. * rtk_vlan_realKeepRemarkEnable_get
  1757. * Description:
  1758. * Get Real keep 1p remarking feature
  1759. * Input:
  1760. * None.
  1761. * Output:
  1762. * pEnabled - State of 1p remarking at real keep packet
  1763. * Return:
  1764. * RT_ERR_OK - OK
  1765. * RT_ERR_FAILED - Failed
  1766. * RT_ERR_SMI - SMI access error
  1767. * RT_ERR_INPUT - Error Input
  1768. * Note:
  1769. *
  1770. */
  1771. rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_get(rtk_enable_t *pEnabled)
  1772. {
  1773. rtk_api_ret_t retVal;
  1774. /* Check initialization state */
  1775. RTK_CHK_INIT_STATE();
  1776. if(NULL == pEnabled)
  1777. return RT_ERR_NULL_POINTER;
  1778. if ((retVal = rtl8367c_getRealKeepRemarkEn((rtk_uint32 *)pEnabled)) != RT_ERR_OK)
  1779. return retVal;
  1780. return RT_ERR_OK;
  1781. }
  1782. /* Function Name:
  1783. * rtk_vlan_reset
  1784. * Description:
  1785. * Reset VLAN
  1786. * Input:
  1787. * None.
  1788. * Output:
  1789. * pEnabled - State of 1p remarking at real keep packet
  1790. * Return:
  1791. * RT_ERR_OK - OK
  1792. * RT_ERR_FAILED - Failed
  1793. * RT_ERR_SMI - SMI access error
  1794. * RT_ERR_INPUT - Error Input
  1795. * Note:
  1796. *
  1797. */
  1798. rtk_api_ret_t rtk_vlan_reset(void)
  1799. {
  1800. rtk_api_ret_t retVal;
  1801. /* Check initialization state */
  1802. RTK_CHK_INIT_STATE();
  1803. if ((retVal = rtl8367c_resetVlan()) != RT_ERR_OK)
  1804. return retVal;
  1805. return RT_ERR_OK;
  1806. }