📄 ratelimit.cpp
字号:
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 + -