/* * @implemented */ VOID EXPORT EthFilterDprIndicateReceive( IN PETH_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize) /* * FUNCTION: Receive indication function for Ethernet devices * ARGUMENTS: * MiniportAdapter = Miniport Adapter Handle (PLOGICAL_ADAPTER) * MacReceiveContext = MAC receive context handle * Address = Pointer to destination Ethernet address * HeaderBuffer = Pointer to Ethernet header buffer * HeaderBufferSize = Size of Ethernet header buffer * LookaheadBuffer = Pointer to lookahead buffer * LookaheadBufferSize = Size of lookahead buffer * PacketSize = Total size of received packet */ { /* Not sure if this is a valid thing to do, but we do arrive here early * in the boot process with Filter NULL. We need to investigate whether * this should be handled or not allowed. */ if( !Filter ) { NDIS_DbgPrint(MIN_TRACE, ("Filter is NULL\n")); return; } MiniIndicateData((PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize, PacketSize); }
NDIS_STATUS ProIndicatePacket( PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet) /* * FUNCTION: Indicates a packet to bound protocols * ARGUMENTS: * Adapter = Pointer to logical adapter * Packet = Pointer to packet to indicate * RETURNS: * STATUS_SUCCESS in all cases * NOTES: * - XXX ATM, this only handles loopback packets - is that its designed function? */ { UINT BufferedLength; UINT PacketLength; KIRQL OldIrql; PUCHAR LookaheadBuffer; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); #if DBG MiniDisplayPacket(Packet); #endif NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength); LookaheadBuffer = ExAllocatePool(NonPagedPool, PacketLength); if (!LookaheadBuffer) { NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n")); return NDIS_STATUS_RESOURCES; } NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { BufferedLength = CopyPacketToBuffer(LookaheadBuffer, Packet, 0, PacketLength); Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = Packet; } KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); if (BufferedLength > Adapter->MediumHeaderSize) { /* XXX Change this to call SendPackets so we don't have to duplicate this wacky logic */ MiniIndicateData(Adapter, NULL, LookaheadBuffer, Adapter->MediumHeaderSize, &LookaheadBuffer[Adapter->MediumHeaderSize], BufferedLength - Adapter->MediumHeaderSize, PacketLength - Adapter->MediumHeaderSize); } else { MiniIndicateData(Adapter, NULL, LookaheadBuffer, Adapter->MediumHeaderSize, NULL, 0, 0); } ExFreePool(LookaheadBuffer); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = NULL; } KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); return NDIS_STATUS_SUCCESS; }