Поделиться через


OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Предупреждение

Некоторые сведения в этом разделе относятся к предварительно созданному продукту, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

RSSv2 доступна только в Windows 10 версии 1809.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID отправляется в драйверы мини-порта, поддерживающие RSSv2, для выполнения перемещения отдельных записей таблицы косвенного обращения. Этот OID является синхронным OID, то есть он не может возвращать NDIS_STATUS_PENDING. Он выпускается только в качестве запроса метода в IRQL == DISPATCH_LEVEL.

В этом вызове используется точка входа XxxSynchronousOidRequest , где XxxMiniport или Filter в зависимости от типа драйвера, получающего запрос. Эта точка входа приводит к проверка системной ошибки, если она видит состояние возврата NDIS_STATUS_PENDING.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES использует структуру NDIS_RSS_SET_INDIRECTION_ENTRIES , чтобы указать минипорт-адаптеру синхронно выполнять набор действий, где каждое действие перемещает одну запись таблицы косвенных значений RSS указанного VPort на целевой ЦП.

Замечания

Этот OID должен выполняться и завершиться в контексте процессора, выдаваемом им. Драйверы минипорта должны полностью выполнить этот OID после возвращения NDIS_STATUS_SUCCESS на верхний слой. Это означает, что мини-драйвер должен быть готов к получению запросов обратно в OID для перемещения нескольких ИТ-служб на новом процессоре сразу после завершения первого перемещения с NDIS_STATUS_SUCCESS.

Совет

Полное выполнение этого OID означает, что мини-драйвер должен быть готов к успешной попытке выполнить другое действие для перемещения ИТE. Он не предписывает, где трафик приема в полете указывается сразу после перемещения очереди, который может находиться на исходном ЦП или целевом ЦП.

Протоколы верхнего уровня OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES задать ИТ-адреса и (или) основные и стандартные параметры процессора, указывающие на разные процессоры.

Этот OID может быть выдан для параметров управления активным или неактивным трафиком. Дополнительные сведения о параметрах управления см. в статье о масштабировании на стороне получения версии 2 (RSSv2). Для параметров и ИТ-адресов в неактивном состоянии драйвер минипорта должен проверять и кэшировать целевой процессор до следующего соответствующего изменения состояния RSS (включение или отключение). На этом этапе кэшированные номера процессора становятся активными и используются для направления трафика. Обновления для активных параметров (которые также должны быть проверены) должны быть немедленно приняты в силу для направления трафика.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES должен быть выдан мини-адаптеру с флагом NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID с очисткой. Это связано с возможностью ссылки на различные элементы в массиве.

Этот OID вызывается только в IRQL == DISPATCH_LEVEL.

Драйверы минипорта должны быть готовы обрабатывать по крайней мере столько действий перемещения непрямой таблицы, сколько они объявляют в структуре NDIS_NIC_SWITCH_CAPABILITIES . Это определяется в элементе NumberOfIndirectionTableEntriesPerNonDefaultPFVPort или NumberOfIndirectionTableEntriesForDefaultVPort этой структуры или 128 в режиме собственного RSS.

Драйверы минипорта должны пытаться выполнить столько записей, сколько они могут, и обновить элемент EntryStatus каждого NDIS_RSS_SET_INDIRECTION_ENTRY с результатом операции.

Обработчик OID для OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Ожидается, что обработчик OID для OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES будет вести себя следующим образом:

  • Возврат NDIS_STATUS_PENDING не разрешен из-за синхронного вызова OID.
  • Завершите все входящие перемещения ИТE, предназначенные для текущего ЦП (ранее инициированные на удаленных процессорах).
  • Настоятельно рекомендуется использовать мини-порты для выполнения полного прохождения проверки параметров. Если это невозможно, выполните однократную проверку и выполнение записей массива. Драйверы минипорта должны специально проверка, если все указанные объекты допустимы:
    • Возврат NDIS_STATUS_PENDING в поле EntryStatus для ITE не разрешен.
    • Минипорт-адаптер существует и находится в хорошем состоянии. Кроме того, задайте для поля EntryStatus запись значение NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY и т. д.
    • Каждый VPort существует и находится в хорошем состоянии. Кроме того, задайте для поля EntryStatus запись значение NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE и т. д.
    • Каждый индекс записи таблицы косвенного обращения находится в заданном диапазоне. Этот диапазон либо 0xFFFF, либо находится в диапазоне [0...NumberOfIndirectionTableEntries - 1], заданном OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID. Индексы записи 0xFFFF и 0xFFFE имеют особые значения: 0xFFFF определяет процессор по умолчанию, а 0xFFFE определяет основной процессор. При ошибке обработчик задает поле EntryStatus записи NDIS_STATUS_INVALID_PARAMETER.
    • Верхний слой и драйвер минипорта ожидают, что ITE указывает на текущий процессор (ЦП субъекта) перед перемещением. Другими словами, ИТ-служба не может быть перенаправлена удаленно. Если это не так, задайте для поля EntryStatus значение NDIS_STATUS_NOT_ACCEPTED.
    • Все целевые процессоры допустимы и являются частью набора RSS адаптера мини-порта. Кроме того, задайте для поля EntryStatus запись значение NDIS_STATUS_INVALID_DATA.
  • Затем или в рамках прохождения проверки параметра проверьте ситуацию с ресурсом. Убедитесь, что количество очередей, используемых после полного перемещения пакетной службы (эвакуация), не превышает число наборов NumberOfQueues в структуре NDIS_RECEIVE_SCALE_PARAMETERS_V2 во время запроса OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 . В противном случае возвращается NDIS_STATUS_NO_QUEUES. NDIS_STATUS_NO_QUEUES следует использовать для всех условий, представляющих нарушение настроенного количества очередей. NDIS_STATUS_RESOURCES следует использовать только для обозначения временных условий вне памяти.
  • В рамках проверка ресурсов для каждой сущности масштабирования (например, VPort), драйвер минипорта должен обрабатывать условие, когда все ИТ-службы, указывающие на текущий ЦП, перемещаются от него.

Если все указанные выше проверка пройти, минипорт-драйвер должен иметь возможность безоговорочно применить новую конфигурацию и задать поле EntryStatus каждой записи NDIS_STATUS_SUCCESS.

Как правило, обработчик для этого OID должен быть очень легким весом. Он не должен вызывать службы NDIS или операционных систем, отличные от возможных операций синхронизации, таких как спинлоки и NdisMConfigMSIXTableEntry.

Минипорт-драйвер не должен вызывать NDIS, чтобы указать состояние или события PnP.

Минипорт-драйвер также не должен использовать полные признаки приема и передачи в контексте этого обработчика OID, так как это приводит к рекурсии. Верхний слой может вызвать этот OID из контекста получения или передачи признаков.

Перемещение всех записей таблицы косвенного обращения

Драйверы минипорта должны распознавать и обрабатывать специальный запрос, который перемещает все записи таблицы косвенного обращения от текущего ЦП. Так как RSSv2 работает с отдельными перемещениями ITE, мини-порты должны гарантировать атомарность общей операции. Если при обработке соответствующих массивов команд перемещения возникает ошибка в середине пакета, драйвер минипорта должен отменить изменения все команды, которые уже были выполнены, и пометить все команды как "неудачные" в поле EntryStatus для каждой команды. Протокол верхнего уровня всегда ожидает, что пакет перемещения всех ИТ-адресов будет содержать либо все команды, помеченные как "успешно", либо все команды, помеченные как "неудачные", и предполагается, что трафик подчиняется результирующему состоянию (либо до, либо после перемещения). Если верхний слой видит только некоторые записи, помеченные как "сбой", это приведет к ошибке проверка системе и указывает на драйвер минипорта в качестве причины.

Чтобы помочь в обработке драйвера минипорта команды "переместить все ИТ-адреса" и избежать взаимоблокировок, команды перемещения протоколов верхнего слоя в пакете в парах полей SwitchId + VPortId , например:

  • Команды, которые верхний слой хочет выполнить вместе, в рамках команды "переместить все" для одного И того же VPort помещаются последовательно в общий пакет.
  • Минипорт-драйвер не должен пытаться выполнить общий пакет команд, который может нацелиться на разные VPorts, в режиме "переместить все". Необходимо выполнить только группу команд, предназначенных для одного И того же VPort (помеченного той же парой SwitchId + VPortId ), которая соответствует семантике перемещения всех.
  • Если верхний слой не заботится о семантике перемещения всех элементов, он может пересекать команды в один и тот же VPort с командами для разных виртуальных портов. В этом случае, если вторая группа команд в том же VPort не может быть выполнена из-за нарушения "количества очередей", драйвер мини-порта помечает эту группу с соответствующим кодом состояния (NDIS_STATUS_NO_QUEUES), а верхний слой несет ответственность за восстановление.

Например, если протокол верхнего слоя пересекает ряд команд, как показано ниже:

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

Минипорт-драйвер не должен пытаться атомарно выполнять все четыре команды перемещения или все три команды перемещения для VPort=1 (ITE[0,1,2]). Он должен выполнять только группу VPort=1 ITE[0,1] в режиме "переместить все", а затем группу VPort=2 ITE[0] , а затем VPort=1 ITE[2]. Все три группы команд могут иметь другой результат. Например, группы для VPort=1 ITE[0,1] и VPort=2 ITE[0] могут завершиться успешно, а группа может завершиться ошибкой VPort=1 ITE[2] . Результат должен отражаться в соответствующем элементе EntryStatus каждой структуры команд. Таким образом, минипорт-драйвер не должен принимать меры предосторожности для безопасного выполнения общего пакета (например, блокировка всего адаптера). Можно использовать только те команды, которые нацелены на конкретный VPort, сериализуемые, более точные блокировки на VPort, и некоторые взаимоблокировки не используются.

Примечание.

Всю группу записей команд необходимо пометить с одинаковым состоянием записи.

Условия ошибки и коды состояния

Этот OID возвращает следующие коды состояния при возникновении ошибки:

Код состояния Условие ошибки
NDIS_STATUS_INVALID_LENGTH OID был неправильно сформирован.
NDIS_STATUS_INVALID_PARAMETER Другие поля в заголовке или в самом OID (но не в отдельных записях команд) содержат недопустимые значения.

Требования

Версия: Windows 10 версии 1709 Header: Ntddndis.h (include Ndis.h)

См. также