Поделиться через


структура 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 структура.

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

Flags

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

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

DataStart

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

DataLength

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

MetaDataV0

MetaDataV0.RxFilterContext

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

MetaDataV0.GftFlowEntryId

Если задано одно из битов RxGftExceptionPacket или RxGftCopyPacket или RxGftSamplePacket, значение RxFilterContext перезаписывается со значением идентификатора записи потока 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 структуры, кроме головного буфера, должны очистить флаг PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER. Последний частичный PD_BUFFER должен иметь значение NULL в поле NextPartialPDBuffer. Общая длина пакета 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