NetAdapterCx PLDR을 사용하여 응답하지 않는 NIC 복구

NetAdapterCx는 PLDR(플랫폼 수준 디바이스 재설정)을 통해 오작동하는 네트워크 디바이스를 재설정하고 복구하는 효과적인 방법을 제공합니다. 전체 Windows 시스템을 다시 부팅하지 않고 PLDR 작업은 영향을 받는 네트워크 디바이스 스택을 중단하여 하드웨어 및 드라이버가 빈 상태에서 다시 시작되도록 합니다. 또한 NetAdapterCx를 사용하면 클라이언트 드라이버가 플랫폼 수준 재설정 전에 실패한 디바이스에서 진단 수집할 수 있습니다.

PLDR은 비정상적인 디바이스 동작이 감지되면 트리거됩니다. 다음 중 하나를 통해 트리거할 수 있습니다.

  • 운영 체제(OS)입니다. 예를 들어 전송 중인 패킷이 드라이버에 너무 오래 고정된 경우 OS 쪽에서 PLDR을 트리거할 수 있습니다.

  • IHV(독립 하드웨어 공급업체) 클라이언트 드라이버. 예를 들어 클라이언트 드라이버는 드라이버가 디바이스가 제어 명령에 응답하지 않는 것을 감지할 때 NETAdapterCx에 PLDR을 트리거하도록 요청할 수 있습니다.

사용자에게 친숙한 디바이스 오류 및 복구를 제공하려면 IHV 및 OEM(원본 장비 제조업체)이 네트워크 디바이스에 대해 PLDR을 지원하는 것이 좋습니다. PLDR에 대한 자세한 내용은 디바이스 다시 설정 및 복구를 참조하세요. NetAdapterCx는 함수 수준 디바이스 재설정을 통해 네트워크 디바이스를 복구하지 않습니다.

선택적 진단 컬렉션 콜백 등록

NetAdapterCx 재설정 및 복구 프로세스의 일부로 클라이언트 드라이버는 디바이스가 플랫폼 수준 재설정되기 전에 실패한 디바이스에서 디바이스별 진단 수집할 수 있습니다. IHV와 Microsoft는 오류 후 분석에서 이 데이터를 사용하여 제품의 품질을 향상시킬 수 있습니다.

등록 NET_DEVICE_RESET_CAPABILITIES

클라이언트 드라이버는 디바이스별 진단 수집하기 위해 EVT_WDF_DRIVER_DEVICE_ADD 콜백 함수에서 NET_DEVICE_RESET_CAPABILITIES 구조를 초기화하고 등록해야 합니다.

NET_DEVICE_RESET_CAPABILITIES 다음을 포함합니다.

  • 고유한 GUID입니다. IHV는 이 GUID를 지정하고 나중에 이를 사용하여 메모리 덤프에서 재설정 진단 식별하고 검색합니다. 예를 들어 .enumtag 명령을 사용하여 진단 검색할 수 있습니다.

  • EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 이벤트 콜백 함수입니다. NetAdapterCx는 이 콜백을 호출하여 진단 수집합니다. 클라이언트 드라이버가 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백을 제공하는 경우 NetAdapterCx는 전용 스레드를 사용하여 클라이언트 드라이버에서 호출합니다.

다음 예제에서는 NetAdapterCx에 NET_DEVICE_RESET_CAPABILITIES 등록하는 방법을 보여줍니다.

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 반환될 때까지 패킷 큐 취소/중지, 하드웨어 릴리스 및 디바이스 개체 삭제와 같은 콜백을 호출하지 않는다고 가정할 수 있습니다.

  • 교착 상태를 방지하려면 클라이언트 드라이버에서 진단 컬렉션을 처리할 때 주의해야 합니다. 하드웨어가 이미 실패한 상태일 수 있다는 점을 고려해야 합니다.

  • PLDR 프로세스의 나머지 부분을 진행할 수 있도록 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 가능한 한 빨리 완료하는 것이 중요합니다. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 신뢰할 수 있어야 하며 3초 이내에 반환해야 합니다.

  • NetAdapterCx는 항상 PASSIVE_LEVEL EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 호출합니다.

NetAdapterCx에 진단 제출하기 위해 클라이언트 드라이버는 다음 단계를 수행합니다.

  1. 페이징된 풀 또는 비페이지 풀에서 플랫 버퍼를 미리 할당하여 다시 설정 진단 수집합니다. 디바이스를 다시 설정하는 동안 메모리 부족 오류를 방지하려면 드라이버가 이 버퍼를 미리 할당해야 합니다.

  2. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백 내에서 NetDeviceStoreResetDiagnostics API를 호출하여 진단 플랫 데이터 버퍼로 제출합니다. 클라이언트 드라이버는 PASSIVE_LEVEL NetDeviceStoreResetDiagnostics API를 호출해야 합니다.

  3. NetDeviceStoreResetDiagnostics가 반환되면 데이터 버퍼를 해제합니다.

중요

NetDeviceStoreResetDiagnostics API는 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백에서만 호출되어야 합니다. 또한 이전 NetDeviceStoreResetDiagnostics가 반환된 후에는 진단 데이터를 다시 제출하는 데 사용할 수 없습니다. 이러한 경우 중 하나를 위반하면 버그 검사가 발생합니다.

중요

초기화 진단 크기 제한은 1MB입니다.

클라이언트 드라이버가 PLDR을 요청하는 방법

클라이언트 드라이버는 디바이스 오류를 감지할 때 NetAdapterCx NetDeviceRequestReset API를 사용하여 PLDR을 트리거합니다. NetDeviceRequestReset 은 클라이언트 드라이버에 즉시 반환됩니다. NetAdapterCx 재설정 및 복구 시퀀스에 설명된 초기화 및 복구 시퀀스가 트리거되고 NetDeviceRequestReset 호출에 비동기적입니다.

지정된 시간에는 하나의 PLDR 작업만 발생할 수 있습니다. 따라서 PLDR 작업이 이미 시작된 경우 NetDeviceRequestReset 의 후속 호출에는 영향을 주지 않습니다.

전원 다운 시퀀스가 이미 시작된 경우에도 NetDeviceRequestReset을 호출해도 효과가 없습니다.

NetAdapterCx 초기화 및 복구 시퀀스

OS 또는 클라이언트 드라이버가 PLDR을 트리거하면 다음 시퀀스가 발생합니다.

  1. 재설정 진단 수집: NetAdapterCx는 클라이언트 드라이버의 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백을 호출하여 실패한 디바이스에서 진단 수집합니다. 예를 들어 드라이버는 디바이스 펌웨어의 스냅샷 수집할 수 있습니다. 이 단계는 선택 사항이며 클라이언트 드라이버가 NET_DEVICE_RESET_CAPABILITIES 구조를 등록한 경우에만 발생합니다. 그렇지 않으면 NetAdapterCx가 이 단계를 건너뜁니다.

  2. PLDR 수행: NetAdapterCx는 플랫폼 수준 디바이스 재설정 작업을 수행합니다. NetAdapterCx 전원은 하드웨어를 재활용하고 소프트웨어 디바이스 스택을 중단합니다.

다음 다이어그램에서는 NetAdapterCx 초기화 및 복구 시퀀스를 보여 줍니다.

NetAdapterCx 재설정 및 복구 시퀀스를 보여 주는 순서도입니다.