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