/* * Copyright (C) 2013 Realtek Semiconductor Corp. * All Rights Reserved. * * Unless you and Realtek execute a separate written software license * agreement governing use of this software, this software is licensed * to you under the terms of the GNU General Public License version 2, * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt * * $Revision: 76306 $ * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $ * * Purpose : RTK switch high-level API for RTL8367/RTL8367C * Feature : Here is a list of all functions and variables in Mirror module. * */ #include #include #include #include #include #include /* Function Name: * rtk_mirror_portBased_set * Description: * Set port mirror function. * Input: * mirroring_port - Monitor port. * pMirrored_rx_portmask - Rx mirror port mask. * pMirrored_tx_portmask - Tx mirror port mask. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_PORT_ID - Invalid port number * RT_ERR_PORT_MASK - Invalid portmask. * Note: * The API is to set mirror function of source port and mirror port. * The mirror port can only be set to one port and the TX and RX mirror ports * should be identical. */ rtk_api_ret_t rtk_mirror_portBased_set(rtk_port_t mirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask) { rtk_api_ret_t retVal; rtk_enable_t mirRx, mirTx; rtk_uint32 i, pmask; rtk_port_t source_port; /* Check initialization state */ RTK_CHK_INIT_STATE(); /* Check port valid */ RTK_CHK_PORT_VALID(mirroring_port); if(NULL == pMirrored_rx_portmask) return RT_ERR_NULL_POINTER; if(NULL == pMirrored_tx_portmask) return RT_ERR_NULL_POINTER; RTK_CHK_PORTMASK_VALID(pMirrored_rx_portmask); RTK_CHK_PORTMASK_VALID(pMirrored_tx_portmask); /*Mirror Sorce Port Mask Check*/ if (pMirrored_tx_portmask->bits[0]!=pMirrored_rx_portmask->bits[0]&&pMirrored_tx_portmask->bits[0]!=0&&pMirrored_rx_portmask->bits[0]!=0) return RT_ERR_PORT_MASK; /*mirror port != source port*/ if(RTK_PORTMASK_IS_PORT_SET((*pMirrored_tx_portmask), mirroring_port) || RTK_PORTMASK_IS_PORT_SET((*pMirrored_rx_portmask), mirroring_port)) return RT_ERR_PORT_MASK; source_port = rtk_switch_maxLogicalPort_get(); RTK_SCAN_ALL_LOG_PORT(i) { if (pMirrored_tx_portmask->bits[0]&(1<bits[0]&(1<bits[0] != 0) { if ((retVal = rtk_switch_portmask_L2P_get(pMirrored_rx_portmask, &pmask)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_setAsicPortMirrorMask(pmask)) != RT_ERR_OK) return retVal; } else { if ((retVal = rtk_switch_portmask_L2P_get(pMirrored_tx_portmask, &pmask)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_setAsicPortMirrorMask(pmask)) != RT_ERR_OK) return retVal; } if (pMirrored_rx_portmask->bits[0]) mirRx = ENABLED; else mirRx = DISABLED; if ((retVal = rtl8367c_setAsicPortMirrorRxFunction(mirRx)) != RT_ERR_OK) return retVal; if (pMirrored_tx_portmask->bits[0]) mirTx = ENABLED; else mirTx = DISABLED; if ((retVal = rtl8367c_setAsicPortMirrorTxFunction(mirTx)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_portBased_get * Description: * Get port mirror function. * Input: * None * Output: * pMirroring_port - Monitor port. * pMirrored_rx_portmask - Rx mirror port mask. * pMirrored_tx_portmask - Tx mirror port mask. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * The API is to get mirror function of source port and mirror port. */ rtk_api_ret_t rtk_mirror_portBased_get(rtk_port_t *pMirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask) { rtk_api_ret_t retVal; rtk_port_t source_port; rtk_enable_t mirRx, mirTx; rtk_uint32 sport, mport, pmask; /* Check initialization state */ RTK_CHK_INIT_STATE(); if(NULL == pMirrored_rx_portmask) return RT_ERR_NULL_POINTER; if(NULL == pMirrored_tx_portmask) return RT_ERR_NULL_POINTER; if(NULL == pMirroring_port) return RT_ERR_NULL_POINTER; if ((retVal = rtl8367c_getAsicPortMirror(&sport, &mport)) != RT_ERR_OK) return retVal; source_port = rtk_switch_port_P2L_get(sport); *pMirroring_port = rtk_switch_port_P2L_get(mport); if ((retVal = rtl8367c_getAsicPortMirrorRxFunction((rtk_uint32*)&mirRx)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_getAsicPortMirrorTxFunction((rtk_uint32*)&mirTx)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_getAsicPortMirrorMask(&pmask)) != RT_ERR_OK) return retVal; if (DISABLED == mirRx) pMirrored_rx_portmask->bits[0]=0; else { if ((retVal = rtk_switch_portmask_P2L_get(pmask, pMirrored_rx_portmask)) != RT_ERR_OK) return retVal; pMirrored_rx_portmask->bits[0] |= 1<bits[0]=0; else { if ((retVal = rtk_switch_portmask_P2L_get(pmask, pMirrored_tx_portmask)) != RT_ERR_OK) return retVal; pMirrored_tx_portmask->bits[0] |= 1<= RTK_ENABLE_END) return RT_ERR_ENABLE; if ((retVal = rtl8367c_setAsicPortMirrorIsolation(enable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_portIso_get * Description: * Get mirror port isolation. * Input: * None * Output: * pEnable |Mirror isolation status. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * The API is to get mirror isolation status. */ rtk_api_ret_t rtk_mirror_portIso_get(rtk_enable_t *pEnable) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if(NULL == pEnable) return RT_ERR_NULL_POINTER; if ((retVal = rtl8367c_getAsicPortMirrorIsolation(pEnable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_vlanLeaky_set * Description: * Set mirror VLAN leaky. * Input: * txenable -TX leaky enable. * rxenable - RX leaky enable. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_ENABLE - Invalid enable input * Note: * The API is to set mirror VLAN leaky function forwarding packets to miror port. */ rtk_api_ret_t rtk_mirror_vlanLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if ((txenable >= RTK_ENABLE_END) ||(rxenable >= RTK_ENABLE_END)) return RT_ERR_ENABLE; if ((retVal = rtl8367c_setAsicPortMirrorVlanTxLeaky(txenable)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_setAsicPortMirrorVlanRxLeaky(rxenable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_vlanLeaky_get * Description: * Get mirror VLAN leaky. * Input: * None * Output: * pTxenable - TX leaky enable. * pRxenable - RX leaky enable. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * The API is to get mirror VLAN leaky status. */ rtk_api_ret_t rtk_mirror_vlanLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if( (NULL == pTxenable) || (NULL == pRxenable) ) return RT_ERR_NULL_POINTER; if ((retVal = rtl8367c_getAsicPortMirrorVlanTxLeaky(pTxenable)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_getAsicPortMirrorVlanRxLeaky(pRxenable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_isolationLeaky_set * Description: * Set mirror Isolation leaky. * Input: * txenable -TX leaky enable. * rxenable - RX leaky enable. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_ENABLE - Invalid enable input * Note: * The API is to set mirror VLAN leaky function forwarding packets to miror port. */ rtk_api_ret_t rtk_mirror_isolationLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if ((txenable >= RTK_ENABLE_END) ||(rxenable >= RTK_ENABLE_END)) return RT_ERR_ENABLE; if ((retVal = rtl8367c_setAsicPortMirrorIsolationTxLeaky(txenable)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_setAsicPortMirrorIsolationRxLeaky(rxenable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_isolationLeaky_get * Description: * Get mirror isolation leaky. * Input: * None * Output: * pTxenable - TX leaky enable. * pRxenable - RX leaky enable. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * The API is to get mirror isolation leaky status. */ rtk_api_ret_t rtk_mirror_isolationLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if( (NULL == pTxenable) || (NULL == pRxenable) ) return RT_ERR_NULL_POINTER; if ((retVal = rtl8367c_getAsicPortMirrorIsolationTxLeaky(pTxenable)) != RT_ERR_OK) return retVal; if ((retVal = rtl8367c_getAsicPortMirrorIsolationRxLeaky(pRxenable)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_keep_set * Description: * Set mirror packet format keep. * Input: * mode - -mirror keep mode. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_ENABLE - Invalid enable input * Note: * The API is to set -mirror keep mode. * The mirror keep mode is as following: * - MIRROR_FOLLOW_VLAN * - MIRROR_KEEP_ORIGINAL * - MIRROR_KEEP_END */ rtk_api_ret_t rtk_mirror_keep_set(rtk_mirror_keep_t mode) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if (mode >= MIRROR_KEEP_END) return RT_ERR_ENABLE; if ((retVal = rtl8367c_setAsicPortMirrorRealKeep(mode)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_keep_get * Description: * Get mirror packet format keep. * Input: * None * Output: * pMode -mirror keep mode. * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameters. * Note: * The API is to get mirror keep mode. * The mirror keep mode is as following: * - MIRROR_FOLLOW_VLAN * - MIRROR_KEEP_ORIGINAL * - MIRROR_KEEP_END */ rtk_api_ret_t rtk_mirror_keep_get(rtk_mirror_keep_t *pMode) { rtk_api_ret_t retVal; /* Check initialization state */ RTK_CHK_INIT_STATE(); if(NULL == pMode) return RT_ERR_NULL_POINTER; if ((retVal = rtl8367c_getAsicPortMirrorRealKeep(pMode)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_override_set * Description: * Set port mirror override function. * Input: * rxMirror - 1: output mirrored packet, 0: output normal forward packet * txMirror - 1: output mirrored packet, 0: output normal forward packet * aclMirror - 1: output mirrored packet, 0: output normal forward packet * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * Note: * The API is to set mirror override function. * This function control the output format when a port output * normal forward & mirrored packet at the same time. */ rtk_api_ret_t rtk_mirror_override_set(rtk_enable_t rxMirror, rtk_enable_t txMirror, rtk_enable_t aclMirror) { rtk_api_ret_t retVal; if( (rxMirror >= RTK_ENABLE_END) || (txMirror >= RTK_ENABLE_END) || (aclMirror >= RTK_ENABLE_END)) return RT_ERR_ENABLE; if ((retVal = rtl8367c_setAsicPortMirrorOverride((rtk_uint32)rxMirror, (rtk_uint32)txMirror, (rtk_uint32)aclMirror)) != RT_ERR_OK) return retVal; return RT_ERR_OK; } /* Function Name: * rtk_mirror_override_get * Description: * Get port mirror override function. * Input: * None * Output: * pRxMirror - 1: output mirrored packet, 0: output normal forward packet * pTxMirror - 1: output mirrored packet, 0: output normal forward packet * pAclMirror - 1: output mirrored packet, 0: output normal forward packet * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_SMI - SMI access error * RT_ERR_NULL_POINTER - Null Pointer * Note: * The API is to Get mirror override function. * This function control the output format when a port output * normal forward & mirrored packet at the same time. */ rtk_api_ret_t rtk_mirror_override_get(rtk_enable_t *pRxMirror, rtk_enable_t *pTxMirror, rtk_enable_t *pAclMirror) { rtk_api_ret_t retVal; if( (pRxMirror == NULL) || (pTxMirror == NULL) || (pAclMirror == NULL)) return RT_ERR_ENABLE; if ((retVal = rtl8367c_getAsicPortMirrorOverride((rtk_uint32 *)pRxMirror, (rtk_uint32 *)pTxMirror, (rtk_uint32 *)pAclMirror)) != RT_ERR_OK) return retVal; return RT_ERR_OK; }