estructura PD_BUFFER (ndis.h)
Esta estructura representa un paquete PacketDirect (PD) o una parte de un paquete pd en una cola.
Sintaxis
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;
Miembros
NextPDBuffer
Puntero a la siguiente estructura PD_BUFFER de la cola.
NextPartialPDBuffer
Puntero a la siguiente estructura de PD_BUFFER parcial de la cola.
PDClientReserved
Reservado para uso del sistema. No debe usarse.
PDClientContext
El cliente y el proveedor no pueden modificar este campo. Si un cliente ha asignado el PD_BUFFER con un valor distinto de cero para ClientContextSize, PDClientContext hace referencia a un tamaño de búfer de ClientContextSize. De lo contrario, este campo es NULL.
DataBufferVirtualAddress
Este campo representa la dirección que los hosts y el software pueden usar para acceder o modificar el contenido del paquete. Los datos de paquetes reales siempre se encuentra en DataBufferVirtualAddress+DataStart. El proveedor y la plataforma nunca modifican el valor de este campo después de la inicialización del PD_BUFFER .
DataBufferDmaLogicalAddress
Este campo representa la ubicación de memoria lógica utilizada para almacenar los datos del paquete. El proveedor debe usar para DMA. Los datos de paquetes reales siempre se encuentra en DataBufferDmaLogicalAddress+DataStart. El proveedor y la plataforma nunca deben modificar el valor de este campo después de la inicialización PD_BUFFER .
DataBufferSize
Este es el tamaño total del búfer de datos asignado. El proveedor y la plataforma nunca deben modificar el valor de este campo después de la inicialización PD_BUFFER . Este tipo de datos es ULONG en lugar de USHORT debido a una descarga de envío grande.
PDClientContextSize
Cuando este valor es distinto de cero, es el tamaño del búfer al que apunta PDClientContext. La plataforma solo debe modificar el valor de este campo. La plataforma no cambia el valor de este campo después de la asignación de PD_BUFFER .
Attributes
El proveedor nunca debe modificar los atributos. En la tabla siguiente se enumeran los atributos que puede tener esta estructura de PD_BUFFER .
Atributo | Descripción |
---|---|
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER | Un PD_BUFFER asignado con su propio búfer de datos adjunto tendrá este conjunto de atributos. Los atributos de PD_BUFFER nunca deben modificarse por clientes o proveedores. |
Flags
En la tabla siguiente se enumeran las marcas que puede tener esta estructura de PD_BUFFER .
Marca | Descripción |
---|---|
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD | Indica que este búfer es el encabezado de paquetes parciales. |
DataStart
Este campo indica dónde comienza el paquete en relación con la dirección inicial original del búfer de datos asignado. El proveedor nunca debe modificar este campo. El proveedor agrega este valor al valor DataBufferDmaLogicalAddress para derivar la dirección DMA de destino real para la recepción o transmisión de paquetes. Por ejemplo, el valor de dirección DMA de destino del descriptor de recepción/transmisión de hardware debe establecerse en DataBufferDmaLogicalAddress+DataStart cuando se publica un PD_BUFFER en una cola de recepción y transmisión.
DataLength
Longitud de los datos de este paquete o de paquetes parciales.
MetaDataV0
MetaDataV0.RxFilterContext
El proveedor establece esto en el valor de contexto de filtro obtenido del filtro coincidente que dirigió el paquete a la cola de recepción. Los clientes especifican los valores de contexto de filtro al configurar filtros.
MetaDataV0.GftFlowEntryId
Si se establece uno de los bits RxGftExceptionPacket o RxGftCopyPacket o RxGftSamplePacket, el valor rxFilterContext se sobrescribe con un valor de identificador de entrada de flujo de GFT.
MetaDataV0.RxHashValue
Valor hash calculado para el paquete entrante que se dirige a la cola de recepción mediante RSS.
MetaDataV0.RxIPHeaderChecksumSucceeded
Campo de descarga de RX común que indica si la suma de comprobación del encabezado IP se realizó correctamente.
MetaDataV0.RxTCPChecksumSucceeded
Campo de descarga de RX común que indica si la suma de comprobación tcp se realizó correctamente.
MetaDataV0.RxUDPChecksumSucceeded
Campo de descarga de RX común que indica si la suma de comprobación de UDP se realizó correctamente.
MetaDataV0.RxIPHeaderChecksumFailed
Campo de descarga de RX común que indica si se produjo un error en la suma de comprobación del encabezado IP.
MetaDataV0.RxTCPChecksumFailed
Campo de descarga de RX común que indica si se produjo un error en la suma de comprobación de TCP.
MetaDataV0.RxUDPChecksumFailed
Campo de descarga de RX común que indica si se produjo un error en la suma de comprobación de UDP.
MetaDataV0.RxHashComputed
Campo de descarga de RX común que indica si se calcula el hash.
MetaDataV0.RxHashWithL4PortNumbers
Un campo de descarga rx común que indica que el hash se calcula con números de puerto L4.
MetaDataV0.RxGftDirectionIngress
MetaDataV0.RxGftExceptionPacket
Un campo de descarga de RX común que indica que se trata de un paquete de excepción GFT.
MetaDataV0.RxGftCopyPacket
Un campo de descarga rx común que indica que se trata de un paquete de copia GFT.
MetaDataV0.RxGftSamplePacket
Un campo de descarga rx común que indica que se trata de un paquete de ejemplo de GFT.
MetaDataV0.RxReserved1
Reservado.
MetaDataV0.RxCoalescedSegCount
Campo de descarga de RX común que contiene la cantidad de segmentos fusionados.
MetaDataV0.RxRscTcpTimestampDelta
Un campo de descarga rx común que contiene la diferencia de marca de tiempo RSC y TCP.
MetaDataV0.RxOffloads[2]
Descargas de RX para este búfer.
MetaDataV0.TxIsIPv4
Un campo de descarga tx común que indica que este paquete es IPv4.
MetaDataV0.TxIsIPv6
Un campo de descarga TX común que indica que este paquete es IPv6.
MetaDataV0.TxTransportHeaderOffset
Campo de descarga tx común que contiene el desplazamiento de encabezado del paquete.
MetaDataV0.TxMSS
Campo de descarga tx común que contiene el tamaño máximo del segmento de este paquete.
MetaDataV0.TxComputeIPHeaderChecksum
Se calcula un campo de descarga tx común que indica que se calcula la suma de comprobación del encabezado IP.
MetaDataV0.TxComputeTCPChecksum
Un campo de descarga tx común que indica que se calcula la suma de comprobación tcp.
MetaDataV0.TxComputeUDPChecksum
Un campo de descarga tx común que indica que se calcula la suma de comprobación udp.
MetaDataV0.TxIsEncapsulatedPacket
Un campo de descarga tx común que indica que el paquete está encapsulado.
MetaDataV0.TxInnerPacketOffsetsValid
Un campo de descarga TX común que indica que los desplazamientos de paquetes internos son válidos.
MetaDataV0.TxReserved1
Reservado.
MetaDataV0.TxInnerFrameOffset
Campo de descarga tx común que contiene el desplazamiento del marco interno.
MetaDataV0.TxInnerIpHeaderRelativeOffset
Campo de descarga tx común que contiene el desplazamiento relativo del encabezado IP interno.
MetaDataV0.TxInnerIsIPv6
Un campo de descarga tx común que indica que el paquete interno es IPv6.
MetaDataV0.TxInnerTcpOptionsPresent
Un campo de descarga tx común que indica que las opciones tcp internas están presentes.
MetaDataV0.TxOffloads[2]
Tx descarga para este búfer.
MetaDataV0.VirtualSubnetInfo
Información de subred virtual.
MetaDataV0.Ieee8021qInfo
La información de IEEE 802.1Q.
MetaDataV0.GftSourceVPortId
Identificador de puerto virtual de origen de GFT.
MetaDataV0.Reserved
Reservado para uso del sistema.
MetaDataV0.ProviderScratch
Campo temporal que el proveedor de PD puede usar para sus propios fines mientras el PD_BUFFER se encuentra en la cola del proveedor (es decir, publicado por el cliente, pero aún no se ha purgado de nuevo por el cliente). Una vez que el cliente purga el PD_BUFFER, no hay ninguna garantía de que se conserve el contenido de este campo.
Comentarios
Si un paquete L2 se representa mediante varias estructuras de PD_BUFFER , el primer PD_BUFFER debe tener establecida la marca PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER y el campo NextPartialPDBuffer debe apuntar a las estructuras de PD_BUFFER parciales que constituyen todo el paquete. Cada una de las estructuras de PD_BUFFER parciales debe apuntar al siguiente PD_BUFFER parcial mediante nextPartialPDBuffer en lugar del campo NextPDBuffer. El campo NextPDBuffer debe ser NULL en todas las estructuras de PD_BUFFER parciales, excepto para el búfer principal. Todas las estructuras de PD_BUFFER parciales, excepto para el búfer principal, deben tener desactivada la marca PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER. El último PD_BUFFER parcial debe tener el campo NextPartialPDBuffer establecido en NULL. La longitud total del paquete L2 es la suma de los campos DataLength de cada PD_BUFFER parcial. La PD_BUFFER principal debe contener hasta e incluir el encabezado de transporte IP (TCP, UDP, SCTP, etc.). En el caso de la encapsulación o la encapsulación doble, el encabezado de transporte IP más interno debe estar contenido en el encabezado PD_BUFFER.
Al publicar PD_BUFFER estructuras para recibir colas, el proveedor omite DataLength (Para obtener más información, consulte la descripción ReceiveDataLength en la estructura NDIS_PD_QUEUE_PARAMETERS ). Cuando se completa la purga PD_BUFFER estructuras de las colas de recepción, el proveedor almacena la longitud del paquete recibido en el campo DataLength. La longitud no incluye FCS ni ningún encabezado 801Q quitado. Al publicar PD_BUFFER estructuras para transmitir colas, DataLength denota la longitud del paquete que se va a enviar. Al purgar las estructuras completadas PD_BUFFER de las colas de transmisión, el proveedor deja sin modificar el campo DataLength.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 10 |
Servidor mínimo compatible | Windows Server 2016 |
Encabezado | ndis.h |