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


Восстановление неответственного сетевого адаптера с помощью NetAdapterCx PLDR

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

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

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

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

Чтобы обеспечить удобный для пользователей сбой и восстановление устройств, рекомендуется поддерживать 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 для сбора диагностики с неудачного устройства. Например, драйвер может собирать моментальный снимок встроенного ПО устройства. Этот шаг является необязательным и возникает только в том случае, если драйвер клиента зарегистрировал структуру NET_DEVICE_RESET_CAPABILITIES . В противном случае NetAdapterCx пропустит этот шаг.

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

Схема ниже иллюстрирует последовательность сброса и восстановления NetAdapterCx.

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