Bagikan melalui


Mengkloning Lalu Lintas Paket

Topik ini menjelaskan bagaimana ekstensi sakelar Hyper-V yang dapat diperluas mengkloning, atau menduplikasi, paket, dan menyuntikkannya ke jalur data sakelar yang dapat diperluas. Untuk informasi selengkapnya tentang mengkloning paket, lihat Struktur NET_BUFFER_LIST Kloning.

Catatan Halaman ini mengasumsikan bahwa Anda terbiasa dengan informasi dan diagram dalam Gambaran Umum Hyper-V Extensible Switch dan Penerusan Hibrid.

Catatan Dalam antarmuka sakelar yang dapat diperluas, driver filter NDIS dikenal sebagai ekstensi sakelar yang dapat diperluas dan tumpukan driver dikenal sebagai tumpukan driver sakelar yang dapat diperluas. Untuk informasi selengkapnya tentang ekstensi, lihat Ekstensi Sakelar Yang Dapat Diperluas Hyper-V.

Ekstensi pemfilteran dan penerusan sakelar yang dapat diperluas dapat menyuntikkan paket kloning ke jalur data masuk atau keluar sakelar yang dapat diperluas dengan mengikuti panduan berikut:

  • Ekstensi harus terlebih dahulu mengalokasikan struktur NET_BUFFER_LIST untuk paket kloning. Ekstensi kemudian harus menyalin data paket dari paket asli ke paket kloning. Untuk informasi selengkapnya tentang cara mengkloning paket, lihat Struktur turunan NET_BUFFER_LIST.

  • Setelah ekstensi mengalokasikan struktur NET_BUFFER_LIST , ekstensi harus memanggil fungsi handler AllocateNetBufferListForwardingContext untuk mengalokasikan konteks penerusan sakelar yang dapat diperluas untuk paket.

    Konteks penerusan berada dalam data out-of-band (OOB) paket. Ini berisi informasi penerusan untuk paket, seperti port sumbernya dan array dari satu atau beberapa port tujuan.

    Untuk informasi selengkapnya tentang konteks penerusan, lihat Konteks Penerusan Sakelar Yang Dapat Diperluas Hyper-V.

  • Ekstensi harus menyalin data OOB, termasuk port sumber yang ada, dari paket asli ke paket kloning dengan memanggil CopyNetBufferListInfo. Jika ekstensi berencana untuk menyuntikkan paket ke jalur data masuk, ekstensi juga harus menyalin port tujuan dari data OOB paket asli.

    Saat menyalin data OOB, ekstensi harus mengikuti panduan berikut:

    • Jika ekstensi pemfilteran berencana untuk menyuntikkan paket ke jalur data ingress, ekstensi pemfilteran harus memanggil CopyNetBufferListInfo dengan bendera NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS tidak ditentukan. Hal ini menyebabkan port tujuan paket asli tidak disalin ke paket kloning. Ketika ekstensi pemfilteran menyuntikkan paket ini ke jalur data masuk, port tujuan akan ditambahkan ke paket dengan ekstensi penerusan yang mendasar (jika diaktifkan di tumpukan driver) atau tepi miniport dari sakelar yang dapat diperluas.

    • Jika ekstensi pemfilteran berencana untuk menyuntikkan paket ke jalur data keluar, ekstensi pemfilteran harus memanggil CopyNetBufferListInfo dengan bendera NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS yang ditentukan. Ini menyebabkan port tujuan paket asli disalin ke paket kloning.

  • Jika ekstensi pemfilteran mengkloning atau menduplikasi paket yang diperoleh dari jalur data keluar, ekstensi pemfilteran dapat mengubah port tujuan untuk paket setelah memanggil CopyNetBufferListInfo dengan bendera NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS ditentukan. Untuk informasi selengkapnya tentang prosedur ini, lihat Memodifikasi Data Port Sumber Sakelar yang Dapat Diperluas Paket.

  • Jika ekstensi penerusan mengkloning atau menduplikasi paket yang diperoleh dari jalur data masuk, ekstensi tersebut harus menambahkan port tujuan baru untuk paket sebelum memasukkan paket ke jalur data masuk. Untuk informasi selengkapnya tentang prosedur ini, lihat Menambahkan Data Port Tujuan Sakelar yang Dapat Diperluas ke Paket.

  • Setelah ekstensi memanggil CopyNetBufferListInfo, paket akan diberi informasi port sumber yang sama yang terkandung dalam paket asli.

    Ekstensi dapat memanggil SetNetBufferListSource untuk mengubah informasi port sumber dalam data out-of-band (OOB) paket.

    Ekstensi mungkin ingin paket diperlakukan seolah-olah berasal dari port tertentu. Ini memungkinkan kebijakan untuk port tersebut diterapkan ke paket. Ekstensi memanggil SetNetBufferListSource untuk mengubah port sumber untuk paket.

    Namun, mungkin ada situasi di mana ekstensi mungkin ingin menetapkan pengidentifikasi port sumber paket ke NDIS_SWITCH_DEFAULT_PORT_ID. Misalnya, ekstensi mungkin ingin mengatur pengidentifikasi port sumber ke NDIS_SWITCH_DEFAULT_PORT_ID untuk paket kontrol kepemilikan yang dikirim ke perangkat di jaringan eksternal.

  • Dalam jalur data NDIS standar, data OOB sakelar yang tidak dapat diperluas sering memiliki nilai yang berbeda tergantung pada apakah paket ditunjukkan sebagai kirim atau terima. Misalnya, data OOB NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO adalah penyatuan struktur khusus kirim dan terima

    Dalam jalur data sakelar yang dapat diperluas, semua paket bergerak melalui tumpukan driver ekstensi saat mengirim dan menerima. Karena itu, data OOB sakelar yang tidak dapat diperluas dalam struktur NET_BUFFER_LIST paket akan berada dalam format kirim atau terima melalui durasi alur melalui tumpukan driver.

    Format data OOB ini tergantung pada port sakelar sumber yang dapat diperluas dari mana paket tiba di sakelar yang dapat diperluas. Jika port sumber tersambung ke adaptor jaringan eksternal, data OOB sakelar yang tidak dapat diperluas akan berada dalam format terima. Untuk port lain, data OOB ini akan dalam format kirim.

    Informasi port sumber disimpan dalam gabungan NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO dalam data OOB struktur NET_BUFFER_LIST paket. Ekstensi memperoleh data dengan menggunakan makro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .

    Catatan Jika ekstensi mengkloning struktur NET_BUFFER_LIST paket, ekstensi harus mempertimbangkan data OOB sakelar yang tidak dapat diperluas jika menambahkan atau memodifikasi data OOB. Ekstensi dapat memanggil CopyNetBufferListInfo untuk menyalin semua data OOB dari paket sumber ke paket kloning. Fungsi ini akan mempertahankan format kirim atau terima OOB saat data disalin ke paket.

  • Ketika ekstensi mengkloning paket, data paket kloning terletak di lokal, atau tepercaya, memori dalam sistem operasi induk partisi induk Hyper-V. Memori ini tidak dapat diakses oleh partisi anak. Oleh karena itu, dianggap "aman" dari pembaruan yang tidak disinkronkan oleh sistem operasi tamu yang berjalan di partisi tersebut.

    Setelah paket asli dikloning, ekstensi harus mendapatkan serikat NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO dalam paket kloning dengan menggunakan makro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . Ekstensi harus mengatur anggota IsPacketDataSafe ke TRUE. Ini menentukan bahwa semua data paket terletak di memori tepercaya.

Ekstensi pemfilteran dan penerusan harus mengikuti panduan ini untuk menyuntikkan paket kloning ke jalur data masuk atau keluar:

  • Ekstensi harus memanggil NdisFSendNetBufferLists untuk menyuntikkan paket kloning ke jalur data ingress. Ekstensi harus mengatur parameter SendFlags dengan pengaturan bendera sakelar yang dapat diperluas yang sesuai. Untuk informasi selengkapnya tentang pengaturan bendera ini, lihat Bendera Kirim dan Terima Sakelar Yang Dapat Diperluas Hyper-V.

    Ketika NDIS memanggil fungsi FilterSendNetBufferListsComplete ekstensi untuk menyelesaikan permintaan pengiriman paket kloning, ekstensi harus memanggil FreeNetBufferListForwardingContext untuk membebaskan konteks penerusan yang dialokasikan. Ekstensi harus melakukan ini sebelum membebaskan atau menggunakan kembali struktur NET_BUFFER_LIST untuk paket.

    Catatan Ekstensi harus menyuntikkan paket kloning ke jalur data masuk jika memodifikasi data paket atau port sumber untuk paket yang diperolehnya dari jalur data keluar. Ini juga harus menyuntikkan paket kloning ke jalur data masuk jika port tujuan paket tidak dipertahankan.

  • Ekstensi harus memanggil NdisFIndicateReceiveNetBufferLists untuk menyuntikkan paket kloning ke jalur data keluar. Ekstensi harus mengatur parameter ReceiveFlags dengan pengaturan bendera sakelar yang dapat diperluas yang sesuai.

    Ketika NDIS memanggil fungsi FilterReturnNetBufferLists ekstensi untuk menyelesaikan permintaan terima paket kloning, ekstensi harus memanggil FreeNetBufferListForwardingContext sebelum membebaskan atau menggunakan kembali struktur NET_BUFFER_LIST untuk paket.

    Catatan Sebelum ekstensi penerusan memanggil NdisFIndicateReceiveNetBufferLists, ekstensi tersebut harus menentukan port tujuan paket kloning dan menambahkan data ini ke data OOB paket.

  • Jika ekstensi mengkloning struktur NET_BUFFER_LIST paket, ekstensi harus mempertahankan kepemilikan struktur NET_BUFFER_LIST paket asli sampai permintaan kirim atau terima paket kloning selesai. Ekstensi harus menggunakan anggota ParentNetBufferList dari struktur NET_BUFFER_LIST paket kloning untuk menautkan ke struktur NET_BUFFER_LIST paket asli.

    Catatan Di NDIS 6.30 (Windows Server 2012), ekstensi dapat menggunakan anggota ParentNetBufferList untuk menautkan ke paket asli, tetapi tidak diperlukan untuk melakukannya. Di NDIS 6.40 (Windows Server 2012 R2) dan yang lebih baru, ekstensi diperlukan untuk menggunakan anggota ParentNetBufferList untuk menautkan ke paket asli.

    Setelah permintaan kirim atau terima paket kloning selesai, ekstensi harus menyelesaikan permintaan kirim atau terima paket asli.

    Catatan Jika ekstensi telah mengkloning struktur NET_BUFFER_LIST paket, ekstensi dapat menyelesaikan permintaan kirim atau terima paket asli setelah dikloning.

  • Jika ekstensi mengkloning paket, ekstensi dapat menyelesaikan permintaan kirim atau terima paket asli segera setelah dikloning.

Jika ekstensi penerusan atau pemfilteran mendapatkan paket di jalur data keluar, ekstensi tersebut tidak dapat menyuntikkan versi kloning paket di jalur data ini jika ekstensi memodifikasi data paket atau mengubah port sumber. Namun, ekstensi dapat menyuntikkan paket ini ke jalur data ingress. Ini memungkinkan paket diteruskan dan difilter dengan benar melalui jalur data sakelar yang dapat diperluas.

Catatan Ekstensi pemfilteran hanya dapat menyuntikkan paket kloning ke jalur data masuk jika port tujuan paket tidak dipertahankan.

Misalnya, asumsikan bahwa paket dengan beberapa port tujuan diperoleh di jalur data keluar sakelar yang dapat diperluas. Jika satu port tujuan memerlukan penanganan khusus, seperti enkapulasi data, ekstensi penerusan atau pemfilteran menangani ini dengan mengikuti langkah-langkah berikut:

  1. Kecualikan pengiriman paket ke port yang memerlukan penanganan khusus. Ekstensi melakukan ini dengan mengatur anggota IsExcluded dari struktur NDIS_SWITCH_PORT_DESTINATION port tujuan ke nilai satu. Untuk informasi selengkapnya tentang prosedur ini, lihat Mengecualikan Pengiriman Paket ke Port Tujuan Switch yang Dapat Diperluas.

  2. Kloning paket asli dan lakukan penanganan data paket yang diperlukan.

    Catatan Ekstensi pemfilteran tidak boleh menambahkan port tujuan untuk paket kloning. Data ini akan ditambahkan nanti oleh ekstensi penerusan atau tepi miniport dari sakelar yang dapat diperluas.

  3. Teruskan paket asli pada jalur data keluar dengan memanggil NdisMIndicateReceiveNetBufferLists.

  4. Masukkan paket kloning pada jalur data masuk dengan memanggil NdisFSendNetBufferLists.

Untuk informasi selengkapnya tentang jalur data ingress dan egress switch yang dapat diperluas, lihat Jalur Data Hyper-V Extensible Switch.

Catatan Menangkap ekstensi tidak dapat mengkloning lalu lintas paket. Namun, mereka dapat berasal dari lalu lintas paket. Untuk informasi selengkapnya, lihat Lalu Lintas Paket Asal.