📄 oid.c
字号:
case OID_802_3_MAC_OPTIONS: // NEW
GenericUlong = 0;
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
GenericUlong = pvMini_Context->RcvErrorAlignments;
break;
case OID_802_3_XMIT_ONE_COLLISION:
GenericUlong = pvMini_Context->XmitOneCollisions;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
GenericUlong = pvMini_Context->XmitMoreCollisions;
break;
case OID_802_3_XMIT_MAX_COLLISIONS:
GenericUlong = pvMini_Context->XmitMaxCollisions;
break;
case OID_802_3_XMIT_LATE_COLLISIONS:
GenericUlong = pvMini_Context->XmitLateCollisions;
break;
case OID_802_3_XMIT_UNDERRUN:
GenericUlong = pvMini_Context->XmitUnderrun;
break;
case OID_802_3_XMIT_TIMES_CRS_LOST:
GenericUlong = pvMini_Context->XmitLostCRS;
break;
case OID_802_3_RCV_OVERRUN:
GenericUlong = pvMini_Context->RcvOverrun;
break;
// case OID_802_3_XMIT_DEFERRED:
// case OID_802_3_XMIT_HEARTBEAT_FAILURE:
// *BytesWritten = 0;
// return NDIS_STATUS_RESOURCES;
// break;
case OID_PNP_CAPABILITIES:
NKDbgPrintfW(TEXT("OID_PNP_CAPABILITIES.\r\n"));
break;
default:
*BytesWritten = 0;
return NDIS_STATUS_INVALID_OID;
} /* endswitch */
if (SourceBufferLength > InformationBufferLength) {
NdisMoveMemory(InformationBuffer, SourceBuffer, InformationBufferLength);
*BytesWritten = InformationBufferLength;
*BytesNeeded = SourceBufferLength;
return NDIS_STATUS_INVALID_LENGTH;
}
NdisMoveMemory(InformationBuffer, SourceBuffer, SourceBufferLength);
*BytesWritten = SourceBufferLength;
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalQueryInformation\r\n")));
return NDIS_STATUS_SUCCESS;
}
/*++
Routine Description:
CrystalSetInformation handles a set operation for a
single OID.
Arguments:
MiniportAdapterContext - Context registered with the wrapper, really
a pointer to the VP context.
Oid - The OID of the set.
InformationBuffer - Holds the data to be set.
InformationBufferLength - The length of InformationBuffer.
BytesRead - If the call is successful, returns the number
of bytes read from InformationBuffer.
BytesNeeded - If there is not enough data in InformationBuffer
to satisfy the OID, returns the amount of storage needed.
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_PENDING
NDIS_STATUS_INVALID_LENGTH
NDIS_STATUS_INVALID_OID
--*/
extern
NDIS_STATUS
CrystalSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
ULONG PacketFilter;
ULONG OldPacketFilter;
WORD LookAhead;
WORD LookAheadIndex;
//WORD data; //delete by diaoliangpeng 20051208
VPM_SetupMiniContext;
PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalSetInformation OID=0x%x\r\n"), Oid));
//RETAILMSG(1, (TEXT("==>CS8900:CrystalSetInformation OID=0x%x\r\n"), Oid));
//
// Now check for the most common OIDs
//
switch (Oid)
{
case OID_802_3_MULTICAST_LIST:
/* Make Sure Length of Data looks okay */
if (InformationBufferLength % ETH_LENGTH_OF_ADDRESS != 0)
Status = NDIS_STATUS_INVALID_DATA;
else
{
/* Make sure Multicast buffer has not been exceeded */
if (InformationBufferLength <= sizeof(pvMini_Context->McastList))
{
/* Copy Multicast addresses and inform VCHIP */
NdisMoveMemory(pvMini_Context->McastList, InformationBuffer, InformationBufferLength);
*BytesRead = InformationBufferLength;
pvMini_Context->McastListSize = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;
// Do Flush
VchipMulticastDeleteAll( pChip );
// Add each one
for (LookAheadIndex=0;
LookAheadIndex < pvMini_Context->McastListSize;
LookAheadIndex++ )
{
VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
} /* endfor */
}
else
{
*BytesRead = 0;
Status = NDIS_STATUS_MULTICAST_FULL;
} /* endif */
} /* endif */
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_802_3_MULTICAST_LIST status = %d\r\n"), Status));
return Status;
break;
case OID_GEN_CURRENT_PACKET_FILTER:
if (InformationBufferLength != 4)
{
*BytesNeeded = 4;
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_PACKET_FILTER NDIS_STATUS_INVALID_LENGTH\r\n")));
return NDIS_STATUS_INVALID_LENGTH;
}
//
// Now call the filter package to set the packet filter.
//
NdisMoveMemory((PVOID)&PacketFilter, InformationBuffer, (ULONG) sizeof(ULONG));
//
// Verify bits
//
if (PacketFilter & (NDIS_PACKET_TYPE_SOURCE_ROUTING |
NDIS_PACKET_TYPE_SMT |
NDIS_PACKET_TYPE_MAC_FRAME |
NDIS_PACKET_TYPE_FUNCTIONAL |
NDIS_PACKET_TYPE_ALL_FUNCTIONAL |
NDIS_PACKET_TYPE_GROUP |
NDIS_PACKET_TYPE_ALL_MULTICAST | // Fails Cert test
NDIS_PACKET_TYPE_ALL_LOCAL // No Loopback!
))
{
*BytesRead = 4;
*BytesNeeded = 0;
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_PACKET_FILTER NDIS_STATUS_NOT_SUPPORTED\r\n")));
return NDIS_STATUS_NOT_SUPPORTED;
}
OldPacketFilter = pvMini_Context->PacketFilter;
pvMini_Context->PacketFilter = PacketFilter;
pChip->Config.Filtering = 0;
if (PacketFilter & NDIS_PACKET_TYPE_DIRECTED)
pChip->Config.Filtering |= FILTER_INDIVIDUAL_ACCEPT;
if (PacketFilter & NDIS_PACKET_TYPE_BROADCAST)
pChip->Config.Filtering |= FILTER_BROADCAST_ACCEPT;
if (PacketFilter & (NDIS_PACKET_TYPE_MULTICAST |
NDIS_PACKET_TYPE_ALL_MULTICAST))
{
pChip->Config.Filtering |= FILTER_MULTICAST_ACCEPT;
// Do Flush
VchipMulticastDeleteAll( pChip );
if (PacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST)
VchipMulticastAddAll( pChip );
else
{
// Add each one
for (LookAheadIndex=0;
LookAheadIndex < pvMini_Context->McastListSize;
LookAheadIndex++ )
{
VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
} /* endfor */
}
} /* endif */
if (PacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS)
pChip->Config.Filtering |= FILTER_PROMISCUOUS_ACCEPT;
VchipChangeFiltering( pChip );
break;
case OID_GEN_CURRENT_LOOKAHEAD:
LookAhead = *((WORD *)InformationBuffer);
if (LookAhead > (VP_MAX_FRAMESIZE - VP_HEADERSIZE))
{
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_LOOKAHEAD NDIS_STATUS_INVALID_LENGTH\r\n")));
return NDIS_STATUS_INVALID_LENGTH;
}
pvMini_Context->ProtocolLookahead = LookAhead;
*BytesRead = InformationBufferLength;
break;
case OID_GEN_PROTOCOL_OPTIONS:
*BytesRead = InformationBufferLength;
break;
/* case OID_GEN_RESET_COUNTS: //QQQQQQQQQQQQ new for CE 4.0
*BytesRead = 125; //125 ms
break;
case OID_GEN_MEDIA_SENSE_COUNTS: //QQQQQQQQQQQQ new for CE 4.0
*BytesRead = 5000; //5 sec
break;
*/
case OID_PNP_SET_POWER:
if(*((int*)InformationBuffer)==NdisDeviceStateD0)
{
RETAILMSG(1, (TEXT("|++>CS8900A power on\r\n")));
VchipStartup( pChip );
RETAILMSG(1, (TEXT("|-->CS8900A power on\r\n")));
}
else
{
RETAILMSG(1, (TEXT("|++>CS8900A power off\r\n")));
VchipDisableInterrupts( pChip );
VchipShutdown( pChip );
pvMini_Context->CurrentState = NdisHardwareStatusNotReady;
VominiShutdown( pChip->pOSD );
// data = ReadPacketPage(CRYSTAL_SELF_CONTROL_REGISTER);
// data |= CRYSTAL_SCR_SW_SUSPEND;
// WritePacketPage( CRYSTAL_SELF_CONTROL_REGISTER, data );
RETAILMSG(1, (TEXT("|-->CS8900A power off\r\n")));
}
//Status = NDIS_STATUS_SUCCESS;
break;
default:
*BytesRead = 0; //@251
*BytesNeeded = 0; //@251
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation INVALID_OID\r\n")));
return NDIS_STATUS_INVALID_OID;
break;
}
PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation SUCCESS\r\n")));
return NDIS_STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -