Net ring 元素管理

請遵循本主題中的指引,在網路資料傳輸期間管理 您的NET_RING 結構和其元素。 本主題中的規則描述哪些 net ring 元素用戶端驅動程式的成員可以根據資料路徑案例修改和何時修改,以及這些結構的一般資訊用戶端驅動程式應該牢記在心。

重要

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

NET_RING

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

下表說明用戶端驅動程式可以修改的 net 通道成員。

欄位 允許用戶端驅動程式修改
OSReserved1
ElementStride
NumberOfElements
ElementIndexMask
EndIndex
OSReserved0
OSReserved2
BeginIndex 是 (必要)
NextIndex 是 (選擇性) 注意:架構永遠不會讀取 NextIndex
臨時 是 (選擇性) 注意:架構永遠不會讀取 臨時
Buffer

用戶端驅動程式不得修改此結構的任何唯讀成員,也不應該在呼叫EvtPacketQueueAdvance期間遞增BeginIndex超過EndIndex

如需有關 net 通道中索引擁有權的詳細資訊,請參閱 net 通道簡介

NET_PACKET

NET_PACKET中的欄位會區分資料路徑運作的不同內容。 是否設定封包的 [忽略] 欄位,以及驅動程式是否接收 (Rx) 或傳輸 (Tx,) 封包變更套用至封包的規則集。

下表提供每個案例中驅動程式的指示。

Rx 或 Tx [忽略] 欄位設定為... 注意
Rx 用戶端驅動程式
  • 在 Rx 期間,用戶端驅動程式會視需要設定 Ignore ,而且架構會讀取它。 用戶端驅動程式不需要在 Rx 期間的任何時間點讀取 Ignore
  • 如果用戶端驅動程式在 Rx 期間設定 [忽略] 欄位,則:
    • 用戶端驅動程式必須寫入 [忽略 ] 欄位,以取消任何尚未成功設計成硬體之封包的 Rx 作業。 如需詳細資訊,請參閱 使用 net 通道取消網路資料
    • 用戶端驅動程式不得將資源與封包產生關聯,因為它們不會釋出。
  • 如果用戶端驅動程式未在 Rx 期間設定 [忽略] 欄位,則:
    • 用戶端驅動程式必須在Layout中填入FragmentIndexFragmentCount和所有欄位。
    • 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 或更新版本。
  • 圖層類型欄位必須位於適當的列舉範圍內。

Tx 期間不會使用版面配置

NET_FRAGMENT

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

Rx 或 Tx 注意
Rx
  • 用戶端驅動程式無法寫入 至 [OsReserved_Bounced ] 欄位。
  • 如果驅動程式未附加 ,則容量 不得修改,但 ValidLengthOffset 必須修改。
  • 如果驅動程式正在附加,則必須修改 CapacityValidLengthOffset
  • 抵消 + ValidLength必須小於Capacity
Tx
  • 除了 Scratch以外,用戶端驅動程式無法修改任何欄位。