共用方式為


OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

警告

本主題中的一些資訊與發行前版本產品有關,在發行前可能會大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

RSSv2 僅在 Windows 10 版本 1809 中為預覽版。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID 會傳送至 支援 RSSv2 的迷你埠驅動程式,以執行個別間接數據表項目的移動。 此 OID 是 同步 OID,表示無法傳回NDIS_STATUS_PENDING。 只有在 IRQL == DISPATCH_LEVEL,才會發出此方法要求。

此呼叫會使用 XxxSynchronousOidRequest 進入點,其中 XxxMiniportFilter ,視接收要求的驅動程式類型而定。 此進入點會導致系統錯誤檢查它是否看到NDIS_STATUS_PENDING傳回狀態。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES會使用 NDIS_RSS_SET_INDIRECTION_ENTRIES 結構來指示迷你埠配接器同步執行一組動作,其中每個動作會將指定 VPort 之 RSS 間接轉換數據表的單一專案移至目標指定的 CPU。

備註

此 OID 必須在發出它的處理器內容中執行並完成。 迷你埠驅動程序必須在將NDIS_STATUS_SUCCESS傳回至上層時,完全執行此 OID。 這表示迷你埠驅動程序應該準備好接收背對背 OID 要求,以在第一次移動完成NDIS_STATUS_SUCCESS之後,立即在新處理器上移動多個 ITE。

提示

完全執行此 OID 表示迷你埠驅動程式必須準備好成功嘗試另一個動作來移動 ITE。 它不會指定在佇列移動之後立即指出進行中的接收流量,而該流量可能位於來源 CPU 或目標 CPU 上。

上層通訊協議發出OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES,將 ITE 和/或主要和預設處理器參數設定為指向不同的處理器。

此 OID 可以針對 作用 中或 非使用 中的流量轉向參數發出。 如需轉向參數的詳細資訊,請參閱 接收端調整第 2 版 (RSSv2) 。 針對處於非使用狀態的參數/ITE,迷你埠驅動程序應該驗證並快取目標處理器,直到下一個相關的 RSS 狀態變更(啟用或停用)。 此時,快取處理器編號會變成 作用 中,並用於引導流量。 更新 作用中參數(也必須經過驗證)立即生效,以引導流量。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES必須發出至已清除NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID旗標的迷你埠適配卡。 這是因為陣列中不同元素可能會參考不同的 VPorts。

此 OID 只會在 IRQL == DISPATCH_LEVEL叫用。

迷你埠驅動程式應該準備好處理至少與NDIS_NIC_SWITCH_CAPABILITIES結構中公告的間接數據表專案移動動作一樣多。 這會定義於 該結構的 NumberOfIndirectionTableEntriesPerNonDefaultPFVPortNumberOfIndirectionTableEntriesForDefaultVPort 成員中,或 原生 RSS 模式中的 128

迷你埠驅動程式應該嘗試執行盡可能多的專案,並使用作業結果更新每個NDIS_RSS_SET_INDIRECTION_ENTRY的 EntryStatus 成員。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES的 OID 處理程式

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES的 OID 處理程式預期會如下所示:

  • 由於 OID 的同步呼叫類型,不允許傳回NDIS_STATUS_PENDING。
  • 完成任何以目前 CPU 為目標的傳入 ITE 移動(先前在遠端處理器上起始)。
  • 強烈建議迷你埠驅動程序執行完整的參數驗證傳遞。 如果不可能,請執行一對一的驗證和執行數位專案。 迷你埠驅動程式應該特別檢查所有參考的物件是否有效:
    • 不允許在 ITE 的 EntryStatus 字段中傳回NDIS_STATUS_PENDING。
    • 迷你埠配接器存在且處於良好狀態。 否則,請將 專案的 EntryStatus 字段設定為NDIS_STATUS_ADAPTER_NOT_FOUND、NDIS_STATUS_ADAPTER_NOT_READY等。
    • 每個 VPort 都存在且處於良好狀態。 否則,請將專案的 EntryStatus 字段設定為NDIS_STATUS_INVALID_PORT、NDIS_STATUS_INVALID_PORT_STATE等。
    • 每個間接值數據表專案索引都位於設定的範圍內。 此範圍是0xFFFF,或是在 OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID 所設定的 [0...NumberOfIndirectionTableEntries - 1] 範圍內。 0xFFFF和0xFFFE專案索引具有特殊意義:0xFFFF定義默認處理器,而0xFFFE定義主要處理器。 發生錯誤時,處理程式會將專案的 EntryStatus 字段設定為 NDIS_STATUS_INVALID_PARAMETER。
    • 上層和迷你埠驅動程序預期 ITE 會在移動前指向目前的處理器(動作專案 CPU)。 換句話說,ITE 無法從遠端重新導向。 如果這不是 true,請將專案的 EntryStatus 字段設定為 NDIS_STATUS_NOT_ACCEPTED。
    • 所有目標處理器都是有效的,而且是迷你埠適配卡 RSS 集合的一部分。 否則,請將 專案的 EntryStatus 字段設定為 NDIS_STATUS_INVALID_DATA。
  • 後續或作為參數驗證階段的一部分,驗證資源狀況。 驗證在完整批次移動(疏散)之後要使用的佇列數目不會超過在OID_GEN_RECEIVE_SCALE_PARAMETERS_V2要求期間在NDIS_RECEIVE_SCALE_PARAMETERS_V2結構中設定的 NumberOfQueues。 否則會傳回NDIS_STATUS_NO_QUEUES。 NDIS_STATUS_NO_QUEUES應該用於代表違反已設定佇列數目的所有條件。 NDIS_STATUS_RESOURCES應該只用來指定暫時性記憶體不足狀況。
  • 作為資源檢查的一部分,每個縮放實體(例如 VPort),迷你埠驅動程式必須在指向目前 CPU 的所有 ITE 都移開時處理條件。

如果上述所有檢查都通過,迷你埠驅動程式應該能夠無條件地套用新的設定,而且必須將每個專案的 EntryStatus 字段設定為NDIS_STATUS_SUCCESS。

一般而言,此 OID 的處理程式應該非常輕量。 它不應該針對微調鎖定和 NdisMConfigMSIXTableEntry 等可能的同步處理作業呼叫 NDIS 或操作系統服務。

迷你埠驅動程序不應該呼叫 NDIS 來指出狀態或 PnP 事件。

迷你埠驅動程式不應在此 OID 處理程式的內容中使用接收/傳輸完整指示,因為這樣做會導致遞歸。 上層可以從接收或傳輸指示的內容叫用此 OID。

移動所有間接取值數據表專案

迷你埠驅動程式應該辨識並處理將所有間接數據表專案從目前的 CPU 移開的特殊要求。 由於 RSSv2 會使用個別的 ITE 移動運作,因此迷你埠驅動程式必須保證整體作業的不可部分完成性。 如果在處理對應的移動命令陣列時,批次中間發生錯誤,迷你埠驅動程序應該還原已執行的所有命令,並將每個命令 EntryStatus 字段中的所有命令標示為「失敗」。 上層通訊協定一律預期「移動所有 ITE」批次會包含標示為「成功」的所有命令,或標示為「失敗」的所有命令,且會假設流量遵守產生的狀態(移動之前或移動之後)。 如果上層只看到一些標示為「失敗」的專案,它會錯誤地檢查系統,並指向迷你埠驅動程序作為原因。

為了協助迷你埠驅動程序處理「移動所有 ITE」命令,並避免死結,上層通訊協定會將批次中的命令群組移動成對 SwitchId + VPortId 欄位,如此一來:

  • 上層想要一起執行的命令,做為「移動全部」命令的一部分,相同的 VPort 會連續放在整體批次中。
  • 迷你埠驅動程序不應該嘗試以「移動全部」的方式執行以不同 VPorts 為目標的整體命令批次。 只有以相同 VPort 為目標的命令群組(以相同的 SwitchId + VPortId 配對標記)必須執行符合「移動全部」語意。
  • 當上層不關心「移動所有」語意時,它可能會將命令交錯至相同的 VPort,並將命令交錯到不同的 VPort(s)。 在此情況下,如果無法執行相同 VPort 的第二組命令,因為發生「佇列數目」違規,迷你埠驅動程式會將該群組標示為對應的狀態代碼 (NDIS_STATUS_NO_QUEUES),而上層負責復原。

例如,如果上層通訊協定交錯了一系列的命令,如下所示:

  • VPort=1 ITE[0,1]
  • VPort=2 ITE[0]
  • VPort=1 ITE[2]

迷你埠驅動程式不需要嘗試以不可部分完成的方式執行所有四個移動命令,或針對 (ITE[0,1,2]) 的所有三個移動命令VPort=1。 它只需要以「移動全部」的方式執行群組,然後執行VPort=2 ITE[0]群組,再VPort=1 ITE[2]執行VPort=1 ITE[0,1]群組。 這三個命令群組可能有不同的結果。 例如,和 VPort=2 ITE[0] 的群組VPort=1 ITE[0,1]可能會成功,而VPort=1 ITE[2]群組可能會失敗。 結果應該反映在每個命令結構的對應 EntryStatus 成員中。 如此一來,迷你埠驅動程式就不需要採取預防措施,才能安全執行整體批次(例如,鎖定整個配接器)。 只有以特定 VPort 為目標的命令需要串行化,可以使用更精細的個別 VPort 鎖定,並避免某些死結。

注意

命令專案的整個群組必須標示為相同的項目狀態。

錯誤條件和狀態代碼

當發生錯誤時,此 OID 會傳回下列狀態代碼:

狀態碼 錯誤狀況
NDIS_STATUS_INVALID_LENGTH OID 格式不正確。
NDIS_STATUS_INVALID_PARAMETER 標頭或 OID 本身的其他欄位(但不在個別命令專案中)包含無效的值。

需求

版本:Windows 10 版本 1709 標頭:Ntddndis.h(包括 Ndis.h)

另請參閱