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

📄 staticmac.cpp

📁 ks8995m5口交换机启动eeprom配置源码
💻 CPP
字号:
// StaticMAC.cpp : implementation file
//

#include "stdafx.h"
#include "DgbTool.h"
#include "StaticMAC.h"
#include "ks95mspi.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CStaticMAC property page

IMPLEMENT_DYNCREATE(CStaticMAC, CPropertyPage)

CStaticMAC::CStaticMAC() : CPropertyPage(CStaticMAC::IDD)
{
}

CStaticMAC::~CStaticMAC()
{
}

void CStaticMAC::DoDataExchange(CDataExchange* pDX)
{
    int i; 

	CPropertyPage::DoDataExchange(pDX);

    for ( i = 0; i < SMACTABCOUNT; i++ )
	{
 	    DDX_LBIndex(pDX, IDC_LIST1 + i, m_iVLAN[ i ]);
		DDX_Check(pDX, IDC_CHECK41 + i, m_bEnable [ i ]);
	}

	for ( i = 0; i < SMACTABCOUNT * 6 ; i++ )
	{
 		DDX_Control(pDX, IDC_EDIT48 + i, m_cMACAdd[ i ] );
 		DDX_Text(pDX, IDC_EDIT48 + i, m_sMACAdd[ i ] );
		DDV_MaxChars(pDX, m_sMACAdd[ i ], 2 );
	}


	for ( i = 0; i < PORTCOUNT * SMACTABCOUNT; i++ )
	{
		DDX_Check(pDX, IDC_CHECK1 + i, m_bPortToForward [ i ]);
	}

	for ( i = 0; i < SMACTABCOUNT; i++ )
	{
		DDX_Check(pDX, IDC_CHECK41 + i, m_bEnable [ i ]);
	}
}


BEGIN_MESSAGE_MAP(CStaticMAC, CPropertyPage)
    ON_LBN_SELCHANGE(IDC_LIST1, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST2, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST3, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST4, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST5, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST6, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST7, OnUpdate)
    ON_LBN_SELCHANGE(IDC_LIST8, OnUpdate)
  
    ON_EN_UPDATE(IDC_EDIT41, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT42, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT43, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT44, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT45, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT46, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT47, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT48, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT49, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT50, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT51, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT52, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT53, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT54, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT55, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT56, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT57, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT58, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT59, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT60, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT61, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT62, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT63, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT64, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT65, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT66, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT67, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT68, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT69, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT70, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT71, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT72, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT73, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT74, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT75, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT76, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT77, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT78, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT79, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT80, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT81, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT82, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT83, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT84, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT85, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT86, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT87, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT88, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT89, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT90, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT91, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT92, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT93, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT94, OnUpdate)
    ON_EN_UPDATE(IDC_EDIT95, OnUpdate)
  
    ON_BN_CLICKED(IDC_CHECK1, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK2, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK3, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK4, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK5, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK6, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK7, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK8, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK9, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK10, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK11, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK12, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK13, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK14, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK15, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK16, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK17, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK18, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK19, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK20, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK31, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK32, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK33, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK34, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK35, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK36, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK37, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK38, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK39, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK40, OnUpdate) 

    ON_BN_CLICKED(IDC_CHECK41, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK42, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK43, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK44, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK45, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK46, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK47, OnUpdate) 
    ON_BN_CLICKED(IDC_CHECK48, OnUpdate) 
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticMAC message handlers

BOOL CStaticMAC::OnInitDialog() 
{

	int i,j;
	char sList[10];
	union utag {
		BYTE data;	
		struct stag {
			unsigned useFID :1;
			unsigned Fid : 4;
			unsigned filler : 3;
		} field;

	} byte8;

	union {
		BYTE data;
		struct {
			unsigned forwardingports : 5;
			unsigned valid : 1;
			unsigned override :1;
			unsigned filler : 1;
		} field;
	} byte7;

	WORD wMACBytes[MACADDRESSLEN];

	CDgbToolApp	*pApp;
	pApp = (CDgbToolApp *)AfxGetApp();

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

	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	CListBox * pListBox;

	for ( j = 0; j < SMACTABCOUNT; j++)
	{
		pListBox = (CListBox *)GetDlgItem ( IDC_LIST1 + j );

		//
		// VLAN 0 means not using FID
		//
		for ( i = 0; i < VLANCOUNT + 1; i++ )
		{
			sprintf ( sList, "%0d", i );
			pListBox->AddString(sList);
		}

	}

	for ( i = 0; i < SMACTABCOUNT; i++ )
	{
		GetStaticMACBytes ( i, 
							&byte8.data, 
							&byte7.data, 
							&wMACBytes[0]
						  );

		for ( j = 0; j < MACADDRESSLEN; j++)
		{
			m_sMACAdd [ j + i * MACADDRESSLEN ].Format ("%02x", wMACBytes[j]);
						
		}

		m_bEnable [ i ] = byte7.field.valid;

		if ( !byte8.field.useFID )
			m_iVLAN [ i ] = 0;
		else
			m_iVLAN[ i ] = byte8.field.Fid; 
//			m_iVLAN[ i ] = byte8.field.Fid + 1; // Plus one for indexing to the List Box entry

		pListBox->SetCurSel( m_iVLAN [ i ] );

		for ( j = 0; j < PORTCOUNT; j++ )
		{
			m_bPortToForward [ j + i * PORTCOUNT ] = 
				( byte7.field.forwardingports & ( 0x1 << j ) ) >> j ;
		}

		//	pApp->ReadData ( INDIRECTDATABASE + 4),
		//	pApp->ReadData ( INDIRECTDATABASE + 5),
		//	pApp->ReadData ( INDIRECTDATABASE + 6),
		//	pApp->ReadData ( INDIRECTDATABASE + 7),
		//	pApp->ReadData ( INDIRECTDATABASE + 8) );
	}

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

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


BOOL CStaticMAC::OnSetActive() 
{
	UpdateData(FALSE);

	return CPropertyPage::OnSetActive();
}

BOOL CStaticMAC::OnApply() 
{
	int		i, j;
	BYTE	bByte7;
	BYTE	bByte8;
	WORD	wMACByte;
	WORD	wMACBytes[MACADDRESSLEN];
	DWORD	dwMACLow;
	DWORD	dwMACHigh;
	CString	csErrorMsg;	
	CString	csTitle;	

	CDgbToolApp	*pApp;
	pApp = (CDgbToolApp *)AfxGetApp();

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

	UpdateData(TRUE);

	//
	//	uMACLow holds the low 4 bytes of the MAC address. hh:hh:ll:ll:ll:ll
	//  uMACHigh holds the high 2 bytes of the MAC address.
	//
	for ( i = 0; i < SMACTABCOUNT; i++ )
	{

		dwMACHigh = dwMACLow = 0;

		for ( j = 0; j < MACADDRESSLEN; j++)
		{

			if ( SUCCESS != ParseMACAddress ( &m_sMACAdd [ j + i * MACADDRESSLEN ], &wMACByte)  )
			{
				csErrorMsg.LoadString(IDS_ILLEGALMACADDREEBYTE);
				csTitle.LoadString(IDS_TITLE);
				MessageBox(csErrorMsg, csTitle, MB_OK | MB_ICONSTOP);

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

				return CPropertyPage::OnApply();
			}
			else if ( j < 2 ) // Byte 6 and 5
			{
				dwMACHigh |= (BYTE)wMACByte << ( 8 * ( 1 - j ) );
			}
			else	// Byte 1-4
			{
				dwMACLow |= (BYTE)wMACByte << ( 8 * ( MACADDRESSLEN - j - 1 ) );
			}

		}


		GetStaticMACBytes ( (BYTE)i, &bByte8, &bByte7, &wMACBytes[0] );

		// 
		// Check to see if need to update MAC address
		//	
/*		if ( uMAC )
		{
			bMACByte6 =	ReadData ( INDIRECTDATABASE + 3);
			bMACByte5 =	ReadData ( INDIRECTDATABASE + 4);
			bMACByte4 =	ReadData ( INDIRECTDATABASE + 5);
			bMACByte3 =	ReadData ( INDIRECTDATABASE + 6);
			bMACByte2 =	ReadData ( INDIRECTDATABASE + 7);
			bMACByte1 =	ReadData ( INDIRECTDATABASE + 8);

			uMACLow = bMACByte4 << 24 | bMACByte3 << 16 | bMACByte2 << 8 | bMACByte1;
			uMACHigh = bMACByte5 << 8 | bMACByte6;
		}
*/
		//
		// Shift bit 56, and above, right one bit. The hardware is designed this way.
		//

		if ( bByte8 & 0x01 == 1 )
			bByte7 |= 0x80;
		else
			bByte7 &= 0x7f;

		bByte8 >>= 1;

		bByte8 &= ~FIDMASK;
		bByte8 |= m_iVLAN [ i ]  & FIDMASK;
		bByte8 |= m_iVLAN [ i ] & FIDMASK; 

//		bByte8 |= ( m_iVLAN [ i ] - 1 ) & FIDMASK; // Minus one to convert from index number to actual
											 // hardware value

		bByte7 &= ~UFIDMASK;

		if ( m_iVLAN [ i ] )
			bByte7 |= ( 0x1 << UFIDSHIFT );
		else
			bByte7 &= ~UFIDMASK;
			
		bByte7 &= ~VALIDMASK;
		bByte7 |= ( m_bEnable [ i ] << VALIDSHIFT );

		bByte7 &= ~FPORTSMASK;

		for ( j = 0; j < PORTCOUNT; j++ )
			bByte7 |= m_bPortToForward [ j + i * PORTCOUNT ] << j;
		//
		//	uMACLow holds the low 4 bytes of the MAC address. hh:hh:ll:ll:ll:ll
		//  uMACHigh holds the high 2 bytes of the MAC address.
		//

		WriteToStaticMACTable ( i, dwMACLow, (DWORD) ( bByte8 << 24 | bByte7 << 16 | dwMACHigh ) ) ;


	}

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

    return CPropertyPage::OnApply();
}


void CStaticMAC::OnUpdate() 
{
	SetModified(TRUE);
}

//--------------------------------------------------------------------------
//  
//  void GetStaticMACBytes
//  
//  Description:
//      Read two MSB bytes from static MAC address table entries.
//
//  Parameters:
//      int iEntry      MAC address table entry number
//      BYTE *bByte7    Pointer to content of byte 7   
//      BYTE *bByte8    Pointer to content of byte 8
//  
//  Return Vlaue:
//      None
//
//--------------------------------------------------------------------------
void CStaticMAC::GetStaticMACBytes ( int iEntry, BYTE *bByte8, 
												 BYTE *bByte7,
												 WORD wMACAddr[]
)
{
//	int	i;
	CDgbToolApp	*pApp;
	pApp = (CDgbToolApp *)AfxGetApp();

	pApp->WriteData ( INDIRECTCTL1, INDIRECTREAD | INDIRECTSMACTAB );
	pApp->WriteData ( INDIRECTCTL2, (BYTE) iEntry );

	*bByte8 = pApp->ReadData ( INDIRECTDATABASE + 1 );
	*bByte7 = pApp->ReadData ( INDIRECTDATABASE + 2 );

	wMACAddr[0] = pApp->ReadData ( INDIRECTDATABASE + 3 );
	wMACAddr[1] = pApp->ReadData ( INDIRECTDATABASE + 4 );
	wMACAddr[2] = pApp->ReadData ( INDIRECTDATABASE + 5 );
	wMACAddr[3] = pApp->ReadData ( INDIRECTDATABASE + 6 );
	wMACAddr[4] = pApp->ReadData ( INDIRECTDATABASE + 7 );
	wMACAddr[5] = pApp->ReadData ( INDIRECTDATABASE + 8 );
//	for ( i = 0; i < MACADDRESSLEN; i++ )
//	{
//		wMACAddr[i] = pApp->ReadData ( INDIRECTDATABASE + 3 + i );
//	}

	return;
}


int CStaticMAC::ParseMACAddress ( CString *sBuf, WORD *wMACByte )
{

	int i;
	int	iLen;
	char cByte;
	char str[]="1";
	
	sBuf->MakeLower();

	iLen = sBuf->GetLength();

	for ( i = 0; i < iLen; i++ )
	{
		cByte = sBuf->GetAt ( i );

		if ( !isxdigit ( cByte ) )
			return FAIL;
	}

	sscanf ( sBuf->GetBuffer( iLen ), "%x", wMACByte );

	sBuf->ReleaseBuffer();

	return SUCCESS;

}


int CStaticMAC::WriteToStaticMACTable ( WORD elem1, DWORD elem2, DWORD elem3 )
{
	CDgbToolApp	*pApp;
	pApp = (CDgbToolApp *)AfxGetApp();

	pApp->WriteDataBegin ( INDIRECTDATABASE + 1, (BYTE) (elem3 >> 24 ));
	pApp->WriteDataContinue ( (BYTE) (elem3 >> 16 ) );
	pApp->WriteDataContinue ( (BYTE) (elem3 >> 8 ) );
	pApp->WriteDataContinue ( (BYTE) (elem3 ) );
	pApp->WriteDataContinue ( (BYTE) (elem2 >> 24) );
	pApp->WriteDataContinue ( (BYTE) (elem2 >> 16) );
	pApp->WriteDataContinue ( (BYTE) (elem2 >> 8 ) );
	pApp->WriteDataEnd ( (BYTE) (elem2 ) );

	pApp->WriteData ( INDIRECTCTL1, INDIRECTWRITE | INDIRECTSMACTAB );
	pApp->WriteData ( INDIRECTCTL2, (BYTE) elem1 );

	return SUCCESS;
}





⌨️ 快捷键说明

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