Melampirkan tanda waktu ke paket

Setelah driver miniport melaporkan kemampuan tanda waktu mana yang ada dan saat ini diaktifkan, driver dapat melampirkan tanda waktu yang relevan ke paket menggunakan struktur NET_BUFFER_LIST (NBL).

Untuk informasi selengkapnya tentang melaporkan kemampuan tanda waktu perangkat keras NIC dan kemampuan tanda waktu perangkat lunak driver miniport ke sistem operasi, lihat Melaporkan kemampuan tanda waktu dan konfigurasi saat ini.

Tanda waktu perangkat keras

Bendera PtpV2OverUdpIPv4EventMsgReceiveHw, , PtpV2OverUdpIPv4AllMsgTransmitHwPtpV2OverUdpIPv4EventMsgTransmitHwPtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv6AllMsgReceiveHwPtpV2OverUdpIPv6EventMsgReceiveHw, PtpV2OverUdpIPv6EventMsgTransmitHw, PtpV2OverUdpIPv6AllMsgTransmitHw, , AllReceiveHw, AllTransmitHw dan TaggedTransmitHw dalam struktur NDIS_TIMESTAMP_CAPABILITY_FLAGS menunjukkan tanda waktu perangkat keras mana yang didukung driver miniport.

Tanda waktu yang dihasilkan perangkat keras NIC pada penerimaan atau transmisi paket diwakili oleh nilai bilangan bulat 64-bit. Ini harus menjadi nilai mentah jam perangkat keras NIC pada saat tanda waktu ditangkap. Tanda waktu disimpan dalam array NetBufferListInfo struktur NBL.

Driver Miniport dapat menggunakan struktur NET_BUFFER_LIST_TIMESTAMP untuk mengatur tanda waktu di bidang NetBufferListInfo NBL. Driver mengisi bidang Tanda Waktu dari struktur NET_BUFFER_LIST_TIMESTAMP dengan tanda waktu yang dihasilkan oleh perangkat keras dan memanggil fungsi utilitas NdisSetNblTimestampInfo , melewati struktur.

Driver Miniport dapat menggunakan NdisGetNblTimestampInfo dan NdisCopyNblTimestampInfo untuk mengambil dan menyalin tanda waktu.

Jika pengaturan tanda waktu perangkat keras tertentu diaktifkan tetapi tanda waktu yang sesuai dengan kemampuan tersebut tidak dihasilkan, miniport harus mengatur tanda waktu yang dilampirkan ke NBL ke nol.

Catatan

Saat mengenali paket PTP versi 2 untuk menghasilkan tanda waktu perangkat keras, implementasinya tidak boleh membatasi pembuatan tanda waktu ke paket yang menggunakan alamat multicast (IPv4 dan IPv6) yang ditentukan oleh spesifikasi PTP. Implementasi harus mencoba mengenali paket PTP dengan cara lain, misalnya menggunakan header UDP atau payload PTP. Ini sehingga tanda waktu masih dihasilkan dalam skenario di mana implementasi PTP mungkin tidak menggunakan alamat multicast yang ditentukan dalam spesifikasi PTP, misalnya di mana alamat unicast digunakan.

Menerima tanda waktu samping

Perangkat keras harus mendapatkan tanda waktu sedekat mungkin dengan titik ketika perangkat keras menerima bingkai dari media. Pedoman ini ditentukan oleh standar IEEE 1588.

Ketika paket diterima, driver miniport harus:

  1. Koreksi tanda waktu untuk setiap penundaan yang ada antara ketika perangkat keras menangkap tanda waktu dan kapan perangkat keras benar-benar menerima bingkai.

  2. Lampirkan tanda waktu yang dihasilkan dalam perangkat keras ke NBL. Tanda waktu sesuai dengan bingkai (struktur NET_BUFFER ) yang terkandung dalam NBL.

  3. Panggil NdisMIndicateReceiveNetBufferLists untuk menunjukkan NBL ke NDIS.

Perhatikan bahwa dalam arah penerimaan, driver miniport untuk perangkat keras Ethernet diperlukan untuk menunjukkan hanya satu NET_BUFFER per NBL.

Mengirimkan tanda waktu sisi

Perangkat keras harus mendapatkan tanda waktu sedekat mungkin dengan titik ketika perangkat keras mengirimkan bingkai ke media. Pedoman ini ditentukan oleh standar IEEE 1588.

Ketika paket ditransmisikan, driver miniport harus:

  1. Koreksi tanda waktu untuk setiap penundaan yang ada antara ketika perangkat keras menangkap tanda waktu dan kapan perangkat keras benar-benar mengirimkan bingkai.

  2. Lampirkan tanda waktu yang dihasilkan dalam perangkat keras ke NBL. Jika NBL berisi beberapa NET_BUFFER, tanda waktu perangkat keras yang sesuai dengan NET_BUFFER pertama di NBL harus dilampirkan ke NBL.

  3. Panggil NdisMSendNetBufferListsComplete untuk mengirim menyelesaikan NBL ke NDIS.

Perangkat keras Miniport dan NIC yang melaporkan bahwa TaggedTransmitHw bendera kemampuan didukung dan saat ini diaktifkan harus memeriksa apakah NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT bendera diatur di bidang NblFlags dari NBL yang diberikan ke miniport untuk transmisi. Jika bendera ini diatur, ini menunjukkan bahwa tanda waktu transmisi diperlukan untuk NBL tersebut dan tanda waktu perangkat keras waktu transmisi harus dibuat untuk NBL.

Tanda waktu perangkat lunak

Bendera AllReceiveSw, AllTransmitSw dan TaggedTransmitSw dalam struktur NDIS_TIMESTAMP_CAPABILITY_FLAGS menunjukkan apakah miniport mendukung pembuatan tanda waktu perangkat lunak.

Tanda waktu perangkat lunak juga direpresentasikan sebagai nilai bilangan bulat 64-bit dan disimpan dalam slot yang sama di array NetBufferListInfo dari struktur NET_BUFFER (NBL) sebagai tanda waktu perangkat keras.

Jika kemampuan tanda waktu perangkat lunak ada dan diaktifkan, driver miniport mengatur tanda waktu di NBL menggunakan nilai penghitung kinerja (QPC). Driver miniport harus:

  1. Panggil KeQueryPerformanceCounter untuk mendapatkan QPC.

  2. Isi bidang Tanda Waktu dari struktur NET_BUFFER_LIST_TIMESTAMP dengan QPC.

  3. Atur tanda waktu di NBL dengan memanggil NdisSetNblTimestampInfo dan meneruskan NET_BUFFER_LIST_TIMESTAMP.

Pada menerima driver miniport harus menangkap QPC sedini mungkin tetapi tidak lebih awal dari ketika paket tiba.

Pada transmisi driver miniport harus menangkap QPC selambat mungkin sebelum paket diberikan ke perangkat keras untuk transmisi.

Bendera TaggedTransmitSw dianalogikan TaggedTransmitHw dengan bendera tetapi sesuai dengan tanda waktu perangkat lunak. Jika kemampuan didukung dan diaktifkan, miniport harus memeriksa NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT bendera di bidang NblFlags NBL. Jika bendera ini diatur, miniport harus menghasilkan tanda waktu perangkat lunak waktu transmisi untuk NBL.