Bagikan melalui


Fungsi FwpsConstructIpHeaderForTransportPacket0 (fwpsk.h)

Fungsi FwpsConstructIpHeaderForTransportPacket0 dipanggil oleh callout untuk membangun header IP baru atau untuk membangun kembali header paket IP yang sudah ada sebelumnya hanya untuk satu buffer net.

CatatanFwpsConstructIpHeaderForTransportPacket0 adalah versi spesifik dari FwpsConstructIpHeaderForTransportPacket. Lihat Nama Version-Independent WFP dan Menargetkan Versi Windows Tertentu untuk informasi selengkapnya.
 

Sintaks

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

Parameter

[in, out] netBufferList

Penunjuk ke struktur NET_BUFFER_LIST yang menjelaskan data paket lapisan transportasi kloning tempat header IP baru akan dibangun atau dibangun kembali. Untuk membuat header IP baru, temukan offset struktur NET_BUFFER_LIST kloning di awal header transportasi. Untuk membangun kembali header paket IP yang sudah ada sebelumnya, temukan offset di awal header IP.

headerIncludeHeaderLength

Jika struktur NET_BUFFER_LIST yang ditunjukkan oleh NetBufferList sudah berisi header IP, menunjukkan ukuran total, dalam byte, dari header IP yang ada (jika ada). Jika NetBufferList tidak berisi header IP, headerIncludeHeaderSize adalah nol. Jika tidak, nilai parameter ini sama dengan anggota ipHeaderSize dari FWPS_INCOMING_METADATA_VALUES0 struktur yang diteruskan ke fungsi callout classifyFn driver callout. Perhatikan bahwa header ekstensi untuk header IPv6 yang ada akan dihapus ketika fungsi ini dipanggil, meskipun opsi IPv4 akan dipertahankan. Untuk informasi selengkapnya, lihat Keterangan.

[in] addressFamily

Salah satu keluarga alamat berikut:

AF_INET

Keluarga alamat IPv4.

AF_INET6

Keluarga alamat IPv6.

[in] sourceAddress

Penunjuk ke alamat IP sumber yang akan menjadi bagian dari header IP yang akan dibangun. Untuk IPv4, alamatnya adalah 4 byte. Untuk IPv6, alamatnya adalah 16 byte. Byte alamat sumber selalu dalam urutan byte jaringan.

[in] remoteAddress

Penunjuk ke buffer yang menentukan alamat IP jarak jauh yang akan menjadi bagian dari header IP yang akan dibangun.

Buffer dapat berisi alamat IPv4 (4 byte) atau alamat IPv6 (16 byte), dan alamat harus ditentukan dalam urutan byte jaringan. Versi IP harus cocok dengan parameter addressFamily .

[in] nextProtocol

Menentukan jenis protokol IPPROTO dari header IP baru yang akan dibangun. Untuk informasi selengkapnya tentang enumerasi IPPROTO, lihat AF_INET atau AF_INET6.

[in, optional] endpointHandle

Handel opsional yang menunjukkan titik akhir transportasi tumpukan di jalur kirim data tempat paket akan disuntikkan. Handel titik akhir ini disediakan untuk panggilan melalui anggota transportEndpointHandle FWPS_INCOMING_METADATA_VALUES0 struktur yang diteruskan ke fungsi callout classifyFn driver callout.

[in, optional] controlData

Penunjuk opsional ke buffer yang berisi data kontrol soket yang ditentukan oleh fungsi WSASendMsg , yang dijelaskan dalam dokumentasi Microsoft Windows SDK. Untuk informasi tentang jenis WSACMSGHDR, lihat CMSGHDR.

Jika ada, data kontrol soket disediakan untuk callout dengan anggota controlData FWPS_INCOMING_METADATA_VALUES0 struktur yang diteruskan ke fungsi callout classifyFn driver callout.

Jika data kontrol soket bukan NULL, data harus disalin secara mendalam dalam implementasi driver callout dari fungsi classifyFn , dan buffer controlData harus tetap valid sampai fungsi penyelesaian injeksi dipanggil.

[in] controlDataLength

Panjangnya, dalam byte, dari parameter controlData .

[in] flags

Bendera yang menentukan apakah NBL ditujukan untuk jalur kirim atau terima. Parameter bendera dapat memiliki nilai berikut:

Nilai Makna
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Ketika diatur, bendera ini menentukan bahwa NBL dimaksudkan untuk jalur pengiriman.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Ketika diatur, bendera ini menentukan bahwa NBL dimaksudkan untuk jalur penerimaan.

Untuk driver callout yang mendukung USO atau URO, wajib untuk mengatur parameter ini ke salah satu nilai ini. Driver callout lainnya dapat mengatur parameter ini ke nol. Bendera ini hanya didukung pada Windows Server 2022 23H2 dan yang lebih baru. Pada rilis Windows sebelumnya, driver callout harus selalu mengatur parameter ini ke nol.

reserved

Dicadangkan. Driver callout harus mengatur parameter ini ke NULL.

[in, optional] interfaceIndex

Indeks antarmuka tempat data paket asli diterima. Driver callout harus menggunakan nilai indeks antarmuka yang diteruskan sebagai salah satu nilai data masuk ke fungsi callout classifyFn untuk parameter ini. Parameter ini bersifat opsional dan bisa nol.

[in, optional] subInterfaceIndex

Indeks sub-antarmuka tempat data paket asli diterima. Driver callout harus menggunakan nilai indeks sub-antarmuka yang diteruskan sebagai salah satu nilai data masuk ke fungsi callout classifyFn untuk parameter ini jika paket akan disuntikkan ke subinterface yang sama tempat paket asli ditunjukkan. Parameter ini bersifat opsional dan bisa nol.

Nilai kembali

Fungsi FwpsConstructIpHeaderForTransportPacket0 mengembalikan salah satu kode NTSTATUS berikut.

Menampilkan kode Deskripsi
STATUS_SUCCESS
Header IP baru berhasil dibangun.
Kode status lainnya
Terjadi kesalahan.

Keterangan

Dari daftar buffer bersih yang dikloning pada lapisan transportasi keluar WFP (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 membuat header baru untuk setiap buffer net yang merupakan bagian dari rantai daftar buffer net. Fungsi ini juga dapat digunakan untuk membangun kembali header IP paket yang sudah ada sebelumnya, dalam hal ini daftar buffer net hanya boleh berisi satu buffer net.

Fungsi ini berguna ketika header IP belum dibuat, tetapi alamat IP sumber atau port sumber harus dimodifikasi dari lapisan transportasi. Meskipun biasanya dimungkinkan untuk menunggu untuk melakukan modifikasi tersebut sampai paket mencapai lapisan Jaringan, ini tidak dapat dilakukan di lingkungan IPsec di mana paket IP dienkripsi atau ditandatangani secara digital sebelum mencapai lapisan Jaringan.

Alamat IP sumber dapat dimodifikasi menjadi alamat IP lain yang ditentukan secara lokal atau alamat lain yang tidak ada di komputer lokal. Paket yang dimodifikasi kemudian dapat dikirim atau disuntikkan ke jalur data penerima atau penerusan.

Jika parameter endpointHandle bukan nol ditentukan, status sesi (opsi soket), jika ada, yang terkait dengan soket akan digunakan untuk membangun setiap header IP baru. Demikian pula, jika opsi soket tambahan ditentukan dengan parameter controlData dan controlDataLength , opsi tersebut akan digunakan untuk membangun setiap header IP baru.

Jika daftar buffer net input dikloning dari lapisan transportasi WFP masuk, atau jika dibuat sebagai akibat dari operasi pengiriman mentah, buffer net sudah akan berisi header IP. Dalam hal ini, ketika fungsi ini dipanggil, opsi IPv4 akan dipertahankan di header IP baru, tetapi header AH/ESP dan header ekstensi IPv6 akan dihapus. Karena tumpukan TCP/IP mempertahankan header AH/ESP setelah pemrosesan IPsec, paket yang telah ditunjukkan oleh WFP dan dikloning oleh callout tidak dapat dengan mudah disuntikkan ke jalur data penerima. Akibatnya fungsi ini berguna untuk membangun kembali paket yang diproses IPsec yang akan disuntikkan ke jalur data penerima dengan fungsi FwpsInjectTransportReceiveAsync0 .

Untuk sesi yang disertakan header; misalnya, untuk memfilter lalu lintas Generic Routing Encapsulation (GRE) (protokol IP 47) yang dikirim pada soket mentah dari lapisan transportasi keluar, gunakan prosedur berikut sebelum Anda memanggil FwpsConstructIpHeaderForTransportPacket0:

  1. Mengkloning daftar buffer net dengan memanggil Fungsi FwpsAllocateCloneNetBufferList0 .
  2. Jika anggota headerIncludeHeaderLength dari struktur FWPS_INCOMING_METADATA_VALUES0 yang ditunjukkan oleh parameter inMetaValues fungsi classifyFn lebih besar dari nol, mundur daftar buffer bersih kloning dengan jumlah tersebut; misalnya, dengan panggilan ke NdisRetreatNetBufferListDataStart.
  3. Salin buffer yang ditunjukkan oleh anggota headerIncludeHeader dari FWPS_INCOMING_METADATA_VALUES0 ke wilayah yang baru mundur dari daftar buffer bersih kloning. Ukuran buffer harus sama dengan nilai headerIncludeHeaderLength.
  4. Panggil FwpsConstructIpHeaderForTransportPacket0 yang memiliki parameter NetBufferList yang menunjuk ke daftar buffer net kloning dan parameter headerIncludeHeaderSize diatur ke nilai headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 menonaktifkan dukungan offload pengiriman besar (LSO) dan checksum offload untuk daftar buffer net yang dihasilkan. Checksum penuh dihitung untuk protokol tingkat atas (TCP, UDP, dan ICMP). Checksum IP dihitung ulang ketika header IP direkonstruksi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia dimulai dengan Windows Server 2008.
Target Platform Universal
Header fwpsk.h (termasuk Fwpsk.h)
Pustaka Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Lihat juga

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn