共用方式為


網環元素管理

請遵循本主題中的指引,在網路數據傳輸期間管理您的 NET_RING 結構及其元素。 此主題中的規則描述了在什麼情況下用戶端驅動程式可以修改哪些 net ring 元素的成員,以及這些修改如何取決於數據路徑場景,同時也提供了用戶端驅動程式應記住的關於這些結構的一般資訊。

重要

在開發的所有階段,客戶端驅動程式都應該遵守這些指示。 如果客戶端驅動程式在測試時未遵循這些指示,驅動程式驗證器,驅動程式驗證器會回報違規,並在受測裝置上觸發錯誤檢查。

NET_RING

當啟動 NET_RING的父封包佇列時,通道中的所有索引都會初始化為 0

下表說明客戶端驅動程式可以修改的網路環成員。

允許修改客戶端驅動程式
OSReserved1
ElementStride
元素數量
ElementIndexMask
EndIndex
OSReserved0
OSReserved2
BeginIndex 是(必要)
NextIndex 是(選擇性)附註:架構永遠不會讀取 NextIndex
是(選擇性)附註:架構永遠不會讀取 Scratch
緩衝區

客戶端驅動程式不得修改此結構中的任何只讀成員,也不應在呼叫 EvtPacketQueueAdvance期間,將 BeginIndex 增加至超過 EndIndex

如需有關網狀環中索引擁有權的詳細資訊,請參閱 網狀環簡介

NET_PACKET

NET_PACKET 中的欄位對數據路徑運行的不同情境具有靈敏度。 封包的 [忽略] 字段是否已設定,以及驅動程式是在接收(Rx)還是傳輸(Tx)封包,這些因素都會影響封包所套用的規則集。

下表提供各種情境中的駕駛指引。

Rx 或 Tx 忽略欄位是由...設定的 筆記
Rx 用戶端驅動程式
  • 在 Rx 期間,用戶端驅動程式會視需要設定 忽略,而且架構會讀取它。 用戶端驅動程式在任何時間點都不需要讀取或忽略 在 Rx 過程中。
  • 如果客戶端驅動程式在 Rx 期間設定 [Ignore] 欄位,則:
    • 客戶端驅動程式在取消任何未成功寫入硬體的封包的 Rx 作業時,必須寫入[忽略]欄位。 如需詳細資訊,請參閱 取消具有網路環的網路數據
    • 用戶端驅動程式不得將資源與封包產生關聯,因為它們不會釋出。
  • 如果客戶端驅動程式在 Rx 期間未設定 [忽略] 欄位,則:
    • 用戶端驅動程序必須填入 FragmentIndexFragmentCount,以及 Layout中的所有欄位。
    • FragmentIndex 必須介於 BeginIndex(包含)和 endIndex(未包含)之間,且需位於片段環中。
    • FragmentCount 不能超過在片段環中從包含 BeginIndex 到 (不含) EndIndex 之間的片段數量。
    • 如果客戶端驅動程式移動對應的片段通道 BeginIndex,用戶端驅動程式就必須移動封包通道 BeginIndex
    • 呼叫 EvtPacketQueueAdvance之後,如果客戶端驅動程式遞增封包通道 BeginIndex 則驅動程式也必須將片段環遞增 BeginIndex 超過該封包的片段。 換句話說,片段環 應該從 BeginIndex 移到先前封包片段的 EndIndex
Tx NetAdapterCx
  • 除了 Scratch以外,客戶端驅動程式不得修改任何封包中的任何字段。
  • 用戶端驅動程式可以讀取 Ignore 的值,但絕對不能寫入它。
  • 如果忽略 Tx 封包,驅動程式不得讀取任何欄位,可能要例外的是 Scratch

NET_PACKET_LAYOUT

在 Rx 作業期間,NET_PACKET 的 [版面配置] 欄位受限於下列規則:

  • 用戶端驅動程序必須初始化 Reserved0 以外的所有欄位。
  • 如果 Layer2Type 設定為 NetPacketLayer2TypeEthernet,則 Layer2HeaderLength 必須 14 或更新版本。
  • 如果 Layer2Type 設為 NetPacketLayer2TypeNull,則 Layer2HeaderLength 必須設定為 0
  • 如果 Layer3Type 是 IPv4 類型,則 Layer3HeaderLength 必須 20 或更新。
  • 如果 Layer3Type 是 IPv6 類型,則 Layer3HeaderLength 必須 40 或更新。
  • 如果 Layer4Type 設定為 Tcp,則 Layer4HeaderLength 必須是 40 或更大。
  • 如果 Layer4Type 設為 Udp,則 Layer4HeaderLength 必須是 8 或更大。
  • 層類型欄位必須位於適當的列舉範圍內。

傳輸期間不會使用版面配置

網路片段

NET_FRAGMENT 欄位規則取決於驅動程式是接收還是傳輸,以及片段緩衝區是否由驅動程式或架構附加至封包。

Rx 或 Tx 筆記
Rx
  • 用戶端驅動程式無法寫入 [OsReserved_Bounced] 欄位。
  • 如果驅動程式未附加,則Capacity 不得修改,但必須修改ValidLengthOffset
  • 如果驅動程式正在掛載,則必須修改 CapacityValidLengthOffset
  • 位移 + 的有效長度 必須小於 的容量
Tx
  • 除了 Scratch之外,用戶端驅動程式無法修改任何字段。