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