Menambahkan Extensible Switch Destination Port Data ke Paket
Topik ini menjelaskan bagaimana ekstensi penerusan sakelar Hyper-V yang dapat diperluas dapat menentukan pengiriman paket ke satu atau beberapa port tujuan. Ekstensi ini juga dapat meneruskan paket ke adaptor jaringan fisik individual yang terikat ke adaptor jaringan eksternal sakelar yang dapat diperluas.
Catatan Hanya ekstensi penerusan atau sakelar itu sendiri yang dapat meneruskan paket ke port sakelar yang dapat diperluas atau adaptor jaringan individual.
Gambar berikut menunjukkan jalur data untuk lalu lintas paket melalui tumpukan driver switch yang dapat diperluas untuk NDIS 6.40 (Windows Server 2012 R2) dan yang lebih baru. Kedua gambar juga menunjukkan jalur data untuk lalu lintas paket ke atau dari adaptor jaringan yang terhubung ke port sakelar yang dapat diperluas.
Gambar berikut menunjukkan jalur data untuk lalu lintas paket melalui tumpukan driver switch yang dapat diperluas untuk NDIS 6.30 (Windows Server 2012).
Setiap port tujuan sakelar yang dapat diperluas ditentukan oleh elemen NDIS_SWITCH_PORT_DESTINATION dalam struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Array ini terkandung dalam konteks penerusan out-of-band (OOB) dari struktur NET_BUFFER_LIST paket. Untuk informasi selengkapnya tentang konteks ini, lihat Konteks Penerusan Sakelar yang Dapat Diperluas Hyper-V.
Jika ekstensi penerusan terikat dan diaktifkan dalam tumpukan driver switch yang dapat diperluas, ekstensi ini bertanggung jawab untuk menentukan port tujuan untuk setiap paket yang diperoleh dari jalur data masuk switch yang dapat diperluas, kecuali paket tersebut adalah paket NVGRE. Untuk informasi selengkapnya tentang jalur data ini, lihat Gambaran Umum Jalur Data Hyper-V Extensible Switch. Untuk informasi selengkapnya tentang paket NVGRE, lihat Penerusan Hibrid.
Catatan Jika ekstensi penerusan tidak terikat atau diaktifkan di tumpukan driver, sakelar yang dapat diperluas menentukan port tujuan untuk paket yang diperolehnya dari jalur data ingress.
Ekstensi penerusan harus mengikuti panduan ini ketika menentukan port tujuan untuk paket yang diperoleh pada jalur data masuk:
Ekstensi harus menginisialisasi struktur NDIS_SWITCH_PORT_DESTINATION dalam struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY dengan informasi port tujuan.
Jika port tujuan tidak tersambung ke adaptor jaringan eksternal, ekstensi harus mengatur anggota NicIndex dari struktur NDIS_SWITCH_PORT_DESTINATION ke NDIS_SWITCH_DEFAULT_NIC_INDEX.
Jika port tujuan tersambung ke adaptor jaringan eksternal sakelar yang dapat diperluas, ekstensi dapat menentukan indeks adaptor jaringan fisik yang mendasar untuk meneruskan permintaan pengiriman. Ekstensi melakukan ini dengan mengatur anggota NicIndex ke nilai NDIS_SWITCH_NIC_INDEX bukan nol dari adaptor jaringan tujuan yang terikat ke adaptor jaringan eksternal.
Untuk informasi selengkapnya, lihat Meneruskan Paket ke Adaptor Jaringan Fisik.
Ekstensi harus menambahkan port tujuan ke data OOB paket hanya untuk port yang memiliki koneksi adaptor jaringan aktif. Jika ekstensi telah meneruskan permintaan OID_SWITCH_NIC_DISCONNECT , ekstensi tidak boleh menambahkan port tujuan yang terkait dengan adaptor jaringan yang terputus.
Untuk meningkatkan performa, ekstensi hanya boleh menambahkan tujuan port yang valid untuk pengiriman paket. Dalam hal ini, ekstensi harus mengatur anggota IsExcluded dari struktur NDIS_SWITCH_PORT_DESTINATION port tujuan ke FALSE.
Untuk menyimpan data jaringan area lokal virtual (VLAN) 802.1Q dalam paket sebelum dikirimkan ke port, ekstensi mengatur anggota PreserveVLAN ke TRUE.
Untuk menghapus data jaringan area lokal virtual (VLAN) 802.1Q dalam paket sebelum dikirimkan ke port, ekstensi mengatur anggota PreserveVLAN ke FALSE.
Untuk menyimpan data prioritas 802.1Q dalam paket sebelum dikirimkan ke port, ekstensi mengatur anggota PreservePriority ke TRUE.
Untuk menghapus data prioritas 802.1Q dalam paket sebelum dikirimkan ke port, ekstensi mengatur anggota PreservePriority ke FALSE.
Jika ekstensi penerusan menambahkan beberapa port tujuan untuk paket, ekstensi tersebut harus mengikuti langkah-langkah berikut:
Ekstensi pertama-tama mengakses struktur NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO paket dengan menggunakan makro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . Ekstensi kemudian membaca anggota NumAvailableDestinations untuk menentukan berapa banyak elemen port tujuan yang tidak digunakan yang tersedia di array port tujuan. Jika ekstensi memerlukan lebih banyak port tujuan daripada yang tersedia dalam array, ekstensi harus memanggil fungsi GrowNetBufferListDestinations untuk mengalokasikan ruang untuk port tujuan tambahan dalam array.
Ketika ekstensi memanggil GrowNetBufferListDestinations, ekstensi mengatur parameter NumberOfNewDestinations ke jumlah port tujuan baru yang akan ditambahkan ke paket.
Ekstensi ini juga mengatur parameter NetBufferLists ke penunjuk ke struktur NET_BUFFER_LIST paket.
Catatan Jika ada port tujuan yang tersedia dalam array, ekstensi tidak boleh memanggil GrowNetBufferListDestinations.
Jika fungsi GrowNetBufferListDestinations berhasil dikembalikan, fungsi tersebut telah menambahkan port tujuan tambahan ke akhir array tujuan dalam struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Penunjuk ke struktur ini dikembalikan dalam parameter Tujuan .
Catatan Jika fungsi GrowNetBufferListDestinations tidak dapat mengalokasikan jumlah port tujuan yang diminta, fungsi tersebut mengembalikan NDIS_STATUS_RESOURCES.
Ekstensi menentukan elemen port tujuan baru dalam struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Ekstensi menginisialisasi setiap port tujuan baru sebagai struktur NDIS_SWITCH_PORT_DESTINATION .
Ekstensi menginisialisasi port tujuan baru ke array yang dimulai pada offset NumDestinations . NumDestinations adalah anggota struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .
Setelah ekstensi selesai menambahkan atau memodifikasi elemen port tujuan, ekstensi harus memanggil UpdateNetBufferListDestinations untuk menerapkan perubahan tersebut.
Jika ekstensi menambahkan satu port tujuan untuk paket, ekstensi harus mengikuti langkah-langkah berikut:
Ekstensi menginisialisasi informasi port tujuan untuk paket dalam struktur NDIS_SWITCH_PORT_DESTINATION yang dialokasikan ekstensi.
Ekstensi memanggil AddNetBufferListDestination untuk menerapkan perubahan pada struktur NET_BUFFER_LIST untuk paket. Ekstensi meneruskan alamat struktur NDIS_SWITCH_PORT_DESTINATION dalam parameter Tujuan .
Catatan Ekstensi tidak boleh memanggil fungsi UpdateNetBufferListDestinations untuk menerapkan perubahan pada paket hanya dengan satu port tujuan.
Ketika ekstensi penerusan memanggil AddNetBufferListDestination atau UpdateNetBufferListDestinations untuk melakukan perubahan untuk port tujuan, antarmuka sakelar yang dapat diperluas tidak akan menghapus port sakelar yang dapat diperluas yang ditentukan dalam elemen struktur NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Setelah operasi pengiriman atau penerimaan paket selesai, antarmuka bebas untuk menghapus port jika perlu.
Catatan Setelah ekstensi penerusan menerapkan perubahan untuk port tujuan ke konteks penerusan, port tujuan tidak dapat dihapus dan hanya anggota IsExcluded dari struktur NDIS_SWITCH_PORT_DESTINATION port tujuan yang dapat diubah. Untuk informasi selengkapnya, lihat Mengecualikan Pengiriman Paket ke Port Tujuan Switch yang Dapat Diperluas.
Ekstensi penerusan harus menyinkronkan penanganan permintaan kumpulan pengidentifikasi objek (OID) OID_SWITCH_NIC_DISCONNECT dengan kodenya yang menambahkan port tujuan untuk adaptor jaringan yang terputus.
Jika FilterOidRequest ekstensi penerusan dipanggil untuk permintaan OID_SWITCH_NIC_DISCONNECT , ekstensi dapat melakukan salah satu hal berikut:
Jika ekstensi yang disebut NdisFOidRequest untuk meneruskan permintaan OID ini, ekstensi tidak boleh menentukan port dengan adaptor jaringan yang terputus sebagai port tujuan untuk paket.
Catatan Jika satu-satunya port tujuan untuk paket adalah yang memiliki adaptor jaringan yang terputus, ekstensi harus menghilangkan paket.
Ekstensi dapat mengembalikan NDIS_STATUS_PENDING untuk menyelesaikan permintaan secara asinkron. Ini memungkinkan ekstensi untuk menambahkan port dengan adaptor jaringan yang terputus sebagai port tujuan untuk paket. Ini juga memungkinkan ekstensi untuk memanggil AddNetBufferListDestination atau UpdateNetBufferListDestinations dan menyelesaikan penambahan port tujuan ke paket.
Ekstensi mungkin ingin melakukan ini untuk paket yang harus diteruskan ke port sebelum dicabut.
Catatan Jika ekstensi mengembalikan NDIS_STATUS_PENDING, ekstensi juga dapat memanggil ReferenceSwitchPort untuk menaikkan penghitung referensi untuk port dengan adaptor jaringan yang terputus. Namun, ekstensi tidak dapat meneruskan permintaan OID sampai setelah memanggil DereferenceSwitchPort untuk mengurangi penghitung referensi untuk port.
Jika jumlah port tujuan adalah nol, ekstensi penerusan harus memanggil NdisMSendNetBufferListsComplete untuk menghilangkan paket. Ekstensi juga harus memanggil ReportFilteredNetBufferLists untuk memberi tahu antarmuka sakelar yang dapat diperluas tentang paket yang dihilangkan.
Catatan Jika ekstensi penerusan memperoleh daftar tertaut struktur NET_BUFFER_LIST untuk beberapa paket dari jalur data masuk, ekstensi tersebut harus membuat daftar paket terpisah yang dihilangkan. Dengan melakukan ini, ekstensi dapat memanggil NdisMSendNetBufferListsComplete dan ReportFilteredNetBufferLists hanya sekali.
Jika jumlah port tujuan lebih besar dari nol, ekstensi penerusan harus memanggil NdisFSendNetBufferLists untuk meneruskan paket melalui jalur data masuk ke tepi miniport sakelar yang dapat diperluas.
Catatan Jika ekstensi penerusan memperoleh daftar tertaut struktur NET_BUFFER_LIST untuk beberapa paket dari jalur data masuk, ekstensi tersebut harus membuat daftar paket terpisah yang diteruskan. Dengan melakukan ini, ekstensi dapat memanggil NdisFSendNetBufferLists hanya sekali untuk meneruskan daftar paket. Selain itu, ekstensi harus mempertahankan daftar terpisah untuk meneruskan paket yang memiliki port tujuan yang sama. Untuk informasi selengkapnya, lihat Bendera Kirim dan Terima Sakelar Yang Dapat Diperluas Hyper-V.