2 * Copyright (C) 2013 Realtek Semiconductor Corp.
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
11 * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
13 * Purpose : RTK switch high-level API for RTL8367/RTL8367C
14 * Feature : Here is a list of all functions and variables in VLAN module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
24 #include <rtl8367c_asicdrv.h>
25 #include <rtl8367c_asicdrv_vlan.h>
26 #include <rtl8367c_asicdrv_dot1x.h>
28 typedef enum vlan_mbrCfgType_e
35 static rtk_vlan_t vlan_mbrCfgVid
[RTL8367C_CVIDXNO
];
36 static vlan_mbrCfgType_t vlan_mbrCfgUsage
[RTL8367C_CVIDXNO
];
48 * RT_ERR_FAILED - Failed
49 * RT_ERR_SMI - SMI access error
51 * VLAN is disabled by default. User has to call this API to enable VLAN before
52 * using it. And It will set a default VLAN(vid 1) including all ports and set
53 * all ports PVID to the default VLAN.
55 rtk_api_ret_t
rtk_vlan_init(void)
59 rtl8367c_user_vlan4kentry vlan4K
;
60 rtl8367c_vlanconfiguser vlanMC
;
62 /* Check initialization state */
66 memset(vlan_mbrCfgVid
, 0x00, sizeof(rtk_vlan_t
) * RTL8367C_CVIDXNO
);
67 memset(vlan_mbrCfgUsage
, 0x00, sizeof(vlan_mbrCfgType_t
) * RTL8367C_CVIDXNO
);
69 /* clean 32 VLAN member configuration */
70 for (i
= 0; i
<= RTL8367C_CVIDXMAX
; i
++)
79 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(i
, &vlanMC
)) != RT_ERR_OK
)
83 /* Set a default VLAN with vid 1 to 4K table for all ports */
84 memset(&vlan4K
, 0, sizeof(rtl8367c_user_vlan4kentry
));
86 vlan4K
.mbr
= RTK_PHY_PORTMASK_ALL
;
87 vlan4K
.untag
= RTK_PHY_PORTMASK_ALL
;
89 if ((retVal
= rtl8367c_setAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
92 /* Also set the default VLAN to 32 member configuration index 0 */
93 memset(&vlanMC
, 0, sizeof(rtl8367c_vlanconfiguser
));
95 vlanMC
.mbr
= RTK_PHY_PORTMASK_ALL
;
97 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(0, &vlanMC
)) != RT_ERR_OK
)
100 /* Set all ports PVID to default VLAN and tag-mode to original */
101 RTK_SCAN_ALL_PHY_PORTMASK(i
)
103 if ((retVal
= rtl8367c_setAsicVlanPortBasedVID(i
, 0, 0)) != RT_ERR_OK
)
105 if ((retVal
= rtl8367c_setAsicVlanEgressTagMode(i
, EG_TAG_MODE_ORI
)) != RT_ERR_OK
)
110 vlan_mbrCfgUsage
[0] = MBRCFG_USED_BY_VLAN
;
111 vlan_mbrCfgVid
[0] = 1;
113 /* Enable Ingress filter */
114 RTK_SCAN_ALL_PHY_PORTMASK(i
)
116 if ((retVal
= rtl8367c_setAsicVlanIngressFilter(i
, ENABLED
)) != RT_ERR_OK
)
121 if ((retVal
= rtl8367c_setAsicVlanFilter(ENABLED
)) != RT_ERR_OK
)
132 * vid - VLAN ID to configure.
133 * pVlanCfg - VLAN Configuration
138 * RT_ERR_FAILED - Failed
139 * RT_ERR_SMI - SMI access error
140 * RT_ERR_INPUT - Invalid input parameters.
141 * RT_ERR_L2_FID - Invalid FID.
142 * RT_ERR_VLAN_PORT_MBR_EXIST - Invalid member port mask.
143 * RT_ERR_VLAN_VID - Invalid VID parameter.
147 rtk_api_ret_t
rtk_vlan_set(rtk_vlan_t vid
, rtk_vlan_cfg_t
*pVlanCfg
)
149 rtk_api_ret_t retVal
;
150 rtk_uint32 phyMbrPmask
;
151 rtk_uint32 phyUntagPmask
;
152 rtl8367c_user_vlan4kentry vlan4K
;
153 rtl8367c_vlanconfiguser vlanMC
;
155 rtk_uint32 empty_index
= 0xffff;
156 rtk_uint32 update_evid
= 0;
158 /* Check initialization state */
159 RTK_CHK_INIT_STATE();
161 /* vid must be 0~8191 */
162 if (vid
> RTL8367C_EVIDMAX
)
163 return RT_ERR_VLAN_VID
;
165 /* Null pointer check */
167 return RT_ERR_NULL_POINTER
;
169 /* Check port mask valid */
170 RTK_CHK_PORTMASK_VALID(&(pVlanCfg
->mbr
));
172 if (vid
<= RTL8367C_VIDMAX
)
174 /* Check untag port mask valid */
175 RTK_CHK_PORTMASK_VALID(&(pVlanCfg
->untag
));
179 if(pVlanCfg
->ivl_en
>= RTK_ENABLE_END
)
180 return RT_ERR_ENABLE
;
182 /* fid must be 0~15 */
183 if(pVlanCfg
->fid_msti
> RTL8367C_FIDMAX
)
184 return RT_ERR_L2_FID
;
187 if(pVlanCfg
->envlanpol
>= RTK_ENABLE_END
)
188 return RT_ERR_ENABLE
;
191 if(pVlanCfg
->meteridx
> RTK_MAX_METER_ID
)
194 /* VLAN based priority */
195 if(pVlanCfg
->vbpen
>= RTK_ENABLE_END
)
196 return RT_ERR_ENABLE
;
199 if(pVlanCfg
->vbpri
> RTL8367C_PRIMAX
)
202 /* Get physical port mask */
203 if(rtk_switch_portmask_L2P_get(&(pVlanCfg
->mbr
), &phyMbrPmask
) != RT_ERR_OK
)
204 return RT_ERR_FAILED
;
206 if(rtk_switch_portmask_L2P_get(&(pVlanCfg
->untag
), &phyUntagPmask
) != RT_ERR_OK
)
207 return RT_ERR_FAILED
;
209 if (vid
<= RTL8367C_VIDMAX
)
211 /* update 4K table */
212 memset(&vlan4K
, 0, sizeof(rtl8367c_user_vlan4kentry
));
215 vlan4K
.mbr
= (phyMbrPmask
& 0xFFFF);
216 vlan4K
.untag
= (phyUntagPmask
& 0xFFFF);
218 vlan4K
.ivl_svl
= pVlanCfg
->ivl_en
;
219 vlan4K
.fid_msti
= pVlanCfg
->fid_msti
;
220 vlan4K
.envlanpol
= pVlanCfg
->envlanpol
;
221 vlan4K
.meteridx
= pVlanCfg
->meteridx
;
222 vlan4K
.vbpen
= pVlanCfg
->vbpen
;
223 vlan4K
.vbpri
= pVlanCfg
->vbpri
;
225 if ((retVal
= rtl8367c_setAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
228 /* Update Member configuration if exist */
229 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
231 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_USED_BY_VLAN
)
233 if(vlan_mbrCfgVid
[idx
] == vid
)
236 if(phyMbrPmask
== 0x00)
238 /* Member port = 0x00, delete this VLAN from Member Configuration */
239 memset(&vlanMC
, 0x00, sizeof(rtl8367c_vlanconfiguser
));
240 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
244 vlan_mbrCfgUsage
[idx
] = MBRCFG_UNUSED
;
245 vlan_mbrCfgVid
[idx
] = 0;
249 /* Normal VLAN config, update to member configuration */
251 vlanMC
.mbr
= vlan4K
.mbr
;
252 vlanMC
.fid_msti
= vlan4K
.fid_msti
;
253 vlanMC
.meteridx
= vlan4K
.meteridx
;
254 vlanMC
.envlanpol
= vlan4K
.envlanpol
;
255 vlanMC
.vbpen
= vlan4K
.vbpen
;
256 vlanMC
.vbpri
= vlan4K
.vbpri
;
257 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
269 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
271 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_USED_BY_VLAN
)
273 if(vlan_mbrCfgVid
[idx
] == vid
)
276 if(phyMbrPmask
== 0x00)
278 /* Member port = 0x00, delete this VLAN from Member Configuration */
279 memset(&vlanMC
, 0x00, sizeof(rtl8367c_vlanconfiguser
));
280 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
284 vlan_mbrCfgUsage
[idx
] = MBRCFG_UNUSED
;
285 vlan_mbrCfgVid
[idx
] = 0;
289 /* Normal VLAN config, update to member configuration */
291 vlanMC
.mbr
= phyMbrPmask
;
292 vlanMC
.fid_msti
= pVlanCfg
->fid_msti
;
293 vlanMC
.meteridx
= pVlanCfg
->meteridx
;
294 vlanMC
.envlanpol
= pVlanCfg
->envlanpol
;
295 vlanMC
.vbpen
= pVlanCfg
->vbpen
;
296 vlanMC
.vbpri
= pVlanCfg
->vbpri
;
297 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
307 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_UNUSED
)
309 if(0xffff == empty_index
)
314 /* doesn't find out same EVID entry and there is empty index in member configuration */
315 if( (phyMbrPmask
!= 0x00) && (update_evid
== 0) && (empty_index
!= 0xFFFF) )
318 vlanMC
.mbr
= phyMbrPmask
;
319 vlanMC
.fid_msti
= pVlanCfg
->fid_msti
;
320 vlanMC
.meteridx
= pVlanCfg
->meteridx
;
321 vlanMC
.envlanpol
= pVlanCfg
->envlanpol
;
322 vlanMC
.vbpen
= pVlanCfg
->vbpen
;
323 vlanMC
.vbpri
= pVlanCfg
->vbpri
;
324 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(empty_index
, &vlanMC
)) != RT_ERR_OK
)
327 vlan_mbrCfgUsage
[empty_index
] = MBRCFG_USED_BY_VLAN
;
328 vlan_mbrCfgVid
[empty_index
] = vid
;
341 * vid - VLAN ID to configure.
343 * pVlanCfg - VLAN Configuration
346 * RT_ERR_FAILED - Failed
347 * RT_ERR_SMI - SMI access error
348 * RT_ERR_INPUT - Invalid input parameters.
349 * RT_ERR_VLAN_VID - Invalid VID parameter.
353 rtk_api_ret_t
rtk_vlan_get(rtk_vlan_t vid
, rtk_vlan_cfg_t
*pVlanCfg
)
355 rtk_api_ret_t retVal
;
356 rtk_uint32 phyMbrPmask
;
357 rtk_uint32 phyUntagPmask
;
358 rtl8367c_user_vlan4kentry vlan4K
;
359 rtl8367c_vlanconfiguser vlanMC
;
362 /* Check initialization state */
363 RTK_CHK_INIT_STATE();
365 /* vid must be 0~8191 */
366 if (vid
> RTL8367C_EVIDMAX
)
367 return RT_ERR_VLAN_VID
;
369 /* Null pointer check */
371 return RT_ERR_NULL_POINTER
;
373 if (vid
<= RTL8367C_VIDMAX
)
377 if ((retVal
= rtl8367c_getAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
380 phyMbrPmask
= vlan4K
.mbr
;
381 phyUntagPmask
= vlan4K
.untag
;
382 if(rtk_switch_portmask_P2L_get(phyMbrPmask
, &(pVlanCfg
->mbr
)) != RT_ERR_OK
)
383 return RT_ERR_FAILED
;
385 if(rtk_switch_portmask_P2L_get(phyUntagPmask
, &(pVlanCfg
->untag
)) != RT_ERR_OK
)
386 return RT_ERR_FAILED
;
388 pVlanCfg
->ivl_en
= vlan4K
.ivl_svl
;
389 pVlanCfg
->fid_msti
= vlan4K
.fid_msti
;
390 pVlanCfg
->envlanpol
= vlan4K
.envlanpol
;
391 pVlanCfg
->meteridx
= vlan4K
.meteridx
;
392 pVlanCfg
->vbpen
= vlan4K
.vbpen
;
393 pVlanCfg
->vbpri
= vlan4K
.vbpri
;
397 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
399 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_USED_BY_VLAN
)
401 if(vlan_mbrCfgVid
[idx
] == vid
)
403 if ((retVal
= rtl8367c_getAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
406 phyMbrPmask
= vlanMC
.mbr
;
407 if(rtk_switch_portmask_P2L_get(phyMbrPmask
, &(pVlanCfg
->mbr
)) != RT_ERR_OK
)
408 return RT_ERR_FAILED
;
410 pVlanCfg
->untag
.bits
[0] = 0;
411 pVlanCfg
->ivl_en
= 0;
412 pVlanCfg
->fid_msti
= vlanMC
.fid_msti
;
413 pVlanCfg
->envlanpol
= vlanMC
.envlanpol
;
414 pVlanCfg
->meteridx
= vlanMC
.meteridx
;
415 pVlanCfg
->vbpen
= vlanMC
.vbpen
;
416 pVlanCfg
->vbpri
= vlanMC
.vbpri
;
426 * rtk_vlan_egrFilterEnable_set
428 * Set VLAN egress filter.
430 * egrFilter - Egress filtering
435 * RT_ERR_FAILED - Failed
436 * RT_ERR_SMI - SMI access error
437 * RT_ERR_ENABLE - Invalid input parameters.
441 rtk_api_ret_t
rtk_vlan_egrFilterEnable_set(rtk_enable_t egrFilter
)
443 rtk_api_ret_t retVal
;
445 /* Check initialization state */
446 RTK_CHK_INIT_STATE();
448 if(egrFilter
>= RTK_ENABLE_END
)
449 return RT_ERR_ENABLE
;
452 if ((retVal
= rtl8367c_setAsicVlanFilter((rtk_uint32
)egrFilter
)) != RT_ERR_OK
)
459 * rtk_vlan_egrFilterEnable_get
461 * Get VLAN egress filter.
463 * pEgrFilter - Egress filtering
468 * RT_ERR_FAILED - Failed
469 * RT_ERR_SMI - SMI access error
470 * RT_ERR_NULL_POINTER - NULL Pointer.
474 rtk_api_ret_t
rtk_vlan_egrFilterEnable_get(rtk_enable_t
*pEgrFilter
)
476 rtk_api_ret_t retVal
;
479 /* Check initialization state */
480 RTK_CHK_INIT_STATE();
482 if(NULL
== pEgrFilter
)
483 return RT_ERR_NULL_POINTER
;
486 if ((retVal
= rtl8367c_getAsicVlanFilter(&state
)) != RT_ERR_OK
)
489 *pEgrFilter
= (rtk_enable_t
)state
;
494 * rtk_vlan_mbrCfg_set
496 * Set a VLAN Member Configuration entry by index.
498 * idx - Index of VLAN Member Configuration.
499 * pMbrcfg - VLAN member Configuration.
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.
509 * Set a VLAN Member Configuration entry by index.
511 rtk_api_ret_t
rtk_vlan_mbrCfg_set(rtk_uint32 idx
, rtk_vlan_mbrcfg_t
*pMbrcfg
)
513 rtk_api_ret_t retVal
;
514 rtk_uint32 phyMbrPmask
;
515 rtl8367c_vlanconfiguser mbrCfg
;
517 /* Check initialization state */
518 RTK_CHK_INIT_STATE();
522 return RT_ERR_NULL_POINTER
;
524 if(idx
> RTL8367C_CVIDXMAX
)
527 if(pMbrcfg
->evid
> RTL8367C_EVIDMAX
)
530 if(pMbrcfg
->fid_msti
> RTL8367C_FIDMAX
)
531 return RT_ERR_L2_FID
;
533 if(pMbrcfg
->envlanpol
>= RTK_ENABLE_END
)
534 return RT_ERR_ENABLE
;
536 if(pMbrcfg
->meteridx
> RTK_MAX_METER_ID
)
537 return RT_ERR_FILTER_METER_ID
;
539 if(pMbrcfg
->vbpen
>= RTK_ENABLE_END
)
540 return RT_ERR_ENABLE
;
542 if(pMbrcfg
->vbpri
> RTL8367C_PRIMAX
)
543 return RT_ERR_QOS_INT_PRIORITY
;
545 /* Check port mask valid */
546 RTK_CHK_PORTMASK_VALID(&(pMbrcfg
->mbr
));
548 mbrCfg
.evid
= pMbrcfg
->evid
;
549 mbrCfg
.fid_msti
= pMbrcfg
->fid_msti
;
550 mbrCfg
.envlanpol
= pMbrcfg
->envlanpol
;
551 mbrCfg
.meteridx
= pMbrcfg
->meteridx
;
552 mbrCfg
.vbpen
= pMbrcfg
->vbpen
;
553 mbrCfg
.vbpri
= pMbrcfg
->vbpri
;
555 if(rtk_switch_portmask_L2P_get(&(pMbrcfg
->mbr
), &phyMbrPmask
) != RT_ERR_OK
)
556 return RT_ERR_FAILED
;
558 mbrCfg
.mbr
= phyMbrPmask
;
560 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(idx
, &mbrCfg
)) != RT_ERR_OK
)
563 /* Update Database */
564 if( (mbrCfg
.evid
== 0) && (mbrCfg
.mbr
== 0) )
566 vlan_mbrCfgUsage
[idx
] = MBRCFG_UNUSED
;
567 vlan_mbrCfgVid
[idx
] = 0;
571 vlan_mbrCfgUsage
[idx
] = MBRCFG_USED_BY_VLAN
;
572 vlan_mbrCfgVid
[idx
] = mbrCfg
.evid
;
580 * rtk_vlan_mbrCfg_get
582 * Get a VLAN Member Configuration entry by index.
584 * idx - Index of VLAN Member Configuration.
586 * pMbrcfg - VLAN member Configuration.
589 * RT_ERR_FAILED - Failed
590 * RT_ERR_SMI - SMI access error
591 * RT_ERR_INPUT - Invalid input parameters.
592 * RT_ERR_VLAN_VID - Invalid VID parameter.
594 * Get a VLAN Member Configuration entry by index.
596 rtk_api_ret_t
rtk_vlan_mbrCfg_get(rtk_uint32 idx
, rtk_vlan_mbrcfg_t
*pMbrcfg
)
598 rtk_api_ret_t retVal
;
599 rtk_uint32 phyMbrPmask
;
600 rtl8367c_vlanconfiguser mbrCfg
;
602 /* Check initialization state */
603 RTK_CHK_INIT_STATE();
607 return RT_ERR_NULL_POINTER
;
609 if(idx
> RTL8367C_CVIDXMAX
)
612 memset(&mbrCfg
, 0x00, sizeof(rtl8367c_vlanconfiguser
));
613 if ((retVal
= rtl8367c_getAsicVlanMemberConfig(idx
, &mbrCfg
)) != RT_ERR_OK
)
616 pMbrcfg
->evid
= mbrCfg
.evid
;
617 pMbrcfg
->fid_msti
= mbrCfg
.fid_msti
;
618 pMbrcfg
->envlanpol
= mbrCfg
.envlanpol
;
619 pMbrcfg
->meteridx
= mbrCfg
.meteridx
;
620 pMbrcfg
->vbpen
= mbrCfg
.vbpen
;
621 pMbrcfg
->vbpri
= mbrCfg
.vbpri
;
623 phyMbrPmask
= mbrCfg
.mbr
;
624 if(rtk_switch_portmask_P2L_get(phyMbrPmask
, &(pMbrcfg
->mbr
)) != RT_ERR_OK
)
625 return RT_ERR_FAILED
;
631 * rtk_vlan_portPvid_set
633 * Set port to specified VLAN ID(PVID).
636 * pvid - Specified VLAN ID.
637 * priority - 802.1p priority for the PVID.
642 * RT_ERR_FAILED - Failed
643 * RT_ERR_SMI - SMI access error
644 * RT_ERR_PORT_ID - Invalid port number.
645 * RT_ERR_VLAN_PRIORITY - Invalid priority.
646 * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN entry not found.
647 * RT_ERR_VLAN_VID - Invalid VID parameter.
649 * The API is used for Port-based VLAN. The untagged frame received from the
650 * port will be classified to the specified VLAN and assigned to the specified priority.
652 rtk_api_ret_t
rtk_vlan_portPvid_set(rtk_port_t port
, rtk_vlan_t pvid
, rtk_pri_t priority
)
654 rtk_api_ret_t retVal
;
657 /* Check initialization state */
658 RTK_CHK_INIT_STATE();
660 /* Check Port Valid */
661 RTK_CHK_PORT_VALID(port
);
663 /* vid must be 0~8191 */
664 if (pvid
> RTL8367C_EVIDMAX
)
665 return RT_ERR_VLAN_VID
;
667 /* priority must be 0~7 */
668 if (priority
> RTL8367C_PRIMAX
)
669 return RT_ERR_VLAN_PRIORITY
;
671 if((retVal
= rtk_vlan_checkAndCreateMbr(pvid
, &index
)) != RT_ERR_OK
)
674 if ((retVal
= rtl8367c_setAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port
), index
, priority
)) != RT_ERR_OK
)
681 * rtk_vlan_portPvid_get
683 * Get VLAN ID(PVID) on specified port.
687 * pPvid - Specified VLAN ID.
688 * pPriority - 802.1p priority for the PVID.
691 * RT_ERR_FAILED - Failed
692 * RT_ERR_SMI - SMI access error
693 * RT_ERR_INPUT - Invalid input parameters.
694 * RT_ERR_PORT_ID - Invalid port number.
696 * The API can get the PVID and 802.1p priority for the PVID of Port-based VLAN.
698 rtk_api_ret_t
rtk_vlan_portPvid_get(rtk_port_t port
, rtk_vlan_t
*pPvid
, rtk_pri_t
*pPriority
)
700 rtk_api_ret_t retVal
;
701 rtk_uint32 index
, pri
;
702 rtl8367c_vlanconfiguser mbrCfg
;
704 /* Check initialization state */
705 RTK_CHK_INIT_STATE();
707 /* Check Port Valid */
708 RTK_CHK_PORT_VALID(port
);
711 return RT_ERR_NULL_POINTER
;
713 if(NULL
== pPriority
)
714 return RT_ERR_NULL_POINTER
;
716 if ((retVal
= rtl8367c_getAsicVlanPortBasedVID(rtk_switch_port_L2P_get(port
), &index
, &pri
)) != RT_ERR_OK
)
719 memset(&mbrCfg
, 0x00, sizeof(rtl8367c_vlanconfiguser
));
720 if ((retVal
= rtl8367c_getAsicVlanMemberConfig(index
, &mbrCfg
)) != RT_ERR_OK
)
723 *pPvid
= mbrCfg
.evid
;
730 * rtk_vlan_portIgrFilterEnable_set
732 * Set VLAN ingress for each port.
735 * igr_filter - VLAN ingress function enable status.
740 * RT_ERR_FAILED - Failed
741 * RT_ERR_SMI - SMI access error
742 * RT_ERR_PORT_ID - Invalid port number
743 * RT_ERR_ENABLE - Invalid enable input
745 * The status of vlan ingress filter is as following:
748 * While VLAN function is enabled, ASIC will decide VLAN ID for each received frame and get belonged member
749 * 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.
751 rtk_api_ret_t
rtk_vlan_portIgrFilterEnable_set(rtk_port_t port
, rtk_enable_t igr_filter
)
753 rtk_api_ret_t retVal
;
755 /* Check initialization state */
756 RTK_CHK_INIT_STATE();
758 /* Check Port Valid */
759 RTK_CHK_PORT_VALID(port
);
761 if (igr_filter
>= RTK_ENABLE_END
)
762 return RT_ERR_ENABLE
;
764 if ((retVal
= rtl8367c_setAsicVlanIngressFilter(rtk_switch_port_L2P_get(port
), igr_filter
)) != RT_ERR_OK
)
771 * rtk_vlan_portIgrFilterEnable_get
773 * Get VLAN Ingress Filter
777 * pIgr_filter - VLAN ingress function enable status.
780 * RT_ERR_FAILED - Failed
781 * RT_ERR_SMI - SMI access error
782 * RT_ERR_INPUT - Invalid input parameters.
783 * RT_ERR_PORT_ID - Invalid port number.
785 * The API can Get the VLAN ingress filter status.
786 * The status of vlan ingress filter is as following:
790 rtk_api_ret_t
rtk_vlan_portIgrFilterEnable_get(rtk_port_t port
, rtk_enable_t
*pIgr_filter
)
792 rtk_api_ret_t retVal
;
794 /* Check initialization state */
795 RTK_CHK_INIT_STATE();
797 /* Check Port Valid */
798 RTK_CHK_PORT_VALID(port
);
800 if(NULL
== pIgr_filter
)
801 return RT_ERR_NULL_POINTER
;
803 if ((retVal
= rtl8367c_getAsicVlanIngressFilter(rtk_switch_port_L2P_get(port
), pIgr_filter
)) != RT_ERR_OK
)
810 * rtk_vlan_portAcceptFrameType_set
812 * Set VLAN accept_frame_type
815 * accept_frame_type - accept frame type
820 * RT_ERR_FAILED - Failed
821 * RT_ERR_SMI - SMI access error
822 * RT_ERR_PORT_ID - Invalid port number.
823 * RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type.
825 * The API is used for checking 802.1Q tagged frames.
826 * The accept frame type as following:
827 * - ACCEPT_FRAME_TYPE_ALL
828 * - ACCEPT_FRAME_TYPE_TAG_ONLY
829 * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
831 rtk_api_ret_t
rtk_vlan_portAcceptFrameType_set(rtk_port_t port
, rtk_vlan_acceptFrameType_t accept_frame_type
)
833 rtk_api_ret_t retVal
;
835 /* Check initialization state */
836 RTK_CHK_INIT_STATE();
838 /* Check Port Valid */
839 RTK_CHK_PORT_VALID(port
);
841 if (accept_frame_type
>= ACCEPT_FRAME_TYPE_END
)
842 return RT_ERR_VLAN_ACCEPT_FRAME_TYPE
;
844 if ((retVal
= rtl8367c_setAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port
), (rtl8367c_accframetype
)accept_frame_type
)) != RT_ERR_OK
)
851 * rtk_vlan_portAcceptFrameType_get
853 * Get VLAN accept_frame_type
857 * pAccept_frame_type - accept frame type
860 * RT_ERR_FAILED - Failed
861 * RT_ERR_SMI - SMI access error
862 * RT_ERR_INPUT - Invalid input parameters.
863 * RT_ERR_PORT_ID - Invalid port number.
865 * The API can Get the VLAN ingress filter.
866 * The accept frame type as following:
867 * - ACCEPT_FRAME_TYPE_ALL
868 * - ACCEPT_FRAME_TYPE_TAG_ONLY
869 * - ACCEPT_FRAME_TYPE_UNTAG_ONLY
871 rtk_api_ret_t
rtk_vlan_portAcceptFrameType_get(rtk_port_t port
, rtk_vlan_acceptFrameType_t
*pAccept_frame_type
)
873 rtk_api_ret_t retVal
;
874 rtl8367c_accframetype acc_frm_type
;
876 /* Check initialization state */
877 RTK_CHK_INIT_STATE();
879 /* Check Port Valid */
880 RTK_CHK_PORT_VALID(port
);
882 if(NULL
== pAccept_frame_type
)
883 return RT_ERR_NULL_POINTER
;
885 if ((retVal
= rtl8367c_getAsicVlanAccpetFrameType(rtk_switch_port_L2P_get(port
), &acc_frm_type
)) != RT_ERR_OK
)
888 *pAccept_frame_type
= (rtk_vlan_acceptFrameType_t
)acc_frm_type
;
894 * rtk_vlan_protoAndPortBasedVlan_add
896 * Add the protocol-and-port-based vlan to the specified port of device.
899 * pInfo - Protocol and port based VLAN configuration information.
904 * RT_ERR_FAILED - Failed
905 * RT_ERR_SMI - SMI access error
906 * RT_ERR_PORT_ID - Invalid port number.
907 * RT_ERR_VLAN_VID - Invalid VID parameter.
908 * RT_ERR_VLAN_PRIORITY - Invalid priority.
909 * RT_ERR_TBL_FULL - Table is full.
910 * RT_ERR_OUT_OF_RANGE - input out of range.
912 * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
913 * The frame type is shown in the following:
914 * - FRAME_TYPE_ETHERNET
915 * - FRAME_TYPE_RFC1042
916 * - FRAME_TYPE_LLCOTHER
918 rtk_api_ret_t
rtk_vlan_protoAndPortBasedVlan_add(rtk_port_t port
, rtk_vlan_protoAndPortInfo_t
*pInfo
)
920 rtk_api_ret_t retVal
, i
;
921 rtk_uint32 exist
, empty
, used
, index
;
922 rtl8367c_protocolgdatacfg ppb_data_cfg
;
923 rtl8367c_protocolvlancfg ppb_vlan_cfg
;
924 rtl8367c_provlan_frametype tmp
;
926 /* Check initialization state */
927 RTK_CHK_INIT_STATE();
929 /* Check Port Valid */
930 RTK_CHK_PORT_VALID(port
);
933 return RT_ERR_NULL_POINTER
;
935 if (pInfo
->proto_type
> RTK_MAX_NUM_OF_PROTO_TYPE
)
936 return RT_ERR_OUT_OF_RANGE
;
938 if (pInfo
->frame_type
>= FRAME_TYPE_END
)
939 return RT_ERR_OUT_OF_RANGE
;
941 if (pInfo
->cvid
> RTL8367C_VIDMAX
)
942 return RT_ERR_VLAN_VID
;
944 if (pInfo
->cpri
> RTL8367C_PRIMAX
)
945 return RT_ERR_VLAN_PRIORITY
;
949 for (i
= RTL8367C_PROTOVLAN_GIDX_MAX
; i
>= 0; i
--)
951 if ((retVal
= rtl8367c_getAsicVlanProtocolBasedGroupData(i
, &ppb_data_cfg
)) != RT_ERR_OK
)
953 tmp
= pInfo
->frame_type
;
954 if (ppb_data_cfg
.etherType
== pInfo
->proto_type
&& ppb_data_cfg
.frameType
== tmp
)
960 else if (ppb_data_cfg
.etherType
== 0 && ppb_data_cfg
.frameType
== 0)
968 /*No empty and exist index*/
969 if (0xFF == exist
&& 0xFF == empty
)
970 return RT_ERR_TBL_FULL
;
971 else if (exist
<RTL8367C_PROTOVLAN_GROUPNO
)
976 else if (empty
<RTL8367C_PROTOVLAN_GROUPNO
)
978 /*No exist index, but have empty index*/
979 ppb_data_cfg
.frameType
= pInfo
->frame_type
;
980 ppb_data_cfg
.etherType
= pInfo
->proto_type
;
981 if ((retVal
= rtl8367c_setAsicVlanProtocolBasedGroupData(empty
, &ppb_data_cfg
)) != RT_ERR_OK
)
986 return RT_ERR_FAILED
;
988 if((retVal
= rtk_vlan_checkAndCreateMbr(pInfo
->cvid
, &index
)) != RT_ERR_OK
)
991 ppb_vlan_cfg
.vlan_idx
= index
;
992 ppb_vlan_cfg
.valid
= TRUE
;
993 ppb_vlan_cfg
.priority
= pInfo
->cpri
;
994 if ((retVal
= rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port
), used
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1001 * rtk_vlan_protoAndPortBasedVlan_get
1003 * Get the protocol-and-port-based vlan to the specified port of device.
1006 * proto_type - protocol-and-port-based vlan protocol type.
1007 * frame_type - protocol-and-port-based vlan frame type.
1009 * pInfo - Protocol and port based VLAN configuration information.
1012 * RT_ERR_FAILED - Failed
1013 * RT_ERR_SMI - SMI access error
1014 * RT_ERR_PORT_ID - Invalid port number.
1015 * RT_ERR_OUT_OF_RANGE - input out of range.
1016 * RT_ERR_TBL_FULL - Table is full.
1018 * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
1019 * The frame type is shown in the following:
1020 * - FRAME_TYPE_ETHERNET
1021 * - FRAME_TYPE_RFC1042
1022 * - FRAME_TYPE_LLCOTHER
1024 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
)
1026 rtk_api_ret_t retVal
;
1029 rtl8367c_protocolgdatacfg ppb_data_cfg
;
1030 rtl8367c_protocolvlancfg ppb_vlan_cfg
;
1032 /* Check initialization state */
1033 RTK_CHK_INIT_STATE();
1035 /* Check Port Valid */
1036 RTK_CHK_PORT_VALID(port
);
1038 if (proto_type
> RTK_MAX_NUM_OF_PROTO_TYPE
)
1039 return RT_ERR_OUT_OF_RANGE
;
1041 if (frame_type
>= FRAME_TYPE_END
)
1042 return RT_ERR_OUT_OF_RANGE
;
1046 for (i
= 0; i
<= RTL8367C_PROTOVLAN_GIDX_MAX
; i
++)
1048 if ((retVal
= rtl8367c_getAsicVlanProtocolBasedGroupData(i
, &ppb_data_cfg
)) != RT_ERR_OK
)
1051 if ( (ppb_data_cfg
.frameType
== (rtl8367c_provlan_frametype
)frame_type
) && (ppb_data_cfg
.etherType
== proto_type
) )
1056 else if (RTL8367C_PROTOVLAN_GIDX_MAX
== i
)
1057 return RT_ERR_TBL_FULL
;
1060 if ((retVal
= rtl8367c_getAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port
), ppb_idx
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1063 if (FALSE
== ppb_vlan_cfg
.valid
)
1064 return RT_ERR_FAILED
;
1066 pInfo
->frame_type
= frame_type
;
1067 pInfo
->proto_type
= proto_type
;
1068 pInfo
->cvid
= vlan_mbrCfgVid
[ppb_vlan_cfg
.vlan_idx
];
1069 pInfo
->cpri
= ppb_vlan_cfg
.priority
;
1075 * rtk_vlan_protoAndPortBasedVlan_del
1077 * Delete the protocol-and-port-based vlan from the specified port of device.
1080 * proto_type - protocol-and-port-based vlan protocol type.
1081 * frame_type - protocol-and-port-based vlan frame type.
1086 * RT_ERR_FAILED - Failed
1087 * RT_ERR_SMI - SMI access error
1088 * RT_ERR_PORT_ID - Invalid port number.
1089 * RT_ERR_OUT_OF_RANGE - input out of range.
1090 * RT_ERR_TBL_FULL - Table is full.
1092 * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
1093 * The frame type is shown in the following:
1094 * - FRAME_TYPE_ETHERNET
1095 * - FRAME_TYPE_RFC1042
1096 * - FRAME_TYPE_LLCOTHER
1098 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
)
1100 rtk_api_ret_t retVal
;
1101 rtk_uint32 i
, bUsed
;
1103 rtl8367c_protocolgdatacfg ppb_data_cfg
;
1104 rtl8367c_protocolvlancfg ppb_vlan_cfg
;
1106 /* Check initialization state */
1107 RTK_CHK_INIT_STATE();
1109 /* Check Port Valid */
1110 RTK_CHK_PORT_VALID(port
);
1112 if (proto_type
> RTK_MAX_NUM_OF_PROTO_TYPE
)
1113 return RT_ERR_OUT_OF_RANGE
;
1115 if (frame_type
>= FRAME_TYPE_END
)
1116 return RT_ERR_OUT_OF_RANGE
;
1120 for (i
= 0; i
<= RTL8367C_PROTOVLAN_GIDX_MAX
; i
++)
1122 if ((retVal
= rtl8367c_getAsicVlanProtocolBasedGroupData(i
, &ppb_data_cfg
)) != RT_ERR_OK
)
1125 if ( (ppb_data_cfg
.frameType
== (rtl8367c_provlan_frametype
)frame_type
) && (ppb_data_cfg
.etherType
== proto_type
) )
1128 ppb_vlan_cfg
.valid
= FALSE
;
1129 ppb_vlan_cfg
.vlan_idx
= 0;
1130 ppb_vlan_cfg
.priority
= 0;
1131 if ((retVal
= rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port
), ppb_idx
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1137 RTK_SCAN_ALL_PHY_PORTMASK(i
)
1139 if ((retVal
= rtl8367c_getAsicVlanPortAndProtocolBased(i
, ppb_idx
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1142 if (TRUE
== ppb_vlan_cfg
.valid
)
1149 if (FALSE
== bUsed
) /*No Port use this PPB Index, Delete it*/
1151 ppb_data_cfg
.etherType
=0;
1152 ppb_data_cfg
.frameType
=0;
1153 if ((retVal
= rtl8367c_setAsicVlanProtocolBasedGroupData(ppb_idx
, &ppb_data_cfg
)) != RT_ERR_OK
)
1161 * rtk_vlan_protoAndPortBasedVlan_delAll
1163 * Delete all protocol-and-port-based vlans from the specified port of device.
1170 * RT_ERR_FAILED - Failed
1171 * RT_ERR_SMI - SMI access error
1172 * RT_ERR_PORT_ID - Invalid port number.
1173 * RT_ERR_OUT_OF_RANGE - input out of range.
1175 * The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
1176 * Delete all flow table protocol-and-port-based vlan entries.
1178 rtk_api_ret_t
rtk_vlan_protoAndPortBasedVlan_delAll(rtk_port_t port
)
1180 rtk_api_ret_t retVal
;
1181 rtk_uint32 i
, j
, bUsed
[4];
1182 rtl8367c_protocolgdatacfg ppb_data_cfg
;
1183 rtl8367c_protocolvlancfg ppb_vlan_cfg
;
1185 /* Check initialization state */
1186 RTK_CHK_INIT_STATE();
1188 /* Check Port Valid */
1189 RTK_CHK_PORT_VALID(port
);
1191 for (i
= 0; i
<= RTL8367C_PROTOVLAN_GIDX_MAX
; i
++)
1193 ppb_vlan_cfg
.valid
= FALSE
;
1194 ppb_vlan_cfg
.vlan_idx
= 0;
1195 ppb_vlan_cfg
.priority
= 0;
1196 if ((retVal
= rtl8367c_setAsicVlanPortAndProtocolBased(rtk_switch_port_L2P_get(port
), i
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1204 RTK_SCAN_ALL_PHY_PORTMASK(i
)
1206 for (j
= 0; j
<= RTL8367C_PROTOVLAN_GIDX_MAX
; j
++)
1208 if ((retVal
= rtl8367c_getAsicVlanPortAndProtocolBased(i
,j
, &ppb_vlan_cfg
)) != RT_ERR_OK
)
1211 if (TRUE
== ppb_vlan_cfg
.valid
)
1218 for (i
= 0; i
<= RTL8367C_PROTOVLAN_GIDX_MAX
; i
++)
1220 if (FALSE
== bUsed
[i
]) /*No Port use this PPB Index, Delete it*/
1222 ppb_data_cfg
.etherType
=0;
1223 ppb_data_cfg
.frameType
=0;
1224 if ((retVal
= rtl8367c_setAsicVlanProtocolBasedGroupData(i
, &ppb_data_cfg
)) != RT_ERR_OK
)
1235 * rtk_vlan_tagMode_set
1237 * Set CVLAN egress tag mode
1240 * tag_mode - The egress tag mode.
1245 * RT_ERR_FAILED - Failed
1246 * RT_ERR_SMI - SMI access error
1247 * RT_ERR_PORT_ID - Invalid port number.
1248 * RT_ERR_INPUT - Invalid input parameter.
1249 * RT_ERR_ENABLE - Invalid enable input.
1251 * The API can set Egress tag mode. There are 4 mode for egress tag:
1252 * - VLAN_TAG_MODE_ORIGINAL,
1253 * - VLAN_TAG_MODE_KEEP_FORMAT,
1254 * - VLAN_TAG_MODE_PRI.
1255 * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
1257 rtk_api_ret_t
rtk_vlan_tagMode_set(rtk_port_t port
, rtk_vlan_tagMode_t tag_mode
)
1259 rtk_api_ret_t retVal
;
1261 /* Check initialization state */
1262 RTK_CHK_INIT_STATE();
1264 /* Check Port Valid */
1265 RTK_CHK_PORT_VALID(port
);
1267 if (tag_mode
>= VLAN_TAG_MODE_END
)
1268 return RT_ERR_PORT_ID
;
1270 if ((retVal
= rtl8367c_setAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port
), tag_mode
)) != RT_ERR_OK
)
1277 * rtk_vlan_tagMode_get
1279 * Get CVLAN egress tag mode
1283 * pTag_mode - The egress tag mode.
1286 * RT_ERR_FAILED - Failed
1287 * RT_ERR_SMI - SMI access error
1288 * RT_ERR_INPUT - Invalid input parameters.
1289 * RT_ERR_PORT_ID - Invalid port number.
1291 * The API can get Egress tag mode. There are 4 mode for egress tag:
1292 * - VLAN_TAG_MODE_ORIGINAL,
1293 * - VLAN_TAG_MODE_KEEP_FORMAT,
1294 * - VLAN_TAG_MODE_PRI.
1295 * - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
1297 rtk_api_ret_t
rtk_vlan_tagMode_get(rtk_port_t port
, rtk_vlan_tagMode_t
*pTag_mode
)
1299 rtk_api_ret_t retVal
;
1300 rtl8367c_egtagmode mode
;
1302 /* Check initialization state */
1303 RTK_CHK_INIT_STATE();
1305 /* Check Port Valid */
1306 RTK_CHK_PORT_VALID(port
);
1308 if(NULL
== pTag_mode
)
1309 return RT_ERR_NULL_POINTER
;
1311 if ((retVal
= rtl8367c_getAsicVlanEgressTagMode(rtk_switch_port_L2P_get(port
), &mode
)) != RT_ERR_OK
)
1314 *pTag_mode
= (rtk_vlan_tagMode_t
)mode
;
1319 * rtk_vlan_transparent_set
1321 * Set VLAN transparent mode
1323 * egr_port - Egress Port id.
1324 * pIgr_pmask - Ingress Port Mask.
1329 * RT_ERR_FAILED - Failed
1330 * RT_ERR_SMI - SMI access error
1331 * RT_ERR_INPUT - Invalid input parameters.
1332 * RT_ERR_PORT_ID - Invalid port number.
1336 rtk_api_ret_t
rtk_vlan_transparent_set(rtk_port_t egr_port
, rtk_portmask_t
*pIgr_pmask
)
1338 rtk_api_ret_t retVal
;
1341 /* Check initialization state */
1342 RTK_CHK_INIT_STATE();
1344 /* Check Port Valid */
1345 RTK_CHK_PORT_VALID(egr_port
);
1347 if(NULL
== pIgr_pmask
)
1348 return RT_ERR_NULL_POINTER
;
1350 RTK_CHK_PORTMASK_VALID(pIgr_pmask
);
1352 if(rtk_switch_portmask_L2P_get(pIgr_pmask
, &pmask
) != RT_ERR_OK
)
1353 return RT_ERR_FAILED
;
1355 if ((retVal
= rtl8367c_setAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port
), pmask
)) != RT_ERR_OK
)
1362 * rtk_vlan_transparent_get
1364 * Get VLAN transparent mode
1366 * egr_port - Egress Port id.
1368 * pIgr_pmask - Ingress Port Mask
1371 * RT_ERR_FAILED - Failed
1372 * RT_ERR_SMI - SMI access error
1373 * RT_ERR_INPUT - Invalid input parameters.
1374 * RT_ERR_PORT_ID - Invalid port number.
1378 rtk_api_ret_t
rtk_vlan_transparent_get(rtk_port_t egr_port
, rtk_portmask_t
*pIgr_pmask
)
1380 rtk_api_ret_t retVal
;
1383 /* Check initialization state */
1384 RTK_CHK_INIT_STATE();
1386 /* Check Port Valid */
1387 RTK_CHK_PORT_VALID(egr_port
);
1389 if(NULL
== pIgr_pmask
)
1390 return RT_ERR_NULL_POINTER
;
1392 if ((retVal
= rtl8367c_getAsicVlanTransparent(rtk_switch_port_L2P_get(egr_port
), &pmask
)) != RT_ERR_OK
)
1395 if(rtk_switch_portmask_P2L_get(pmask
, pIgr_pmask
) != RT_ERR_OK
)
1396 return RT_ERR_FAILED
;
1404 * Set VLAN egress keep mode
1406 * egr_port - Egress Port id.
1407 * pIgr_pmask - Ingress Port Mask.
1412 * RT_ERR_FAILED - Failed
1413 * RT_ERR_SMI - SMI access error
1414 * RT_ERR_INPUT - Invalid input parameters.
1415 * RT_ERR_PORT_ID - Invalid port number.
1419 rtk_api_ret_t
rtk_vlan_keep_set(rtk_port_t egr_port
, rtk_portmask_t
*pIgr_pmask
)
1421 rtk_api_ret_t retVal
;
1424 /* Check initialization state */
1425 RTK_CHK_INIT_STATE();
1427 /* Check Port Valid */
1428 RTK_CHK_PORT_VALID(egr_port
);
1430 if(NULL
== pIgr_pmask
)
1431 return RT_ERR_NULL_POINTER
;
1433 RTK_CHK_PORTMASK_VALID(pIgr_pmask
);
1435 if(rtk_switch_portmask_L2P_get(pIgr_pmask
, &pmask
) != RT_ERR_OK
)
1436 return RT_ERR_FAILED
;
1438 if ((retVal
= rtl8367c_setAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port
), pmask
)) != RT_ERR_OK
)
1447 * Get VLAN egress keep mode
1449 * egr_port - Egress Port id.
1451 * pIgr_pmask - Ingress Port Mask
1454 * RT_ERR_FAILED - Failed
1455 * RT_ERR_SMI - SMI access error
1456 * RT_ERR_INPUT - Invalid input parameters.
1457 * RT_ERR_PORT_ID - Invalid port number.
1461 rtk_api_ret_t
rtk_vlan_keep_get(rtk_port_t egr_port
, rtk_portmask_t
*pIgr_pmask
)
1463 rtk_api_ret_t retVal
;
1466 /* Check initialization state */
1467 RTK_CHK_INIT_STATE();
1469 /* Check Port Valid */
1470 RTK_CHK_PORT_VALID(egr_port
);
1472 if(NULL
== pIgr_pmask
)
1473 return RT_ERR_NULL_POINTER
;
1475 if ((retVal
= rtl8367c_getAsicVlanEgressKeep(rtk_switch_port_L2P_get(egr_port
), &pmask
)) != RT_ERR_OK
)
1478 if(rtk_switch_portmask_P2L_get(pmask
, pIgr_pmask
) != RT_ERR_OK
)
1479 return RT_ERR_FAILED
;
1487 * Set spanning tree group instance of the vlan to the specified device
1489 * vid - Specified VLAN ID.
1490 * stg - spanning tree group instance.
1495 * RT_ERR_FAILED - Failed
1496 * RT_ERR_SMI - SMI access error
1497 * RT_ERR_MSTI - Invalid msti parameter
1498 * RT_ERR_INPUT - Invalid input parameter.
1499 * RT_ERR_VLAN_VID - Invalid VID parameter.
1501 * The API can set spanning tree group instance of the vlan to the specified device.
1503 rtk_api_ret_t
rtk_vlan_stg_set(rtk_vlan_t vid
, rtk_stp_msti_id_t stg
)
1505 rtk_api_ret_t retVal
;
1506 rtl8367c_user_vlan4kentry vlan4K
;
1508 /* Check initialization state */
1509 RTK_CHK_INIT_STATE();
1511 /* vid must be 0~4095 */
1512 if (vid
> RTL8367C_VIDMAX
)
1513 return RT_ERR_VLAN_VID
;
1515 /* priority must be 0~15 */
1516 if (stg
> RTL8367C_MSTIMAX
)
1519 /* update 4K table */
1521 if ((retVal
= rtl8367c_getAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
1524 vlan4K
.fid_msti
= stg
;
1525 if ((retVal
= rtl8367c_setAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
1534 * Get spanning tree group instance of the vlan to the specified device
1536 * vid - Specified VLAN ID.
1538 * pStg - spanning tree group instance.
1541 * RT_ERR_FAILED - Failed
1542 * RT_ERR_SMI - SMI access error
1543 * RT_ERR_INPUT - Invalid input parameters.
1544 * RT_ERR_VLAN_VID - Invalid VID parameter.
1546 * The API can get spanning tree group instance of the vlan to the specified device.
1548 rtk_api_ret_t
rtk_vlan_stg_get(rtk_vlan_t vid
, rtk_stp_msti_id_t
*pStg
)
1550 rtk_api_ret_t retVal
;
1551 rtl8367c_user_vlan4kentry vlan4K
;
1553 /* Check initialization state */
1554 RTK_CHK_INIT_STATE();
1556 /* vid must be 0~4095 */
1557 if (vid
> RTL8367C_VIDMAX
)
1558 return RT_ERR_VLAN_VID
;
1561 return RT_ERR_NULL_POINTER
;
1563 /* update 4K table */
1565 if ((retVal
= rtl8367c_getAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
1568 *pStg
= vlan4K
.fid_msti
;
1574 * rtk_vlan_portFid_set
1576 * Set port-based filtering database
1579 * enable - ebable port-based FID
1580 * fid - Specified filtering database.
1585 * RT_ERR_FAILED - Failed
1586 * RT_ERR_SMI - SMI access error
1587 * RT_ERR_L2_FID - Invalid fid.
1588 * RT_ERR_INPUT - Invalid input parameter.
1589 * RT_ERR_PORT_ID - Invalid port ID.
1591 * The API can set port-based filtering database. If the function is enabled, all input
1592 * packets will be assigned to the port-based fid regardless vlan tag.
1594 rtk_api_ret_t
rtk_vlan_portFid_set(rtk_port_t port
, rtk_enable_t enable
, rtk_fid_t fid
)
1596 rtk_api_ret_t retVal
;
1598 /* Check initialization state */
1599 RTK_CHK_INIT_STATE();
1601 /* Check Port Valid */
1602 RTK_CHK_PORT_VALID(port
);
1604 if (enable
>=RTK_ENABLE_END
)
1605 return RT_ERR_ENABLE
;
1607 /* fid must be 0~4095 */
1608 if (fid
> RTK_FID_MAX
)
1609 return RT_ERR_L2_FID
;
1611 if ((retVal
= rtl8367c_setAsicPortBasedFidEn(rtk_switch_port_L2P_get(port
), enable
))!=RT_ERR_OK
)
1614 if ((retVal
= rtl8367c_setAsicPortBasedFid(rtk_switch_port_L2P_get(port
), fid
))!=RT_ERR_OK
)
1621 * rtk_vlan_portFid_get
1623 * Get port-based filtering database
1627 * pEnable - ebable port-based FID
1628 * pFid - Specified filtering database.
1631 * RT_ERR_FAILED - Failed
1632 * RT_ERR_SMI - SMI access error
1633 * RT_ERR_INPUT - Invalid input parameters.
1634 * RT_ERR_PORT_ID - Invalid port ID.
1636 * The API can get port-based filtering database status. If the function is enabled, all input
1637 * packets will be assigned to the port-based fid regardless vlan tag.
1639 rtk_api_ret_t
rtk_vlan_portFid_get(rtk_port_t port
, rtk_enable_t
*pEnable
, rtk_fid_t
*pFid
)
1641 rtk_api_ret_t retVal
;
1643 /* Check initialization state */
1644 RTK_CHK_INIT_STATE();
1646 /* Check Port Valid */
1647 RTK_CHK_PORT_VALID(port
);
1650 return RT_ERR_NULL_POINTER
;
1653 return RT_ERR_NULL_POINTER
;
1655 if ((retVal
= rtl8367c_getAsicPortBasedFidEn(rtk_switch_port_L2P_get(port
), pEnable
))!=RT_ERR_OK
)
1658 if ((retVal
= rtl8367c_getAsicPortBasedFid(rtk_switch_port_L2P_get(port
), pFid
))!=RT_ERR_OK
)
1665 * rtk_vlan_UntagDscpPriorityEnable_set
1667 * Set Untag DSCP priority assign
1669 * enable - state of Untag DSCP priority assign
1674 * RT_ERR_FAILED - Failed
1675 * RT_ERR_SMI - SMI access error
1676 * RT_ERR_ENABLE - Invalid input parameters.
1680 rtk_api_ret_t
rtk_vlan_UntagDscpPriorityEnable_set(rtk_enable_t enable
)
1682 rtk_api_ret_t retVal
;
1684 /* Check initialization state */
1685 RTK_CHK_INIT_STATE();
1687 if(enable
>= RTK_ENABLE_END
)
1688 return RT_ERR_ENABLE
;
1690 if ((retVal
= rtl8367c_setAsicVlanUntagDscpPriorityEn((rtk_uint32
)enable
)) != RT_ERR_OK
)
1697 * rtk_vlan_UntagDscpPriorityEnable_get
1699 * Get Untag DSCP priority assign
1703 * pEnable - state of Untag DSCP priority assign
1706 * RT_ERR_FAILED - Failed
1707 * RT_ERR_SMI - SMI access error
1708 * RT_ERR_NULL_POINTER - Null pointer
1712 rtk_api_ret_t
rtk_vlan_UntagDscpPriorityEnable_get(rtk_enable_t
*pEnable
)
1714 rtk_api_ret_t retVal
;
1717 /* Check initialization state */
1718 RTK_CHK_INIT_STATE();
1721 return RT_ERR_NULL_POINTER
;
1723 if ((retVal
= rtl8367c_getAsicVlanUntagDscpPriorityEn(&value
)) != RT_ERR_OK
)
1726 *pEnable
= (rtk_enable_t
)value
;
1731 * rtk_stp_mstpState_set
1733 * Configure spanning tree state per each port.
1736 * msti - Multiple spanning tree instance.
1737 * stp_state - Spanning tree state for msti
1742 * RT_ERR_FAILED - Failed
1743 * RT_ERR_SMI - SMI access error
1744 * RT_ERR_PORT_ID - Invalid port number.
1745 * RT_ERR_MSTI - Invalid msti parameter.
1746 * RT_ERR_MSTP_STATE - Invalid STP state.
1748 * System supports per-port multiple spanning tree state for each msti.
1749 * There are four states supported by ASIC.
1750 * - STP_STATE_DISABLED
1751 * - STP_STATE_BLOCKING
1752 * - STP_STATE_LEARNING
1753 * - STP_STATE_FORWARDING
1755 rtk_api_ret_t
rtk_stp_mstpState_set(rtk_stp_msti_id_t msti
, rtk_port_t port
, rtk_stp_state_t stp_state
)
1757 rtk_api_ret_t retVal
;
1759 /* Check initialization state */
1760 RTK_CHK_INIT_STATE();
1762 /* Check Port Valid */
1763 RTK_CHK_PORT_VALID(port
);
1765 if (msti
> RTK_MAX_NUM_OF_MSTI
)
1768 if (stp_state
>= STP_STATE_END
)
1769 return RT_ERR_MSTP_STATE
;
1771 if ((retVal
= rtl8367c_setAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port
), msti
, stp_state
)) != RT_ERR_OK
)
1778 * rtk_stp_mstpState_get
1780 * Get spanning tree state per each port.
1783 * msti - Multiple spanning tree instance.
1785 * pStp_state - Spanning tree state for msti
1788 * RT_ERR_FAILED - Failed
1789 * RT_ERR_SMI - SMI access error
1790 * RT_ERR_PORT_ID - Invalid port number.
1791 * RT_ERR_MSTI - Invalid msti parameter.
1793 * System supports per-port multiple spanning tree state for each msti.
1794 * There are four states supported by ASIC.
1795 * - STP_STATE_DISABLED
1796 * - STP_STATE_BLOCKING
1797 * - STP_STATE_LEARNING
1798 * - STP_STATE_FORWARDING
1800 rtk_api_ret_t
rtk_stp_mstpState_get(rtk_stp_msti_id_t msti
, rtk_port_t port
, rtk_stp_state_t
*pStp_state
)
1802 rtk_api_ret_t retVal
;
1804 /* Check initialization state */
1805 RTK_CHK_INIT_STATE();
1807 /* Check Port Valid */
1808 RTK_CHK_PORT_VALID(port
);
1810 if (msti
> RTK_MAX_NUM_OF_MSTI
)
1813 if(NULL
== pStp_state
)
1814 return RT_ERR_NULL_POINTER
;
1816 if ((retVal
= rtl8367c_getAsicSpanningTreeStatus(rtk_switch_port_L2P_get(port
), msti
, pStp_state
)) != RT_ERR_OK
)
1823 * rtk_vlan_checkAndCreateMbr
1825 * Check and create Member configuration and return index
1829 * pIndex - Member configuration index
1832 * RT_ERR_FAILED - Failed
1833 * RT_ERR_SMI - SMI access error
1834 * RT_ERR_VLAN_VID - Invalid VLAN ID.
1835 * RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN not found
1836 * RT_ERR_TBL_FULL - Member Configuration table full
1840 rtk_api_ret_t
rtk_vlan_checkAndCreateMbr(rtk_vlan_t vid
, rtk_uint32
*pIndex
)
1842 rtk_api_ret_t retVal
;
1843 rtl8367c_user_vlan4kentry vlan4K
;
1844 rtl8367c_vlanconfiguser vlanMC
;
1846 rtk_uint32 empty_idx
= 0xFFFF;
1848 /* Check initialization state */
1849 RTK_CHK_INIT_STATE();
1851 /* vid must be 0~8191 */
1852 if (vid
> RTL8367C_EVIDMAX
)
1853 return RT_ERR_VLAN_VID
;
1855 /* Null pointer check */
1857 return RT_ERR_NULL_POINTER
;
1860 if (vid
<= RTL8367C_VIDMAX
)
1862 memset(&vlan4K
, 0x00, sizeof(rtl8367c_user_vlan4kentry
));
1864 if ((retVal
= rtl8367c_getAsicVlan4kEntry(&vlan4K
)) != RT_ERR_OK
)
1868 /* Search exist entry */
1869 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
1871 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_USED_BY_VLAN
)
1873 if(vlan_mbrCfgVid
[idx
] == vid
)
1875 /* Found! return index */
1882 /* Not found, Read H/W Member Configuration table to update database */
1883 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
1885 if ((retVal
= rtl8367c_getAsicVlanMemberConfig(idx
, &vlanMC
)) != RT_ERR_OK
)
1888 if( (vlanMC
.evid
== 0) && (vlanMC
.mbr
== 0x00))
1890 vlan_mbrCfgUsage
[idx
] = MBRCFG_UNUSED
;
1891 vlan_mbrCfgVid
[idx
] = 0;
1895 vlan_mbrCfgUsage
[idx
] = MBRCFG_USED_BY_VLAN
;
1896 vlan_mbrCfgVid
[idx
] = vlanMC
.evid
;
1900 /* Search exist entry again */
1901 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
1903 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_USED_BY_VLAN
)
1905 if(vlan_mbrCfgVid
[idx
] == vid
)
1907 /* Found! return index */
1914 /* try to look up an empty index */
1915 for (idx
= 0; idx
<= RTL8367C_CVIDXMAX
; idx
++)
1917 if(vlan_mbrCfgUsage
[idx
] == MBRCFG_UNUSED
)
1924 if(empty_idx
== 0xFFFF)
1926 /* No empty index */
1927 return RT_ERR_TBL_FULL
;
1930 if (vid
> RTL8367C_VIDMAX
)
1932 /* > 4K, there is no 4K entry, create on member configuration directly */
1933 memset(&vlanMC
, 0x00, sizeof(rtl8367c_vlanconfiguser
));
1935 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(empty_idx
, &vlanMC
)) != RT_ERR_OK
)
1940 /* Copy from 4K table */
1942 vlanMC
.mbr
= vlan4K
.mbr
;
1943 vlanMC
.fid_msti
= vlan4K
.fid_msti
;
1944 vlanMC
.meteridx
= vlan4K
.meteridx
;
1945 vlanMC
.envlanpol
= vlan4K
.envlanpol
;
1946 vlanMC
.vbpen
= vlan4K
.vbpen
;
1947 vlanMC
.vbpri
= vlan4K
.vbpri
;
1948 if ((retVal
= rtl8367c_setAsicVlanMemberConfig(empty_idx
, &vlanMC
)) != RT_ERR_OK
)
1952 /* Update Database */
1953 vlan_mbrCfgUsage
[empty_idx
] = MBRCFG_USED_BY_VLAN
;
1954 vlan_mbrCfgVid
[empty_idx
] = vid
;
1956 *pIndex
= empty_idx
;
1961 * rtk_vlan_reservedVidAction_set
1963 * Set Action of VLAN ID = 0 & 4095 tagged packet
1965 * action_vid0 - Action for VID 0.
1966 * action_vid4095 - Action for VID 4095.
1971 * RT_ERR_FAILED - Failed
1972 * RT_ERR_SMI - SMI access error
1973 * RT_ERR_INPUT - Error Input
1977 rtk_api_ret_t
rtk_vlan_reservedVidAction_set(rtk_vlan_resVidAction_t action_vid0
, rtk_vlan_resVidAction_t action_vid4095
)
1979 rtk_api_ret_t retVal
;
1981 /* Check initialization state */
1982 RTK_CHK_INIT_STATE();
1984 if(action_vid0
>= RESVID_ACTION_END
)
1985 return RT_ERR_INPUT
;
1987 if(action_vid4095
>= RESVID_ACTION_END
)
1988 return RT_ERR_INPUT
;
1990 if ((retVal
= rtl8367c_setReservedVidAction((rtk_uint32
)action_vid0
, (rtk_uint32
)action_vid4095
)) != RT_ERR_OK
)
1997 * rtk_vlan_reservedVidAction_get
1999 * Get Action of VLAN ID = 0 & 4095 tagged packet
2001 * pAction_vid0 - Action for VID 0.
2002 * pAction_vid4095 - Action for VID 4095.
2007 * RT_ERR_FAILED - Failed
2008 * RT_ERR_SMI - SMI access error
2009 * RT_ERR_NULL_POINTER - NULL Pointer
2013 rtk_api_ret_t
rtk_vlan_reservedVidAction_get(rtk_vlan_resVidAction_t
*pAction_vid0
, rtk_vlan_resVidAction_t
*pAction_vid4095
)
2015 rtk_api_ret_t retVal
;
2017 /* Check initialization state */
2018 RTK_CHK_INIT_STATE();
2020 if(pAction_vid0
== NULL
)
2021 return RT_ERR_NULL_POINTER
;
2023 if(pAction_vid4095
== NULL
)
2024 return RT_ERR_NULL_POINTER
;
2026 if ((retVal
= rtl8367c_getReservedVidAction((rtk_uint32
*)pAction_vid0
, (rtk_uint32
*)pAction_vid4095
)) != RT_ERR_OK
)
2033 * rtk_vlan_realKeepRemarkEnable_set
2035 * Set Real keep 1p remarking feature
2037 * enabled - State of 1p remarking at real keep packet
2042 * RT_ERR_FAILED - Failed
2043 * RT_ERR_SMI - SMI access error
2044 * RT_ERR_INPUT - Error Input
2048 rtk_api_ret_t
rtk_vlan_realKeepRemarkEnable_set(rtk_enable_t enabled
)
2050 rtk_api_ret_t retVal
;
2052 /* Check initialization state */
2053 RTK_CHK_INIT_STATE();
2055 if(enabled
>= RTK_ENABLE_END
)
2056 return RT_ERR_INPUT
;
2058 if ((retVal
= rtl8367c_setRealKeepRemarkEn((rtk_uint32
)enabled
)) != RT_ERR_OK
)
2065 * rtk_vlan_realKeepRemarkEnable_get
2067 * Get Real keep 1p remarking feature
2071 * pEnabled - State of 1p remarking at real keep packet
2074 * RT_ERR_FAILED - Failed
2075 * RT_ERR_SMI - SMI access error
2076 * RT_ERR_INPUT - Error Input
2080 rtk_api_ret_t
rtk_vlan_realKeepRemarkEnable_get(rtk_enable_t
*pEnabled
)
2082 rtk_api_ret_t retVal
;
2084 /* Check initialization state */
2085 RTK_CHK_INIT_STATE();
2087 if(NULL
== pEnabled
)
2088 return RT_ERR_NULL_POINTER
;
2090 if ((retVal
= rtl8367c_getRealKeepRemarkEn((rtk_uint32
*)pEnabled
)) != RT_ERR_OK
)
2103 * pEnabled - State of 1p remarking at real keep packet
2106 * RT_ERR_FAILED - Failed
2107 * RT_ERR_SMI - SMI access error
2108 * RT_ERR_INPUT - Error Input
2112 rtk_api_ret_t
rtk_vlan_reset(void)
2114 rtk_api_ret_t retVal
;
2116 /* Check initialization state */
2117 RTK_CHK_INIT_STATE();
2119 if ((retVal
= rtl8367c_resetVlan()) != RT_ERR_OK
)