Partager via


structure_BUFFER (ndis.h)

Cette structure représente un paquet PacketDirect () ou une partie d’un paquet 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 _BUFFER suivante dans la file d’attente.

NextPartialPDBuffer

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

PDClientReserved

Réservé à l’utilisation du système. N’utilisez pas.

PDClientContext

Le client et le fournisseur ne sont pas autorisés à modifier ce champ. Si un client a alloué la _BUFFER avec une valeur non nulle pour ClientContextSize, le PDClientContext fait référence à une taille de mémoire tampon de ClientContextSize. Sinon, ce champ a la valeur NULL.

DataBufferVirtualAddress

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

DataBufferDmaLogicalAddress

Ce champ représente l’emplacement de mémoire logique utilisé pour stocker les données de paquets. Le fournisseur doit utiliser pour DMA. Les données de paquet réelles sont toujours au niveau de DataBufferDmaLogicalAddress+DataStart. Le fournisseur et la plateforme ne doivent jamais modifier la valeur de ce champ après l’initialisation _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 _BUFFER. Ce type de données est ULONG au lieu de USHORT en raison d’un déchargement d’envoi volumineux.

PDClientContextSize

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

Attributes

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

Attribut Description
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Une _BUFFER allouée avec sa propre mémoire tampon de données associée aura ce jeu d’attributs. Les attributs _BUFFER ne doivent jamais être modifiés par des clients ou des fournisseurs.

Flags

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

Drapeau 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 d’adresse DMA cible dans le descripteur de réception/transmission matériel doit être définie sur DataBufferDmaLogicalAddress+DataStart lorsqu’un _BUFFER est publié dans une file d’attente de réception/transmission.

DataLength

Longueur du paquet ou des données de paquets partiels.

MetaDataV0

MetaDataV0.RxFilterContext

Le fournisseur définit cette valeur sur la valeur du 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 ou RxGftCopyPacket ou RxGftSamplePacket est défini, la valeur RxFilterContext est remplacée par une valeur d’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 courant qui indique si la somme de contrôle TCP a réussi.

MetaDataV0.RxUDPChecksumSucceeded

Champ de déchargement RX courant 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 les 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 courant 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]

Déchargement 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 maximale du segment 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 courant 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 sur le sous-réseau virtuel.

MetaDataV0.Ieee8021qInfo

Informations IEEE 802.1Q.

MetaDataV0.GftSourceVPortId

ID de port virtuel source GFT.

MetaDataV0.Reserved

Réservé à l’utilisation du système.

MetaDataV0.ProviderScratch

Champ de travail que le fournisseur peut utiliser à ses propres fins alors que le_BUFFER est assis dans la file d’attente du fournisseur (en d’autres termes, publié par le client, mais pas encore vidé par le client). Une fois que le_BUFFER est vidé par le client, il n’existe aucune garantie que le contenu de ce champ sera conservé.

Remarques

Si un paquet L2 est représenté par plusieurs structures _BUFFER, le premier _BUFFER doit avoir le jeu d’indicateurs_BUFFER_ATTR_BUILT_IN_DATA_BUFFER et le champ NextPartialPDBuffer doit pointer vers les structures partielles _BUFFER qui constituent l’ensemble du paquet. Chacune des structures de _BUFFER partielles doit pointer vers la _BUFFER partielle suivante à l’aide de NextPartialPDBuffer par opposition au champ NextPDBuffer. Le champ NextPDBuffer doit être NULL dans toutes les structures de _BUFFER partielles, à l’exception de la mémoire tampon de tête. Toutes les structures de_BUFFER partielles, à l’exception de la mémoire tampon de tête, doivent avoir l’indicateur_BUFFER_ATTR_BUILT_IN_DATA_BUFFER effacé. La dernière _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 _BUFFERpartielle. La tête _BUFFER doit contenir jusqu’à l’en-tête de transport IP (TCP, UDP, SCTP, etc.). Dans le cas de l’encapsulation ou de l’encapsulation double, l’en-tête de transport IP le plus interne doit être contenu dans la tête _BUFFER.

Lorsque vous publiez _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__QUEUE_PARAMETERS). Lors du drainage terminé _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 les en-têtes FCS ou 801Q supprimés. Lors de la publication de _BUFFER structures pour transmettre des files d’attente, DataLength indique la longueur du paquet à envoyer. Lors du drainage terminé _BUFFER structures des files d’attente de transmission, le fournisseur laisse le champ DataLength non modifié.

Exigences

Exigence Valeur
client minimum pris en charge Windows 10
serveur minimum pris en charge Windows Server 2016
d’en-tête ndis.h