⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ratelimit.cpp

📁 ks8995m5口交换机启动eeprom配置源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_cRxRateLimitHi[i].EnableWindow ( TRUE );
		}

	}

}



BOOL CRateLimit::OnApply() 
{
    WORD i, j;
    WORD wStrlen;
    WORD wTemp;
    BOOL bInvalid = 0;
	CString	csTitle;
    char sErrMsg[50];
    BYTE bData;
    
	
	CDgbToolApp	*pApp;
	pApp = (CDgbToolApp *)AfxGetApp();

	// Block background MIB read
	pApp->m_bHWSemaphore = NOMIBREAD;

	UpdateData(TRUE);

    //
    // Valide numeric strings 
    //
    for ( i = 0; i < PORTCOUNT; i++ )
    {
        sprintf ( sErrMsg, "Invalid Rate Limit for Port %d.", i + 1 );
		csTitle.LoadString(IDS_TITLE);        

	    if ( ( wStrlen = m_sTxRateLimitHi[ i ].GetLength() ) > 0)
        {
            for ( j = 0; j < wStrlen; j++ )
            {
                if ( ((LPCTSTR)m_sTxRateLimitHi[ i ])[ j ] < '0' || ((LPCTSTR)m_sTxRateLimitHi [ i ])[ j ] > '9' )
                {
		            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                    bInvalid = 1;
                }
            }     
            
            wTemp = atoi ( m_sTxRateLimitHi [ i ] );

            if ( wTemp > MAXRATELIMIT )
            {
                sprintf ( sErrMsg, "High Priority Tx Rate Limit for Port %d exceeds %d.", i + 1, MAXRATELIMIT );
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
            }
/*			else if ( !wTemp )
			{
				sprintf ( sErrMsg, "0 is not a valid VLAN ID for VLAN %d.", i + 1);
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
			}
*/			else
            {
                m_wTxRateLimitHi [ i ] = wTemp * 1000 / RATEUNIT; // Convert to 32kbps per unit
                if ( ( wTemp * 1000 ) % RATEUNIT >= RATEUNIT / 2 ) // Round it up
				{
					m_wTxRateLimitHi [ i ]++;
				}

            }
        }
        else 
        {
            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
            bInvalid = 1;
        }
    }


    for ( i = 0; i < PORTCOUNT; i++ )
    {
        sprintf ( sErrMsg, "Invalid Rate Limit for Port %d.", i + 1 );
		csTitle.LoadString(IDS_TITLE);        

	    if ( ( wStrlen = m_sTxRateLimitLo[ i ].GetLength() ) > 0)
        {
            for ( j = 0; j < wStrlen; j++ )
            {
                if ( ((LPCTSTR)m_sTxRateLimitLo[ i ])[ j ] < '0' || ((LPCTSTR)m_sTxRateLimitLo [ i ])[ j ] > '9' )
                {
		            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                    bInvalid = 1;
                }
            }     
            
            wTemp = atoi ( m_sTxRateLimitLo [ i ] );

            if ( wTemp > MAXRATELIMIT )
            {
                sprintf ( sErrMsg, "Low priority Tx Rate Limit for Port %d exceeds %d.", i + 1, MAXRATELIMIT );
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
            }
/*			else if ( !wTemp )
			{
				sprintf ( sErrMsg, "0 if not a valid VLAN ID for VLAN %d.", i + 1);
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
			}
*/			else
            {
                m_wTxRateLimitLo [ i ] = wTemp * 1000 / RATEUNIT; // Convert to 32kbps per unit
                if ( ( wTemp * 1000 ) % RATEUNIT >= RATEUNIT / 2 ) // Round it up
				{
					m_wTxRateLimitLo [ i ]++;
				}
}
        }
        else 
        {
            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
            bInvalid = 1;
        }
    }

    for ( i = 0; i < PORTCOUNT; i++ )
    {
        sprintf ( sErrMsg, "Invalid Rate Limit for Port %d.", i + 1 );
		csTitle.LoadString(IDS_TITLE);        

	    if ( ( wStrlen = m_sRxRateLimitHi[ i ].GetLength() ) > 0)
        {
            for ( j = 0; j < wStrlen; j++ )
            {
                if ( ((LPCTSTR)m_sRxRateLimitHi[ i ])[ j ] < '0' || ((LPCTSTR)m_sRxRateLimitHi [ i ])[ j ] > '9' )
                {
		            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                    bInvalid = 1;
                }
            }     
            
            wTemp = atoi ( m_sRxRateLimitHi [ i ] );

            if ( wTemp > MAXRATELIMIT )
            {
                sprintf ( sErrMsg, "High priority Rx Rate Limit for Port %d exceeds %d.", i + 1, MAXRATELIMIT );
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
            }
/*			else if ( !wTemp )
			{
				sprintf ( sErrMsg, "0 if not a valid VLAN ID for VLAN %d.", i + 1);
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
			}
*/			else
            {
                m_wRxRateLimitHi [ i ] = wTemp * 1000 / RATEUNIT; // Convert to 32kbps per unit
                if ( ( wTemp * 1000 ) % RATEUNIT >= RATEUNIT / 2 ) // Round it up
				{
					m_wRxRateLimitHi [ i ]++;
				}

            }
        }
        else 
        {
            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
            bInvalid = 1;
        }
    }

    for ( i = 0; i < PORTCOUNT; i++ )
    {
        sprintf ( sErrMsg, "Invalid Rate Limit for Port %d.", i + 1 );
		csTitle.LoadString(IDS_TITLE);        

	    if ( ( wStrlen = m_sRxRateLimitLo[ i ].GetLength() ) > 0)
        {
            for ( j = 0; j < wStrlen; j++ )
            {
                if ( ((LPCTSTR)m_sRxRateLimitLo[ i ])[ j ] < '0' || ((LPCTSTR)m_sRxRateLimitLo [ i ])[ j ] > '9' )
                {
		            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                    bInvalid = 1;
                }
            }     
            
            wTemp = atoi ( m_sRxRateLimitLo [ i ] );

            if ( wTemp > MAXRATELIMIT )
            {
                sprintf ( sErrMsg, "Low priority Rx Rate Limit for Port %d exceeds %d.", i + 1, MAXRATELIMIT );
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
            }
/*			else if ( !wTemp )
			{
				sprintf ( sErrMsg, "0 if not a valid VLAN ID for VLAN %d.", i + 1);
                MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
                bInvalid = 1;
			}
*/			else
            {
                m_wRxRateLimitLo [ i ] = wTemp * 1000 / RATEUNIT; // Convert to 32kbps per unit
                if ( ( wTemp * 1000 ) % RATEUNIT >= RATEUNIT / 2 ) // Round it up
				{
					m_wRxRateLimitLo [ i ]++;
				}
            }
        }
        else 
        {
            MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
            bInvalid = 1;
        }
    }

    if ( !bInvalid )
    {
		for ( i = 0; i < PORTCOUNT; i++)
		{
			pApp->WriteData ( TXRATELIMITHIPORT1LSB + i * PORTCTLREGOFFSET, 
									  (BYTE) m_wTxRateLimitHi [ i ]);

			pApp->WriteData ( TXRATELIMITLOPORT1LSB + i * PORTCTLREGOFFSET, 
									  (BYTE) m_wTxRateLimitLo [ i ]);

			pApp->WriteData ( TXRATELIMITPORT1MSB + i * PORTCTLREGOFFSET, 
									  (BYTE) ((m_wTxRateLimitHi [ i ] >> 8) & 0x0f | 
									  (((m_wTxRateLimitLo [ i ] >> 8) & 0x0f) << 4)));
			
			pApp->WriteData ( RXRATELIMITHIPORT1LSB + i * PORTCTLREGOFFSET, 
									  (BYTE) m_wRxRateLimitHi [ i ]);

			pApp->WriteData ( RXRATELIMITLOPORT1LSB + i * PORTCTLREGOFFSET, 
									  (BYTE) m_wRxRateLimitLo [ i ]);

			pApp->WriteData ( RXRATELIMITPORT1MSB + i * PORTCTLREGOFFSET, 
									  (BYTE) ((m_wRxRateLimitHi [ i ] >> 8) & 0x0f | 
									  (((m_wRxRateLimitLo [ i ] >> 8) & 0x0f) << 4)));

//			bData = pApp->ReadData ( ENABLERATELIMITPORT1 + i * PORTCTLREGOFFSET );

//			bData &= ~(TXRATELIMITLOENABLE | TXRATELIMITHIENABLE |	
//					   RXRATELIMITLOENABLE | RXRATELIMITHIENABLE );

			bData = 0; // Reset it all

			bData |= m_TxEnableRateLimitHi [ i ];
			bData |= m_TxEnableRateLimitLo [ i ] << 1;
			bData |= m_RxEnableRateLimitHi [ i ] << 5;
			bData |= m_RxEnableRateLimitLo [ i ] << 6;

			// Set flow control if necessary
			if ( m_bEnableFlowControl )
			{
				bData |= (RXFLOWCTRLLOENABLE | RXFLOWCTRLHIENABLE);
			}
			else
				bData &= ~(RXFLOWCTRLLOENABLE | RXFLOWCTRLHIENABLE);


			// Enable differential priority if either low or high priority rate control is
			// enabled

			//
			//		Differential Ctl		Hi Priority			Lo Priority
			//		--------------------------------------------------------
			//	(1)			0					x					1			
			//	(2)			1					1					0
			//	(3)			1					0					1
			//	(4)			1					1					1
			//	(5)			0					0					0
			//
			//
			//	(1)	When Differential is reset, the Lo Priority Rate is used if it is 
			//		enabled and set. Hi Priority Rate is ignored.
			//
			//	(2) (3) (4) When Differential is set, the Hi or/and Lo Priority Rate is/are
			//		used according to how they are set.
			//	(5) No rate limit
			//
			//

			if ( m_bRxDisablePriority [ i ] )
				bData &= ~RXDIFFPRIORITYCTL;
			else
				bData |= RXDIFFPRIORITYCTL;

			if ( m_bTxDisablePriority [ i ] )
				bData &= ~TXDIFFPRIORITYCTL;
			else
				bData |= TXDIFFPRIORITYCTL;

			pApp->WriteData ( ENABLERATELIMITPORT1 + i * PORTCTLREGOFFSET, bData );

			// Also turn on priority queue setting
			//if ( !m_bTxDisablePriority [ i ] || !m_bRxDisablePriority [ i ] )
			//{
				bData = pApp->ReadData ( PORT1CTL0 + i * PORTCTLREGOFFSET );

				bData &= ~PRIORITYMASK;

				bData |= m_wPriorityScheme;

				if ( !m_bTxDisablePriority [ i ] )
					bData |= ENABLEPRIORITYQUEUE;
				else
					bData &= ~ENABLEPRIORITYQUEUE;

				pApp->WriteData ( PORT1CTL0 + i * PORTCTLREGOFFSET ,  bData );
			//}

		}
    }

	// Release background MIB read
	pApp->m_bHWSemaphore = ~NOMIBREAD;

    return CPropertyPage::OnApply();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -