структура PD_BUFFER (ndis.h)

Эта структура представляет пакет PacketDirect (PD) или часть пакета PD в очереди.

Синтаксис

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;

Члены

NextPDBuffer

Указатель на следующую PD_BUFFER структуру в очереди.

NextPartialPDBuffer

Указатель на следующую часть PD_BUFFER структуру в очереди.

PDClientReserved

Зарезервировано для системного использования. Не используйте.

PDClientContext

Клиенту и поставщику не разрешено изменять это поле. Если клиент выделил PD_BUFFER с ненулевым значением для ClientContextSize, то PDClientContext ссылается на размер буфера ClientContextSize. В противном случае это поле имеет значение NULL.

DataBufferVirtualAddress

Это поле представляет адрес, который узлы и программное обеспечение могут использовать для доступа к содержимому пакета или его изменения. Фактические данные пакета всегда доступны на странице DataBufferVirtualAddress+DataStart. Поставщик и платформа никогда не изменяют значение этого поля после инициализации PD_BUFFER .

DataBufferDmaLogicalAddress

Это поле представляет расположение логической памяти, используемое для хранения данных пакета. Поставщик должен использовать для DMA. Фактические данные пакета всегда доступны в dataBufferDmaLogicalAddress+DataStart. Поставщик и платформа никогда не должны изменять значение этого поля после инициализации PD_BUFFER .

DataBufferSize

Это общий размер выделенного буфера данных. Поставщик и платформа никогда не должны изменять значение этого поля после инициализации PD_BUFFER . Этот тип данных является ULONG вместо USHORT из-за большой разгрузки отправки.

PDClientContextSize

Если это значение не равно нулю, это размер буфера, на который указывает PDClientContext. Значение этого поля должно быть изменено только платформой. Платформа не изменяет значение этого поля после выделения PD_BUFFER .

Attributes

Атрибуты никогда не должны изменяться поставщиком. В таблице ниже перечислены атрибуты, которые могут быть у этой структуры PD_BUFFER .

attribute Описание
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER Этот атрибут будет задан для PD_BUFFER , выделенного с собственным сопровождающим буфером данных. Атрибуты PD_BUFFER никогда не должны изменяться клиентами или поставщиками.

Flags

В следующей таблице перечислены флаги, которые может иметь эта PD_BUFFER структура.

Flag Описание
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD Указывает, что этот буфер является головой частичных пакетов.

DataStart

Это поле указывает, где начинается пакет относительно исходного начального адреса выделенного буфера данных. Поставщик никогда не должен изменять это поле. Поставщик добавляет это значение к значению DataBufferDmaLogicalAddress, чтобы получить фактический целевой адрес DMA для приема и передачи пакетов. Например, целевой адрес DMA в аппаратном дескрипторе приема и передачи должен иметь значение DataBufferDmaLogicalAddress+DataStart при отправке PD_BUFFER в очередь приема и передачи.

DataLength

Длина этого пакета или частичных данных пакета.

MetaDataV0

MetaDataV0.RxFilterContext

Поставщик задает значение контекста фильтра, полученное из соответствующего фильтра, который перенаправил пакет в очередь получения. Значения контекста фильтра задаются клиентами при настройке фильтров.

MetaDataV0.GftFlowEntryId

Если задан один из битов RxGftExceptionPacket или RxGftCopyPacket или RxGftSamplePacket, значение RxFilterContext перезаписывается значением id записи потока GFT.

MetaDataV0.RxHashValue

Хэш-значение, вычисленное для входящего пакета, который отправляется в очередь получения с помощью RSS.

MetaDataV0.RxIPHeaderChecksumSucceeded

Общее поле разгрузки RX, указывающее, успешно ли выполнена контрольная сумма заголовка IP-адреса.

MetaDataV0.RxTCPChecksumSucceeded

Общее поле разгрузки RX, указывающее, успешно ли выполнена контрольная сумма TCP.

MetaDataV0.RxUDPChecksumSucceeded

Общее поле разгрузки RX, указывающее, успешно ли выполнена контрольная сумма UDP.

MetaDataV0.RxIPHeaderChecksumFailed

Общее поле разгрузки RX, указывающее, не удалось ли выполнить контрольную сумму заголовка IP.

MetaDataV0.RxTCPChecksumFailed

Общее поле разгрузки RX, указывающее, не удалось ли выполнить контрольную сумму TCP.

MetaDataV0.RxUDPChecksumFailed

Общее поле разгрузки RX, указывающее, не удалось ли выполнить контрольную сумму UDP.

MetaDataV0.RxHashComputed

Общее поле разгрузки RX, указывающее, вычисляется ли хэш.

MetaDataV0.RxHashWithL4PortNumbers

Общее поле разгрузки RX, указывающее, что хэш вычисляется с номерами портов L4.

MetaDataV0.RxGftDirectionIngress

MetaDataV0.RxGftExceptionPacket

Общее поле разгрузки RX, указывающее, что это пакет исключений GFT.

MetaDataV0.RxGftCopyPacket

Общее поле разгрузки RX, указывающее, что это пакет копирования GFT.

MetaDataV0.RxGftSamplePacket

Общее поле разгрузки RX, указывающее, что это пример пакета GFT.

MetaDataV0.RxReserved1

Зарезервировано.

MetaDataV0.RxCoalescedSegCount

Общее поле разгрузки RX, содержащее количество объединенных сегментов.

MetaDataV0.RxRscTcpTimestampDelta

Общее поле разгрузки RX, содержащее разницу между метками времени RSC и TCP.

MetaDataV0.RxOffloads[2]

Разгрузка RX для этого буфера.

MetaDataV0.TxIsIPv4

Общее поле разгрузки TX, указывающее, что этот пакет является IPv4.

MetaDataV0.TxIsIPv6

Общее поле разгрузки TX, указывающее, что этот пакет является IPv6.

MetaDataV0.TxTransportHeaderOffset

Общее поле разгрузки TX, содержащее смещение заголовка пакета.

MetaDataV0.TxMSS

Общее поле разгрузки TX, содержащее максимальный размер сегмента этого пакета.

MetaDataV0.TxComputeIPHeaderChecksum

Общее поле разгрузки TX, указывающее, что вычисляется контрольная сумма ip-заголовка.

MetaDataV0.TxComputeTCPChecksum

Общее поле разгрузки TX, указывающее, что вычисляется контрольная сумма TCP.

MetaDataV0.TxComputeUDPChecksum

Общее поле разгрузки TX, указывающее, что вычисляется контрольная сумма UDP.

MetaDataV0.TxIsEncapsulatedPacket

Общее поле разгрузки TX, указывающее, что пакет инкапсулирован.

MetaDataV0.TxInnerPacketOffsetsValid

Общее поле разгрузки TX, указывающее, что смещения внутренних пакетов допустимы.

MetaDataV0.TxReserved1

Зарезервировано.

MetaDataV0.TxInnerFrameOffset

Общее поле разгрузки TX, содержащее смещение внутреннего кадра.

MetaDataV0.TxInnerIpHeaderRelativeOffset

Общее поле разгрузки TX, содержащее относительное смещение внутреннего ip-заголовка.

MetaDataV0.TxInnerIsIPv6

Общее поле разгрузки TX, указывающее, что внутренний пакет имеет IPv6.

MetaDataV0.TxInnerTcpOptionsPresent

Общее поле разгрузки TX, указывающее на наличие внутренних параметров TCP.

MetaDataV0.TxOffloads[2]

Разгрузки TX для этого буфера.

MetaDataV0.VirtualSubnetInfo

Сведения о виртуальной подсети.

MetaDataV0.Ieee8021qInfo

Сведения о IEEE 802.1Q.

MetaDataV0.GftSourceVPortId

Идентификатор исходного виртуального порта GFT.

MetaDataV0.Reserved

Зарезервировано для системного использования.

MetaDataV0.ProviderScratch

Временное поле, которое поставщик PD может использовать для собственных целей, пока PD_BUFFER находится в очереди поставщика (иными словами, размещенное клиентом, но еще не истощаемое клиентом). После очистки PD_BUFFER клиентом нет никакой гарантии, что содержимое этого поля будет сохранено.

Комментарии

Если пакет L2 представлен несколькими структурами PD_BUFFER , первый PD_BUFFER должен иметь флаг PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER, а поле NextPartialPDBuffer должно указывать на частичные PD_BUFFER структуры, составляющие весь пакет. Каждая из частичных PD_BUFFER структур должна указывать на следующую частичную PD_BUFFER с помощью nextPartialPDBuffer, а не на поле NextPDBuffer. Поле NextPDBuffer должно иметь значение NULL во всех частичных PD_BUFFER структурах, кроме буфера головы. Флаг PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER должен быть снят для всех частичных PD_BUFFER структур, кроме головного буфера. Для последнего частичного PD_BUFFER поле NextPartialPDBuffer должно иметь значение NULL. Общая длина пакета L2 — это сумма полей DataLength из каждого частичного PD_BUFFER. Головной PD_BUFFER должен содержать до заголовка ip-транспорта (TCP, UDP, SCTP и т. д.) включительно. В случае инкапсуляции или двойной инкапсуляции верхний заголовок транспорта IP-адресов должен содержаться в головном PD_BUFFER.

При публикации PD_BUFFER структур для получения очередей DataLength игнорируется поставщиком (дополнительные сведения см. в описании ReceiveDataLength в структуре NDIS_PD_QUEUE_PARAMETERS ). При очистке завершенных PD_BUFFER структур из очередей получения поставщик сохраняет длину полученного пакета в поле DataLength. Длина не включает fcs или какие-либо урезаемые заголовки 801Q. При публикации PD_BUFFER структур для передачи очередей DataLength обозначает длину отправляемого пакета. При завершении очистки PD_BUFFER структур из очередей передачи поставщик оставляет поле DataLength без изменений.

Требования

Требование Значение
Минимальная версия клиента Windows 10
Минимальная версия сервера Windows Server 2016
Верхняя часть ndis.h