/* * Copyright (C) 2013 Realtek Semiconductor Corp. * All Rights Reserved. * * This program is the proprietary software of Realtek Semiconductor * Corporation and/or its licensors, and only be used, duplicated, * modified or distributed under the authorized license from Realtek. * * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. * * $Revision: 41080 $ * $Date: 2013-07-11 17:57:45 +0800 (ι€±ε››, 11 δΈƒζœˆ 2013) $ * * Purpose : RTK switch high-level API for RTL8367/RTL8367C * Feature : Here is a list of all functions and variables in Leaky module. * */ #include #include #include #ifndef __KERNEL__ #include #else #include #endif #include #include #include #include /* Function Name: * rtk_leaky_vlan_set * Description: * Set VLAN leaky. * Input: * type - Packet type for VLAN leaky. * enable - Leaky status. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * RT_ERR_ENABLE - Invalid enable input * Note: * This API can set VLAN leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets. * The leaky frame types are as following: * - LEAKY_BRG_GROUP, * - LEAKY_FD_PAUSE, * - LEAKY_SP_MCAST, * - LEAKY_1X_PAE, * - LEAKY_UNDEF_BRG_04, * - LEAKY_UNDEF_BRG_05, * - LEAKY_UNDEF_BRG_06, * - LEAKY_UNDEF_BRG_07, * - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS, * - LEAKY_UNDEF_BRG_09, * - LEAKY_UNDEF_BRG_0A, * - LEAKY_UNDEF_BRG_0B, * - LEAKY_UNDEF_BRG_0C, * - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS, * - LEAKY_8021AB, * - LEAKY_UNDEF_BRG_0F, * - LEAKY_BRG_MNGEMENT, * - LEAKY_UNDEFINED_11, * - LEAKY_UNDEFINED_12, * - LEAKY_UNDEFINED_13, * - LEAKY_UNDEFINED_14, * - LEAKY_UNDEFINED_15, * - LEAKY_UNDEFINED_16, * - LEAKY_UNDEFINED_17, * - LEAKY_UNDEFINED_18, * - LEAKY_UNDEFINED_19, * - LEAKY_UNDEFINED_1A, * - LEAKY_UNDEFINED_1B, * - LEAKY_UNDEFINED_1C, * - LEAKY_UNDEFINED_1D, * - LEAKY_UNDEFINED_1E, * - LEAKY_UNDEFINED_1F, * - LEAKY_GMRP, * - LEAKY_GVRP, * - LEAKY_UNDEF_GARP_22, * - LEAKY_UNDEF_GARP_23, * - LEAKY_UNDEF_GARP_24, * - LEAKY_UNDEF_GARP_25, * - LEAKY_UNDEF_GARP_26, * - LEAKY_UNDEF_GARP_27, * - LEAKY_UNDEF_GARP_28, * - LEAKY_UNDEF_GARP_29, * - LEAKY_UNDEF_GARP_2A, * - LEAKY_UNDEF_GARP_2B, * - LEAKY_UNDEF_GARP_2C, * - LEAKY_UNDEF_GARP_2D, * - LEAKY_UNDEF_GARP_2E, * - LEAKY_UNDEF_GARP_2F, * - LEAKY_IGMP, * - LEAKY_IPMULTICAST. * - LEAKY_CDP, * - LEAKY_CSSTP, * - LEAKY_LLDP. */ rtk_api_ret_t rtk_leaky_vlan_set(rtk_leaky_type_t type, rtk_enable_t enable) { rtk_api_ret_t retVal; rtk_uint32 port; rtl8367c_rma_t rmacfg; rtk_uint32 tmp; /* Check initialization state */ RTK_CHK_INIT_STATE(); if (type >= LEAKY_END) return RT_ERR_INPUT; if (enable >= RTK_ENABLE_END) return RT_ERR_INPUT; if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F) { if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; rmacfg.vlan_leaky = enable; if ((retVal = rtl8367c_setAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_IPMULTICAST == type) { for (port = 0; port <= RTK_PORT_ID_MAX; port++) { if ((retVal = rtl8367c_setAsicIpMulticastVlanLeaky(port,enable)) != RT_ERR_OK) return retVal; } } else if (LEAKY_IGMP == type) { if ((retVal = rtl8367c_setAsicIGMPVLANLeaky(enable)) != RT_ERR_OK) return retVal; } else if (LEAKY_CDP == type) { if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; rmacfg.vlan_leaky = enable; if ((retVal = rtl8367c_setAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_CSSTP == type) { if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; rmacfg.vlan_leaky = enable; if ((retVal = rtl8367c_setAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_LLDP == type) { if ((retVal = rtl8367c_getAsicRmaLldp(&tmp,&rmacfg)) != RT_ERR_OK) return retVal; rmacfg.vlan_leaky = enable; if ((retVal = rtl8367c_setAsicRmaLldp(tmp, &rmacfg)) != RT_ERR_OK) return retVal; } return RT_ERR_OK; } /* Function Name: * rtk_leaky_vlan_get * Description: * Get VLAN leaky. * Input: * type - Packet type for VLAN leaky. * Output: * pEnable - Leaky status. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * This API can get VLAN leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets. * The leaky frame types are as following: * - LEAKY_BRG_GROUP, * - LEAKY_FD_PAUSE, * - LEAKY_SP_MCAST, * - LEAKY_1X_PAE, * - LEAKY_UNDEF_BRG_04, * - LEAKY_UNDEF_BRG_05, * - LEAKY_UNDEF_BRG_06, * - LEAKY_UNDEF_BRG_07, * - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS, * - LEAKY_UNDEF_BRG_09, * - LEAKY_UNDEF_BRG_0A, * - LEAKY_UNDEF_BRG_0B, * - LEAKY_UNDEF_BRG_0C, * - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS, * - LEAKY_8021AB, * - LEAKY_UNDEF_BRG_0F, * - LEAKY_BRG_MNGEMENT, * - LEAKY_UNDEFINED_11, * - LEAKY_UNDEFINED_12, * - LEAKY_UNDEFINED_13, * - LEAKY_UNDEFINED_14, * - LEAKY_UNDEFINED_15, * - LEAKY_UNDEFINED_16, * - LEAKY_UNDEFINED_17, * - LEAKY_UNDEFINED_18, * - LEAKY_UNDEFINED_19, * - LEAKY_UNDEFINED_1A, * - LEAKY_UNDEFINED_1B, * - LEAKY_UNDEFINED_1C, * - LEAKY_UNDEFINED_1D, * - LEAKY_UNDEFINED_1E, * - LEAKY_UNDEFINED_1F, * - LEAKY_GMRP, * - LEAKY_GVRP, * - LEAKY_UNDEF_GARP_22, * - LEAKY_UNDEF_GARP_23, * - LEAKY_UNDEF_GARP_24, * - LEAKY_UNDEF_GARP_25, * - LEAKY_UNDEF_GARP_26, * - LEAKY_UNDEF_GARP_27, * - LEAKY_UNDEF_GARP_28, * - LEAKY_UNDEF_GARP_29, * - LEAKY_UNDEF_GARP_2A, * - LEAKY_UNDEF_GARP_2B, * - LEAKY_UNDEF_GARP_2C, * - LEAKY_UNDEF_GARP_2D, * - LEAKY_UNDEF_GARP_2E, * - LEAKY_UNDEF_GARP_2F, * - LEAKY_IGMP, * - LEAKY_IPMULTICAST. * - LEAKY_CDP, * - LEAKY_CSSTP, * - LEAKY_LLDP. */ rtk_api_ret_t rtk_leaky_vlan_get(rtk_leaky_type_t type, rtk_enable_t *pEnable) { rtk_api_ret_t retVal; rtk_uint32 port,tmp; rtl8367c_rma_t rmacfg; /* Check initialization state */ RTK_CHK_INIT_STATE(); if (type >= LEAKY_END) return RT_ERR_INPUT; if(NULL == pEnable) return RT_ERR_NULL_POINTER; if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F) { if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.vlan_leaky; } else if (LEAKY_IPMULTICAST == type) { for (port = 0; port <= RTK_PORT_ID_MAX; port++) { if ((retVal = rtl8367c_getAsicIpMulticastVlanLeaky(port, &tmp)) != RT_ERR_OK) return retVal; if (port>0&&(tmp!=*pEnable)) return RT_ERR_FAILED; *pEnable = tmp; } } else if (LEAKY_IGMP == type) { if ((retVal = rtl8367c_getAsicIGMPVLANLeaky(&tmp)) != RT_ERR_OK) return retVal; *pEnable = tmp; } else if (LEAKY_CDP == type) { if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.vlan_leaky; } else if (LEAKY_CSSTP == type) { if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.vlan_leaky; } else if (LEAKY_LLDP == type) { if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.vlan_leaky; } return RT_ERR_OK; } /* Function Name: * rtk_leaky_portIsolation_set * Description: * Set port isolation leaky. * Input: * type - Packet type for port isolation leaky. * enable - Leaky status. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * RT_ERR_ENABLE - Invalid enable input * Note: * This API can set port isolation leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets. * The leaky frame types are as following: * - LEAKY_BRG_GROUP, * - LEAKY_FD_PAUSE, * - LEAKY_SP_MCAST, * - LEAKY_1X_PAE, * - LEAKY_UNDEF_BRG_04, * - LEAKY_UNDEF_BRG_05, * - LEAKY_UNDEF_BRG_06, * - LEAKY_UNDEF_BRG_07, * - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS, * - LEAKY_UNDEF_BRG_09, * - LEAKY_UNDEF_BRG_0A, * - LEAKY_UNDEF_BRG_0B, * - LEAKY_UNDEF_BRG_0C, * - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS, * - LEAKY_8021AB, * - LEAKY_UNDEF_BRG_0F, * - LEAKY_BRG_MNGEMENT, * - LEAKY_UNDEFINED_11, * - LEAKY_UNDEFINED_12, * - LEAKY_UNDEFINED_13, * - LEAKY_UNDEFINED_14, * - LEAKY_UNDEFINED_15, * - LEAKY_UNDEFINED_16, * - LEAKY_UNDEFINED_17, * - LEAKY_UNDEFINED_18, * - LEAKY_UNDEFINED_19, * - LEAKY_UNDEFINED_1A, * - LEAKY_UNDEFINED_1B, * - LEAKY_UNDEFINED_1C, * - LEAKY_UNDEFINED_1D, * - LEAKY_UNDEFINED_1E, * - LEAKY_UNDEFINED_1F, * - LEAKY_GMRP, * - LEAKY_GVRP, * - LEAKY_UNDEF_GARP_22, * - LEAKY_UNDEF_GARP_23, * - LEAKY_UNDEF_GARP_24, * - LEAKY_UNDEF_GARP_25, * - LEAKY_UNDEF_GARP_26, * - LEAKY_UNDEF_GARP_27, * - LEAKY_UNDEF_GARP_28, * - LEAKY_UNDEF_GARP_29, * - LEAKY_UNDEF_GARP_2A, * - LEAKY_UNDEF_GARP_2B, * - LEAKY_UNDEF_GARP_2C, * - LEAKY_UNDEF_GARP_2D, * - LEAKY_UNDEF_GARP_2E, * - LEAKY_UNDEF_GARP_2F, * - LEAKY_IGMP, * - LEAKY_IPMULTICAST. * - LEAKY_CDP, * - LEAKY_CSSTP, * - LEAKY_LLDP. */ rtk_api_ret_t rtk_leaky_portIsolation_set(rtk_leaky_type_t type, rtk_enable_t enable) { rtk_api_ret_t retVal; rtk_uint32 port; rtl8367c_rma_t rmacfg; rtk_uint32 tmp; /* Check initialization state */ RTK_CHK_INIT_STATE(); if (type >= LEAKY_END) return RT_ERR_INPUT; if (enable >= RTK_ENABLE_END) return RT_ERR_INPUT; if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F) { if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; rmacfg.portiso_leaky = enable; if ((retVal = rtl8367c_setAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_IPMULTICAST == type) { for (port = 0; port < RTK_MAX_NUM_OF_PORT; port++) { if ((retVal = rtl8367c_setAsicIpMulticastPortIsoLeaky(port,enable)) != RT_ERR_OK) return retVal; } } else if (LEAKY_IGMP == type) { if ((retVal = rtl8367c_setAsicIGMPIsoLeaky(enable)) != RT_ERR_OK) return retVal; } else if (LEAKY_CDP == type) { if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; rmacfg.portiso_leaky = enable; if ((retVal = rtl8367c_setAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_CSSTP == type) { if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; rmacfg.portiso_leaky = enable; if ((retVal = rtl8367c_setAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; } else if (LEAKY_LLDP == type) { if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK) return retVal; rmacfg.portiso_leaky = enable; if ((retVal = rtl8367c_setAsicRmaLldp(tmp, &rmacfg)) != RT_ERR_OK) return retVal; } return RT_ERR_OK; } /* Function Name: * rtk_leaky_portIsolation_get * Description: * Get port isolation leaky. * Input: * type - Packet type for port isolation leaky. * Output: * pEnable - Leaky status. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * This API can get port isolation leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets. * The leaky frame types are as following: * - LEAKY_BRG_GROUP, * - LEAKY_FD_PAUSE, * - LEAKY_SP_MCAST, * - LEAKY_1X_PAE, * - LEAKY_UNDEF_BRG_04, * - LEAKY_UNDEF_BRG_05, * - LEAKY_UNDEF_BRG_06, * - LEAKY_UNDEF_BRG_07, * - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS, * - LEAKY_UNDEF_BRG_09, * - LEAKY_UNDEF_BRG_0A, * - LEAKY_UNDEF_BRG_0B, * - LEAKY_UNDEF_BRG_0C, * - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS, * - LEAKY_8021AB, * - LEAKY_UNDEF_BRG_0F, * - LEAKY_BRG_MNGEMENT, * - LEAKY_UNDEFINED_11, * - LEAKY_UNDEFINED_12, * - LEAKY_UNDEFINED_13, * - LEAKY_UNDEFINED_14, * - LEAKY_UNDEFINED_15, * - LEAKY_UNDEFINED_16, * - LEAKY_UNDEFINED_17, * - LEAKY_UNDEFINED_18, * - LEAKY_UNDEFINED_19, * - LEAKY_UNDEFINED_1A, * - LEAKY_UNDEFINED_1B, * - LEAKY_UNDEFINED_1C, * - LEAKY_UNDEFINED_1D, * - LEAKY_UNDEFINED_1E, * - LEAKY_UNDEFINED_1F, * - LEAKY_GMRP, * - LEAKY_GVRP, * - LEAKY_UNDEF_GARP_22, * - LEAKY_UNDEF_GARP_23, * - LEAKY_UNDEF_GARP_24, * - LEAKY_UNDEF_GARP_25, * - LEAKY_UNDEF_GARP_26, * - LEAKY_UNDEF_GARP_27, * - LEAKY_UNDEF_GARP_28, * - LEAKY_UNDEF_GARP_29, * - LEAKY_UNDEF_GARP_2A, * - LEAKY_UNDEF_GARP_2B, * - LEAKY_UNDEF_GARP_2C, * - LEAKY_UNDEF_GARP_2D, * - LEAKY_UNDEF_GARP_2E, * - LEAKY_UNDEF_GARP_2F, * - LEAKY_IGMP, * - LEAKY_IPMULTICAST. * - LEAKY_CDP, * - LEAKY_CSSTP, * - LEAKY_LLDP. */ rtk_api_ret_t rtk_leaky_portIsolation_get(rtk_leaky_type_t type, rtk_enable_t *pEnable) { rtk_api_ret_t retVal; rtk_uint32 port, tmp; rtl8367c_rma_t rmacfg; /* Check initialization state */ RTK_CHK_INIT_STATE(); if (type >= LEAKY_END) return RT_ERR_INPUT; if(NULL == pEnable) return RT_ERR_NULL_POINTER; if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F) { if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.portiso_leaky; } else if (LEAKY_IPMULTICAST == type) { for (port = 0; port < RTK_MAX_NUM_OF_PORT; port++) { if ((retVal = rtl8367c_getAsicIpMulticastPortIsoLeaky(port, &tmp)) != RT_ERR_OK) return retVal; if (port > 0 &&(tmp != *pEnable)) return RT_ERR_FAILED; *pEnable = tmp; } } else if (LEAKY_IGMP == type) { if ((retVal = rtl8367c_getAsicIGMPIsoLeaky(&tmp)) != RT_ERR_OK) return retVal; *pEnable = tmp; } else if (LEAKY_CDP == type) { if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.portiso_leaky; } else if (LEAKY_CSSTP == type) { if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.portiso_leaky; } else if (LEAKY_LLDP == type) { if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK) return retVal; *pEnable = rmacfg.portiso_leaky; } return RT_ERR_OK; }