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

📄 vlan.cpp

📁 ks8995m5口交换机启动eeprom配置源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	              // 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 + -