Share via


EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES 콜백 함수(netreceivescaling.h)

EvtNetAdapterReceiveScalingSetIndirectionEntries 콜백 함수는 클라이언트 드라이버가 RSS(수신 측 크기 조정) 간접 테이블 항목을 새 수신 큐로 이동하기 위해 구현합니다.

구문

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
  [_In_]    NETADAPTER Adapter,
  [_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}

매개 변수

[_In_] Adapter

NetAdapterCreate에 대한 이전 호출에서 클라이언트 드라이버가 가져온 NETADAPTER 개체입니다.

[_Inout_] IndirectionEntries

간접 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 테이블을 나타내는 구조체에 대한 포인터입니다.

반환 값

이동 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 적절한 NTSTATUS 오류 코드를 반환합니다.

설명

NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 구조체의 적절한 멤버를 설정한 다음 NetAdapterSetReceiveScalingCapabilities를 호출하여 이 콜백 함수의 구현을 등록합니다. 클라이언트 드라이버는 일반적으로 NetAdapterStart를 호출하기 전에 Net 어댑터를 시작할 때 NetAdapterSetReceiveScalingCapabilities를 호출합니다.

프로토콜 드라이버가 RSS에서 프로세서 워크로드의 균형을 조정해야 하는 경우 먼저 각 간접 테이블 항목에 대한 새 매핑을 새 프로세서에 계산합니다. 그런 다음 프로토콜은 이 정보를 NetAdapterCx에 전달하여 프로세서 번호를 내부적으로 NIC 수신 큐 ID에 매핑합니다. NetAdapterCx는 큐 ID를 수신하도록 매핑된 항목이 있는 새 간접 참조 테이블을 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 구조에 저장하고 드라이버의 EvtNetAdapterReceiveScalingSetIndirectionEntries 콜백 함수를 호출할 때 이 구조를 NIC 클라이언트 드라이버에 전달합니다.

이 콜백에서 클라이언트 드라이버는 NIC 간접 테이블의 각 항목을 지정된 수신 큐로 이동합니다. NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 배열의 각 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY 구조에는 테이블의 해당 항목에 대한 해시 인덱스, 항목을 할당할 새 수신 큐 및 개별 이동이 성공했는지 여부를 나타내는 상태 필드가 포함됩니다.

하드웨어 수신 큐에 인덱스 항목을 할당하는 기능은 각 NIC의 디자인에 따라 달라집니다. 예를 들어 일부 NIC 클라이언트 드라이버는 NetAdapterCx 할당 ID와 다른 각 수신 큐에 고유한 ID를 할당할 수 있으므로 간접 참조 테이블 항목을 다시 할당하기 전에 먼저 제공된 큐 ID를 자체 큐 ID로 변환해야 합니다. 다른 NIC에는 시스템 유지 관리 간접 테이블과 크기가 다른 압축된 간접 테이블이 있을 수 있으므로 해당 NIC의 클라이언트 드라이버는 항목을 할당할 때 하드웨어의 간접 처리 테이블에 올바른 인덱스를 계산해야 합니다. 이 두 번째 예제의 코드 샘플은 Realtek Github 샘플 드라이버를 참조하세요.

예제

이 간단한 예제에서는 프로세서에 대한 수신 큐의 1:1 비율을 가정하므로 NIC의 간접 테이블은 시스템의 간접 테이블과 크기가 같습니다.

NTSTATUS
MyEvtNetAdapterReceiveScalingSetIndirectionEntries(
	_In_ 	NETADAPTER   										Adapter,
    _Inout_ PNET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 	IndirectionEntries
)
{

	// Get the adapter's context to retrieve the address of the hardware indirection table
	PMY_NET_ADAPTER_CONTEXT adapterContext = GetMyAdapterContext(Adapter);

	// Assign each indirection table entry to the specified receive queue
	for(size_t i = 0; i < IndirectionEntries->Count; i++)
	{
		// Get the queue ID from its context
		const ULONG queueId = GetMyRxQueueContext(IndirectionEntries->Entries[i].Queue)->QueueId;
		
		// Get the hash index for this entry
		const UINT32 index = IndirectionEntries->Entries[i].Index;

		// Assign the new queue ID for this index in the indirection table and record success
		IndirectionEntries->Entries[i].Status = MySetIndirectionTableEntry(adapterContext->HardwareInfo->RssIndirectionTable[index], 
	queueId
	);
	}

	return STATUS_SUCCESS;
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.25
머리글 netreceivescaling.h(netadaptercx.h 포함)
IRQL DISPATCH_LEVEL

추가 정보

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx 수신 쪽 크기 조정