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 SVLAN module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
24 #include <rtl8367c_asicdrv.h>
25 #include <rtl8367c_asicdrv_svlan.h>
27 rtk_uint8 svlan_mbrCfgUsage
[RTL8367C_SVIDXNO
];
28 rtk_uint16 svlan_mbrCfgVid
[RTL8367C_SVIDXNO
];
29 rtk_svlan_lookupType_t svlan_lookupType
;
33 * Initialize SVLAN Configuration
40 * RT_ERR_FAILED - Failed
41 * RT_ERR_SMI - SMI access error
43 * Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200 for Q-in-Q SLAN design.
44 * User can set mathced ether type as service provider supported protocol.
46 rtk_api_ret_t
rtk_svlan_init(void)
50 rtl8367c_svlan_memconf_t svlanMemConf
;
51 rtl8367c_svlan_s2c_t svlanSP2CConf
;
52 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
55 /* Check initialization state */
58 /*default use C-priority*/
59 if ((retVal
= rtl8367c_setAsicSvlanPrioritySel(SPRISEL_CTAGPRI
)) != RT_ERR_OK
)
62 /*Drop SVLAN untag frame*/
63 if ((retVal
= rtl8367c_setAsicSvlanIngressUntag(UNTAG_DROP
)) != RT_ERR_OK
)
66 /*Drop SVLAN unmatch frame*/
67 if ((retVal
= rtl8367c_setAsicSvlanIngressUnmatch(UNMATCH_DROP
)) != RT_ERR_OK
)
70 /*Set TPID to 0x88a8*/
71 if ((retVal
= rtl8367c_setAsicSvlanTpid(0x88a8)) != RT_ERR_OK
)
74 /*Clean Uplink Port Mask to none*/
75 if ((retVal
= rtl8367c_setAsicSvlanUplinkPortMask(0)) != RT_ERR_OK
)
78 /*Clean SVLAN Member Configuration*/
79 for (i
=0; i
<= RTL8367C_SVIDXMAX
; i
++)
81 memset(&svlanMemConf
, 0, sizeof(rtl8367c_svlan_memconf_t
));
82 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
86 /*Clean C2S Configuration*/
87 for (i
=0; i
<= RTL8367C_C2SIDXMAX
; i
++)
89 if ((retVal
= rtl8367c_setAsicSvlanC2SConf(i
, 0,0,0)) != RT_ERR_OK
)
93 /*Clean SP2C Configuration*/
94 for (i
=0; i
<= RTL8367C_SP2CMAX
; i
++)
96 memset(&svlanSP2CConf
, 0, sizeof(rtl8367c_svlan_s2c_t
));
97 if ((retVal
= rtl8367c_setAsicSvlanSP2CConf(i
, &svlanSP2CConf
)) != RT_ERR_OK
)
101 /*Clean MC2S Configuration*/
102 for (i
=0 ; i
<= RTL8367C_MC2SIDXMAX
; i
++)
104 memset(&svlanMC2SConf
, 0, sizeof(rtl8367c_svlan_mc2s_t
));
105 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
110 if ((retVal
= rtk_svlan_lookupType_set(SVLAN_LOOKUP_S64MBRCGF
)) != RT_ERR_OK
)
114 for (svidx
= 0; svidx
<= RTL8367C_SVIDXMAX
; svidx
++)
116 svlan_mbrCfgUsage
[svidx
] = FALSE
;
124 * rtk_svlan_servicePort_add
126 * Add one service port in the specified device
133 * RT_ERR_FAILED - Failed
134 * RT_ERR_SMI - SMI access error
135 * RT_ERR_PORT_ID - Invalid port number.
136 * RT_ERR_INPUT - Invalid input parameters.
138 * This API is setting which port is connected to provider switch. All frames receiving from this port must
139 * contain accept SVID in S-tag field.
141 rtk_api_ret_t
rtk_svlan_servicePort_add(rtk_port_t port
)
143 rtk_api_ret_t retVal
;
146 /* Check initialization state */
147 RTK_CHK_INIT_STATE();
149 /* check port valid */
150 RTK_CHK_PORT_VALID(port
);
152 if ((retVal
= rtl8367c_getAsicSvlanUplinkPortMask(&pmsk
)) != RT_ERR_OK
)
155 pmsk
= pmsk
| (1<<rtk_switch_port_L2P_get(port
));
157 if ((retVal
= rtl8367c_setAsicSvlanUplinkPortMask(pmsk
)) != RT_ERR_OK
)
164 * rtk_svlan_servicePort_get
166 * Get service ports in the specified device.
170 * pSvlan_portmask - pointer buffer of svlan ports.
173 * RT_ERR_FAILED - Failed
174 * RT_ERR_SMI - SMI access error
176 * This API is setting which port is connected to provider switch. All frames receiving from this port must
177 * contain accept SVID in S-tag field.
179 rtk_api_ret_t
rtk_svlan_servicePort_get(rtk_portmask_t
*pSvlan_portmask
)
181 rtk_api_ret_t retVal
;
182 rtk_uint32 phyMbrPmask
;
184 /* Check initialization state */
185 RTK_CHK_INIT_STATE();
187 if(NULL
== pSvlan_portmask
)
188 return RT_ERR_NULL_POINTER
;
190 if ((retVal
= rtl8367c_getAsicSvlanUplinkPortMask(&phyMbrPmask
)) != RT_ERR_OK
)
193 if(rtk_switch_portmask_P2L_get(phyMbrPmask
, pSvlan_portmask
) != RT_ERR_OK
)
194 return RT_ERR_FAILED
;
201 * rtk_svlan_servicePort_del
203 * Delete one service port in the specified device
210 * RT_ERR_FAILED - Failed
211 * RT_ERR_SMI - SMI access error
212 * RT_ERR_PORT_ID - Invalid port number.
214 * This API is removing SVLAN service port in the specified device.
216 rtk_api_ret_t
rtk_svlan_servicePort_del(rtk_port_t port
)
218 rtk_api_ret_t retVal
;
221 /* Check initialization state */
222 RTK_CHK_INIT_STATE();
224 /* check port valid */
225 RTK_CHK_PORT_VALID(port
);
227 if ((retVal
= rtl8367c_getAsicSvlanUplinkPortMask(&pmsk
)) != RT_ERR_OK
)
230 pmsk
= pmsk
& ~(1<<rtk_switch_port_L2P_get(port
));
232 if ((retVal
= rtl8367c_setAsicSvlanUplinkPortMask(pmsk
)) != RT_ERR_OK
)
239 * rtk_svlan_tpidEntry_set
241 * Configure accepted S-VLAN ether type.
243 * svlan_tag_id - Ether type of S-tag frame parsing in uplink ports.
248 * RT_ERR_FAILED - Failed
249 * RT_ERR_SMI - SMI access error
250 * RT_ERR_INPUT - Invalid input parameter.
252 * Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200 for Q-in-Q SLAN design.
253 * User can set mathced ether type as service provider supported protocol.
255 rtk_api_ret_t
rtk_svlan_tpidEntry_set(rtk_svlan_tpid_t svlan_tag_id
)
257 rtk_api_ret_t retVal
;
259 /* Check initialization state */
260 RTK_CHK_INIT_STATE();
262 if (svlan_tag_id
>RTK_MAX_NUM_OF_PROTO_TYPE
)
265 if ((retVal
= rtl8367c_setAsicSvlanTpid(svlan_tag_id
)) != RT_ERR_OK
)
272 * rtk_svlan_tpidEntry_get
274 * Get accepted S-VLAN ether type setting.
278 * pSvlan_tag_id - Ether type of S-tag frame parsing in uplink ports.
281 * RT_ERR_FAILED - Failed
282 * RT_ERR_SMI - SMI access error
284 * This API is setting which port is connected to provider switch. All frames receiving from this port must
285 * contain accept SVID in S-tag field.
287 rtk_api_ret_t
rtk_svlan_tpidEntry_get(rtk_svlan_tpid_t
*pSvlan_tag_id
)
289 rtk_api_ret_t retVal
;
291 /* Check initialization state */
292 RTK_CHK_INIT_STATE();
294 if(NULL
== pSvlan_tag_id
)
295 return RT_ERR_NULL_POINTER
;
297 if ((retVal
= rtl8367c_getAsicSvlanTpid(pSvlan_tag_id
)) != RT_ERR_OK
)
304 * rtk_svlan_priorityRef_set
306 * Set S-VLAN upstream priority reference setting.
308 * ref - reference selection parameter.
313 * RT_ERR_FAILED - Failed
314 * RT_ERR_SMI - SMI access error
315 * RT_ERR_INPUT - Invalid input parameter.
317 * The API can set the upstream SVLAN tag priority reference source. The related priority
318 * sources are as following:
319 * - REF_INTERNAL_PRI,
324 rtk_api_ret_t
rtk_svlan_priorityRef_set(rtk_svlan_pri_ref_t ref
)
326 rtk_api_ret_t retVal
;
328 /* Check initialization state */
329 RTK_CHK_INIT_STATE();
331 if (ref
>= REF_PRI_END
)
334 if ((retVal
= rtl8367c_setAsicSvlanPrioritySel(ref
)) != RT_ERR_OK
)
341 * rtk_svlan_priorityRef_get
343 * Get S-VLAN upstream priority reference setting.
347 * pRef - reference selection parameter.
350 * RT_ERR_FAILED - Failed
351 * RT_ERR_SMI - SMI access error
353 * The API can get the upstream SVLAN tag priority reference source. The related priority
354 * sources are as following:
355 * - REF_INTERNAL_PRI,
360 rtk_api_ret_t
rtk_svlan_priorityRef_get(rtk_svlan_pri_ref_t
*pRef
)
362 rtk_api_ret_t retVal
;
364 /* Check initialization state */
365 RTK_CHK_INIT_STATE();
368 return RT_ERR_NULL_POINTER
;
370 if ((retVal
= rtl8367c_getAsicSvlanPrioritySel(pRef
)) != RT_ERR_OK
)
377 * rtk_svlan_memberPortEntry_set
379 * Configure system SVLAN member content
382 * psvlan_cfg - SVLAN member configuration
387 * RT_ERR_FAILED - Failed
388 * RT_ERR_SMI - SMI access error
389 * RT_ERR_INPUT - Invalid input parameter.
390 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
391 * RT_ERR_PORT_MASK - Invalid portmask.
392 * RT_ERR_SVLAN_TABLE_FULL - SVLAN configuration is full.
394 * The API can set system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
395 * to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped by default setup.
396 * - rtk_svlan_memberCfg_t->svid is SVID of SVLAN member configuration.
397 * - rtk_svlan_memberCfg_t->memberport is member port mask of SVLAN member configuration.
398 * - rtk_svlan_memberCfg_t->fid is filtering database of SVLAN member configuration.
399 * - rtk_svlan_memberCfg_t->priority is priority of SVLAN member configuration.
401 rtk_api_ret_t
rtk_svlan_memberPortEntry_set(rtk_vlan_t svid
, rtk_svlan_memberCfg_t
*pSvlan_cfg
)
403 rtk_api_ret_t retVal
;
405 rtk_uint32 empty_idx
;
406 rtl8367c_svlan_memconf_t svlanMemConf
;
407 rtk_uint32 phyMbrPmask
;
408 rtk_vlan_cfg_t vlanCfg
;
410 /* Check initialization state */
411 RTK_CHK_INIT_STATE();
413 if(NULL
== pSvlan_cfg
)
414 return RT_ERR_NULL_POINTER
;
416 if(svid
> RTL8367C_VIDMAX
)
417 return RT_ERR_SVLAN_VID
;
419 RTK_CHK_PORTMASK_VALID(&(pSvlan_cfg
->memberport
));
421 RTK_CHK_PORTMASK_VALID(&(pSvlan_cfg
->untagport
));
423 if (pSvlan_cfg
->fiden
> ENABLED
)
424 return RT_ERR_ENABLE
;
426 if (pSvlan_cfg
->fid
> RTL8367C_FIDMAX
)
427 return RT_ERR_L2_FID
;
429 if (pSvlan_cfg
->priority
> RTL8367C_PRIMAX
)
430 return RT_ERR_VLAN_PRIORITY
;
432 if (pSvlan_cfg
->efiden
> ENABLED
)
433 return RT_ERR_ENABLE
;
435 if (pSvlan_cfg
->efid
> RTL8367C_EFIDMAX
)
436 return RT_ERR_L2_FID
;
438 if(SVLAN_LOOKUP_C4KVLAN
== svlan_lookupType
)
440 if ((retVal
= rtk_vlan_get(svid
, &vlanCfg
)) != RT_ERR_OK
)
443 vlanCfg
.mbr
= pSvlan_cfg
->memberport
;
444 vlanCfg
.untag
= pSvlan_cfg
->untagport
;
446 if ((retVal
= rtk_vlan_set(svid
, &vlanCfg
)) != RT_ERR_OK
)
451 for (i
= 0; i
<= RTL8367C_SVIDXMAX
; i
++)
453 if (svid
== svlan_mbrCfgVid
[i
] && TRUE
== svlan_mbrCfgUsage
[i
])
455 memset(&svlanMemConf
, 0, sizeof(rtl8367c_svlan_memconf_t
));
456 svlanMemConf
.vs_svid
= svid
;
457 svlanMemConf
.vs_efiden
= pSvlan_cfg
->efiden
;
458 svlanMemConf
.vs_efid
= pSvlan_cfg
->efid
;
459 svlanMemConf
.vs_priority
= pSvlan_cfg
->priority
;
462 if(0 == svlanMemConf
.vs_efiden
&& 0 == svlanMemConf
.vs_efid
)
463 svlanMemConf
.vs_efid
= 1;
465 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
470 else if (FALSE
== svlan_mbrCfgUsage
[i
] && 0xFF == empty_idx
)
476 if (empty_idx
!= 0xFF)
478 svlan_mbrCfgUsage
[empty_idx
] = TRUE
;
479 svlan_mbrCfgVid
[empty_idx
] = svid
;
481 memset(&svlanMemConf
, 0, sizeof(rtl8367c_svlan_memconf_t
));
482 svlanMemConf
.vs_svid
= svid
;
483 svlanMemConf
.vs_efiden
= pSvlan_cfg
->efiden
;
484 svlanMemConf
.vs_efid
= pSvlan_cfg
->efid
;
485 svlanMemConf
.vs_priority
= pSvlan_cfg
->priority
;
488 if(0 == svlanMemConf
.vs_efiden
&& 0 == svlanMemConf
.vs_efid
)
489 svlanMemConf
.vs_efid
= 1;
491 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(empty_idx
, &svlanMemConf
)) != RT_ERR_OK
)
502 for (i
= 0; i
<= RTL8367C_SVIDXMAX
; i
++)
505 if ((retVal = rtl8367c_getAsicSvlanMemberConfiguration(i, &svlanMemConf)) != RT_ERR_OK)
508 if (svid
== svlan_mbrCfgVid
[i
] && TRUE
== svlan_mbrCfgUsage
[i
])
510 svlanMemConf
.vs_svid
= svid
;
512 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->memberport
), &phyMbrPmask
) != RT_ERR_OK
)
513 return RT_ERR_FAILED
;
515 svlanMemConf
.vs_member
= phyMbrPmask
;
517 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->untagport
), &phyMbrPmask
) != RT_ERR_OK
)
518 return RT_ERR_FAILED
;
520 svlanMemConf
.vs_untag
= phyMbrPmask
;
522 svlanMemConf
.vs_force_fid
= pSvlan_cfg
->fiden
;
523 svlanMemConf
.vs_fid_msti
= pSvlan_cfg
->fid
;
524 svlanMemConf
.vs_priority
= pSvlan_cfg
->priority
;
525 svlanMemConf
.vs_efiden
= pSvlan_cfg
->efiden
;
526 svlanMemConf
.vs_efid
= pSvlan_cfg
->efid
;
528 /*all items are reset means deleting*/
529 if( 0 == svlanMemConf
.vs_member
&&
530 0 == svlanMemConf
.vs_untag
&&
531 0 == svlanMemConf
.vs_force_fid
&&
532 0 == svlanMemConf
.vs_fid_msti
&&
533 0 == svlanMemConf
.vs_priority
&&
534 0 == svlanMemConf
.vs_efiden
&&
535 0 == svlanMemConf
.vs_efid
)
537 svlan_mbrCfgUsage
[i
] = FALSE
;
538 svlan_mbrCfgVid
[i
] = 0;
540 /* Clear SVID also */
541 svlanMemConf
.vs_svid
= 0;
545 svlan_mbrCfgUsage
[i
] = TRUE
;
546 svlan_mbrCfgVid
[i
] = svlanMemConf
.vs_svid
;
548 if(0 == svlanMemConf
.vs_svid
)
551 if(0 == svlanMemConf
.vs_efiden
&& 0 == svlanMemConf
.vs_efid
)
553 svlanMemConf
.vs_efid
= 1;
558 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
563 else if (FALSE
== svlan_mbrCfgUsage
[i
] && 0xFF == empty_idx
)
569 if (empty_idx
!= 0xFF)
571 memset(&svlanMemConf
, 0, sizeof(rtl8367c_svlan_memconf_t
));
572 svlanMemConf
.vs_svid
= svid
;
574 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->memberport
), &phyMbrPmask
) != RT_ERR_OK
)
575 return RT_ERR_FAILED
;
577 svlanMemConf
.vs_member
= phyMbrPmask
;
579 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->untagport
), &phyMbrPmask
) != RT_ERR_OK
)
580 return RT_ERR_FAILED
;
582 svlanMemConf
.vs_untag
= phyMbrPmask
;
584 svlanMemConf
.vs_force_fid
= pSvlan_cfg
->fiden
;
585 svlanMemConf
.vs_fid_msti
= pSvlan_cfg
->fid
;
586 svlanMemConf
.vs_priority
= pSvlan_cfg
->priority
;
588 svlanMemConf
.vs_efiden
= pSvlan_cfg
->efiden
;
589 svlanMemConf
.vs_efid
= pSvlan_cfg
->efid
;
591 /*change efid for empty svid 0*/
592 if(0 == svlanMemConf
.vs_svid
)
593 { /*for create check*/
594 if(0 == svlanMemConf
.vs_efiden
&& 0 == svlanMemConf
.vs_efid
)
596 svlanMemConf
.vs_efid
= 1;
600 svlan_mbrCfgUsage
[empty_idx
] = TRUE
;
601 svlan_mbrCfgVid
[empty_idx
] = svlanMemConf
.vs_svid
;
603 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(empty_idx
, &svlanMemConf
)) != RT_ERR_OK
)
611 return RT_ERR_SVLAN_TABLE_FULL
;
615 * rtk_svlan_memberPortEntry_get
617 * Get SVLAN member Configure.
621 * pSvlan_cfg - SVLAN member configuration
624 * RT_ERR_FAILED - Failed
625 * RT_ERR_SMI - SMI access error
626 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
627 * RT_ERR_INPUT - Invalid input parameters.
629 * The API can get system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
630 * to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped.
632 rtk_api_ret_t
rtk_svlan_memberPortEntry_get(rtk_vlan_t svid
, rtk_svlan_memberCfg_t
*pSvlan_cfg
)
634 rtk_api_ret_t retVal
;
636 rtl8367c_svlan_memconf_t svlanMemConf
;
638 /* Check initialization state */
639 RTK_CHK_INIT_STATE();
641 if(NULL
== pSvlan_cfg
)
642 return RT_ERR_NULL_POINTER
;
644 if (svid
> RTL8367C_VIDMAX
)
645 return RT_ERR_SVLAN_VID
;
648 for (i
= 0; i
<= RTL8367C_SVIDXMAX
; i
++)
650 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
653 if (svid
== svlanMemConf
.vs_svid
)
655 pSvlan_cfg
->svid
= svlanMemConf
.vs_svid
;
657 if(rtk_switch_portmask_P2L_get(svlanMemConf
.vs_member
,&(pSvlan_cfg
->memberport
)) != RT_ERR_OK
)
658 return RT_ERR_FAILED
;
660 if(rtk_switch_portmask_P2L_get(svlanMemConf
.vs_untag
,&(pSvlan_cfg
->untagport
)) != RT_ERR_OK
)
661 return RT_ERR_FAILED
;
663 pSvlan_cfg
->fiden
= svlanMemConf
.vs_force_fid
;
664 pSvlan_cfg
->fid
= svlanMemConf
.vs_fid_msti
;
665 pSvlan_cfg
->priority
= svlanMemConf
.vs_priority
;
666 pSvlan_cfg
->efiden
= svlanMemConf
.vs_efiden
;
667 pSvlan_cfg
->efid
= svlanMemConf
.vs_efid
;
673 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
678 * rtk_svlan_memberPortEntry_adv_set
680 * Configure system SVLAN member by index
682 * idx - Index (0 ~ 63)
683 * psvlan_cfg - SVLAN member configuration
688 * RT_ERR_FAILED - Failed
689 * RT_ERR_SMI - SMI access error
690 * RT_ERR_INPUT - Invalid input parameter.
691 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
692 * RT_ERR_PORT_MASK - Invalid portmask.
693 * RT_ERR_SVLAN_TABLE_FULL - SVLAN configuration is full.
695 * The API can set system 64 accepted s-tag frame format by index.
696 * - rtk_svlan_memberCfg_t->svid is SVID of SVLAN member configuration.
697 * - rtk_svlan_memberCfg_t->memberport is member port mask of SVLAN member configuration.
698 * - rtk_svlan_memberCfg_t->fid is filtering database of SVLAN member configuration.
699 * - rtk_svlan_memberCfg_t->priority is priority of SVLAN member configuration.
701 rtk_api_ret_t
rtk_svlan_memberPortEntry_adv_set(rtk_uint32 idx
, rtk_svlan_memberCfg_t
*pSvlan_cfg
)
703 rtk_api_ret_t retVal
;
704 rtl8367c_svlan_memconf_t svlanMemConf
;
705 rtk_uint32 phyMbrPmask
;
707 /* Check initialization state */
708 RTK_CHK_INIT_STATE();
710 if(NULL
== pSvlan_cfg
)
711 return RT_ERR_NULL_POINTER
;
713 if (idx
> RTL8367C_SVIDXMAX
)
714 return RT_ERR_SVLAN_ENTRY_INDEX
;
716 if (pSvlan_cfg
->svid
>RTL8367C_VIDMAX
)
717 return RT_ERR_SVLAN_VID
;
719 RTK_CHK_PORTMASK_VALID(&(pSvlan_cfg
->memberport
));
721 RTK_CHK_PORTMASK_VALID(&(pSvlan_cfg
->untagport
));
723 if (pSvlan_cfg
->fiden
> ENABLED
)
724 return RT_ERR_ENABLE
;
726 if (pSvlan_cfg
->fid
> RTL8367C_FIDMAX
)
727 return RT_ERR_L2_FID
;
729 if (pSvlan_cfg
->priority
> RTL8367C_PRIMAX
)
730 return RT_ERR_VLAN_PRIORITY
;
732 if (pSvlan_cfg
->efiden
> ENABLED
)
733 return RT_ERR_ENABLE
;
735 if (pSvlan_cfg
->efid
> RTL8367C_EFIDMAX
)
736 return RT_ERR_L2_FID
;
738 memset(&svlanMemConf
, 0, sizeof(rtl8367c_svlan_memconf_t
));
739 svlanMemConf
.vs_svid
= pSvlan_cfg
->svid
;
740 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->memberport
), &phyMbrPmask
) != RT_ERR_OK
)
741 return RT_ERR_FAILED
;
743 svlanMemConf
.vs_member
= phyMbrPmask
;
745 if(rtk_switch_portmask_L2P_get(&(pSvlan_cfg
->untagport
), &phyMbrPmask
) != RT_ERR_OK
)
746 return RT_ERR_FAILED
;
748 svlanMemConf
.vs_untag
= phyMbrPmask
;
751 svlanMemConf
.vs_force_fid
= pSvlan_cfg
->fiden
;
752 svlanMemConf
.vs_fid_msti
= pSvlan_cfg
->fid
;
753 svlanMemConf
.vs_priority
= pSvlan_cfg
->priority
;
754 svlanMemConf
.vs_efiden
= pSvlan_cfg
->efiden
;
755 svlanMemConf
.vs_efid
= pSvlan_cfg
->efid
;
757 if(0 == svlanMemConf
.vs_svid
&&
758 0 == svlanMemConf
.vs_member
&&
759 0 == svlanMemConf
.vs_untag
&&
760 0 == svlanMemConf
.vs_force_fid
&&
761 0 == svlanMemConf
.vs_fid_msti
&&
762 0 == svlanMemConf
.vs_priority
&&
763 0 == svlanMemConf
.vs_efiden
&&
764 0 == svlanMemConf
.vs_efid
)
766 svlan_mbrCfgUsage
[idx
] = FALSE
;
767 svlan_mbrCfgVid
[idx
] = 0;
771 svlan_mbrCfgUsage
[idx
] = TRUE
;
772 svlan_mbrCfgVid
[idx
] = svlanMemConf
.vs_svid
;
775 if ((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(idx
, &svlanMemConf
)) != RT_ERR_OK
)
783 * rtk_svlan_memberPortEntry_adv_get
785 * Get SVLAN member Configure by index.
787 * idx - Index (0 ~ 63)
789 * pSvlan_cfg - SVLAN member configuration
792 * RT_ERR_FAILED - Failed
793 * RT_ERR_SMI - SMI access error
794 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
795 * RT_ERR_INPUT - Invalid input parameters.
797 * The API can get system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
798 * to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped.
800 rtk_api_ret_t
rtk_svlan_memberPortEntry_adv_get(rtk_uint32 idx
, rtk_svlan_memberCfg_t
*pSvlan_cfg
)
802 rtk_api_ret_t retVal
;
803 rtl8367c_svlan_memconf_t svlanMemConf
;
805 /* Check initialization state */
806 RTK_CHK_INIT_STATE();
808 if(NULL
== pSvlan_cfg
)
809 return RT_ERR_NULL_POINTER
;
811 if (idx
> RTL8367C_SVIDXMAX
)
812 return RT_ERR_SVLAN_ENTRY_INDEX
;
814 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(idx
, &svlanMemConf
)) != RT_ERR_OK
)
817 pSvlan_cfg
->svid
= svlanMemConf
.vs_svid
;
818 if(rtk_switch_portmask_P2L_get(svlanMemConf
.vs_member
,&(pSvlan_cfg
->memberport
)) != RT_ERR_OK
)
819 return RT_ERR_FAILED
;
821 if(rtk_switch_portmask_P2L_get(svlanMemConf
.vs_untag
,&(pSvlan_cfg
->untagport
)) != RT_ERR_OK
)
822 return RT_ERR_FAILED
;
824 pSvlan_cfg
->fiden
= svlanMemConf
.vs_force_fid
;
825 pSvlan_cfg
->fid
= svlanMemConf
.vs_fid_msti
;
826 pSvlan_cfg
->priority
= svlanMemConf
.vs_priority
;
827 pSvlan_cfg
->efiden
= svlanMemConf
.vs_efiden
;
828 pSvlan_cfg
->efid
= svlanMemConf
.vs_efid
;
835 * rtk_svlan_defaultSvlan_set
837 * Configure default egress SVLAN.
845 * RT_ERR_FAILED - Failed
846 * RT_ERR_SMI - SMI access error
847 * RT_ERR_INPUT - Invalid input parameter.
848 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
849 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
851 * The API can set port n S-tag format index while receiving frame from port n
852 * is transmit through uplink port with s-tag field
854 rtk_api_ret_t
rtk_svlan_defaultSvlan_set(rtk_port_t port
, rtk_vlan_t svid
)
856 rtk_api_ret_t retVal
;
858 rtl8367c_svlan_memconf_t svlanMemConf
;
860 /* Check initialization state */
861 RTK_CHK_INIT_STATE();
863 /* Check port Valid */
864 RTK_CHK_PORT_VALID(port
);
866 /* svid must be 0~4095 */
867 if (svid
> RTL8367C_VIDMAX
)
868 return RT_ERR_SVLAN_VID
;
870 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
872 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
875 if (svid
== svlanMemConf
.vs_svid
)
877 if ((retVal
= rtl8367c_setAsicSvlanDefaultVlan(rtk_switch_port_L2P_get(port
), i
)) != RT_ERR_OK
)
884 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
888 * rtk_svlan_defaultSvlan_get
890 * Get the configure default egress SVLAN.
897 * RT_ERR_FAILED - Failed
898 * RT_ERR_SMI - SMI access error
899 * RT_ERR_INPUT - Invalid input parameters.
901 * The API can get port n S-tag format index while receiving frame from port n
902 * is transmit through uplink port with s-tag field
904 rtk_api_ret_t
rtk_svlan_defaultSvlan_get(rtk_port_t port
, rtk_vlan_t
*pSvid
)
906 rtk_api_ret_t retVal
;
908 rtl8367c_svlan_memconf_t svlanMemConf
;
910 /* Check initialization state */
911 RTK_CHK_INIT_STATE();
914 return RT_ERR_NULL_POINTER
;
916 /* Check port Valid */
917 RTK_CHK_PORT_VALID(port
);
919 if ((retVal
= rtl8367c_getAsicSvlanDefaultVlan(rtk_switch_port_L2P_get(port
), &idx
)) != RT_ERR_OK
)
922 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(idx
, &svlanMemConf
)) != RT_ERR_OK
)
925 *pSvid
= svlanMemConf
.vs_svid
;
933 * Configure SVLAN C2S table
936 * src_port - Ingress Port
942 * RT_ERR_FAILED - Failed
943 * RT_ERR_SMI - SMI access error
944 * RT_ERR_PORT_ID - Invalid port ID.
945 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
946 * RT_ERR_VLAN_VID - Invalid VID parameter.
947 * RT_ERR_OUT_OF_RANGE - input out of range.
948 * RT_ERR_INPUT - Invalid input parameters.
950 * The API can set system C2S configuration. ASIC will check upstream's VID and assign related
951 * SVID to mathed packet. There are 128 SVLAN C2S configurations.
953 rtk_api_ret_t
rtk_svlan_c2s_add(rtk_vlan_t vid
, rtk_port_t src_port
, rtk_vlan_t svid
)
955 rtk_api_ret_t retVal
, i
;
956 rtk_uint32 empty_idx
;
957 rtk_uint32 evid
, pmsk
, svidx
, c2s_svidx
;
958 rtl8367c_svlan_memconf_t svlanMemConf
;
963 /* Check initialization state */
964 RTK_CHK_INIT_STATE();
967 if (vid
> RTL8367C_VIDMAX
)
968 return RT_ERR_VLAN_VID
;
970 if (svid
> RTL8367C_VIDMAX
)
971 return RT_ERR_SVLAN_VID
;
973 /* Check port Valid */
974 RTK_CHK_PORT_VALID(src_port
);
976 phyPort
= rtk_switch_port_L2P_get(src_port
);
982 for (i
= 0; i
<= RTL8367C_SVIDXMAX
; i
++)
984 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
987 if (svid
== svlanMemConf
.vs_svid
)
995 return RT_ERR_SVLAN_VID
;
997 for (i
=RTL8367C_C2SIDXMAX
; i
>=0; i
--)
999 if ((retVal
= rtl8367c_getAsicSvlanC2SConf(i
, &evid
, &pmsk
, &c2s_svidx
)) != RT_ERR_OK
)
1004 /* Check Src_port */
1005 if(pmsk
& (1 << phyPort
))
1008 if(c2s_svidx
== svidx
)
1010 /* All the same, do nothing */
1014 /* New svidx, remove src_port and find a new slot to add a new enrty */
1015 pmsk
= pmsk
& ~(1 << phyPort
);
1019 if ((retVal
= rtl8367c_setAsicSvlanC2SConf(i
, vid
, pmsk
, c2s_svidx
)) != RT_ERR_OK
)
1025 if(c2s_svidx
== svidx
&& doneFlag
== FALSE
)
1027 pmsk
= pmsk
| (1 << phyPort
);
1028 if ((retVal
= rtl8367c_setAsicSvlanC2SConf(i
, vid
, pmsk
, svidx
)) != RT_ERR_OK
)
1035 else if (evid
==0&&pmsk
==0)
1041 if (0xFFFF != empty_idx
&& doneFlag
==FALSE
)
1043 if ((retVal
= rtl8367c_setAsicSvlanC2SConf(empty_idx
, vid
, (1<<phyPort
), svidx
)) != RT_ERR_OK
)
1048 else if(doneFlag
== TRUE
)
1053 return RT_ERR_OUT_OF_RANGE
;
1059 * Delete one C2S entry
1062 * src_port - Ingress Port
1068 * RT_ERR_FAILED - Failed
1069 * RT_ERR_SMI - SMI access error
1070 * RT_ERR_VLAN_VID - Invalid VID parameter.
1071 * RT_ERR_PORT_ID - Invalid port ID.
1072 * RT_ERR_OUT_OF_RANGE - input out of range.
1074 * The API can delete system C2S configuration. There are 128 SVLAN C2S configurations.
1076 rtk_api_ret_t
rtk_svlan_c2s_del(rtk_vlan_t vid
, rtk_port_t src_port
)
1078 rtk_api_ret_t retVal
;
1080 rtk_uint32 evid
, pmsk
, svidx
;
1083 /* Check initialization state */
1084 RTK_CHK_INIT_STATE();
1086 if (vid
> RTL8367C_EVIDMAX
)
1087 return RT_ERR_VLAN_VID
;
1089 /* Check port Valid */
1090 RTK_CHK_PORT_VALID(src_port
);
1091 phyPort
= rtk_switch_port_L2P_get(src_port
);
1093 for (i
= 0; i
<= RTL8367C_C2SIDXMAX
; i
++)
1095 if ((retVal
= rtl8367c_getAsicSvlanC2SConf(i
, &evid
, &pmsk
, &svidx
)) != RT_ERR_OK
)
1100 if(pmsk
& (1 << phyPort
))
1102 pmsk
= pmsk
& ~(1 << phyPort
);
1109 if ((retVal
= rtl8367c_setAsicSvlanC2SConf(i
, vid
, pmsk
, svidx
)) != RT_ERR_OK
)
1117 return RT_ERR_OUT_OF_RANGE
;
1123 * Get configure SVLAN C2S table
1126 * src_port - Ingress Port
1131 * RT_ERR_FAILED - Failed
1132 * RT_ERR_SMI - SMI access error
1133 * RT_ERR_INPUT - Invalid input parameters.
1134 * RT_ERR_PORT_ID - Invalid port ID.
1135 * RT_ERR_OUT_OF_RANGE - input out of range.
1137 * The API can get system C2S configuration. There are 128 SVLAN C2S configurations.
1139 rtk_api_ret_t
rtk_svlan_c2s_get(rtk_vlan_t vid
, rtk_port_t src_port
, rtk_vlan_t
*pSvid
)
1141 rtk_api_ret_t retVal
;
1143 rtk_uint32 evid
, pmsk
, svidx
;
1144 rtl8367c_svlan_memconf_t svlanMemConf
;
1147 /* Check initialization state */
1148 RTK_CHK_INIT_STATE();
1151 return RT_ERR_NULL_POINTER
;
1153 if (vid
> RTL8367C_VIDMAX
)
1154 return RT_ERR_VLAN_VID
;
1156 /* Check port Valid */
1157 RTK_CHK_PORT_VALID(src_port
);
1158 phyPort
= rtk_switch_port_L2P_get(src_port
);
1160 for (i
= 0; i
<= RTL8367C_C2SIDXMAX
; i
++)
1162 if ((retVal
= rtl8367c_getAsicSvlanC2SConf(i
, &evid
, &pmsk
, &svidx
)) != RT_ERR_OK
)
1167 if(pmsk
& (1 << phyPort
))
1169 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(svidx
, &svlanMemConf
)) != RT_ERR_OK
)
1172 *pSvid
= svlanMemConf
.vs_svid
;
1178 return RT_ERR_OUT_OF_RANGE
;
1182 * rtk_svlan_untag_action_set
1184 * Configure Action of downstream UnStag packet
1186 * action - Action for UnStag
1187 * svid - The SVID assigned to UnStag packet
1192 * RT_ERR_FAILED - Failed
1193 * RT_ERR_SMI - SMI access error
1194 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1195 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1196 * RT_ERR_OUT_OF_RANGE - input out of range.
1197 * RT_ERR_INPUT - Invalid input parameters.
1199 * The API can configure action of downstream Un-Stag packet. A SVID assigned
1200 * to the un-stag is also supported by this API. The parameter of svid is
1201 * only referenced when the action is set to UNTAG_ASSIGN
1203 rtk_api_ret_t
rtk_svlan_untag_action_set(rtk_svlan_untag_action_t action
, rtk_vlan_t svid
)
1205 rtk_api_ret_t retVal
;
1207 rtl8367c_svlan_memconf_t svlanMemConf
;
1209 /* Check initialization state */
1210 RTK_CHK_INIT_STATE();
1212 if (action
>= UNTAG_END
)
1213 return RT_ERR_OUT_OF_RANGE
;
1215 if(action
== UNTAG_ASSIGN
)
1217 if (svid
> RTL8367C_VIDMAX
)
1218 return RT_ERR_SVLAN_VID
;
1221 if ((retVal
= rtl8367c_setAsicSvlanIngressUntag((rtk_uint32
)action
)) != RT_ERR_OK
)
1224 if(action
== UNTAG_ASSIGN
)
1226 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
1228 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
1231 if (svid
== svlanMemConf
.vs_svid
)
1233 if ((retVal
= rtl8367c_setAsicSvlanUntagVlan(i
)) != RT_ERR_OK
)
1240 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
1247 * rtk_svlan_untag_action_get
1249 * Get Action of downstream UnStag packet
1253 * pAction - Action for UnStag
1254 * pSvid - The SVID assigned to UnStag packet
1257 * RT_ERR_FAILED - Failed
1258 * RT_ERR_SMI - SMI access error
1259 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1260 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1261 * RT_ERR_OUT_OF_RANGE - input out of range.
1262 * RT_ERR_INPUT - Invalid input parameters.
1264 * The API can Get action of downstream Un-Stag packet. A SVID assigned
1265 * to the un-stag is also retrieved by this API. The parameter pSvid is
1266 * only refernced when the action is UNTAG_ASSIGN
1268 rtk_api_ret_t
rtk_svlan_untag_action_get(rtk_svlan_untag_action_t
*pAction
, rtk_vlan_t
*pSvid
)
1270 rtk_api_ret_t retVal
;
1272 rtl8367c_svlan_memconf_t svlanMemConf
;
1274 /* Check initialization state */
1275 RTK_CHK_INIT_STATE();
1277 if(NULL
== pAction
|| NULL
== pSvid
)
1278 return RT_ERR_NULL_POINTER
;
1280 if ((retVal
= rtl8367c_getAsicSvlanIngressUntag(pAction
)) != RT_ERR_OK
)
1283 if(*pAction
== UNTAG_ASSIGN
)
1285 if ((retVal
= rtl8367c_getAsicSvlanUntagVlan(&svidx
)) != RT_ERR_OK
)
1288 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(svidx
, &svlanMemConf
)) != RT_ERR_OK
)
1291 *pSvid
= svlanMemConf
.vs_svid
;
1298 * rtk_svlan_unmatch_action_set
1300 * Configure Action of downstream Unmatch packet
1302 * action - Action for Unmatch
1303 * svid - The SVID assigned to Unmatch packet
1308 * RT_ERR_FAILED - Failed
1309 * RT_ERR_SMI - SMI access error
1310 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1311 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1312 * RT_ERR_OUT_OF_RANGE - input out of range.
1313 * RT_ERR_INPUT - Invalid input parameters.
1315 * The API can configure action of downstream Un-match packet. A SVID assigned
1316 * to the un-match is also supported by this API. The parameter od svid is
1317 * only refernced when the action is set to UNMATCH_ASSIGN
1319 rtk_api_ret_t
rtk_svlan_unmatch_action_set(rtk_svlan_unmatch_action_t action
, rtk_vlan_t svid
)
1321 rtk_api_ret_t retVal
;
1323 rtl8367c_svlan_memconf_t svlanMemConf
;
1325 /* Check initialization state */
1326 RTK_CHK_INIT_STATE();
1328 if (action
>= UNMATCH_END
)
1329 return RT_ERR_OUT_OF_RANGE
;
1331 if (action
== UNMATCH_ASSIGN
)
1333 if (svid
> RTL8367C_VIDMAX
)
1334 return RT_ERR_SVLAN_VID
;
1337 if ((retVal
= rtl8367c_setAsicSvlanIngressUnmatch((rtk_uint32
)action
)) != RT_ERR_OK
)
1340 if(action
== UNMATCH_ASSIGN
)
1342 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
1344 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
1347 if (svid
== svlanMemConf
.vs_svid
)
1349 if ((retVal
= rtl8367c_setAsicSvlanUnmatchVlan(i
)) != RT_ERR_OK
)
1356 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
1363 * rtk_svlan_unmatch_action_get
1365 * Get Action of downstream Unmatch packet
1369 * pAction - Action for Unmatch
1370 * pSvid - The SVID assigned to Unmatch packet
1373 * RT_ERR_FAILED - Failed
1374 * RT_ERR_SMI - SMI access error
1375 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1376 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1377 * RT_ERR_OUT_OF_RANGE - input out of range.
1378 * RT_ERR_INPUT - Invalid input parameters.
1380 * The API can Get action of downstream Un-match packet. A SVID assigned
1381 * to the un-match is also retrieved by this API. The parameter pSvid is
1382 * only refernced when the action is UNMATCH_ASSIGN
1384 rtk_api_ret_t
rtk_svlan_unmatch_action_get(rtk_svlan_unmatch_action_t
*pAction
, rtk_vlan_t
*pSvid
)
1386 rtk_api_ret_t retVal
;
1388 rtl8367c_svlan_memconf_t svlanMemConf
;
1390 /* Check initialization state */
1391 RTK_CHK_INIT_STATE();
1393 if(NULL
== pAction
|| NULL
== pSvid
)
1394 return RT_ERR_NULL_POINTER
;
1396 if ((retVal
= rtl8367c_getAsicSvlanIngressUnmatch(pAction
)) != RT_ERR_OK
)
1399 if(*pAction
== UNMATCH_ASSIGN
)
1401 if ((retVal
= rtl8367c_getAsicSvlanUnmatchVlan(&svidx
)) != RT_ERR_OK
)
1404 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(svidx
, &svlanMemConf
)) != RT_ERR_OK
)
1407 *pSvid
= svlanMemConf
.vs_svid
;
1414 * rtk_svlan_unassign_action_set
1416 * Configure Action of upstream without svid assign action
1418 * action - Action for Un-assign
1423 * RT_ERR_FAILED - Failed
1424 * RT_ERR_OUT_OF_RANGE - input out of range.
1425 * RT_ERR_INPUT - Invalid input parameters.
1427 * The API can configure action of upstream Un-assign svid packet. If action is not
1428 * trap to CPU, the port-based SVID sure be assign as system need
1430 rtk_api_ret_t
rtk_svlan_unassign_action_set(rtk_svlan_unassign_action_t action
)
1432 rtk_api_ret_t retVal
;
1434 /* Check initialization state */
1435 RTK_CHK_INIT_STATE();
1437 if (action
>= UNASSIGN_END
)
1438 return RT_ERR_OUT_OF_RANGE
;
1440 retVal
= rtl8367c_setAsicSvlanEgressUnassign((rtk_uint32
)action
);
1446 * rtk_svlan_unassign_action_get
1448 * Get action of upstream without svid assignment
1452 * pAction - Action for Un-assign
1455 * RT_ERR_FAILED - Failed
1459 rtk_api_ret_t
rtk_svlan_unassign_action_get(rtk_svlan_unassign_action_t
*pAction
)
1461 rtk_api_ret_t retVal
;
1463 /* Check initialization state */
1464 RTK_CHK_INIT_STATE();
1467 return RT_ERR_NULL_POINTER
;
1469 retVal
= rtl8367c_getAsicSvlanEgressUnassign(pAction
);
1475 * rtk_svlan_dmac_vidsel_set
1477 * Set DMAC CVID selection
1480 * enable - state of DMAC CVID Selection
1485 * RT_ERR_FAILED - Failed
1486 * RT_ERR_SMI - SMI access error
1487 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1488 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1489 * RT_ERR_OUT_OF_RANGE - input out of range.
1490 * RT_ERR_INPUT - Invalid input parameters.
1492 * This API can set DMAC CVID Selection state
1494 rtk_api_ret_t
rtk_svlan_dmac_vidsel_set(rtk_port_t port
, rtk_enable_t enable
)
1496 rtk_api_ret_t retVal
;
1498 /* Check initialization state */
1499 RTK_CHK_INIT_STATE();
1501 /* Check port Valid */
1502 RTK_CHK_PORT_VALID(port
);
1504 if (enable
>= RTK_ENABLE_END
)
1505 return RT_ERR_ENABLE
;
1507 if ((retVal
= rtl8367c_setAsicSvlanDmacCvidSel(rtk_switch_port_L2P_get(port
), enable
)) != RT_ERR_OK
)
1514 * rtk_svlan_dmac_vidsel_get
1516 * Get DMAC CVID selection
1520 * pEnable - state of DMAC CVID Selection
1523 * RT_ERR_FAILED - Failed
1524 * RT_ERR_SMI - SMI access error
1525 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1526 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1527 * RT_ERR_OUT_OF_RANGE - input out of range.
1528 * RT_ERR_INPUT - Invalid input parameters.
1530 * This API can get DMAC CVID Selection state
1532 rtk_api_ret_t
rtk_svlan_dmac_vidsel_get(rtk_port_t port
, rtk_enable_t
*pEnable
)
1534 rtk_api_ret_t retVal
;
1536 /* Check initialization state */
1537 RTK_CHK_INIT_STATE();
1540 return RT_ERR_NULL_POINTER
;
1542 /* Check port Valid */
1543 RTK_CHK_PORT_VALID(port
);
1545 if ((retVal
= rtl8367c_getAsicSvlanDmacCvidSel(rtk_switch_port_L2P_get(port
), pEnable
)) != RT_ERR_OK
)
1552 * rtk_svlan_ipmc2s_add
1554 * add ip multicast address to SVLAN
1557 * ipmc - ip multicast address
1558 * ipmcMsk - ip multicast mask
1563 * RT_ERR_FAILED - Failed
1564 * RT_ERR_SMI - SMI access error
1565 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1566 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1567 * RT_ERR_OUT_OF_RANGE - input out of range.
1568 * RT_ERR_INPUT - Invalid input parameters.
1570 * The API can set IP mutlicast to SVID configuration. If upstream packet is IPv4 multicast
1571 * packet and DIP is matched MC2S configuration, ASIC will assign egress SVID to the packet.
1572 * There are 32 SVLAN multicast configurations for IP and L2 multicast.
1574 rtk_api_ret_t
rtk_svlan_ipmc2s_add(ipaddr_t ipmc
, ipaddr_t ipmcMsk
,rtk_vlan_t svid
)
1576 rtk_api_ret_t retVal
, i
;
1577 rtk_uint32 empty_idx
;
1579 rtl8367c_svlan_memconf_t svlanMemConf
;
1580 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1582 /* Check initialization state */
1583 RTK_CHK_INIT_STATE();
1585 if (svid
> RTL8367C_VIDMAX
)
1586 return RT_ERR_SVLAN_VID
;
1588 if ((ipmc
&0xF0000000)!=0xE0000000)
1589 return RT_ERR_INPUT
;
1593 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
1595 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
1598 if (svid
== svlanMemConf
.vs_svid
)
1605 if (0xFFFF == svidx
)
1606 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
1611 for (i
= RTL8367C_MC2SIDXMAX
; i
>= 0; i
--)
1613 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1616 if (TRUE
== svlanMC2SConf
.valid
)
1618 if (svlanMC2SConf
.format
== SVLAN_MC2S_MODE_IP
&&
1619 svlanMC2SConf
.sdata
==ipmc
&&
1620 svlanMC2SConf
.smask
==ipmcMsk
)
1622 svlanMC2SConf
.svidx
= svidx
;
1623 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1633 if (empty_idx
!=0xFFFF)
1635 svlanMC2SConf
.valid
= TRUE
;
1636 svlanMC2SConf
.svidx
= svidx
;
1637 svlanMC2SConf
.format
= SVLAN_MC2S_MODE_IP
;
1638 svlanMC2SConf
.sdata
= ipmc
;
1639 svlanMC2SConf
.smask
= ipmcMsk
;
1640 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(empty_idx
, &svlanMC2SConf
)) != RT_ERR_OK
)
1645 return RT_ERR_OUT_OF_RANGE
;
1650 * rtk_svlan_ipmc2s_del
1652 * delete ip multicast address to SVLAN
1654 * ipmc - ip multicast address
1655 * ipmcMsk - ip multicast mask
1660 * RT_ERR_FAILED - Failed
1661 * RT_ERR_SMI - SMI access error
1662 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1663 * RT_ERR_OUT_OF_RANGE - input out of range.
1665 * The API can delete IP mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
1667 rtk_api_ret_t
rtk_svlan_ipmc2s_del(ipaddr_t ipmc
, ipaddr_t ipmcMsk
)
1669 rtk_api_ret_t retVal
;
1671 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1673 /* Check initialization state */
1674 RTK_CHK_INIT_STATE();
1676 if ((ipmc
&0xF0000000)!=0xE0000000)
1677 return RT_ERR_INPUT
;
1679 for (i
= 0; i
<= RTL8367C_MC2SIDXMAX
; i
++)
1681 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1684 if (TRUE
== svlanMC2SConf
.valid
)
1686 if (svlanMC2SConf
.format
== SVLAN_MC2S_MODE_IP
&&
1687 svlanMC2SConf
.sdata
==ipmc
&&
1688 svlanMC2SConf
.smask
==ipmcMsk
)
1690 memset(&svlanMC2SConf
, 0, sizeof(rtl8367c_svlan_mc2s_t
));
1691 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1698 return RT_ERR_OUT_OF_RANGE
;
1702 * rtk_svlan_ipmc2s_get
1704 * Get ip multicast address to SVLAN
1706 * ipmc - ip multicast address
1707 * ipmcMsk - ip multicast mask
1712 * RT_ERR_FAILED - Failed
1713 * RT_ERR_SMI - SMI access error
1714 * RT_ERR_INPUT - Invalid input parameters.
1715 * RT_ERR_OUT_OF_RANGE - input out of range.
1717 * The API can get IP mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
1719 rtk_api_ret_t
rtk_svlan_ipmc2s_get(ipaddr_t ipmc
, ipaddr_t ipmcMsk
, rtk_vlan_t
*pSvid
)
1721 rtk_api_ret_t retVal
;
1723 rtl8367c_svlan_memconf_t svlanMemConf
;
1724 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1726 /* Check initialization state */
1727 RTK_CHK_INIT_STATE();
1730 return RT_ERR_NULL_POINTER
;
1732 if ((ipmc
&0xF0000000)!=0xE0000000)
1733 return RT_ERR_INPUT
;
1735 for (i
= 0; i
<= RTL8367C_MC2SIDXMAX
; i
++)
1737 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1740 if (TRUE
== svlanMC2SConf
.valid
&&
1741 svlanMC2SConf
.format
== SVLAN_MC2S_MODE_IP
&&
1742 svlanMC2SConf
.sdata
== ipmc
&&
1743 svlanMC2SConf
.smask
== ipmcMsk
)
1745 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(svlanMC2SConf
.svidx
, &svlanMemConf
)) != RT_ERR_OK
)
1747 *pSvid
= svlanMemConf
.vs_svid
;
1752 return RT_ERR_OUT_OF_RANGE
;
1756 * rtk_svlan_l2mc2s_add
1758 * Add L2 multicast address to SVLAN
1760 * mac - L2 multicast address
1761 * macMsk - L2 multicast address mask
1767 * RT_ERR_FAILED - Failed
1768 * RT_ERR_SMI - SMI access error
1769 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1770 * RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
1771 * RT_ERR_OUT_OF_RANGE - input out of range.
1772 * RT_ERR_INPUT - Invalid input parameters.
1774 * The API can set L2 Mutlicast to SVID configuration. If upstream packet is L2 multicast
1775 * packet and DMAC is matched, ASIC will assign egress SVID to the packet. There are 32
1776 * SVLAN multicast configurations for IP and L2 multicast.
1778 rtk_api_ret_t
rtk_svlan_l2mc2s_add(rtk_mac_t mac
, rtk_mac_t macMsk
, rtk_vlan_t svid
)
1780 rtk_api_ret_t retVal
, i
;
1781 rtk_uint32 empty_idx
;
1782 rtk_uint32 svidx
, l2add
, l2Mask
;
1783 rtl8367c_svlan_memconf_t svlanMemConf
;
1784 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1786 /* Check initialization state */
1787 RTK_CHK_INIT_STATE();
1789 if (svid
> RTL8367C_VIDMAX
)
1790 return RT_ERR_SVLAN_VID
;
1792 if (mac
.octet
[0]!= 1&&mac
.octet
[1]!=0)
1793 return RT_ERR_INPUT
;
1795 l2add
= (mac
.octet
[2] << 24) | (mac
.octet
[3] << 16) | (mac
.octet
[4] << 8) | mac
.octet
[5];
1796 l2Mask
= (macMsk
.octet
[2] << 24) | (macMsk
.octet
[3] << 16) | (macMsk
.octet
[4] << 8) | macMsk
.octet
[5];
1800 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
1802 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
1805 if (svid
== svlanMemConf
.vs_svid
)
1812 if (0xFFFF == svidx
)
1813 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
1817 for (i
= RTL8367C_MC2SIDXMAX
; i
>=0; i
--)
1819 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1822 if (TRUE
== svlanMC2SConf
.valid
)
1824 if (svlanMC2SConf
.format
== SVLAN_MC2S_MODE_MAC
&&
1825 svlanMC2SConf
.sdata
==l2add
&&
1826 svlanMC2SConf
.smask
==l2Mask
)
1828 svlanMC2SConf
.svidx
= svidx
;
1829 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1839 if (empty_idx
!=0xFFFF)
1841 svlanMC2SConf
.valid
= TRUE
;
1842 svlanMC2SConf
.svidx
= svidx
;
1843 svlanMC2SConf
.format
= SVLAN_MC2S_MODE_MAC
;
1844 svlanMC2SConf
.sdata
= l2add
;
1845 svlanMC2SConf
.smask
= l2Mask
;
1847 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(empty_idx
, &svlanMC2SConf
)) != RT_ERR_OK
)
1852 return RT_ERR_OUT_OF_RANGE
;
1856 * rtk_svlan_l2mc2s_del
1858 * delete L2 multicast address to SVLAN
1860 * mac - L2 multicast address
1861 * macMsk - L2 multicast address mask
1866 * RT_ERR_FAILED - Failed
1867 * RT_ERR_SMI - SMI access error
1868 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1869 * RT_ERR_OUT_OF_RANGE - input out of range.
1871 * The API can delete Mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
1873 rtk_api_ret_t
rtk_svlan_l2mc2s_del(rtk_mac_t mac
, rtk_mac_t macMsk
)
1875 rtk_api_ret_t retVal
;
1877 rtk_uint32 l2add
, l2Mask
;
1878 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1880 /* Check initialization state */
1881 RTK_CHK_INIT_STATE();
1883 if (mac
.octet
[0]!= 1&&mac
.octet
[1]!=0)
1884 return RT_ERR_INPUT
;
1886 l2add
= (mac
.octet
[2] << 24) | (mac
.octet
[3] << 16) | (mac
.octet
[4] << 8) | mac
.octet
[5];
1887 l2Mask
= (macMsk
.octet
[2] << 24) | (macMsk
.octet
[3] << 16) | (macMsk
.octet
[4] << 8) | macMsk
.octet
[5];
1889 for (i
= 0; i
<= RTL8367C_MC2SIDXMAX
; i
++)
1891 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1894 if (TRUE
== svlanMC2SConf
.valid
)
1896 if (svlanMC2SConf
.format
== SVLAN_MC2S_MODE_MAC
&&
1897 svlanMC2SConf
.sdata
==l2add
&&
1898 svlanMC2SConf
.smask
==l2Mask
)
1900 memset(&svlanMC2SConf
, 0, sizeof(rtl8367c_svlan_mc2s_t
));
1901 if ((retVal
= rtl8367c_setAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1908 return RT_ERR_OUT_OF_RANGE
;
1912 * rtk_svlan_l2mc2s_get
1914 * Get L2 multicast address to SVLAN
1916 * mac - L2 multicast address
1917 * macMsk - L2 multicast address mask
1922 * RT_ERR_FAILED - Failed
1923 * RT_ERR_SMI - SMI access error
1924 * RT_ERR_INPUT - Invalid input parameters.
1925 * RT_ERR_OUT_OF_RANGE - input out of range.
1927 * The API can get L2 mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
1929 rtk_api_ret_t
rtk_svlan_l2mc2s_get(rtk_mac_t mac
, rtk_mac_t macMsk
, rtk_vlan_t
*pSvid
)
1931 rtk_api_ret_t retVal
;
1933 rtk_uint32 l2add
,l2Mask
;
1934 rtl8367c_svlan_memconf_t svlanMemConf
;
1935 rtl8367c_svlan_mc2s_t svlanMC2SConf
;
1937 /* Check initialization state */
1938 RTK_CHK_INIT_STATE();
1941 return RT_ERR_NULL_POINTER
;
1943 if (mac
.octet
[0]!= 1&&mac
.octet
[1]!=0)
1944 return RT_ERR_INPUT
;
1946 l2add
= (mac
.octet
[2] << 24) | (mac
.octet
[3] << 16) | (mac
.octet
[4] << 8) | mac
.octet
[5];
1947 l2Mask
= (macMsk
.octet
[2] << 24) | (macMsk
.octet
[3] << 16) | (macMsk
.octet
[4] << 8) | macMsk
.octet
[5];
1949 for (i
= 0; i
<= RTL8367C_MC2SIDXMAX
; i
++)
1951 if ((retVal
= rtl8367c_getAsicSvlanMC2SConf(i
, &svlanMC2SConf
)) != RT_ERR_OK
)
1954 if (TRUE
== svlanMC2SConf
.valid
)
1956 if (svlanMC2SConf
.format
== SVLAN_MC2S_MODE_MAC
&&
1957 svlanMC2SConf
.sdata
==l2add
&&
1958 svlanMC2SConf
.smask
==l2Mask
)
1960 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(svlanMC2SConf
.svidx
, &svlanMemConf
)) != RT_ERR_OK
)
1962 *pSvid
= svlanMemConf
.vs_svid
;
1969 return RT_ERR_OUT_OF_RANGE
;
1973 * rtk_svlan_sp2c_add
1975 * Add system SP2C configuration
1978 * dst_port - Destination port of SVLAN to CVLAN configuration
1984 * RT_ERR_FAILED - Failed
1985 * RT_ERR_SMI - SMI access error
1986 * RT_ERR_PORT_ID - Invalid port number.
1987 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
1988 * RT_ERR_VLAN_VID - Invalid VID parameter.
1989 * RT_ERR_OUT_OF_RANGE - input out of range.
1990 * RT_ERR_INPUT - Invalid input parameters.
1992 * The API can add SVID & Destination Port to CVLAN configuration. The downstream frames with assigned
1993 * SVID will be add C-tag with assigned CVID if the output port is the assigned destination port.
1994 * There are 128 SP2C configurations.
1996 rtk_api_ret_t
rtk_svlan_sp2c_add(rtk_vlan_t svid
, rtk_port_t dst_port
, rtk_vlan_t cvid
)
1998 rtk_api_ret_t retVal
, i
;
1999 rtk_uint32 empty_idx
, svidx
;
2000 rtl8367c_svlan_memconf_t svlanMemConf
;
2001 rtl8367c_svlan_s2c_t svlanSP2CConf
;
2004 /* Check initialization state */
2005 RTK_CHK_INIT_STATE();
2007 if (svid
> RTL8367C_VIDMAX
)
2008 return RT_ERR_SVLAN_VID
;
2010 if (cvid
> RTL8367C_VIDMAX
)
2011 return RT_ERR_VLAN_VID
;
2013 /* Check port Valid */
2014 RTK_CHK_PORT_VALID(dst_port
);
2015 port
= rtk_switch_port_L2P_get(dst_port
);
2019 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
2021 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
2024 if (svid
== svlanMemConf
.vs_svid
)
2031 if (0xFFFF == svidx
)
2032 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
2036 for (i
=RTL8367C_SP2CMAX
; i
>=0 ; i
--)
2038 if ((retVal
= rtl8367c_getAsicSvlanSP2CConf(i
, &svlanSP2CConf
)) != RT_ERR_OK
)
2041 if ( (svlanSP2CConf
.svidx
== svidx
) && (svlanSP2CConf
.dstport
== port
) && (svlanSP2CConf
.valid
== 1))
2046 else if (svlanSP2CConf
.valid
== 0)
2052 if (empty_idx
!=0xFFFF)
2054 svlanSP2CConf
.valid
= 1;
2055 svlanSP2CConf
.vid
= cvid
;
2056 svlanSP2CConf
.svidx
= svidx
;
2057 svlanSP2CConf
.dstport
= port
;
2059 if ((retVal
= rtl8367c_setAsicSvlanSP2CConf(empty_idx
, &svlanSP2CConf
)) != RT_ERR_OK
)
2064 return RT_ERR_OUT_OF_RANGE
;
2069 * rtk_svlan_sp2c_get
2071 * Get configure system SP2C content
2074 * dst_port - Destination port of SVLAN to CVLAN configuration
2079 * RT_ERR_FAILED - Failed
2080 * RT_ERR_SMI - SMI access error
2081 * RT_ERR_INPUT - Invalid input parameters.
2082 * RT_ERR_OUT_OF_RANGE - input out of range.
2083 * RT_ERR_PORT_ID - Invalid port number.
2084 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
2086 * The API can get SVID & Destination Port to CVLAN configuration. There are 128 SP2C configurations.
2088 rtk_api_ret_t
rtk_svlan_sp2c_get(rtk_vlan_t svid
, rtk_port_t dst_port
, rtk_vlan_t
*pCvid
)
2090 rtk_api_ret_t retVal
;
2091 rtk_uint32 i
, svidx
;
2092 rtl8367c_svlan_memconf_t svlanMemConf
;
2093 rtl8367c_svlan_s2c_t svlanSP2CConf
;
2095 /* Check initialization state */
2096 RTK_CHK_INIT_STATE();
2099 return RT_ERR_NULL_POINTER
;
2101 if (svid
> RTL8367C_VIDMAX
)
2102 return RT_ERR_SVLAN_VID
;
2104 /* Check port Valid */
2105 RTK_CHK_PORT_VALID(dst_port
);
2106 dst_port
= rtk_switch_port_L2P_get(dst_port
);
2110 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
2112 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
2115 if (svid
== svlanMemConf
.vs_svid
)
2122 if (0xFFFF == svidx
)
2123 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
2125 for (i
= 0; i
<= RTL8367C_SP2CMAX
; i
++)
2127 if ((retVal
= rtl8367c_getAsicSvlanSP2CConf(i
, &svlanSP2CConf
)) != RT_ERR_OK
)
2130 if ( (svlanSP2CConf
.svidx
== svidx
) && (svlanSP2CConf
.dstport
== dst_port
) && (svlanSP2CConf
.valid
== 1) )
2132 *pCvid
= svlanSP2CConf
.vid
;
2137 return RT_ERR_OUT_OF_RANGE
;
2141 * rtk_svlan_sp2c_del
2143 * Delete system SP2C configuration
2146 * dst_port - Destination port of SVLAN to CVLAN configuration
2151 * RT_ERR_FAILED - Failed
2152 * RT_ERR_SMI - SMI access error
2153 * RT_ERR_PORT_ID - Invalid port number.
2154 * RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
2155 * RT_ERR_OUT_OF_RANGE - input out of range.
2157 * The API can delete SVID & Destination Port to CVLAN configuration. There are 128 SP2C configurations.
2159 rtk_api_ret_t
rtk_svlan_sp2c_del(rtk_vlan_t svid
, rtk_port_t dst_port
)
2161 rtk_api_ret_t retVal
;
2162 rtk_uint32 i
, svidx
;
2163 rtl8367c_svlan_memconf_t svlanMemConf
;
2164 rtl8367c_svlan_s2c_t svlanSP2CConf
;
2166 /* Check initialization state */
2167 RTK_CHK_INIT_STATE();
2169 if (svid
> RTL8367C_VIDMAX
)
2170 return RT_ERR_SVLAN_VID
;
2172 /* Check port Valid */
2173 RTK_CHK_PORT_VALID(dst_port
);
2174 dst_port
= rtk_switch_port_L2P_get(dst_port
);
2178 for (i
= 0; i
< RTL8367C_SVIDXNO
; i
++)
2180 if ((retVal
= rtl8367c_getAsicSvlanMemberConfiguration(i
, &svlanMemConf
)) != RT_ERR_OK
)
2183 if (svid
== svlanMemConf
.vs_svid
)
2190 if (0xFFFF == svidx
)
2191 return RT_ERR_SVLAN_ENTRY_NOT_FOUND
;
2193 for (i
= 0; i
<= RTL8367C_SP2CMAX
; i
++)
2195 if ((retVal
= rtl8367c_getAsicSvlanSP2CConf(i
, &svlanSP2CConf
)) != RT_ERR_OK
)
2198 if ( (svlanSP2CConf
.svidx
== svidx
) && (svlanSP2CConf
.dstport
== dst_port
) && (svlanSP2CConf
.valid
== 1) )
2200 svlanSP2CConf
.valid
= 0;
2201 svlanSP2CConf
.vid
= 0;
2202 svlanSP2CConf
.svidx
= 0;
2203 svlanSP2CConf
.dstport
= 0;
2205 if ((retVal
= rtl8367c_setAsicSvlanSP2CConf(i
, &svlanSP2CConf
)) != RT_ERR_OK
)
2212 return RT_ERR_OUT_OF_RANGE
;
2216 * rtk_svlan_lookupType_set
2218 * Set lookup type of SVLAN
2220 * type - lookup type
2229 rtk_api_ret_t
rtk_svlan_lookupType_set(rtk_svlan_lookupType_t type
)
2231 rtk_api_ret_t retVal
;
2233 /* Check initialization state */
2234 RTK_CHK_INIT_STATE();
2236 if (type
>= SVLAN_LOOKUP_END
)
2237 return RT_ERR_CHIP_NOT_SUPPORTED
;
2240 svlan_lookupType
= type
;
2242 retVal
= rtl8367c_setAsicSvlanLookupType((rtk_uint32
)type
);
2248 * rtk_svlan_lookupType_get
2250 * Get lookup type of SVLAN
2252 * pType - lookup type
2261 rtk_api_ret_t
rtk_svlan_lookupType_get(rtk_svlan_lookupType_t
*pType
)
2263 rtk_api_ret_t retVal
;
2265 /* Check initialization state */
2266 RTK_CHK_INIT_STATE();
2269 return RT_ERR_NULL_POINTER
;
2271 retVal
= rtl8367c_getAsicSvlanLookupType(pType
);
2273 svlan_lookupType
= *pType
;
2279 * rtk_svlan_trapPri_set
2281 * Set svlan trap priority
2283 * priority - priority for trap packets
2289 * RT_ERR_QOS_INT_PRIORITY
2293 rtk_api_ret_t
rtk_svlan_trapPri_set(rtk_pri_t priority
)
2295 rtk_api_ret_t retVal
;
2297 RTK_CHK_INIT_STATE();
2299 if(priority
> RTL8367C_PRIMAX
)
2300 return RT_ERR_OUT_OF_RANGE
;
2302 retVal
= rtl8367c_setAsicSvlanTrapPriority(priority
);
2305 } /* end of rtk_svlan_trapPri_set */
2308 * rtk_svlan_trapPri_get
2310 * Get svlan trap priority
2314 * pPriority - priority for trap packets
2318 * RT_ERR_NULL_POINTER - input parameter may be null pointer
2322 rtk_api_ret_t
rtk_svlan_trapPri_get(rtk_pri_t
*pPriority
)
2324 rtk_api_ret_t retVal
;
2326 RTK_CHK_INIT_STATE();
2328 if(NULL
== pPriority
)
2329 return RT_ERR_NULL_POINTER
;
2331 retVal
= rtl8367c_getAsicSvlanTrapPriority(pPriority
);
2334 } /* end of rtk_svlan_trapPri_get */
2338 * rtk_svlan_checkAndCreateMbr
2340 * Check and create Member configuration and return index
2344 * pIndex - Member configuration index
2347 * RT_ERR_FAILED - Failed
2348 * RT_ERR_SMI - SMI access error
2349 * RT_ERR_VLAN_VID - Invalid VLAN ID.
2350 * RT_ERR_TBL_FULL - Member Configuration table full
2354 rtk_api_ret_t
rtk_svlan_checkAndCreateMbr(rtk_vlan_t vid
, rtk_uint32
*pIndex
)
2356 rtk_api_ret_t retVal
;
2358 rtk_uint32 empty_idx
= 0xFFFF;
2359 rtl8367c_svlan_memconf_t svlan_cfg
;
2361 /* Check initialization state */
2362 RTK_CHK_INIT_STATE();
2364 /* vid must be 0~4095 */
2365 if (vid
> RTL8367C_VIDMAX
)
2366 return RT_ERR_VLAN_VID
;
2368 /* Null pointer check */
2370 return RT_ERR_NULL_POINTER
;
2372 /* Search exist entry */
2373 for (svidx
= 0; svidx
<= RTL8367C_SVIDXMAX
; svidx
++)
2375 if(svlan_mbrCfgUsage
[svidx
] == TRUE
)
2377 if(svlan_mbrCfgVid
[svidx
] == vid
)
2379 /* Found! return index */
2384 else if(empty_idx
== 0xFFFF)
2391 if(empty_idx
== 0xFFFF)
2393 /* No empty index */
2394 return RT_ERR_TBL_FULL
;
2397 svlan_mbrCfgUsage
[empty_idx
] = TRUE
;
2398 svlan_mbrCfgVid
[empty_idx
] = vid
;
2400 memset(&svlan_cfg
, 0, sizeof(rtl8367c_svlan_memconf_t
));
2402 svlan_cfg
.vs_svid
= vid
;
2403 /*for create check*/
2406 svlan_cfg
.vs_efid
= 1;
2409 if((retVal
= rtl8367c_setAsicSvlanMemberConfiguration(empty_idx
, &svlan_cfg
)) != RT_ERR_OK
)
2412 *pIndex
= empty_idx
;