struktur PD_BUFFER (ndis.h)
Struktur ini mewakili paket PacketDirect (PD), atau sebagian paket PD dalam antrean.
Sintaks
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;
Anggota
NextPDBuffer
Penunjuk ke struktur PD_BUFFER berikutnya dalam antrean.
NextPartialPDBuffer
Penunjuk ke struktur PD_BUFFER parsial berikutnya dalam antrean.
PDClientReserved
Dicadangkan untuk penggunaan sistem. Jangan gunakan.
PDClientContext
Klien dan penyedia tidak diizinkan untuk mengubah bidang ini. Jika klien telah mengalokasikan PD_BUFFER dengan nilai bukan nol untuk ClientContextSize, maka PDClientContext mengacu pada ukuran buffer ClientContextSize. Jika tidak, bidang ini NULL.
DataBufferVirtualAddress
Bidang ini mewakili alamat yang dapat digunakan host dan perangkat lunak untuk mengakses/memodifikasi konten paket. Data paket aktual selalu ada di DataBufferVirtualAddress+DataStart. Penyedia dan platform tidak pernah memodifikasi nilai bidang ini setelah inisialisasi PD_BUFFER .
DataBufferDmaLogicalAddress
Bidang ini mewakili lokasi memori logis yang digunakan untuk menyimpan data paket. Penyedia harus menggunakan untuk DMA. Data paket aktual selalu ada di DataBufferDmaLogicalAddress+DataStart. Penyedia dan platform tidak boleh memodifikasi nilai bidang ini setelah inisialisasi PD_BUFFER .
DataBufferSize
Ini adalah ukuran total buffer data yang dialokasikan. Penyedia dan platform tidak boleh memodifikasi nilai bidang ini setelah inisialisasi PD_BUFFER . Jenis data ini adalah ULONG alih-alih USHORT karena offload pengiriman besar.
PDClientContextSize
Ketika nilai ini bukan nol, itu adalah ukuran buffer yang diacu oleh PDClientContext. Nilai bidang ini hanya boleh dimodifikasi oleh platform. Platform tidak mengubah nilai bidang ini setelah alokasi PD_BUFFER .
Attributes
Atribut tidak boleh dimodifikasi oleh penyedia. Tabel di bawah ini mencantumkan atribut yang dapat dimiliki struktur PD_BUFFER ini.
Atribut | Deskripsi |
---|---|
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER | PD_BUFFER yang dialokasikan dengan buffer data yang menyertainya sendiri akan memiliki set atribut ini. Atribut PD_BUFFER tidak boleh dimodifikasi oleh klien atau penyedia. |
Flags
Tabel berikut ini mencantumkan bendera yang dapat dimiliki struktur PD_BUFFER ini.
Bendera | Deskripsi |
---|---|
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD | Menunjukkan bahwa buffer ini adalah kepala paket parsial. |
DataStart
Bidang ini menunjukkan di mana paket dimulai relatif terhadap alamat awal asli buffer data yang dialokasikan. Penyedia tidak boleh mengubah bidang ini. Penyedia menambahkan nilai ini ke nilai DataBufferDmaLogicalAddress untuk mendapatkan alamat DMA target aktual untuk penerimaan/transmisi paket. Misalnya, nilai alamat DMA target dalam deskriptor penerima/pengiriman perangkat keras harus diatur ke DataBufferDmaLogicalAddress+DataStart saat PD_BUFFER diposting ke antrean terima/kirim.
DataLength
Panjang paket ini atau data paket parsial.
MetaDataV0
MetaDataV0.RxFilterContext
Penyedia mengatur ini ke nilai konteks filter yang diperoleh dari filter yang cocok yang mengarahkan paket ke antrean terima. Nilai konteks filter ditentukan oleh klien saat mengonfigurasi filter.
MetaDataV0.GftFlowEntryId
Jika salah satu bit RxGftExceptionPacket atau RxGftCopyPacket atau RxGftSamplePacket diatur, nilai RxFilterContext ditimpa dengan nilai Id entri aliran GFT.
MetaDataV0.RxHashValue
Nilai hash dihitung untuk paket masuk yang dikemudikan ke antrean terima menggunakan RSS.
MetaDataV0.RxIPHeaderChecksumSucceeded
Bidang offload RX umum yang menunjukkan apakah checksum header IP berhasil.
MetaDataV0.RxTCPChecksumSucceeded
Bidang offload RX umum yang menunjukkan apakah checksum TCP berhasil.
MetaDataV0.RxUDPChecksumSucceeded
Bidang offload RX umum yang menunjukkan apakah checksum UDP berhasil.
MetaDataV0.RxIPHeaderChecksumFailed
Bidang offload RX umum yang menunjukkan apakah checksum header IP gagal.
MetaDataV0.RxTCPChecksumFailed
Bidang offload RX umum yang menunjukkan apakah checksum TCP gagal.
MetaDataV0.RxUDPChecksumFailed
Bidang offload RX umum yang menunjukkan apakah checksum UDP gagal.
MetaDataV0.RxHashComputed
Bidang offload RX umum yang menunjukkan apakah hash dihitung.
MetaDataV0.RxHashWithL4PortNumbers
Bidang offload RX umum yang menunjukkan hash dihitung dengan nomor port L4.
MetaDataV0.RxGftDirectionIngress
MetaDataV0.RxGftExceptionPacket
Bidang offload RX umum yang menunjukkan ini adalah paket pengecualian GFT.
MetaDataV0.RxGftCopyPacket
Bidang offload RX umum yang menunjukkan ini adalah paket salinan GFT.
MetaDataV0.RxGftSamplePacket
Bidang offload RX umum yang menunjukkan ini adalah paket sampel GFT.
MetaDataV0.RxReserved1
Dicadangkan.
MetaDataV0.RxCoalescedSegCount
Bidang offload RX umum yang berisi jumlah segmen yang digabungkan.
MetaDataV0.RxRscTcpTimestampDelta
Bidang offload RX umum yang berisi perbedaan tanda waktu RSC dan TCP.
MetaDataV0.RxOffloads[2]
Offload RX untuk buffer ini.
MetaDataV0.TxIsIPv4
Bidang offload TX umum yang menunjukkan paket ini adalah IPv4.
MetaDataV0.TxIsIPv6
Bidang offload TX umum yang menunjukkan paket ini adalah IPv6.
MetaDataV0.TxTransportHeaderOffset
Bidang offload TX umum yang berisi offset header paket.
MetaDataV0.TxMSS
Bidang offload TX umum yang berisi ukuran segmen maksimum paket ini.
MetaDataV0.TxComputeIPHeaderChecksum
Bidang offload TX umum yang menunjukkan checksum header IP dihitung.
MetaDataV0.TxComputeTCPChecksum
Bidang offload TX umum yang menunjukkan checksum TCP dihitung.
MetaDataV0.TxComputeUDPChecksum
Bidang offload TX umum yang menunjukkan checksum UDP dihitung.
MetaDataV0.TxIsEncapsulatedPacket
Bidang offload TX umum yang menunjukkan paket dienkapsulasi.
MetaDataV0.TxInnerPacketOffsetsValid
Bidang offload TX umum yang menunjukkan offset paket dalam valid.
MetaDataV0.TxReserved1
Dicadangkan.
MetaDataV0.TxInnerFrameOffset
Bidang offload TX umum yang berisi offset bingkai dalam.
MetaDataV0.TxInnerIpHeaderRelativeOffset
Bidang offload TX umum yang berisi offset relatif header IP dalam.
MetaDataV0.TxInnerIsIPv6
Bidang offload TX umum yang menunjukkan paket dalam adalah IPv6.
MetaDataV0.TxInnerTcpOptionsPresent
Bidang offload TX umum yang menunjukkan opsi TCP dalam ada.
MetaDataV0.TxOffloads[2]
Offload TX untuk buffer ini.
MetaDataV0.VirtualSubnetInfo
Informasi subnet virtual.
MetaDataV0.Ieee8021qInfo
Informasi IEEE 802.1Q.
MetaDataV0.GftSourceVPortId
ID port virtual sumber GFT.
MetaDataV0.Reserved
Dicadangkan untuk penggunaan sistem.
MetaDataV0.ProviderScratch
Bidang coretan yang dapat digunakan penyedia PD untuk tujuannya sendiri saat PD_BUFFER duduk di antrean penyedia (dengan kata lain, diposting oleh klien tetapi belum dikosongkan kembali oleh klien). Setelah PD_BUFFER dikosongkan oleh klien, tidak ada jaminan bahwa konten bidang ini akan dipertahankan.
Keterangan
Jika paket L2 diwakili oleh beberapa struktur PD_BUFFER , PD_BUFFER pertama harus memiliki set bendera PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER dan bidang NextPartialPDBuffer harus menunjuk ke struktur PD_BUFFER parsial yang merupakan seluruh paket. Setiap struktur PD_BUFFER parsial harus menunjuk ke PD_BUFFER parsial berikutnya dengan menggunakan NextPartialPDBuffer dibandingkan dengan bidang NextPDBuffer. Bidang NextPDBuffer harus NULL di semua struktur PD_BUFFER parsial kecuali untuk buffer kepala. Semua struktur PD_BUFFER parsial kecuali untuk buffer kepala harus menghapus bendera PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER. PD_BUFFER parsial terakhir harus memiliki bidang NextPartialPDBuffer yang diatur ke NULL. Panjang total paket L2 adalah jumlah bidang DataLength dari setiap PD_BUFFER parsial. Head PD_BUFFER harus berisi hingga dan termasuk header transportasi IP (TCP, UDP, SCTP, dll). Dalam kasus enkapulasi atau enkapulasi ganda, header transportasi IP paling dalam harus terkandung dalam PD_BUFFER kepala.
Saat memposting struktur PD_BUFFER untuk menerima antrean, DataLength diabaikan oleh penyedia (Untuk informasi selengkapnya lihat deskripsi ReceiveDataLength dalam struktur NDIS_PD_QUEUE_PARAMETERS ). Saat pengurasan selesai PD_BUFFER struktur dari antrean terima, penyedia menyimpan panjang paket yang diterima di bidang DataLength. Panjangnya tidak termasuk FCS atau header 801Q yang dilucuti. Saat memposting struktur PD_BUFFER untuk mengirimkan antrean, DataLength menunjukkan panjang paket yang akan dikirim. Saat pengurasan selesai PD_BUFFER struktur dari mengirimkan antrean, penyedia membiarkan bidang DataLength tidak dimodifikasi.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 10 |
Server minimum yang didukung | Server Windows 2016 |
Header | ndis.h |
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk