다음을 통해 공유


OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Warning

이 항목의 일부 정보는 사전 출시된 제품과 관련이 있으며, 상업적으로 출시되기 전에 실질적으로 수정될 수 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

RSSv2는 Windows 10 버전 1809에서만 미리 보기로 제공됩니다.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID는 RSSv2 지원 미니포트 드라이버로 전송되어 개별 간접 참조 테이블 항목의 이동을 수행합니다. 이 OID는 동기 OID이므로 NDIS_STATUS_PENDING 반환할 수 없습니다. IRQL == DISPATCH_LEVEL 메서드 요청으로만 발급됩니다.

이 호출은 XxxSynchronousOidRequest 진입점을 사용합니다. 여기서 Xxx는 요청을 수신하는 드라이버의 유형에 따라 미니포트 또는 필터입니다. 이 진입점은 NDIS_STATUS_PENDING 반환 상태 표시되는 경우 시스템 버그 검사 발생합니다.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES NDIS_RSS_SET_INDIRECTION_ENTRIES 구조를 사용하여 미니포트 어댑터에 일련의 작업을 동기적으로 수행하도록 지시합니다. 여기서 각 작업은 지정된 VPort의 RSS 간접 테이블의 단일 항목을 대상 지정된 CPU로 이동합니다.

설명

이 OID는 실행한 프로세서 컨텍스트에서 실행되고 완료되어야 합니다. 미니포트 드라이버는 NDIS_STATUS_SUCCESS 상층으로 반환할 때 이 OID를 완전히 실행해야 합니다. 즉, 미니포트 드라이버는 첫 번째 이동이 NDIS_STATUS_SUCCESS 완료된 직후 새 프로세서에서 여러 ITE를 이동하는 백 투 백 OID 요청을 받을 준비가 되어 있어야 합니다.

이 OID를 완전히 실행한다는 것은 미니포트 드라이버가 ITE를 이동하기 위한 다른 작업을 성공적으로 시도할 준비가 되었음을 의미합니다. 원본 CPU 또는 대상 CPU에 있을 수 있는 큐 이동 직후에 진행 중인 수신 트래픽이 표시되는 위치를 규정하지 않습니다.

상층 프로토콜 문제는 IT 및/또는 기본 및 기본 프로세서 매개 변수가 다른 프로세서를 가리키도록 설정하는 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES.

이 OID는 활성 또는 비활성 트래픽 조향 매개 변수에 대해 발급할 수 있습니다. 조향 매개 변수 에 대한 자세한 내용은 수신 측 크기 조정 버전 2(RSSv2)를 참조하세요. 비활성 상태의 매개 변수/IT의 경우 미니포트 드라이버는 다음 관련 RSS 상태 변경(사용 또는 사용 안 함)이 변경될 때까지 대상 프로세서의 유효성을 검사하고 캐시해야 합니다. 이때 캐시된 프로세서 번호가 활성화 되고 트래픽을 지시하는 데 사용됩니다. 활성 매개 변수에 대한 업데이트(유효성을 검사해야 함)는 트래픽을 전달하기 위해 즉시 적용되어야 합니다.

NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID 플래그가 지워진 미니포트 어댑터에 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES 발급해야 합니다. 이는 배열의 다른 요소에서 다른 VPort를 참조할 가능성이 있기 때문입니다.

이 OID는 IRQL == DISPATCH_LEVEL 호출됩니다.

미니포트 드라이버는 NDIS_NIC_SWITCH_CAPABILITIES 구조에서 보급하는 만큼의 간접 참조 테이블 항목 이동 작업을 처리할 수 있도록 준비해야 합니다. 이는 해당 구조의 NumberOfIndirectionTableEntriesPerNonDefaultPFVPort 또는 NumberOfIndirectionTableEntriesForDefaultVPort 멤버 또는 네이티브 RSS 모드에서 128에 정의됩니다.

미니포트 드라이버는 가능한 한 많은 항목을 실행하고 작업의 결과로 각 NDIS_RSS_SET_INDIRECTION_ENTRY EntryStatus 멤버를 업데이트해야 합니다.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES 대한 OID 처리기

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID 처리기는 다음과 같이 동작해야 합니다.

  • OID의 동기 호출 유형으로 인해 NDIS_STATUS_PENDING 반환이 허용되지 않습니다.
  • 현재 CPU(이전에 원격 프로세서에서 시작됨)로 향하는 들어오는 ITE 이동을 완료합니다.
  • 미니포트 드라이버에서 전체 매개 변수 유효성 검사 패스를 수행하는 것이 좋습니다. 가능하지 않은 경우 배열 항목의 일대일 유효성 검사 및 실행을 수행합니다. 미니포트 드라이버는 참조된 모든 개체가 유효한지 구체적으로 검사 합니다.
    • ITE에 대한 EntryStatus 필드에서 NDIS_STATUS_PENDING 반환하는 것은 허용되지 않습니다.
    • 미니포트 어댑터가 존재하며 양수 상태입니다. 그렇지 않으면 항목의 EntryStatus 필드를 NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY 등으로 설정합니다.
    • 각 VPort가 존재하며 양수 상태입니다. 그렇지 않으면 항목의 EntryStatus 필드를 NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE 등으로 설정합니다.
    • 각 간접 테이블 항목 인덱스는 구성된 범위 내에 있습니다. 이 범위는 0xFFFF 또는 OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID에서 설정한 [0...NumberOfIndirectionTableEntries - 1] 범위에 있습니다. 0xFFFF 및 0xFFFE 항목 인덱스에는 특별한 의미가 있습니다. 0xFFFF 기본 프로세서를 정의하는 반면 0xFFFE 기본 프로세서를 정의합니다. 오류 발생시 처리기는 항목의 EntryStatus 필드를 NDIS_STATUS_INVALID_PARAMETER 설정합니다.
    • 위쪽 계층 및 미니포트 드라이버는 ITE가 이동하기 전에 현재 프로세서(행위자 CPU)를 가리킵니다. 즉, ITE를 원격으로 리디렉션할 수 없습니다. 그렇지 않은 경우 항목의 EntryStatus 필드를 NDIS_STATUS_NOT_ACCEPTED 설정합니다.
    • 모든 대상 프로세서는 유효하며 미니포트 어댑터의 RSS 집합에 속합니다. 그렇지 않으면 항목의 EntryStatus 필드를 NDIS_STATUS_INVALID_DATA 설정합니다.
  • 이후에 또는 매개 변수 유효성 검사 통과의 일부로 리소스 상황의 유효성을 검사합니다. 전체 일괄 이동(대피) 후 사용할 큐 수가 OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 요청 중에 NDIS_RECEIVE_SCALE_PARAMETERS_V2 구조에 설정된 NumberOfQueues를 초과하지 않는지 확인합니다. 그렇지 않으면 NDIS_STATUS_NO_QUEUES 반환됩니다. NDIS_STATUS_NO_QUEUES 구성된 큐 수 위반을 나타내는 모든 조건에 사용해야 합니다. NDIS_STATUS_RESOURCES 일시적인 메모리 부족 조건을 지정하는 데만 사용해야 합니다.
  • 리소스 검사 일부로, 각 크기 조정 엔터티(예: VPort)에 대해 미니포트 드라이버는 현재 CPU를 가리키는 모든 IT가 해당 항목에서 벗어나는 경우 조건을 처리해야 합니다.

위의 모든 검사 통과하면 미니포트 드라이버는 새 구성을 무조건 적용할 수 있어야 하며 각 항목의 EntryStatus 필드를 NDIS_STATUS_SUCCESS 설정해야 합니다.

일반적으로 이 OID에 대한 처리기는 매우 가벼운 가중치여야 합니다. spinlocks 및 NdisMConfigMSIXTableEntry같은 가능한 동기화 작업 이외의 NDIS 또는 운영 체제 서비스를 호출해서는 안 됩니다.

미니포트 드라이버는 상태 또는 PnP 이벤트를 나타내기 위해 NDIS를 호출해서는 안 됩니다.

미니포트 드라이버는 이 OID 처리기의 컨텍스트에서 수신/전송 전체 표시를 사용하면 안 됩니다. 이렇게 하면 재귀가 발생합니다. 상층은 수신 또는 전송 표시의 컨텍스트에서 이 OID를 호출할 수 있습니다.

모든 간접 참조 테이블 항목 이동

미니포트 드라이버는 모든 간접 참조 테이블 항목을 현재 CPU에서 멀리 이동하는 특수 요청을 인식하고 처리해야 합니다. RSSv2는 개별 ITE 이동과 함께 작동하므로 미니포트 드라이버는 전체 작업의 원자성을 보장해야 합니다. 해당 이동 명령 배열을 처리하는 동안 일괄 처리 중에 오류가 발생하는 경우 미니포트 드라이버는 이미 수행된 모든 명령을 되돌리기 명령별 EntryStatus 필드에서 모든 명령을 "실패"로 표시해야 합니다. 상층 프로토콜은 항상 "모든 ITE 이동" 일괄 처리에 "성공됨"으로 표시된 모든 명령 또는 "실패"로 표시된 모든 명령이 포함되어야 하며 트래픽이 결과 상태(이동 전후)를 준수한다고 가정합니다. 위쪽 계층에 "실패"로 표시된 일부 항목만 표시되면 시스템 검사 버그가 발생하고 미니포트 드라이버를 원인으로 가리킵니다.

미니포트 드라이버가 "모든 ITE 이동" 명령을 처리하도록 하고 교착 상태를 방지하기 위해 상위 계층 프로토콜은 SwitchId + VPortId 필드 쌍으로 일괄 처리의 이동 명령을 그룹화합니다.

  • 동일한 VPort에 대해 "모두 이동" 명령의 일부로 상위 계층이 함께 실행되기를 원하는 명령은 전체 일괄 처리에 연속적으로 배치됩니다.
  • 미니포트 드라이버는 "모두 이동" 방식으로 다른 VPort를 대상으로 할 수 있는 전체 명령 일괄 처리를 실행하려고 시도해서는 안 됩니다. 동일한 VPort를 대상으로 하는 명령 그룹(동일한 SwitchId + VPortId 쌍으로 태그가 지정됨)만 "모두 이동" 의미 체계에 따라 실행해야 합니다.
  • 상층이 "모두 이동" 의미 체계를 신경 쓰지 않는 경우 명령을 다른 VPort에 명령을 사용하여 동일한 VPort로 인터리브할 수 있습니다. 이 경우 "큐 수" 위반으로 인해 동일한 VPort에 대한 두 번째 명령 그룹을 실행할 수 없는 경우 미니포트 드라이버는 해당 상태 코드(NDIS_STATUS_NO_QUEUES)로 그룹을 표시하고 상층은 복구를 담당합니다.

예를 들어 상층 프로토콜이 다음과 같은 일련의 명령을 인터리브하는 경우:

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

미니포트 드라이버는 네 개의 이동 명령 또는 (ITE[0,1,2])에 대한 VPort=1 세 가지 이동 명령을 모두 원자성으로 실행하려고 할 필요가 없습니다. "모두 이동" 방식으로 그룹을 실행한 다음 VPort=2 ITE[0] 그룹을 VPort=1 ITE[2]실행 VPort=1 ITE[0,1] 하기만 하면 됩니다. 세 명령 그룹 모두 다른 결과를 가질 수 있습니다. 예를 들어 그룹이 성공하면 VPort=2 ITE[0] 그룹이 VPort=1 ITE[0,1] 실패할 VPort=1 ITE[2] 수 있습니다. 결과는 각 명령 구조의 해당 EntryStatus 멤버에 반영되어야 합니다. 이렇게 하면 미니포트 드라이버가 전체 일괄 처리의 안전한 실행을 위한 예방 조치를 취할 필요가 없습니다(예: 전체 어댑터 잠금). 특정 VPort를 대상으로 하는 명령만 직렬화되고 VPort 잠금당 세분화되어야 하며 특정 교착 상태를 방지할 수 있습니다.

참고 항목

명령 항목의 전체 그룹은 동일한 항목 상태 표시되어야 합니다.

오류 조건 및 상태 코드

이 OID는 오류가 발생할 때 다음 상태 코드를 반환합니다.

상태 코드 오류 조건
NDIS_STATUS_INVALID_LENGTH OID 형식이 잘못되었습니다.
NDIS_STATUS_INVALID_PARAMETER 헤더 또는 OID 자체의 다른 필드(개별 명령 항목은 아님)에는 잘못된 값이 포함되어 있습니다.

요구 사항

버전: Windows 10 버전 1709 헤더: Ntddndis.h(Ndis.h 포함)

참고 항목