NDIS_TCP_OFFLOAD_EVENT_INDICATE fonction de rappel (ndischimney.h)

[La fonctionnalité de déchargement de cheminée TCP est déconseillée et ne doit pas être utilisée.]

Une cible de déchargement appelle la fonction NdisTcpOffloadEventHandler pour indiquer un événement relatif à une connexion TCP déchargée.

Syntaxe

NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;

void NdisTcpOffloadEventIndicate(
  [in] IN NDIS_HANDLE NdisOffloadHandle,
  [in] IN ULONG EventType,
  [in] IN ULONG EventSpecificInformation
)
{...}

Paramètres

[in] NdisOffloadHandle

Handle qui identifie la connexion TCP déchargée sur laquelle l’indication est effectuée. Lorsque la connexion a été déchargée, ce handle a été fourni dans le membre NdisOffloadHandle du NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure associée à l’état de connexion.

[in] EventType

L’événement est indiqué comme l’une des valeurs de TCP_OFFLOAD_EVENT_TYPE suivantes :

TcpIndicateDisconnect

Indique que l’hôte distant a lancé une déconnexion normale en envoyant un segment FIN sur la connexion.

TcpIndicateRetrieve

Indique que la cible de déchargement demande à la pile hôte d’arrêter le déchargement d’une connexion TCP.

TcpIndicateAbort

Indique que l’hôte distant a lancé une déconnexion abandonnée en envoyant un segment RST acceptable sur la connexion.

TcpIndicateSendBacklogChange

Indique une modification de la taille de backlog d’envoi préférée.

[in] EventSpecificInformation

Spécifie des informations supplémentaires sur l’événement indiqué comme suit :

TcpIndicateDisconnect

Non significatif.

TcpIndicateRetrieve

Indique la raison de la demande de chargement en tant que valeur TCP_UPLOAD_REASON . Pour plus d'informations, consultez la section Notes.

TcpIndicateAbort

Non significatif.

TcpIndicateSendBacklogChange

Spécifie le nombre optimal d’octets de données d’envoi que la pile hôte doit avoir en attente au niveau de la cible de déchargement.

Valeur de retour

None

Remarques

Indication d’une déconnexion normale

Une cible de déchargement doit indiquer une déconnexion normale uniquement dans les cas suivants :
  • Il a reçu un segment FIN de l’hôte distant.
  • Toutes les données reçues sur la connexion avant la réception du segment FIN ont été consommées par l’application cliente (autrement dit, aucune donnée de réception ne doit être indiquée sur la connexion).
La cible de déchargement ne doit pas libérer les ressources de la connexion tant que la pile de l’hôte n’a pas terminé le déchargement de la connexion.

Notez qu’une déconnexion normale arrête uniquement la moitié de réception de la connexion. Il n’arrête pas l’envoi de la moitié de la connexion.

Indication d’une déconnexion abandonnée

Lorsqu’une cible de déchargement reçoit un segment RST acceptable sur une connexion TCP, elle doit :
  1. Dans son état interne pour la connexion, marquez la connexion comme étant abandonnée.
  2. Appelez la fonction NdisTcpOffloadEventHandler avec un EventType de TcpIndicateAbort.
    Note Lorsque le miniport indique l’événement TcpIndicateAbort , la pile TCP/IP hôte met fin au déchargement de la connexion. La cible de déchargement est libre d’indiquer l’événement TcpIndicateAbort dès que le segment RST arrive.
     
  3. Terminez toutes les demandes d’envoi et de déconnexion en suspens sur la connexion avec NDIS_STATUS_REQUEST_ABORTED. La cible de déchargement écrit cette valeur status dans le membre Status de chaque structure NET_BUFFER_LIST dans la liste liée qu’elle transmet à la Fonction NdisTcpOffloadSendComplete ou à la Fonction NdisTcpOffloadDisconnectComplete .
La cible de déchargement ne doit pas libérer les ressources de la connexion tant que la pile de l’hôte n’a pas terminé le déchargement de la connexion.

Demande d’arrêt d’une connexion TCP

La cible de déchargement spécifie la raison de la demande d’arrêt en tant que valeur TCP_UPLOAD_REASON dans le paramètre EventSpecificInformation qu’elle transmet à la fonction NdisTcpOffloadEventHandler . En réponse, la pile hôte appelle la fonction MiniportTerminateOffload de la cible de déchargement.

La cible de déchargement peut demander l’arrêt d’une seule connexion TCP par appel à NdisTcpOffloadEventHandler. La cible de déchargement ne peut pas demander l’arrêt d’un objet d’état voisin ou d’un objet d’état de chemin d’accès. Seule la pile hôte peut lancer l’arrêt d’un voisin ou d’un objet d’état de chemin d’accès.

Le tableau suivant décrit les événements ou les circonstances qui peuvent amener une cible de déchargement à demander l’arrêt du déchargement d’une connexion TCP.

La colonne la plus à droite indique, pour chaque TCP_UPLOAD_REASON, si la pile hôte charge toujours la connexion (obligatoire) ou peut charger ou non la connexion (facultatif). Dans les cas obligatoires, une cible de déchargement ne continue pas à traiter la connexion déchargée. Dans les cas facultatifs, une cible de déchargement doit être en mesure de poursuivre le traitement sur la connexion déchargée si la pile hôte n’arrête pas le déchargement de cette connexion.

Événement/circonstance TCP_UPLOAD_REASON Arrêt de la connexion TCP par la pile d’hôtes
L’état matériel utilisé pour suivre la connexion est endommagé. HardwareFailure Obligatoire
La cible de déchargement a tenté d’envoyer des données sur une connexion TCP qui dépend d’un objet d’état invalidé. InvalidState Obligatoire
La cible de déchargement reçoit un segment avec le bit URG défini dans l’en-tête TCP. Notez que la cible de déchargement n’envoie pas d’ACK pour accuser réception des données urgentes. ReceivedUrgentData Obligatoire
Un délai d’expiration s’est produit sur la connexion TCP. TimeoutExpiration Obligatoire
La cible de déchargement demande un chargement pour une raison non spécifiée. UploadRequested Obligatoire
La cible de déchargement a détecté qu’un trop grand nombre de segments de transmission sont supprimés sur la connexion TCP. HighDropRate Facultatif
La cible de déchargement a détecté qu’un trop grand nombre de fragments sont reçus sur la connexion TCP. HighFragmentation Facultatif
La cible de déchargement a reçu trop de segments en désordre sur la connexion TCP. HighOutofOrderPackets Facultatif
L’activité (envois/réceptions) sur la connexion TCP est trop faible. LowActivity Facultatif
Il n’existe aucune mémoire tampon de réception prépostée pour la connexion TCP. NoBufferProposting Facultatif
Les mémoires tampons reçues publiées pour la connexion TCP sont trop petites. SmallIO Facultatif
 

La cible de déchargement ne doit pas lancer l’arrêt d’une connexion TCP semi-fermée lorsque cette connexion se trouve dans l’un des états suivants :

  • FIN_WAIT1 :la pile d’hôtes locale a fermé la connexion TCP, mais la connexion reçoit toujours des données du point de terminaison distant.
  • FIN_WAIT2 :l’hôte local a fermé la connexion TCP et reçu un ACK pour le segment FIN qu’il a envoyé, mais la connexion déchargée peut toujours recevoir des données de l’hôte distant.
  • CLOSE_WAIT : l’hôte local peut toujours envoyer des données.
Une cible de déchargement peut demander l’arrêt de toutes les connexions TCP qui y ont été déchargées. Pour plus d’informations, consultez NdisMOffloadEventIndicate.

Indiquant une modification de la taille du backlog d’envoi

La taille du backlog d’envoi peut être fonction du temps d’aller-retour (RTT) de la connexion, de la bande passante de l’interface et d’autres paramètres. Les variables et l’algorithme spécifiques que la cible de déchargement utilise pour calculer la taille du backlog d’envoi sont spécifiques à l’implémentation. Une cible de déchargement peut, par exemple, utiliser un minimum du produit à retard de bande passante et la fenêtre de réception annoncée comme algorithme. Notez toutefois que la taille du backlog d’envoi ne varie pas en fonction du nombre d’octets de données actuellement publiés pour la transmission sur la connexion.

La cible de déchargement doit implémenter un mécanisme de limitation pour s’assurer que, si la valeur de SendBacklogSize change trop fréquemment ou d’une quantité trop faible, la cible de déchargement n’indique pas d’événement SendBacklogSize . Cela empêchera une tempête d’indications d’événement de se produire.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête ndischimney.h (inclure Ndischimney.h)
IRQL DISPATCH_LEVEL

Voir aussi

Indication d’événements de Chimney-Specific TCP

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

Réponse à la réception d’un segment FIN ou RST