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 IGMP module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
23 #include <rtl8367c_asicdrv.h>
24 #include <rtl8367c_asicdrv_igmp.h>
25 #include <rtl8367c_asicdrv_lut.h>
31 * This API enables H/W IGMP and set a default initial configuration.
38 * RT_ERR_FAILED - Failed
39 * RT_ERR_SMI - SMI access error
41 * This API enables H/W IGMP and set a default initial configuration.
43 rtk_api_ret_t
rtk_igmp_init(void)
48 /* Check initialization state */
51 if ((retVal
= rtl8367c_setAsicLutIpMulticastLookup(ENABLED
))!=RT_ERR_OK
)
54 if ((retVal
= rtl8367c_setAsicLutIpLookupMethod(1))!=RT_ERR_OK
)
57 RTK_SCAN_ALL_PHY_PORTMASK(port
)
59 if ((retVal
= rtl8367c_setAsicIGMPv1Opeartion(port
, PROTOCOL_OP_ASIC
))!=RT_ERR_OK
)
62 if ((retVal
= rtl8367c_setAsicIGMPv2Opeartion(port
, PROTOCOL_OP_ASIC
))!=RT_ERR_OK
)
65 if ((retVal
= rtl8367c_setAsicIGMPv3Opeartion(port
, PROTOCOL_OP_FLOOD
))!=RT_ERR_OK
)
68 if ((retVal
= rtl8367c_setAsicMLDv1Opeartion(port
, PROTOCOL_OP_ASIC
))!=RT_ERR_OK
)
71 if ((retVal
= rtl8367c_setAsicMLDv2Opeartion(port
, PROTOCOL_OP_FLOOD
))!=RT_ERR_OK
)
75 if ((retVal
= rtl8367c_setAsicIGMPAllowDynamicRouterPort(rtk_switch_phyPortMask_get()))!=RT_ERR_OK
)
78 if ((retVal
= rtl8367c_setAsicIGMPFastLeaveEn(ENABLED
))!=RT_ERR_OK
)
81 if ((retVal
= rtl8367c_setAsicIGMPReportLeaveFlood(1))!=RT_ERR_OK
)
84 if ((retVal
= rtl8367c_setAsicIgmp(ENABLED
))!=RT_ERR_OK
)
93 * This API set H/W IGMP state.
95 * enabled - H/W IGMP state
100 * RT_ERR_FAILED - Failed
101 * RT_ERR_SMI - SMI access error
102 * RT_ERR_INPUT - Error parameter
104 * This API set H/W IGMP state.
106 rtk_api_ret_t
rtk_igmp_state_set(rtk_enable_t enabled
)
108 rtk_api_ret_t retVal
;
110 /* Check initialization state */
111 RTK_CHK_INIT_STATE();
113 if (enabled
>= RTK_ENABLE_END
)
116 if ((retVal
= rtl8367c_setAsicIgmp(enabled
))!=RT_ERR_OK
)
125 * This API get H/W IGMP state.
129 * pEnabled - H/W IGMP state
132 * RT_ERR_FAILED - Failed
133 * RT_ERR_SMI - SMI access error
134 * RT_ERR_INPUT - Error parameter
136 * This API set current H/W IGMP state.
138 rtk_api_ret_t
rtk_igmp_state_get(rtk_enable_t
*pEnabled
)
140 rtk_api_ret_t retVal
;
142 /* Check initialization state */
143 RTK_CHK_INIT_STATE();
146 return RT_ERR_NULL_POINTER
;
148 if ((retVal
= rtl8367c_getAsicIgmp(pEnabled
))!=RT_ERR_OK
)
155 * rtk_igmp_static_router_port_set
157 * Configure static router port
159 * pPortmask - Static Port mask
164 * RT_ERR_FAILED - Failed
165 * RT_ERR_SMI - SMI access error
166 * RT_ERR_PORT_MASK - Error parameter
168 * This API set static router port
170 rtk_api_ret_t
rtk_igmp_static_router_port_set(rtk_portmask_t
*pPortmask
)
172 rtk_api_ret_t retVal
;
175 /* Check initialization state */
176 RTK_CHK_INIT_STATE();
178 /* Check Valid port mask */
179 if(pPortmask
== NULL
)
180 return RT_ERR_NULL_POINTER
;
182 RTK_CHK_PORTMASK_VALID(pPortmask
);
184 if ((retVal
= rtk_switch_portmask_L2P_get(pPortmask
, &pmask
))!=RT_ERR_OK
)
187 if ((retVal
= rtl8367c_setAsicIGMPStaticRouterPort(pmask
))!=RT_ERR_OK
)
194 * rtk_igmp_static_router_port_get
196 * Get static router port
200 * pPortmask - Static port mask
203 * RT_ERR_FAILED - Failed
204 * RT_ERR_SMI - SMI access error
205 * RT_ERR_PORT_MASK - Error parameter
207 * This API get static router port
209 rtk_api_ret_t
rtk_igmp_static_router_port_get(rtk_portmask_t
*pPortmask
)
211 rtk_api_ret_t retVal
;
214 /* Check initialization state */
215 RTK_CHK_INIT_STATE();
217 if(pPortmask
== NULL
)
218 return RT_ERR_NULL_POINTER
;
220 if ((retVal
= rtl8367c_getAsicIGMPStaticRouterPort(&pmask
))!=RT_ERR_OK
)
223 if ((retVal
= rtk_switch_portmask_P2L_get(pmask
, pPortmask
))!=RT_ERR_OK
)
230 * rtk_igmp_protocol_set
232 * set IGMP/MLD protocol action
235 * protocol - IGMP/MLD protocol
236 * action - Per-port and per-protocol IGMP action setting
241 * RT_ERR_FAILED - Failed
242 * RT_ERR_SMI - SMI access error
243 * RT_ERR_PORT_MASK - Error parameter
245 * This API set IGMP/MLD protocol action
247 rtk_api_ret_t
rtk_igmp_protocol_set(rtk_port_t port
, rtk_igmp_protocol_t protocol
, rtk_igmp_action_t action
)
249 rtk_uint32 operation
;
250 rtk_api_ret_t retVal
;
252 /* Check initialization state */
253 RTK_CHK_INIT_STATE();
255 /* Check port valid */
256 RTK_CHK_PORT_VALID(port
);
258 if(protocol
>= PROTOCOL_END
)
261 if(action
>= IGMP_ACTION_END
)
266 case IGMP_ACTION_FORWARD
:
267 operation
= PROTOCOL_OP_FLOOD
;
269 case IGMP_ACTION_TRAP2CPU
:
270 operation
= PROTOCOL_OP_TRAP
;
272 case IGMP_ACTION_DROP
:
273 operation
= PROTOCOL_OP_DROP
;
275 case IGMP_ACTION_ASIC
:
276 operation
= PROTOCOL_OP_ASIC
;
284 case PROTOCOL_IGMPv1
:
285 if ((retVal
= rtl8367c_setAsicIGMPv1Opeartion(rtk_switch_port_L2P_get(port
), operation
))!=RT_ERR_OK
)
289 case PROTOCOL_IGMPv2
:
290 if ((retVal
= rtl8367c_setAsicIGMPv2Opeartion(rtk_switch_port_L2P_get(port
), operation
))!=RT_ERR_OK
)
294 case PROTOCOL_IGMPv3
:
295 if ((retVal
= rtl8367c_setAsicIGMPv3Opeartion(rtk_switch_port_L2P_get(port
), operation
))!=RT_ERR_OK
)
300 if ((retVal
= rtl8367c_setAsicMLDv1Opeartion(rtk_switch_port_L2P_get(port
), operation
))!=RT_ERR_OK
)
305 if ((retVal
= rtl8367c_setAsicMLDv2Opeartion(rtk_switch_port_L2P_get(port
), operation
))!=RT_ERR_OK
)
318 * rtk_igmp_protocol_get
320 * set IGMP/MLD protocol action
323 * protocol - IGMP/MLD protocol
324 * action - Per-port and per-protocol IGMP action setting
329 * RT_ERR_FAILED - Failed
330 * RT_ERR_SMI - SMI access error
331 * RT_ERR_PORT_MASK - Error parameter
333 * This API set IGMP/MLD protocol action
335 rtk_api_ret_t
rtk_igmp_protocol_get(rtk_port_t port
, rtk_igmp_protocol_t protocol
, rtk_igmp_action_t
*pAction
)
337 rtk_uint32 operation
;
338 rtk_api_ret_t retVal
;
340 /* Check initialization state */
341 RTK_CHK_INIT_STATE();
343 /* Check port valid */
344 RTK_CHK_PORT_VALID(port
);
346 if(protocol
>= PROTOCOL_END
)
350 return RT_ERR_NULL_POINTER
;
354 case PROTOCOL_IGMPv1
:
355 if ((retVal
= rtl8367c_getAsicIGMPv1Opeartion(rtk_switch_port_L2P_get(port
), &operation
))!=RT_ERR_OK
)
359 case PROTOCOL_IGMPv2
:
360 if ((retVal
= rtl8367c_getAsicIGMPv2Opeartion(rtk_switch_port_L2P_get(port
), &operation
))!=RT_ERR_OK
)
364 case PROTOCOL_IGMPv3
:
365 if ((retVal
= rtl8367c_getAsicIGMPv3Opeartion(rtk_switch_port_L2P_get(port
), &operation
))!=RT_ERR_OK
)
370 if ((retVal
= rtl8367c_getAsicMLDv1Opeartion(rtk_switch_port_L2P_get(port
), &operation
))!=RT_ERR_OK
)
375 if ((retVal
= rtl8367c_getAsicMLDv2Opeartion(rtk_switch_port_L2P_get(port
), &operation
))!=RT_ERR_OK
)
386 case PROTOCOL_OP_FLOOD
:
387 *pAction
= IGMP_ACTION_FORWARD
;
389 case PROTOCOL_OP_TRAP
:
390 *pAction
= IGMP_ACTION_TRAP2CPU
;
392 case PROTOCOL_OP_DROP
:
393 *pAction
= IGMP_ACTION_DROP
;
395 case PROTOCOL_OP_ASIC
:
396 *pAction
= IGMP_ACTION_ASIC
;
399 return RT_ERR_FAILED
;
406 * rtk_igmp_fastLeave_set
408 * set IGMP/MLD FastLeave state
410 * state - ENABLED: Enable FastLeave, DISABLED: disable FastLeave
415 * RT_ERR_INPUT - Error Input
416 * RT_ERR_FAILED - Failed
417 * RT_ERR_SMI - SMI access error
419 * This API set IGMP/MLD FastLeave state
421 rtk_api_ret_t
rtk_igmp_fastLeave_set(rtk_enable_t state
)
423 rtk_api_ret_t retVal
;
425 /* Check initialization state */
426 RTK_CHK_INIT_STATE();
428 if(state
>= RTK_ENABLE_END
)
431 if ((retVal
= rtl8367c_setAsicIGMPFastLeaveEn((rtk_uint32
)state
))!=RT_ERR_OK
)
438 * rtk_igmp_fastLeave_get
440 * get IGMP/MLD FastLeave state
444 * pState - ENABLED: Enable FastLeave, DISABLED: disable FastLeave
447 * RT_ERR_NULL_POINTER - NULL pointer
448 * RT_ERR_FAILED - Failed
449 * RT_ERR_SMI - SMI access error
451 * This API get IGMP/MLD FastLeave state
453 rtk_api_ret_t
rtk_igmp_fastLeave_get(rtk_enable_t
*pState
)
455 rtk_uint32 fast_leave
;
456 rtk_api_ret_t retVal
;
458 /* Check initialization state */
459 RTK_CHK_INIT_STATE();
462 return RT_ERR_NULL_POINTER
;
464 if ((retVal
= rtl8367c_getAsicIGMPFastLeaveEn(&fast_leave
))!=RT_ERR_OK
)
467 *pState
= ((fast_leave
== 1) ? ENABLED
: DISABLED
);
472 * rtk_igmp_maxGroup_set
474 * Set per port multicast group learning limit.
477 * group - The number of multicast group learning limit.
482 * RT_ERR_PORT_ID - Error Port ID
483 * RT_ERR_OUT_OF_RANGE - parameter out of range
484 * RT_ERR_FAILED - Failed
485 * RT_ERR_SMI - SMI access error
487 * This API set per port multicast group learning limit.
489 rtk_api_ret_t
rtk_igmp_maxGroup_set(rtk_port_t port
, rtk_uint32 group
)
491 rtk_api_ret_t retVal
;
493 /* Check initialization state */
494 RTK_CHK_INIT_STATE();
496 /* Check port valid */
497 RTK_CHK_PORT_VALID(port
);
499 if(group
> RTL8367C_IGMP_MAX_GOUP
)
500 return RT_ERR_OUT_OF_RANGE
;
502 if ((retVal
= rtl8367c_setAsicIGMPPortMAXGroup(rtk_switch_port_L2P_get(port
), group
))!=RT_ERR_OK
)
509 * rtk_igmp_maxGroup_get
511 * Get per port multicast group learning limit.
515 * pGroup - The number of multicast group learning limit.
518 * RT_ERR_PORT_ID - Error Port ID
519 * RT_ERR_NULL_POINTER - Null pointer
520 * RT_ERR_FAILED - Failed
521 * RT_ERR_SMI - SMI access error
523 * This API get per port multicast group learning limit.
525 rtk_api_ret_t
rtk_igmp_maxGroup_get(rtk_port_t port
, rtk_uint32
*pGroup
)
527 rtk_api_ret_t retVal
;
529 /* Check initialization state */
530 RTK_CHK_INIT_STATE();
532 /* Check port valid */
533 RTK_CHK_PORT_VALID(port
);
536 return RT_ERR_NULL_POINTER
;
538 if ((retVal
= rtl8367c_getAsicIGMPPortMAXGroup(rtk_switch_port_L2P_get(port
), pGroup
))!=RT_ERR_OK
)
545 * rtk_igmp_currentGroup_get
547 * Get per port multicast group learning count.
551 * pGroup - The number of multicast group learning count.
554 * RT_ERR_PORT_ID - Error Port ID
555 * RT_ERR_NULL_POINTER - Null pointer
556 * RT_ERR_FAILED - Failed
557 * RT_ERR_SMI - SMI access error
559 * This API get per port multicast group learning count.
561 rtk_api_ret_t
rtk_igmp_currentGroup_get(rtk_port_t port
, rtk_uint32
*pGroup
)
563 rtk_api_ret_t retVal
;
565 /* Check initialization state */
566 RTK_CHK_INIT_STATE();
568 /* Check port valid */
569 RTK_CHK_PORT_VALID(port
);
572 return RT_ERR_NULL_POINTER
;
574 if ((retVal
= rtl8367c_getAsicIGMPPortCurrentGroup(rtk_switch_port_L2P_get(port
), pGroup
))!=RT_ERR_OK
)
581 * rtk_igmp_tableFullAction_set
583 * set IGMP/MLD Table Full Action
585 * action - Table Full Action
590 * RT_ERR_INPUT - Error Input
591 * RT_ERR_FAILED - Failed
592 * RT_ERR_SMI - SMI access error
595 rtk_api_ret_t
rtk_igmp_tableFullAction_set(rtk_igmp_tableFullAction_t action
)
597 rtk_api_ret_t retVal
;
599 /* Check initialization state */
600 RTK_CHK_INIT_STATE();
602 if(action
>= IGMP_TABLE_FULL_OP_END
)
605 if ((retVal
= rtl8367c_setAsicIGMPTableFullOP((rtk_uint32
)action
))!=RT_ERR_OK
)
612 * rtk_igmp_tableFullAction_get
614 * get IGMP/MLD Table Full Action
618 * pAction - Table Full Action
621 * RT_ERR_NULL_POINTER - Null pointer
622 * RT_ERR_FAILED - Failed
623 * RT_ERR_SMI - SMI access error
626 rtk_api_ret_t
rtk_igmp_tableFullAction_get(rtk_igmp_tableFullAction_t
*pAction
)
628 rtk_api_ret_t retVal
;
630 /* Check initialization state */
631 RTK_CHK_INIT_STATE();
634 return RT_ERR_NULL_POINTER
;
636 if ((retVal
= rtl8367c_getAsicIGMPTableFullOP((rtk_uint32
*)pAction
))!=RT_ERR_OK
)
643 * rtk_igmp_checksumErrorAction_set
645 * set IGMP/MLD Checksum Error Action
647 * action - Checksum error Action
652 * RT_ERR_INPUT - Error Input
653 * RT_ERR_FAILED - Failed
654 * RT_ERR_SMI - SMI access error
657 rtk_api_ret_t
rtk_igmp_checksumErrorAction_set(rtk_igmp_checksumErrorAction_t action
)
659 rtk_api_ret_t retVal
;
661 /* Check initialization state */
662 RTK_CHK_INIT_STATE();
664 if(action
>= IGMP_CRC_ERR_OP_END
)
667 if ((retVal
= rtl8367c_setAsicIGMPCRCErrOP((rtk_uint32
)action
))!=RT_ERR_OK
)
675 * rtk_igmp_checksumErrorAction_get
677 * get IGMP/MLD Checksum Error Action
681 * pAction - Checksum error Action
684 * RT_ERR_NULL_POINTER - Null pointer
685 * RT_ERR_FAILED - Failed
686 * RT_ERR_SMI - SMI access error
689 rtk_api_ret_t
rtk_igmp_checksumErrorAction_get(rtk_igmp_checksumErrorAction_t
*pAction
)
691 rtk_api_ret_t retVal
;
693 /* Check initialization state */
694 RTK_CHK_INIT_STATE();
697 return RT_ERR_NULL_POINTER
;
699 if ((retVal
= rtl8367c_getAsicIGMPCRCErrOP((rtk_uint32
*)pAction
))!=RT_ERR_OK
)
706 * rtk_igmp_leaveTimer_set
708 * set IGMP/MLD Leave timer
710 * timer - Leave timer
715 * RT_ERR_INPUT - Error Input
716 * RT_ERR_FAILED - Failed
717 * RT_ERR_SMI - SMI access error
720 rtk_api_ret_t
rtk_igmp_leaveTimer_set(rtk_uint32 timer
)
722 rtk_api_ret_t retVal
;
724 /* Check initialization state */
725 RTK_CHK_INIT_STATE();
727 if(timer
> RTL8367C_MAX_LEAVE_TIMER
)
730 if ((retVal
= rtl8367c_setAsicIGMPLeaveTimer(timer
))!=RT_ERR_OK
)
737 * rtk_igmp_leaveTimer_get
739 * get IGMP/MLD Leave timer
743 * pTimer - Leave Timer.
746 * RT_ERR_NULL_POINTER - Null pointer
747 * RT_ERR_FAILED - Failed
748 * RT_ERR_SMI - SMI access error
751 rtk_api_ret_t
rtk_igmp_leaveTimer_get(rtk_uint32
*pTimer
)
753 rtk_api_ret_t retVal
;
755 /* Check initialization state */
756 RTK_CHK_INIT_STATE();
759 return RT_ERR_NULL_POINTER
;
761 if ((retVal
= rtl8367c_getAsicIGMPLeaveTimer(pTimer
))!=RT_ERR_OK
)
768 * rtk_igmp_queryInterval_set
770 * set IGMP/MLD Query Interval
772 * interval - Query Interval
777 * RT_ERR_INPUT - Error Input
778 * RT_ERR_FAILED - Failed
779 * RT_ERR_SMI - SMI access error
782 rtk_api_ret_t
rtk_igmp_queryInterval_set(rtk_uint32 interval
)
784 rtk_api_ret_t retVal
;
786 /* Check initialization state */
787 RTK_CHK_INIT_STATE();
789 if(interval
> RTL8367C_MAX_QUERY_INT
)
792 if ((retVal
= rtl8367c_setAsicIGMPQueryInterval(interval
))!=RT_ERR_OK
)
799 * rtk_igmp_queryInterval_get
801 * get IGMP/MLD Query Interval
805 * pInterval - Query Interval
808 * RT_ERR_NULL_POINTER - Null pointer
809 * RT_ERR_FAILED - Failed
810 * RT_ERR_SMI - SMI access error
813 rtk_api_ret_t
rtk_igmp_queryInterval_get(rtk_uint32
*pInterval
)
815 rtk_api_ret_t retVal
;
817 /* Check initialization state */
818 RTK_CHK_INIT_STATE();
820 if(NULL
== pInterval
)
821 return RT_ERR_NULL_POINTER
;
823 if ((retVal
= rtl8367c_getAsicIGMPQueryInterval(pInterval
))!=RT_ERR_OK
)
830 * rtk_igmp_robustness_set
832 * set IGMP/MLD Robustness value
834 * robustness - Robustness value
839 * RT_ERR_INPUT - Error Input
840 * RT_ERR_FAILED - Failed
841 * RT_ERR_SMI - SMI access error
844 rtk_api_ret_t
rtk_igmp_robustness_set(rtk_uint32 robustness
)
846 rtk_api_ret_t retVal
;
848 /* Check initialization state */
849 RTK_CHK_INIT_STATE();
851 if(robustness
> RTL8367C_MAX_ROB_VAR
)
854 if ((retVal
= rtl8367c_setAsicIGMPRobVar(robustness
))!=RT_ERR_OK
)
861 * rtk_igmp_robustness_get
863 * get IGMP/MLD Robustness value
867 * pRobustness - Robustness value.
870 * RT_ERR_NULL_POINTER - Null pointer
871 * RT_ERR_FAILED - Failed
872 * RT_ERR_SMI - SMI access error
875 rtk_api_ret_t
rtk_igmp_robustness_get(rtk_uint32
*pRobustness
)
877 rtk_api_ret_t retVal
;
879 /* Check initialization state */
880 RTK_CHK_INIT_STATE();
882 if(NULL
== pRobustness
)
883 return RT_ERR_NULL_POINTER
;
885 if ((retVal
= rtl8367c_getAsicIGMPRobVar(pRobustness
))!=RT_ERR_OK
)
892 * rtk_igmp_dynamicRouterRortAllow_set
894 * Configure dynamic router port allow option
896 * pPortmask - Dynamic Port allow mask
901 * RT_ERR_FAILED - Failed
902 * RT_ERR_SMI - SMI access error
903 * RT_ERR_PORT_MASK - Error parameter
907 rtk_api_ret_t
rtk_igmp_dynamicRouterPortAllow_set(rtk_portmask_t
*pPortmask
)
909 rtk_api_ret_t retVal
;
912 /* Check initialization state */
913 RTK_CHK_INIT_STATE();
915 if(NULL
== pPortmask
)
916 return RT_ERR_NULL_POINTER
;
918 RTK_CHK_PORTMASK_VALID(pPortmask
);
920 if ((retVal
= rtk_switch_portmask_L2P_get(pPortmask
, &pmask
))!=RT_ERR_OK
)
923 if ((retVal
= rtl8367c_setAsicIGMPAllowDynamicRouterPort(pmask
))!=RT_ERR_OK
)
930 * rtk_igmp_dynamicRouterRortAllow_get
932 * Get dynamic router port allow option
936 * pPortmask - Dynamic Port allow mask
939 * RT_ERR_FAILED - Failed
940 * RT_ERR_NULL_POINTER - Null pointer
941 * RT_ERR_SMI - SMI access error
942 * RT_ERR_PORT_MASK - Error parameter
946 rtk_api_ret_t
rtk_igmp_dynamicRouterPortAllow_get(rtk_portmask_t
*pPortmask
)
948 rtk_api_ret_t retVal
;
951 /* Check initialization state */
952 RTK_CHK_INIT_STATE();
954 if(NULL
== pPortmask
)
955 return RT_ERR_NULL_POINTER
;
957 if ((retVal
= rtl8367c_getAsicIGMPAllowDynamicRouterPort(&pmask
))!=RT_ERR_OK
)
960 if ((retVal
= rtk_switch_portmask_P2L_get(pmask
, pPortmask
))!=RT_ERR_OK
)
967 * rtk_igmp_dynamicRouterPort_get
969 * Get dynamic router port
973 * pDynamicRouterPort - Dynamic Router Port
976 * RT_ERR_FAILED - Failed
977 * RT_ERR_NULL_POINTER - Null pointer
978 * RT_ERR_SMI - SMI access error
979 * RT_ERR_PORT_MASK - Error parameter
983 rtk_api_ret_t
rtk_igmp_dynamicRouterPort_get(rtk_igmp_dynamicRouterPort_t
*pDynamicRouterPort
)
985 rtk_api_ret_t retVal
;
989 /* Check initialization state */
990 RTK_CHK_INIT_STATE();
992 if(NULL
== pDynamicRouterPort
)
993 return RT_ERR_NULL_POINTER
;
995 if ((retVal
= rtl8367c_getAsicIGMPdynamicRouterPort1(&port
, &timer
))!= RT_ERR_OK
)
998 if (port
== RTL8367C_ROUTER_PORT_INVALID
)
1000 pDynamicRouterPort
->dynamicRouterPort0Valid
= DISABLED
;
1001 pDynamicRouterPort
->dynamicRouterPort0
= 0;
1002 pDynamicRouterPort
->dynamicRouterPort0Timer
= 0;
1006 pDynamicRouterPort
->dynamicRouterPort0Valid
= ENABLED
;
1007 pDynamicRouterPort
->dynamicRouterPort0
= rtk_switch_port_P2L_get(port
);
1008 pDynamicRouterPort
->dynamicRouterPort0Timer
= timer
;
1011 if ((retVal
= rtl8367c_getAsicIGMPdynamicRouterPort2(&port
, &timer
))!= RT_ERR_OK
)
1014 if (port
== RTL8367C_ROUTER_PORT_INVALID
)
1016 pDynamicRouterPort
->dynamicRouterPort1Valid
= DISABLED
;
1017 pDynamicRouterPort
->dynamicRouterPort1
= 0;
1018 pDynamicRouterPort
->dynamicRouterPort1Timer
= 0;
1022 pDynamicRouterPort
->dynamicRouterPort1Valid
= ENABLED
;
1023 pDynamicRouterPort
->dynamicRouterPort1
= rtk_switch_port_P2L_get(port
);
1024 pDynamicRouterPort
->dynamicRouterPort1Timer
= timer
;
1031 * rtk_igmp_suppressionEnable_set
1033 * Configure IGMPv1/v2 & MLDv1 Report/Leave/Done suppression
1035 * reportSuppression - Report suppression
1036 * leaveSuppression - Leave suppression
1041 * RT_ERR_FAILED - Failed
1042 * RT_ERR_SMI - SMI access error
1043 * RT_ERR_INPUT - Error Input
1047 rtk_api_ret_t
rtk_igmp_suppressionEnable_set(rtk_enable_t reportSuppression
, rtk_enable_t leaveSuppression
)
1049 rtk_api_ret_t retVal
;
1051 /* Check initialization state */
1052 RTK_CHK_INIT_STATE();
1054 if(reportSuppression
>= RTK_ENABLE_END
)
1055 return RT_ERR_INPUT
;
1057 if(leaveSuppression
>= RTK_ENABLE_END
)
1058 return RT_ERR_INPUT
;
1060 if ((retVal
= rtl8367c_setAsicIGMPSuppression((rtk_uint32
)reportSuppression
, (rtk_uint32
)leaveSuppression
))!=RT_ERR_OK
)
1067 * rtk_igmp_suppressionEnable_get
1069 * Get IGMPv1/v2 & MLDv1 Report/Leave/Done suppression
1073 * pReportSuppression - Report suppression
1074 * pLeaveSuppression - Leave suppression
1077 * RT_ERR_FAILED - Failed
1078 * RT_ERR_SMI - SMI access error
1079 * RT_ERR_NULL_POINTER - Null pointer
1083 rtk_api_ret_t
rtk_igmp_suppressionEnable_get(rtk_enable_t
*pReportSuppression
, rtk_enable_t
*pLeaveSuppression
)
1085 rtk_api_ret_t retVal
;
1087 /* Check initialization state */
1088 RTK_CHK_INIT_STATE();
1090 if(NULL
== pReportSuppression
)
1091 return RT_ERR_NULL_POINTER
;
1093 if(NULL
== pLeaveSuppression
)
1094 return RT_ERR_NULL_POINTER
;
1096 if ((retVal
= rtl8367c_getAsicIGMPSuppression((rtk_uint32
*)pReportSuppression
, (rtk_uint32
*)pLeaveSuppression
))!=RT_ERR_OK
)
1103 * rtk_igmp_portRxPktEnable_set
1105 * Configure IGMP/MLD RX Packet configuration
1108 * pRxCfg - RX Packet Configuration
1113 * RT_ERR_FAILED - Failed
1114 * RT_ERR_SMI - SMI access error
1115 * RT_ERR_INPUT - Error Input
1116 * RT_ERR_NULL_POINTER - Null pointer
1120 rtk_api_ret_t
rtk_igmp_portRxPktEnable_set(rtk_port_t port
, rtk_igmp_rxPktEnable_t
*pRxCfg
)
1122 rtk_api_ret_t retVal
;
1124 /* Check initialization state */
1125 RTK_CHK_INIT_STATE();
1127 /* Check port valid */
1128 RTK_CHK_PORT_VALID(port
);
1131 return RT_ERR_NULL_POINTER
;
1133 if(pRxCfg
->rxQuery
>= RTK_ENABLE_END
)
1134 return RT_ERR_INPUT
;
1136 if(pRxCfg
->rxReport
>= RTK_ENABLE_END
)
1137 return RT_ERR_INPUT
;
1139 if(pRxCfg
->rxLeave
>= RTK_ENABLE_END
)
1140 return RT_ERR_INPUT
;
1142 if(pRxCfg
->rxMRP
>= RTK_ENABLE_END
)
1143 return RT_ERR_INPUT
;
1145 if(pRxCfg
->rxMcast
>= RTK_ENABLE_END
)
1146 return RT_ERR_INPUT
;
1148 if ((retVal
= rtl8367c_setAsicIGMPQueryRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
)pRxCfg
->rxQuery
))!=RT_ERR_OK
)
1151 if ((retVal
= rtl8367c_setAsicIGMPReportRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
)pRxCfg
->rxReport
))!=RT_ERR_OK
)
1154 if ((retVal
= rtl8367c_setAsicIGMPLeaveRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
)pRxCfg
->rxLeave
))!=RT_ERR_OK
)
1157 if ((retVal
= rtl8367c_setAsicIGMPMRPRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
)pRxCfg
->rxMRP
))!=RT_ERR_OK
)
1160 if ((retVal
= rtl8367c_setAsicIGMPMcDataRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
)pRxCfg
->rxMcast
))!=RT_ERR_OK
)
1167 * rtk_igmp_portRxPktEnable_get
1169 * Get IGMP/MLD RX Packet configuration
1172 * pRxCfg - RX Packet Configuration
1177 * RT_ERR_FAILED - Failed
1178 * RT_ERR_SMI - SMI access error
1179 * RT_ERR_INPUT - Error Input
1180 * RT_ERR_NULL_POINTER - Null pointer
1184 rtk_api_ret_t
rtk_igmp_portRxPktEnable_get(rtk_port_t port
, rtk_igmp_rxPktEnable_t
*pRxCfg
)
1186 rtk_api_ret_t retVal
;
1188 /* Check initialization state */
1189 RTK_CHK_INIT_STATE();
1191 /* Check port valid */
1192 RTK_CHK_PORT_VALID(port
);
1195 return RT_ERR_NULL_POINTER
;
1197 if ((retVal
= rtl8367c_getAsicIGMPQueryRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
*)&(pRxCfg
->rxQuery
)))!=RT_ERR_OK
)
1200 if ((retVal
= rtl8367c_getAsicIGMPReportRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
*)&(pRxCfg
->rxReport
)))!=RT_ERR_OK
)
1203 if ((retVal
= rtl8367c_getAsicIGMPLeaveRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
*)&(pRxCfg
->rxLeave
)))!=RT_ERR_OK
)
1206 if ((retVal
= rtl8367c_getAsicIGMPMRPRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
*)&(pRxCfg
->rxMRP
)))!=RT_ERR_OK
)
1209 if ((retVal
= rtl8367c_getAsicIGMPMcDataRX(rtk_switch_port_L2P_get(port
), (rtk_uint32
*)&(pRxCfg
->rxMcast
)))!=RT_ERR_OK
)
1216 * rtk_igmp_groupInfo_get
1218 * Get IGMP/MLD Group database
1220 * index - Index (0~255)
1222 * pGroup - Group database information.
1225 * RT_ERR_FAILED - Failed
1226 * RT_ERR_SMI - SMI access error
1227 * RT_ERR_INPUT - Error Input
1228 * RT_ERR_NULL_POINTER - Null pointer
1232 rtk_api_ret_t
rtk_igmp_groupInfo_get(rtk_uint32 index
, rtk_igmp_groupInfo_t
*pGroup
)
1234 rtk_api_ret_t retVal
;
1236 rtl8367c_igmpgroup grp
;
1238 /* Check initialization state */
1239 RTK_CHK_INIT_STATE();
1242 if(index
> RTL8367C_IGMP_MAX_GOUP
)
1243 return RT_ERR_INPUT
;
1246 return RT_ERR_NULL_POINTER
;
1248 if ((retVal
= rtl8367c_getAsicIGMPGroup(index
, &valid
, &grp
))!=RT_ERR_OK
)
1251 memset(pGroup
, 0x00, sizeof(rtk_igmp_groupInfo_t
));
1252 pGroup
->valid
= valid
;
1253 pGroup
->reportSuppFlag
= grp
.report_supp_flag
;
1255 if(grp
.p0_timer
!= 0)
1257 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(0));
1258 pGroup
->timer
[rtk_switch_port_P2L_get(0)] = grp
.p0_timer
;
1261 if(grp
.p1_timer
!= 0)
1263 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(1));
1264 pGroup
->timer
[rtk_switch_port_P2L_get(1)] = grp
.p1_timer
;
1267 if(grp
.p2_timer
!= 0)
1269 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(2));
1270 pGroup
->timer
[rtk_switch_port_P2L_get(2)] = grp
.p2_timer
;
1273 if(grp
.p3_timer
!= 0)
1275 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(3));
1276 pGroup
->timer
[rtk_switch_port_P2L_get(3)] = grp
.p3_timer
;
1279 if(grp
.p4_timer
!= 0)
1281 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(4));
1282 pGroup
->timer
[rtk_switch_port_P2L_get(4)] = grp
.p4_timer
;
1285 if(grp
.p5_timer
!= 0)
1287 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(5));
1288 pGroup
->timer
[rtk_switch_port_P2L_get(5)] = grp
.p5_timer
;
1291 if(grp
.p6_timer
!= 0)
1293 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(6));
1294 pGroup
->timer
[rtk_switch_port_P2L_get(6)] = grp
.p6_timer
;
1297 if(grp
.p7_timer
!= 0)
1299 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(7));
1300 pGroup
->timer
[rtk_switch_port_P2L_get(7)] = grp
.p7_timer
;
1303 if(grp
.p8_timer
!= 0)
1305 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(8));
1306 pGroup
->timer
[rtk_switch_port_P2L_get(8)] = grp
.p8_timer
;
1309 if(grp
.p9_timer
!= 0)
1311 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(9));
1312 pGroup
->timer
[rtk_switch_port_P2L_get(9)] = grp
.p9_timer
;
1315 if(grp
.p10_timer
!= 0)
1317 RTK_PORTMASK_PORT_SET((pGroup
->member
), rtk_switch_port_P2L_get(10));
1318 pGroup
->timer
[rtk_switch_port_P2L_get(10)] = grp
.p10_timer
;
1325 * rtk_igmp_ReportLeaveFwdAction_set
1327 * Set Report Leave packet forwarding action
1334 * RT_ERR_FAILED - Failed
1335 * RT_ERR_SMI - SMI access error
1336 * RT_ERR_INPUT - Error Input
1340 rtk_api_ret_t
rtk_igmp_ReportLeaveFwdAction_set(rtk_igmp_ReportLeaveFwdAct_t action
)
1342 rtk_api_ret_t retVal
;
1345 /* Check initialization state */
1346 RTK_CHK_INIT_STATE();
1350 case IGMP_REPORT_LEAVE_TO_ROUTER
:
1353 case IGMP_REPORT_LEAVE_TO_ALLPORT
:
1356 case IGMP_REPORT_LEAVE_TO_ROUTER_PORT_ADV
:
1360 return RT_ERR_INPUT
;
1363 if ((retVal
= rtl8367c_setAsicIGMPReportLeaveFlood(regData
))!=RT_ERR_OK
)
1370 * rtk_igmp_ReportLeaveFwdAction_get
1372 * Get Report Leave packet forwarding action
1379 * RT_ERR_FAILED - Failed
1380 * RT_ERR_SMI - SMI access error
1381 * RT_ERR_INPUT - Error Input
1382 * RT_ERR_NULL_POINTER - Null Pointer
1386 rtk_api_ret_t
rtk_igmp_ReportLeaveFwdAction_get(rtk_igmp_ReportLeaveFwdAct_t
*pAction
)
1388 rtk_api_ret_t retVal
;
1391 /* Check initialization state */
1392 RTK_CHK_INIT_STATE();
1395 return RT_ERR_NULL_POINTER
;
1397 if ((retVal
= rtl8367c_getAsicIGMPReportLeaveFlood(®Data
))!=RT_ERR_OK
)
1403 *pAction
= IGMP_REPORT_LEAVE_TO_ROUTER
;
1406 *pAction
= IGMP_REPORT_LEAVE_TO_ALLPORT
;
1409 *pAction
= IGMP_REPORT_LEAVE_TO_ROUTER_PORT_ADV
;
1412 return RT_ERR_FAILED
;
1419 * rtk_igmp_dropLeaveZeroEnable_set
1421 * Set the function of dropping Leave packet with group IP = 0.0.0.0
1423 * enabled - Action 1: drop, 0:pass
1428 * RT_ERR_FAILED - Failed
1429 * RT_ERR_SMI - SMI access error
1430 * RT_ERR_INPUT - Error Input
1434 rtk_api_ret_t
rtk_igmp_dropLeaveZeroEnable_set(rtk_enable_t enabled
)
1436 rtk_api_ret_t retVal
;
1438 /* Check initialization state */
1439 RTK_CHK_INIT_STATE();
1441 if(enabled
>= RTK_ENABLE_END
)
1442 return RT_ERR_INPUT
;
1444 if ((retVal
= rtl8367c_setAsicIGMPDropLeaveZero(enabled
))!=RT_ERR_OK
)
1452 * rtk_igmp_dropLeaveZeroEnable_get
1454 * Get the function of dropping Leave packet with group IP = 0.0.0.0
1458 * pEnabled. - Action 1: drop, 0:pass
1461 * RT_ERR_FAILED - Failed
1462 * RT_ERR_SMI - SMI access error
1463 * RT_ERR_INPUT - Error Input
1464 * RT_ERR_NULL_POINTER - Null Pointer
1468 rtk_api_ret_t
rtk_igmp_dropLeaveZeroEnable_get(rtk_enable_t
*pEnabled
)
1470 rtk_api_ret_t retVal
;
1472 /* Check initialization state */
1473 RTK_CHK_INIT_STATE();
1475 if(NULL
== pEnabled
)
1476 return RT_ERR_NULL_POINTER
;
1478 if ((retVal
= rtl8367c_getAsicIGMPDropLeaveZero((rtk_uint32
*)pEnabled
))!=RT_ERR_OK
)
1486 * rtk_igmp_bypassGroupRange_set
1490 * group - bypassed group
1491 * enabled - enabled 1: Bypassed, 0: not bypass
1496 * RT_ERR_FAILED - Failed
1497 * RT_ERR_SMI - SMI access error
1498 * RT_ERR_INPUT - Error Input
1502 rtk_api_ret_t
rtk_igmp_bypassGroupRange_set(rtk_igmp_bypassGroup_t group
, rtk_enable_t enabled
)
1504 rtk_api_ret_t retVal
;
1506 /* Check initialization state */
1507 RTK_CHK_INIT_STATE();
1509 if(group
>= IGMP_BYPASS_GROUP_END
)
1510 return RT_ERR_INPUT
;
1512 if(enabled
>= RTK_ENABLE_END
)
1513 return RT_ERR_INPUT
;
1515 if ((retVal
= rtl8367c_setAsicIGMPBypassGroup(group
, enabled
))!=RT_ERR_OK
)
1522 * rtk_igmp_bypassGroupRange_get
1526 * group - bypassed group
1528 * pEnable - enabled 1: Bypassed, 0: not bypass
1531 * RT_ERR_FAILED - Failed
1532 * RT_ERR_SMI - SMI access error
1533 * RT_ERR_INPUT - Error Input
1534 * RT_ERR_NULL_POINTER - Null Pointer
1538 rtk_api_ret_t
rtk_igmp_bypassGroupRange_get(rtk_igmp_bypassGroup_t group
, rtk_enable_t
*pEnable
)
1540 rtk_api_ret_t retVal
;
1542 /* Check initialization state */
1543 RTK_CHK_INIT_STATE();
1545 if(group
>= IGMP_BYPASS_GROUP_END
)
1546 return RT_ERR_INPUT
;
1549 return RT_ERR_NULL_POINTER
;
1551 if ((retVal
= rtl8367c_getAsicIGMPBypassGroup(group
, pEnable
))!=RT_ERR_OK
)