📄 miscproc.c
字号:
* Name: SetMacPacketFilter()
*
* Description: To set MAC packet filter
*
* Arguments: PMRVDRV_ADAPTER Adapter,
* ULONG CurrentPacketFilter
*
* Return Value: NDIS_STATUS
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
SetMacPacketFilter(
IN PMRVDRV_ADAPTER Adapter,
IN ULONG CurrentPacketFilter
)
{
NDIS_STATUS Status;
DBGPRINT(DBG_WEP | DBG_CRLF | DBG_ALLEN ,("+SetMacPacketFilter() 0x%x \n", CurrentPacketFilter));
// if the CurrentPacketFilter is 0, turn off Rx
if (CurrentPacketFilter == 0)
{
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_BROADCAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
Adapter->usMacControlRecord |= (HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON |
HostCmd_ACT_MAC_INT_ENABLE);
}
else
{
// Set default MAC option
Adapter->usMacControlRecord |= (HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON );
#ifdef TT_WEP_1
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_WEP_ENABLE;
#else
// need to check if currently the wep is on
if ( Adapter->WEPStatus == Ndis802_11WEPEnabled )
{
DBGPRINT(DBG_WEP | DBG_ALLEN,("WEPStatus set, setting HostCmd_ACT_MAC_WEP_ENABLE in CmdOption\n"));
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_WEP_ENABLE;
}
else
{
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_WEP_ENABLE;
}
#endif // TT_WEP_1
if( CurrentPacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_MULTICAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_MULTICAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_BROADCAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_BROADCAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_BROADCAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
}
DBGPRINT(DBG_WEP | DBG_CRLF ,("+Set HostCmd_CMD_MAC_CONTROL 0x%x \n", Adapter->usMacControlRecord));
// Send MAc control command ro station
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_MAC_CONTROL,
Adapter->usMacControlRecord,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
return Status;
}
/******************************************************************************
*
* Name: SetMacPacketFilterOID()
*
* Description: To set MAC packet filter, and indicates status when firmware
* returns
*
* Arguments: PMRVDRV_ADAPTER Adapter,
* ULONG CurrentPacketFilter
*
* Return Value: NDIS_STATUS
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
SetMacPacketFilterOID(
IN PMRVDRV_ADAPTER Adapter,
IN ULONG CurrentPacketFilter
)
{
NDIS_STATUS Status;
DBGPRINT(DBG_WEP | DBG_CRLF | DBG_ALLEN,("+SetMacPacketFilterOID() 0x%x \n", CurrentPacketFilter));
if (CurrentPacketFilter == 0)
{
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_BROADCAST_ENABLE;
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
Adapter->usMacControlRecord |= (HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON |
HostCmd_ACT_MAC_INT_ENABLE);
}
else
{
// Set default MAC option
Adapter->usMacControlRecord |= (HostCmd_ACT_MAC_RX_ON |
HostCmd_ACT_MAC_TX_ON );
#ifdef TT_WEP_1
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_WEP_ENABLE;
#else
// need to check if currently the wep is on
if ( Adapter->WEPStatus == Ndis802_11WEPEnabled )
{
DBGPRINT(DBG_WEP,("WEPStatus set, setting HostCmd_ACT_MAC_WEP_ENABLE in CmdOption\n"));
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_WEP_ENABLE;
}
else
{
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_WEP_ENABLE;
}
#endif // TT_WEP_1
if( CurrentPacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_MULTICAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_MULTICAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_BROADCAST )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_BROADCAST_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_BROADCAST_ENABLE;
if ( CurrentPacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS )
Adapter->usMacControlRecord |= HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
else
Adapter->usMacControlRecord &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
}
DBGPRINT(DBG_WEP | DBG_CRLF ,("+Set HostCmd_CMD_MAC_CONTROL 0x%x \n", Adapter->usMacControlRecord));
// Send MAc control command ro station
Status = PrepareAndSendCommand(
Adapter,
HostCmd_CMD_MAC_CONTROL,
Adapter->usMacControlRecord,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
return Status;
}
#ifdef UNDER_CE
#ifdef MRVL_PRINT_DBG_MSG
// redirect DBGPrint to a file
void MrvPrintFile(const char *fmt, ...)
{
va_list argP;
FILE *MrvDbgfp;
DWORD dwThreadID;
DWORD dwTick;
MrvDbgfp = fopen("\\My Documents\\MrvlCF-25DBG.log","a+");
//MessageBox(NULL, TEXT("printdbgmsg"), TEXT("CF25"), MB_OK);
if ( MrvDbgfp == NULL )
{
//MessageBox(NULL, TEXT("open file failed"), TEXT("CF25"), MB_OK);
return;
}
dwThreadID = GetCurrentThreadId();
dwTick = GetTickCount();
fprintf(MrvDbgfp, "%8x:%d:", dwThreadID, dwTick);
va_start(argP, fmt);
vfprintf(MrvDbgfp, fmt, argP);
fflush(MrvDbgfp);
va_end(argP);
fclose(MrvDbgfp);
}
#endif // #ifdef MRVL_PRINT_DBG_MSG
#endif // #ifdef UNDER_CE
void AllenPrintFile(const char *fmt, ...)
{
va_list argP;
FILE *MrvDbgfp;
///DWORD dwThreadID;
///DWORD dwTick;
MrvDbgfp = fopen("\\My Documents\\MrvlCF-25DBG.txt","a+");
//MessageBox(NULL, TEXT("printdbgmsg"), TEXT("CF25"), MB_OK);
if ( MrvDbgfp == NULL )
{
//MessageBox(NULL, TEXT("open file failed"), TEXT("CF25"), MB_OK);
return;
}
///dwThreadID = GetCurrentThreadId();
///dwTick = GetTickCount();
///fprintf(MrvDbgfp, "%8x:%d:", dwThreadID, dwTick);
va_start(argP, fmt);
vfprintf(MrvDbgfp, fmt, argP);
fflush(MrvDbgfp);
va_end(argP);
fclose(MrvDbgfp);
}
/******************************************************************************
*
* Name: ConvertNDISRateToFWIndex()
*
* Description: Look up the FW index for the rate
*
* Arguments: NDISRate Rate in NDIS format
*
* Return Value: Equivalent index in FW, return MRVDRV_NUM_SUPPORTED_RATES
* if no matching rate is found
*
* Notes:
*
*****************************************************************************/
UCHAR ConvertNDISRateToFWIndex(UCHAR NDISRate)
{
UCHAR i;
for ( i=0; i < MRVDRV_NUM_SUPPORTED_RATES; i++ )
{
if ( NDISRate == MrvDrvSupportedRates[i] )
{
return i;
}
}
return MRVDRV_NUM_SUPPORTED_RATES;
}
/******************************************************************************
*
* Name: ConvertFWIndexToNDISRate()
*
* Description: Look up the rate for FW index
*
* Arguments: FWIndex
*
* Return Value: Equivalent NDIS Rate, return 0
* if no matching rate is found
*
* Notes:
*
*****************************************************************************/
UCHAR ConvertFWIndexToNDISRate(UCHAR FWIndex)
{
if ( FWIndex >= MRVDRV_NUM_SUPPORTED_RATES )
{
return 0;
}
return MrvDrvSupportedRates[FWIndex];
}
/******************************************************************************
*
* Name: ascii2hex()
*
* Description: convert acssic hex string to hex value
*
* Arguments: s-->input string d-->output value array dlen-->input length
*
* Return Value:
*
* Notes: for ADHOCAES key convert to sync. with linux driver
*
*****************************************************************************/
int AsciiToHex(unsigned char *d, char *s, int dlen)
{
int i;
unsigned char n;
NdisZeroMemory(d, dlen);
for (i = 0; i < dlen * 2; i++)
{
if ((s[i] >= 48) && (s[i] <= 57))
n = s[i] - 48;
else if ((s[i] >= 65) && (s[i] <= 70))
n = s[i] - 65;
else if ((s[i] >= 97) && (s[i] <= 102))
n = s[i] - 97;
else
break;
if ((i % 2) == 0)
n = n * 16;
d[i / 2] += n;
}
return i;
}
// The function just filter and reorganize WPA IE now and will skip WMM IE
VOID
RegularIeFilter(UCHAR *IeBuf, USHORT *pBufLen)
{
UCHAR IeId;
UCHAR IeLen,TmpIeLen;
USHORT CurPos =0;
UCHAR TmpBuf[500];
USHORT TmpPos = 0;
BOOLEAN IsWpaFound = FALSE;
UCHAR WPA_OUI[] = { 0x00, 0x50, 0xF2, 0x01};
UCHAR CCX_OUI[] = { 0x00, 0x40, 0x96};
BOOLEAN ExitFlag = FALSE;
NdisMoveMemory( TmpBuf, IeBuf ,*pBufLen);
// DBGPRINT(DBG_ALLEN, ("RegularIeFilter++ *pBufLen = %d\n", *pBufLen));
// HexDump(DBG_ALLEN, "IeBuf ", IeBuf, *pBufLen);
while (TmpPos < *pBufLen)
{
IeId = *(TmpBuf + TmpPos);
TmpIeLen = *(TmpBuf + TmpPos + 1);
IeLen = TmpIeLen;
switch (IeId)
{
case 0xdd: // WPA IE or WMM IE
if ((! IsWpaFound) && (TmpIeLen >=22))
{
if ( NdisEqualMemory( (TmpBuf + TmpPos + 2), WPA_OUI, 4 ) == 1 )
{
if (TmpIeLen == 24)
{
IeLen = *(TmpBuf + TmpPos + 1) = 22;
NdisMoveMemory((IeBuf + CurPos), (TmpBuf + TmpPos), IeLen + 2);
CurPos += (IeLen + 2);
//HexDump(DBG_ALLEN, "WPA IE TmpIeLen == 24", (IeBuf + CurPos), IeLen + 2);
}
else
if(TmpIeLen == 22)
{
NdisMoveMemory((IeBuf + CurPos), (TmpBuf + TmpPos), TmpIeLen + 2);
CurPos += (TmpIeLen + 2);
//HexDump(DBG_ALLEN, "WPA IE ", (IeBuf + CurPos), TmpIeLen + 2);
}
IsWpaFound = TRUE;
}
#ifdef CCX
else if ( NdisEqualMemory( (TmpBuf + TmpPos + 2), CCX_OUI, 3 ) == 1 )
{
NdisMoveMemory((IeBuf + CurPos), (TmpBuf + TmpPos), TmpIeLen + 2);
CurPos += (TmpIeLen + 2);
}
#endif
else
{
// do nothing
}
}
break;
case 0x80: // workarround for Agree AP for USI
NdisMoveMemory((IeBuf + CurPos), (TmpBuf + TmpPos), 2);
CurPos += 2;
TmpPos = *pBufLen;
break;
case 0x2f:
case 0x2a:
break;
default:
if (*pBufLen >= (CurPos + TmpIeLen + 2))
{
NdisMoveMemory((IeBuf + CurPos), (TmpBuf + TmpPos), TmpIeLen + 2);
//HexDump(DBG_ALLEN, "ELSE IE ", (IeBuf + CurPos), TmpIeLen + 2);
CurPos += (TmpIeLen + 2);
}
else
{
TmpPos = *pBufLen;
ExitFlag = TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -