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에서 프로세서 워크로드의 균형을 조정해야 하는 경우 먼저 새 프로세서에 대한 각 간접 참조 테이블 항목에 대한 새 매핑을 계산합니다. 그런 다음 프로토콜은 내부적으로 프로세서 번호를 NIC 수신 큐 ID에 매핑하는 NetAdapterCx에 이 정보를 전달합니다. 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 |
최소 UMDF 버전 | 2.33 |
머리글 | netreceivescaling.h(netadaptercx.h 포함) |
IRQL | DISPATCH_LEVEL |
추가 정보
NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES