📄 staticmac.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 + -