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 |