📄 vlan.cpp
字号:
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CVlan::OnSetActive()
{
UpdateData(FALSE);
return CPropertyPage::OnSetActive();
}
BOOL CVlan::OnApply()
{
WORD i, j;
WORD wStrlen;
WORD wTemp;
BOOL bInvalid = 0;
CString csTitle;
char sErrMsg[50];
BYTE bData;
WORD wMember;
CDgbToolApp *pApp;
pApp = (CDgbToolApp *)AfxGetApp();
// Block background MIB read
pApp->m_bHWSemaphore = NOMIBREAD;
UpdateData(TRUE);
//
// Valide numeric strings
//
for ( i = 0; i < VLANCOUNT; i++ )
{
sprintf ( sErrMsg, "Invalid VLAN ID for VLAN %02d.", i + 1 );
csTitle.LoadString(IDS_TITLE);
if ( ( wStrlen = m_sVLANID[ i ].GetLength() ) > 0)
{
for ( j = 0; j < wStrlen; j++ )
{
if ( ((LPCTSTR)m_sVLANID[ i ])[ j ] < '0' || ((LPCTSTR)m_sVLANID [ i ])[ j ] > '9' )
{
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
}
wTemp = atoi ( m_sVLANID [ i ] );
if ( wTemp > MAXVLAN )
{
sprintf ( sErrMsg, "VLAN ID for VLAN %02d exceeds %d.", i + 1, MAXVLAN );
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_wVLANID [ i ] = wTemp;
}
}
else
{
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
}
for ( i = 0; i < PORTCOUNT; i++ )
{
sprintf ( sErrMsg, "Invalid Default VLAN ID for port %02d.", i + 1 );
csTitle.LoadString(IDS_TITLE);
if ( ( wStrlen = m_sDefaultVLANID[ i ].GetLength() ) > 0)
{
for ( j = 0; j < wStrlen; j++ )
{
if ( ((LPCTSTR)m_sDefaultVLANID[ i ])[ j ] < '0' || ((LPCTSTR)m_sDefaultVLANID [ i ])[ j ] > '9' )
{
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
}
wTemp = atoi ( m_sDefaultVLANID [ i ] );
if ( wTemp > MAXVLAN )
{
sprintf ( sErrMsg, "Default VLAN ID for Port %02d exceeds %d.", i + 1, MAXVLAN );
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
else if ( !wTemp )
{
sprintf ( sErrMsg, "0 if not a valid default VLAN ID for port %d.", i + 1);
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
else
{
m_wDefaultVLANID [ i ] = wTemp;
}
}
else
{
MessageBox( sErrMsg, csTitle, MB_OK | MB_ICONSTOP );
bInvalid = 1;
}
}
if ( !bInvalid )
{
bData = pApp->ReadData ( GLOBALCTL3 );
if ( m_bEnableVLAN )
{
bData |= VLANENABLE;
pApp->WriteData ( GLOBALCTL3, bData );
}
else
{
bData &= ~VLANENABLE;
pApp->WriteData ( GLOBALCTL3, bData );
}
for ( i = 0; i < VLANCOUNT; i++ )
{
wMember = 0;
for ( j = 0; j < PORTCOUNT; j++ )
{
wMember |= ( m_VLAN [ i * PORTCOUNT + j ] << j );
}
UpdateVLANTab ( i, m_wVLANID [ i ], wMember, m_bActivate [ i ] );
}
for (i = 0; i < PORTCOUNT; i++)
{
// Read back origianl value
wTemp = pApp->ReadData ( PORT1CTL0 + i * PORTCTLREGOFFSET ) & ~PORTINSERTION;
wTemp &= ~PORTREMOVAL;
wTemp |= m_bTagInsertion [ i ] << PORTINSERTIONSHIFT ;
pApp->WriteData( PORT1CTL0 + i * PORTCTLREGOFFSET,
(BYTE)wTemp | ( m_bTagRemoval [ i ] << PORTREMOVALSHIFT ) );
wTemp = pApp->ReadData ( PORT1CTL2 + i * PORTCTLREGOFFSET ) & ~ENABLEINGRESSFILTERING;
wTemp &= ~DISCARDNONPVIDPACKETS;
wTemp |= m_bEnableIngressFiltering [ i ] << ENABLEINGRESSFILTERINGSHIFT ;
pApp->WriteData( PORT1CTL2 + i * PORTCTLREGOFFSET,
(BYTE) wTemp | ( m_bDiscardNonPVIDPackets [ i ] << DISCARDNONPVIDPACKETSSHIFT ) );
wTemp = pApp->ReadData ( PORT1CTL3 + i * PORTCTLREGOFFSET ) & ~PORTVIDHI;
pApp->WriteData ( PORT1CTL3 + i * PORTCTLREGOFFSET,
(BYTE)wTemp | ((m_wDefaultVLANID [ i ] >> 8) & PORTVIDHI ));
pApp->WriteData ( PORT1CTL4 + i * PORTCTLREGOFFSET,
(BYTE)( m_wDefaultVLANID [ i ] & PORTVIDLO ));
}
}
// Release background MIB read
pApp->m_bHWSemaphore = ~NOMIBREAD;
return CPropertyPage::OnApply();
}
void CVlan::OnUpdate()
{
SetModified(TRUE);
}
//--------------------------------------------------------------------------
//
// int GetVLANBytes
//
// Description:
// Read three VLAN bytes accroding to entry number bEntry.
//
// Parameters:
// BYTE bEntry Entry number
// BYTE *bByte0 The first byte read
// BYTE *bByte1 The second byte read
// BYTE *bByte2 The thrid byte read
//
// Return Vlaue:
// None
//
//--------------------------------------------------------------------------
void CVlan::GetVLANBytes ( BYTE bEntry, BYTE *bByte0, BYTE *bByte1, BYTE *bByte2 )
{
CDgbToolApp *pApp;
pApp = (CDgbToolApp *)AfxGetApp();
pApp->WriteData ( INDIRECTCTL1, INDIRECTREAD | INDIRECTVLANTAB );
pApp->WriteData ( INDIRECTCTL2, bEntry );
*bByte2 = pApp->ReadData ( INDIRECTDATABASE + 6 ) & 0x3f;
*bByte1 = pApp->ReadData ( INDIRECTDATABASE + 7 );
*bByte0 = pApp->ReadData ( INDIRECTDATABASE + 8 );
return;
}
//--------------------------------------------------------------------------
//
// int WriteToVLANTable
//
// Description:
// command:
//
// wvtab n, Data Write "Data" to the nth entry of the VLAN table.
//
// Parameters:
// elem1 Register index
// elem2 0-22 VLAN bits
// elem3 NOPARAMETER
//
// Return Vlaue:
// SUCCESS and PARMERROR
//
//--------------------------------------------------------------------------
void CVlan::WriteToVLANTable ( DWORD elem1, DWORD elem2 )
{
CDgbToolApp *pApp;
pApp = (CDgbToolApp *)AfxGetApp();
pApp->WriteData ( INDIRECTDATABASE + 6, (BYTE) (elem2 >> 16 ));
pApp->WriteData ( INDIRECTDATABASE + 7, (BYTE) (elem2 >> 8 ) );
pApp->WriteData ( INDIRECTDATABASE + 8, (BYTE) elem2);
pApp->WriteData ( INDIRECTCTL1, INDIRECTWRITE | INDIRECTVLANTAB );
pApp->WriteData ( INDIRECTCTL2, (BYTE) elem1 );
return;
}
void CVlan::UpdateVLANTab ( WORD wEntry, WORD wVidValue, WORD wMbrValue, BOOL bValid )
{
BYTE bByte0;
BYTE bByte1;
BYTE bByte2;
GetVLANBytes ( (BYTE)wEntry, &bByte0, &bByte1, &bByte2 );
bByte0 = wVidValue & VID1MASK;
bByte1 &= ~VID2MASK;
bByte1 |= (wVidValue >> VID1SHIFT);
bByte1 &= ~VTABFIDMASK;
bByte1 |= ( wEntry << FIDSHIFT );
bByte2 &= ~MBRMASK;
bByte2 |= wMbrValue;
bByte2 &= ~VALIDMASK;
bByte2 |= (bValid << VALIDSHIFT);
WriteToVLANTable ( wEntry, (DWORD) ( bByte2 << 16 | bByte1 << 8 | bByte0 ) );
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -