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


Восстановление сетевого адаптера, не отвечающего на запросы, с помощью NETAdapterCx PLDR

NetAdapterCx предоставляет эффективный способ сброса и восстановления неисправных сетевых устройств с помощью сброса устройства на уровне платформы (PLDR). Без перезагрузки всей системы Windows операция PLDR удаляет стек затронутых сетевых устройств, обеспечивая перезапуск оборудования и драйверов из пустого состояния. NetAdapterCx также позволяет клиентским драйверам собирать диагностика с устройств, на которых произошел сбой, перед сбросом на уровне платформы.

PLDR активируется при обнаружении ненормального поведения устройства. Она может быть активирована следующими способами:

  • Операционная система (ОС). Например, на стороне ОС может активироваться PLDR, если транзитный пакет слишком долго зависает в драйвере.

  • Клиентские драйверы независимых поставщиков оборудования (IHV). Например, клиентские драйверы могут запросить у NetAdapterCx активацию PLDR, когда драйвер обнаруживает, что его устройство не отвечает на команду управления.

Чтобы обеспечить удобный для пользователей сбой и восстановление устройств, рекомендуется, чтобы IHV и изготовители оборудования (OEM) поддерживали PLDR для своих сетевых устройств. Дополнительные сведения о PLDR см. в разделе Сброс и восстановление устройства. NetAdapterCx не восстанавливает сетевые устройства с помощью сброса устройства на уровне функций.

Регистрация необязательного обратного вызова коллекции диагностика

В рамках процесса сброса и восстановления NetAdapterCx драйвер клиента может собирать диагностика конкретного устройства с устройства, завершилось сбоем, прежде чем устройство будет сброшено на уровне платформы. IHV и Корпорация Майкрософт могут использовать эти данные в анализе после сбоя для повышения качества своих продуктов.

Регистрация NET_DEVICE_RESET_CAPABILITIES

Клиентские драйверы должны инициализировать и зарегистрировать структуру NET_DEVICE_RESET_CAPABILITIES в функции обратного вызова EVT_WDF_DRIVER_DEVICE_ADD, чтобы собирать диагностика для конкретного устройства.

NET_DEVICE_RESET_CAPABILITIES содержит:

  • Уникальный GUID. IHV указывает этот GUID и использует его позже для идентификации и извлечения диагностика сброса из дампа памяти. Например, команду .enumtag можно использовать для получения диагностика.

  • Функция обратного вызова события EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS . NetAdapterCx вызывает этот обратный вызов для сбора диагностика. Если драйвер клиента предоставляет обратный вызов EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS , NetAdapterCx вызывает его в драйвере клиента с помощью выделенного потока.

В следующем примере показано, как зарегистрировать NET_DEVICE_RESET_CAPABILITIES в NetAdapterCx:

EVT_WDF_DRIVER_DEVICE_ADD EvtWdfDriverDeviceAdd;
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtDeviceCollectResetDiagnostics;

NTSTATUS EvtWdfDriverDeviceAdd(
    WDFDRIVER Driver,
    PWDFDEVICE_INIT DeviceInit
)
{
    ...

    NET_DEVICE_RESET_CAPABILITIES resetCapabilities;
    NET_DEVICE_RESET_CAPABILITIES_INIT(
        &resetCapabilities,
        DUMMY_GUID,
        EvtDeviceCollectResetDiagnostics);
    NetDeviceInitSetResetCapabilities(DeviceInit, &resetCapabilities);

    ...
}

Сведения об инициализации структуры NET_DEVICE_RESET_CAPABILITIES см. в разделе NET_DEVICE_RESET_CAPABILITIES_INIT.

Сведения о том, как объявить структуру NET_DEVICE_RESET_CAPABILITIES в NetAdapterCx, см. в статье NetDeviceInitSetResetCapabilities.

Реализация EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS

Последовательность сброса и восстановления может выполняться в любое время. Таким образом, реализация обратного вызова EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS драйвера клиента должна учитывать следующее:

  • NetAdapterCx синхронизирует обратный вызов EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS с другими обратными вызовами, которые могут происходить во время последовательности выключения питания. Драйвер клиента может предположить, что NetAdapterCx не будет вызывать обратные вызовы, такие как отмена или остановка очереди пакетов, выпуск оборудования и удаление объекта устройства, пока не вернется EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS .

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

  • Крайне важно, чтобы EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS завершить как можно скорее, чтобы можно было продолжить остальную часть процесса PLDR. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS должны быть надежными и должны возвращаться в течение 3 секунд.

  • NetAdapterCx всегда вызывает EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS в PASSIVE_LEVEL.

Чтобы отправить диагностика в NetAdapterCx, драйвер клиента выполняет следующие действия.

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

  2. В EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS обратном вызове отправьте диагностика в виде неструктурированного буфера данных, вызвав API NetDeviceStoreResetDiagnostics. Драйвер клиента должен вызвать API NetDeviceStoreResetDiagnostics на PASSIVE_LEVEL.

  3. Освободите буфер данных после возврата NetDeviceStoreResetDiagnostics .

Важно!

API NetDeviceStoreResetDiagnostics должен вызываться только в EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS обратном вызове . Его также нельзя использовать для повторной отправки диагностика данных после предыдущих возвратов NetDeviceStoreResetDiagnostics. Нарушение любого из этих случаев приведет к ошибке.

Важно!

Ограничение размера для диагностика сброса составляет 1 МБ.

Как драйвер клиента запрашивает PLDR

Драйвер клиента активирует PLDR с помощью API NetAdapterCx NetDeviceRequestReset при обнаружении сбоя устройства. NetDeviceRequestReset немедленно возвращается драйверу клиента. Последовательность сброса и восстановления, описанная в разделе Последовательность сброса и восстановления NetAdapterCx , активируется и является асинхронной для вызова NetDeviceRequestReset .

В любой момент времени может выполняться только одна операция PLDR. Поэтому последующие вызовы NetDeviceRequestReset не оказывают влияния, когда операция PLDR уже запущена.

Вызов NetDeviceRequestReset также не оказывает влияния, если последовательность выключения питания уже была инициирована.

Последовательность сброса и восстановления NetAdapterCx

При активации PLDR операционной системой или клиентским драйвером происходит следующая последовательность:

  1. Сбор диагностика сброса. NetAdapterCx вызывает обратный вызов EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS драйвера клиента для сбора диагностика с устройства, на которое произошел сбой. Например, драйвер может собирать snapshot встроенного ПО устройства. Этот шаг является необязательным и выполняется только в том случае, если драйвер клиента зарегистрировал структуру NET_DEVICE_RESET_CAPABILITIES . В противном случае NetAdapterCx пропустит этот шаг.

  2. Выполнение PLDR. NetAdapterCx выполняет операцию сброса устройства на уровне платформы. Питание NetAdapterCx перезапускает оборудование и удаляет стек программных устройств.

На следующей схеме показана последовательность сброса и восстановления NetAdapterCx.

Блок-схема, иллюстрирующая последовательность сброса и восстановления NetAdapterCx.