Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
NetAdapterCx-clientstuurprogramma's annuleren netwerkgegevens wanneer het framework hun EvtPacketQueueCancel callback-functie voor een pakketwachtrij aanroept. Deze callback is de plek waar clientstuurprogramma's alle benodigde verwerking uitvoeren voordat het framework de pakketwachtrijen verwijdert.
Een verzendwachtrij annuleren
In uw EvtPacketQueueCancel callback-functie voor een verzendwachtrij hebt u de mogelijkheid om eventuele openstaande verzendpakketten te voltooien. In tegenstelling tot een ontvangstwachtrij hoeft u dit niet te doen. Als u openstaande pakketten laat liggen, roept NetAdapterCx uw EvtPacketQueueAdvance- aan voor de verzendwachtrij, waar u ze verwerkt als onderdeel van uw reguliere proces.
Als uw hardware ondersteuning biedt voor het annuleren van in-flight-verzendingen, moet u ook de pakketiterator van de netwerkring voorbij alle geannuleerde pakketten zetten. Dit kan eruitzien als in het volgende voorbeeld:
void
MyEvtTxQueueCancel(
NETPACKETQUEUE TxQueue
)
{
// Get the transmit queue's context to retrieve the net ring collection
PMY_TX_QUEUE_CONTEXT txQueueContext = MyGetTxQueueContext(TxQueue);
NET_RING_COLLECTION const * ringCollection = txQueueContext->RingCollection;
NET_RING * packetRing = ringCollection->Rings[NET_RING_TYPE_PACKET];
UINT32 currentPacketIndex = packetRing->BeginIndex;
UINT32 packetEndIndex = packetRing->EndIndex;
while (currentPacketIndex != packetEndIndex)
{
// Mark this packet as canceled with the scratch field, then move past it
NET_PACKET * packet = NetRingGetPacketAtIndex(packetRing, currentPacketIndex);
packet->Scratch = 1;
currentPacketIndex = NetRingIncrementIndex(packetRing, currentPacketIndex);
}
packetRing->BeginIndex = packetRing->EndIndex;
}
Als uw hardware geen ondersteuning biedt voor annulering, kan deze callback worden geretourneerd zonder actie te ondernemen.
Een ontvangstwachtrij annuleren
In uw EvtPacketQueueCancel callback-functie voor een ontvangstwachtrij, moet u alle openstaande pakketten afhandelen. Als u niet alle pakketten retourneert, verwijdert het besturingssysteem de wachtrij niet en stopt NetAdapterCx met het aanroepen van uw callbacks voor de wachtrij.
Als u pakketten wilt retourneren, moet u eerst proberen aan te geven of er ontvangsten waren terwijl het ontvangstpad werd uitgeschakeld. Stel vervolgens alle pakketten in om genegeerd te worden en retourneer alle fragmenten naar het besturingssysteem. Dit kan eruitzien als in het volgende codevoorbeeld.
Notitie
In dit voorbeeld worden details weggelaten om ontvangst aan te geven. Zie Netwerkgegevens ontvangen met net-ringenvoor een codevoorbeeld van het ontvangen van gegevens.
void
MyEvtRxQueueCancel(
NETPACKETQUEUE RxQueue
)
{
// Get the receive queue's context to retrieve the net ring collection
PMY_RX_QUEUE_CONTEXT rxQueueContext = MyGetRxQueueContext(RxQueue);
NET_RING_COLLECTION const * ringCollection = rxQueueContext->RingCollection;
NET_RING * packetRing = ringCollection->Rings[NET_RING_TYPE_PACKET];
NET_RING * fragmentRing = ringCollection->Rings[NET_RING_TYPE_FRAGMENT];
UINT32 currentPacketIndex = packetRing->BeginIndex;
UINT32 packetEndIndex = packetRing->EndIndex;
// Set hardware register for cancellation
...
//
// Indicate receives
...
//
// Get all packets and mark them for ignoring
currentPacketIndex = packetRing->BeginIndex;
while(currentPacketIndex != packetEndIndex)
{
NET_PACKET * packet = NetRingGetPacketAtIndex(packetRing, currentPacketIndex);
packet->Ignore = 1;
currentPacketIndex = NetRingIncrementIndex(packetRing, currentPacketIndex);
}
packetRing->BeginIndex = packetRing->EndIndex;
// Return all fragments to the OS
fragmentRing->BeginIndex = fragmentRing->EndIndex;
}