PD_BUFFER structure (ndis.h)

Cette structure représente un paquet PacketDirect (PD) ou une partie d’un paquet PD dans une file d’attente.

Syntaxe

typedef struct _PD_BUFFER {
  struct _PD_BUFFER   *NextPDBuffer;
  struct _PD_BUFFER   *NextPartialPDBuffer;
  PVOID               PDClientReserved;
  PVOID               PDClientContext;
  PUCHAR              DataBufferVirtualAddress;
  DMA_LOGICAL_ADDRESS DataBufferDmaLogicalAddress;
  ULONG               DataBufferSize;
  USHORT              PDClientContextSize;
  USHORT              Attributes;
  USHORT              Flags;
  USHORT              DataStart;
  ULONG               DataLength;
  union {
    struct {
      union {
        ULONG64 RxFilterContext;
        ULONG64 GftFlowEntryId;
      };
      ULONG                         RxHashValue;
      union {
        struct {
          ULONG RxIPHeaderChecksumSucceeded : 1;
          ULONG RxTCPChecksumSucceeded : 1;
          ULONG RxUDPChecksumSucceeded : 1;
          ULONG RxIPHeaderChecksumFailed : 1;
          ULONG RxTCPChecksumFailed : 1;
          ULONG RxUDPChecksumFailed : 1;
          ULONG RxHashComputed : 1;
          ULONG RxHashWithL4PortNumbers : 1;
          ULONG RxGftDirectionIngress : 1;
          ULONG RxGftExceptionPacket : 1;
          ULONG RxGftCopyPacket : 1;
          ULONG RxGftSamplePacket : 1;
          ULONG RxReserved1 : 4;
          ULONG RxCoalescedSegCount : 16;
          ULONG RxRscTcpTimestampDelta;
        };
        ULONG RxOffloads[2];
      };
      union {
        struct {
          ULONG TxIsIPv4 : 1;
          ULONG TxIsIPv6 : 1;
          ULONG TxTransportHeaderOffset : 10;
          ULONG TxMSS : 20;
          ULONG TxComputeIPHeaderChecksum : 1;
          ULONG TxComputeTCPChecksum : 1;
          ULONG TxComputeUDPChecksum : 1;
          ULONG TxIsEncapsulatedPacket : 1;
          ULONG TxInnerPacketOffsetsValid : 1;
          ULONG TxReserved1 : 11;
          ULONG TxInnerFrameOffset : 8;
          ULONG TxInnerIpHeaderRelativeOffset : 6;
          ULONG TxInnerIsIPv6 : 1;
          ULONG TxInnerTcpOptionsPresent : 1;
        };
        ULONG TxOffloads[2];
      };
      PD_BUFFER_VIRTUAL_SUBNET_INFO VirtualSubnetInfo;
      PD_BUFFER_8021Q_INFO          Ieee8021qInfo;
      USHORT                        GftSourceVPortId;
      ULONG                         Reserved;
      UINT64                        ProviderScratch;
    } MetaDataV0;
  };
} PD_BUFFER;

Membres

NextPDBuffer

Pointeur vers la structure de PD_BUFFER suivante dans la file d’attente.

NextPartialPDBuffer

Pointeur vers la structure de PD_BUFFER partielle suivante dans la file d’attente.

PDClientReserved

Réservé pour le système. Ne pas utiliser.

PDClientContext

Le client et le fournisseur ne sont pas autorisés à modifier ce champ. Si un client a alloué le PD_BUFFER avec une valeur différente de zéro pour ClientContextSize, le PDClientContext fait référence à une taille de mémoire tampon de ClientContextSize. Sinon, ce champ est NULL.

DataBufferVirtualAddress

Ce champ représente l’adresse que les hôtes et les logiciels peuvent utiliser pour accéder au contenu du paquet ou le modifier. Les données de paquets réelles se situent toujours dans DataBufferVirtualAddress+DataStart. Le fournisseur et la plateforme ne modifient jamais la valeur de ce champ après l’initialisation PD_BUFFER .

DataBufferDmaLogicalAddress

Ce champ représente l’emplacement de mémoire logique utilisé pour stocker les données du paquet. Le fournisseur doit utiliser pour DMA. Les données de paquets réelles se situent toujours dans DataBufferDmaLogicalAddress+DataStart. Le fournisseur et la plateforme ne doivent jamais modifier la valeur de ce champ après l’initialisation PD_BUFFER .

DataBufferSize

Il s’agit de la taille totale de la mémoire tampon de données allouée. Le fournisseur et la plateforme ne doivent jamais modifier la valeur de ce champ après l’initialisation PD_BUFFER . Ce type de données est ULONG au lieu d’USHORT en raison d’un déchargement d’envoi important.

PDClientContextSize

Lorsque cette valeur n’est pas égale à zéro, il s’agit de la taille de la mémoire tampon pointée par PDClientContext. La valeur de ce champ doit uniquement être modifiée par la plateforme. La plateforme ne modifie pas la valeur de ce champ après l’allocation PD_BUFFER .

Attributes

Les attributs ne doivent jamais être modifiés par le fournisseur. Le tableau ci-dessous répertorie les attributs que cette structure PD_BUFFER peut avoir.

Attribut Description
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Cet attribut est défini pour un PD_BUFFER alloué avec sa propre mémoire tampon de données associée. Les attributs PD_BUFFER ne doivent jamais être modifiés par des clients ou des fournisseurs.

Flags

Le tableau suivant répertorie les indicateurs que cette structure PD_BUFFER peut avoir.

Indicateur Description
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD Indique que cette mémoire tampon est la tête des paquets partiels.

DataStart

Ce champ indique où le paquet démarre par rapport à l’adresse de départ d’origine de la mémoire tampon de données allouée. Le fournisseur ne doit jamais modifier ce champ. Le fournisseur ajoute cette valeur à la valeur DataBufferDmaLogicalAddress pour dériver l’adresse DMA cible réelle pour la réception/la transmission de paquets. Par exemple, la valeur de l’adresse DMA cible dans le descripteur de réception/transmission matériel doit être définie sur DataBufferDmaLogicalAddress+DataStart lorsqu’un PD_BUFFER est publié dans une file d’attente de réception/transmission.

DataLength

Longueur des données de paquets de ce ou de paquets partiels.

MetaDataV0

MetaDataV0.RxFilterContext

Le fournisseur définit cette valeur sur la valeur de contexte de filtre obtenue à partir du filtre correspondant qui a dirigé le paquet vers la file d’attente de réception. Les valeurs de contexte de filtre sont spécifiées par les clients lors de la configuration des filtres.

MetaDataV0.GftFlowEntryId

Si l’un des bits RxGftExceptionPacket, RxGftCopyPacket ou RxGftSamplePacket est défini, la valeur RxFilterContext est remplacée par une valeur ID d’entrée de flux GFT.

MetaDataV0.RxHashValue

Valeur de hachage calculée pour le paquet entrant qui est dirigé vers la file d’attente de réception à l’aide de RSS.

MetaDataV0.RxIPHeaderChecksumSucceeded

Champ de déchargement RX courant qui indique si la somme de contrôle d’en-tête IP a réussi.

MetaDataV0.RxTCPChecksumSucceeded

Champ de déchargement RX commun qui indique si la somme de contrôle TCP a réussi.

MetaDataV0.RxUDPChecksumSucceeded

Champ de déchargement RX commun qui indique si la somme de contrôle UDP a réussi.

MetaDataV0.RxIPHeaderChecksumFailed

Champ de déchargement RX courant qui indique si la somme de contrôle d’en-tête IP a échoué.

MetaDataV0.RxTCPChecksumFailed

Champ de déchargement RX courant qui indique si la somme de contrôle TCP a échoué.

MetaDataV0.RxUDPChecksumFailed

Champ de déchargement RX courant qui indique si la somme de contrôle UDP a échoué.

MetaDataV0.RxHashComputed

Champ de déchargement RX courant qui indique si le hachage est calculé.

MetaDataV0.RxHashWithL4PortNumbers

Champ de déchargement RX courant qui indique que le hachage est calculé avec des numéros de port L4.

MetaDataV0.RxGftDirectionIngress

MetaDataV0.RxGftExceptionPacket

Champ de déchargement RX courant qui indique qu’il s’agit d’un paquet d’exception GFT.

MetaDataV0.RxGftCopyPacket

Champ de déchargement RX courant qui indique qu’il s’agit d’un paquet de copie GFT.

MetaDataV0.RxGftSamplePacket

Champ de déchargement RX courant qui indique qu’il s’agit d’un exemple de paquet GFT.

MetaDataV0.RxReserved1

Réservé.

MetaDataV0.RxCoalescedSegCount

Champ de déchargement RX commun qui contient la quantité de segments coalescés.

MetaDataV0.RxRscTcpTimestampDelta

Champ de déchargement RX courant qui contient la différence d’horodatage RSC et TCP.

MetaDataV0.RxOffloads[2]

Les décharges RX pour cette mémoire tampon.

MetaDataV0.TxIsIPv4

Champ de déchargement TX courant qui indique que ce paquet est IPv4.

MetaDataV0.TxIsIPv6

Champ de déchargement TX courant qui indique que ce paquet est IPv6.

MetaDataV0.TxTransportHeaderOffset

Champ de déchargement TX courant qui contient le décalage d’en-tête du paquet.

MetaDataV0.TxMSS

Champ de déchargement TX courant qui contient la taille de segment maximale de ce paquet.

MetaDataV0.TxComputeIPHeaderChecksum

Champ de déchargement TX courant qui indique que la somme de contrôle d’en-tête IP est calculée.

MetaDataV0.TxComputeTCPChecksum

Champ de déchargement TX courant qui indique que la somme de contrôle TCP est calculée.

MetaDataV0.TxComputeUDPChecksum

Champ de déchargement TX commun qui indique que la somme de contrôle UDP est calculée.

MetaDataV0.TxIsEncapsulatedPacket

Champ de déchargement TX courant qui indique que le paquet est encapsulé.

MetaDataV0.TxInnerPacketOffsetsValid

Champ de déchargement TX courant qui indique que les décalages de paquets internes sont valides.

MetaDataV0.TxReserved1

Réservé.

MetaDataV0.TxInnerFrameOffset

Champ de déchargement TX courant qui contient le décalage d’image interne.

MetaDataV0.TxInnerIpHeaderRelativeOffset

Champ de déchargement TX courant qui contient le décalage relatif de l’en-tête IP interne.

MetaDataV0.TxInnerIsIPv6

Champ de déchargement TX courant qui indique que le paquet interne est IPv6.

MetaDataV0.TxInnerTcpOptionsPresent

Champ de déchargement TX courant qui indique que les options TCP internes sont présentes.

MetaDataV0.TxOffloads[2]

Décharges TX pour cette mémoire tampon.

MetaDataV0.VirtualSubnetInfo

Informations de sous-réseau virtuel.

MetaDataV0.Ieee8021qInfo

Informations IEEE 802.1Q.

MetaDataV0.GftSourceVPortId

ID de port virtuel source GFT.

MetaDataV0.Reserved

Réservé pour le système.

MetaDataV0.ProviderScratch

Champ de travail que le fournisseur de pdd peut utiliser à ses propres fins pendant que le PD_BUFFER se trouve dans la file d’attente du fournisseur (en d’autres termes, publié par le client, mais pas encore vidé par le client). Une fois le PD_BUFFER vidé par le client, il n’y a aucune garantie que le contenu de ce champ sera conservé.

Remarques

Si un paquet L2 est représenté par plusieurs structures PD_BUFFER , la première PD_BUFFER doit avoir l’indicateur de PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER défini et le champ NextPartialPDBuffer doit pointer vers les structures PD_BUFFER partielles qui constituent le paquet entier. Chacune des structures PD_BUFFER partielles doit pointer vers la PD_BUFFER partielle suivante à l’aide du nextPartialPDBuffer par opposition au champ NextPDBuffer. Le champ NextPDBuffer doit avoir la valeur NULL dans toutes les structures PD_BUFFER partielles, à l’exception de la mémoire tampon principale. L’indicateur PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER doit être effacé pour toutes les structures de PD_BUFFER partielles à l’exception de la mémoire tampon principale. La dernière PD_BUFFER partielle doit avoir le champ NextPartialPDBuffer défini sur NULL. La longueur totale du paquet L2 est la somme des champs DataLength de chaque PD_BUFFER partiel. Le PD_BUFFER principal doit contenir jusqu’à et y compris l’en-tête de transport IP (TCP, UDP, SCTP, etc.). Dans le cas d’une encapsulation ou d’une double encapsulation, l’en-tête de transport IP le plus interne doit être contenu dans le PD_BUFFER principal.

Lors de la publication de PD_BUFFER structures pour recevoir des files d’attente, DataLength est ignoré par le fournisseur (pour plus d’informations, consultez la description receiveDataLength dans la structure NDIS_PD_QUEUE_PARAMETERS ). Lorsque le drainage est terminé PD_BUFFER structures des files d’attente de réception, le fournisseur stocke la longueur du paquet reçu dans le champ DataLength. La longueur n’inclut pas fcs ni les en-têtes 801Q supprimés. Lors de la publication PD_BUFFER structures pour transmettre des files d’attente, DataLength indique la longueur du paquet à envoyer. Une fois le drainage terminé PD_BUFFER structures des files d’attente de transmission, le fournisseur laisse le champ DataLength non modifié.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 10
Serveur minimal pris en charge Windows Server 2016
En-tête ndis.h