Recuperación de una NIC no responde con NetAdapterCx PLDR
NetAdapterCx proporciona una manera eficaz de restablecer y recuperar dispositivos de red que no funcionan correctamente a través del restablecimiento de dispositivos de nivel de plataforma (PLDR). Sin reiniciar todo el sistema Windows, la operación PLDR desgarra la pila de dispositivos de red afectados, lo que garantiza que el hardware y los controladores se reinicien desde un estado en blanco. NetAdapterCx también permite a los controladores de cliente recopilar diagnósticos de dispositivos con errores antes de que se restablezcan en el nivel de plataforma.
PLDR se desencadena cuando se detecta un comportamiento anómalo del dispositivo. Se puede desencadenar mediante:
Sistema operativo (SO). Por ejemplo, el lado del sistema operativo puede desencadenar PLDR cuando un paquete en tránsito está bloqueado en el controlador durante demasiado tiempo.
Controladores de cliente independientes del proveedor de hardware (IHV). Por ejemplo, los controladores de cliente pueden solicitar a NetAdapterCx que desencadene PLDR cuando un controlador detecte que su dispositivo no responde a su comando de control.
Para proporcionar errores y recuperación de dispositivos fáciles de usar, se recomienda que los IHD y los fabricantes de equipos originales (OEM) admitan PLDR para sus dispositivos de red. Para obtener más información sobre PLDR, consulte Restablecer y recuperar un dispositivo. NetAdapterCx no recupera dispositivos de red a través del restablecimiento del dispositivo de nivel de función.
Registrar la devolución de llamada de recopilación de diagnóstico opcional
Como parte del proceso de restablecimiento y recuperación de NetAdapterCx, el controlador cliente puede recopilar diagnósticos específicos del dispositivo del dispositivo con errores antes de que el dispositivo sea el restablecimiento en el nivel de plataforma. Los IHD y Microsoft pueden usar estos datos en el análisis posterior al error para mejorar la calidad de sus productos.
Registrar NET_DEVICE_RESET_CAPABILITIES
Los controladores de cliente deben inicializar y registrar la estructura de NET_DEVICE_RESET_CAPABILITIES en su función de devolución de llamada EVT_WDF_DRIVER_DEVICE_ADD para recopilar diagnósticos específicos del dispositivo.
NET_DEVICE_RESET_CAPABILITIES contiene:
Un GUID único. El IHV especifica este GUID y lo usa más adelante para identificar y recuperar los diagnósticos de restablecimiento de un volcado de memoria. Por ejemplo, el comando .enumtag se puede usar para recuperar los diagnósticos.
Función de devolución de llamada de evento EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS. NetAdapterCx invoca esta devolución de llamada para recopilar diagnósticos. Si el controlador de cliente proporciona una devolución de llamada EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS , NetAdapterCx lo invoca en el controlador cliente mediante un subproceso dedicado .
En el ejemplo siguiente se muestra cómo registrar NET_DEVICE_RESET_CAPABILITIES en 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);
...
}
Para obtener información sobre cómo inicializar la estructura de NET_DEVICE_RESET_CAPABILITIES , consulte NET_DEVICE_RESET_CAPABILITIES_INIT.
Para obtener información sobre cómo anunciar la estructura de NET_DEVICE_RESET_CAPABILITIES en NetAdapterCx, consulte NetDeviceInitSetResetCapabilities.
Implementación de EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS
La secuencia de restablecimiento y recuperación puede producirse en cualquier momento. Por lo tanto, la implementación de devolución de llamada de la EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS del controlador cliente debe tener en cuenta lo siguiente:
NetAdapterCx sincroniza la devolución de llamada EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS con otras devoluciones de llamada que pueden producirse durante la secuencia de apagado. El controlador cliente puede suponer que NetAdapterCx no invocará devoluciones de llamada, como cancelación o detención de cola de paquetes, liberación de hardware y eliminación de objetos de dispositivo hasta que EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS devuelva.
El controlador cliente debe tener precaución adicional al controlar la recopilación de diagnósticos para evitar el interbloqueo. Debe tener en cuenta que el hardware puede que ya esté en estado de error.
Es fundamental que EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS complete lo antes posible para que el resto del proceso plDR pueda continuar. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS debe ser confiable y debe devolverse en un plazo de 3 segundos.
NetAdapterCx siempre invoca EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS en PASSIVE_LEVEL.
Para enviar diagnósticos a NetAdapterCx, el controlador cliente realiza los pasos siguientes:
Asignación previa de un búfer plano desde un grupo paginado o no paginado para recopilar los diagnósticos de restablecimiento. El controlador debe preasignar este búfer para evitar un error de memoria insuficiente durante el restablecimiento del dispositivo.
Dentro de la devolución de llamada EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS , envíe los diagnósticos como búfer de datos planos mediante una llamada a la API NetDeviceStoreResetDiagnostics . El controlador de cliente debe llamar a la API NetDeviceStoreResetDiagnostics en PASSIVE_LEVEL.
Libere el búfer de datos una vez que NetDeviceStoreResetDiagnostics devuelva.
Importante
La API NetDeviceStoreResetDiagnostics solo debe llamarse en la devolución de llamada EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS . Tampoco se puede usar para volver a enviar datos de diagnóstico después de que se devuelvan netDeviceStoreResetDiagnostics anteriores. Infringir cualquiera de estos casos provocará una comprobación de errores.
Importante
La limitación de tamaño para el diagnóstico de restablecimiento es de 1 MB.
Cómo un controlador cliente solicita PLDR
Un controlador cliente desencadena PLDR mediante la API NetAdapterCx NetDeviceRequestReset cuando detecta un error en el dispositivo. NetDeviceRequestReset vuelve inmediatamente al controlador cliente. La secuencia de restablecimiento y recuperación descrita en restablecimiento y recuperación de NetAdapterCx se desencadena y es asincrónica a la llamada netDeviceRequestReset .
Solo se puede producir una operación PLDR en un momento dado. Por lo tanto, las llamadas posteriores de NetDeviceRequestReset no tienen ningún efecto cuando ya se ha iniciado una operación PLDR.
Llamar a NetDeviceRequestReset tampoco tiene ningún efecto si ya se ha iniciado la secuencia de apagado .
Secuencia de restablecimiento y recuperación de NetAdapterCx
Cuando el sistema operativo o el controlador cliente desencadena PLDR, se produce la siguiente secuencia:
Recopilar diagnósticos de restablecimiento: NetAdapterCx invoca la devolución de llamada del controlador de cliente EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS para recopilar diagnósticos del dispositivo con errores. Por ejemplo, el controlador puede recopilar una instantánea del firmware del dispositivo. Este paso es opcional y solo se produce si el controlador cliente ha registrado la estructura de NET_DEVICE_RESET_CAPABILITIES . De lo contrario, NetAdapterCx omitirá este paso.
Realizar PLDR: NetAdapterCx realiza la operación de restablecimiento de dispositivo de nivel de plataforma. La energía netAdapterCx recicla el hardware y desglosa la pila de dispositivos de software.
En el diagrama siguiente se muestra la secuencia de restablecimiento y recuperación de NetAdapterCx: