MINIPORT_SEND_NET_BUFFER_LISTS 콜백 함수(ndis.h)
NDIS는 MiniportSendNetBufferLists 함수를 호출하여 연결된 NET_BUFFER_LIST 구조 목록에 포함된 네트워크 데이터를 전송합니다.
구문
MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;
void MiniportSendNetBufferLists(
[in] NDIS_HANDLE MiniportAdapterContext,
[in] PNET_BUFFER_LIST NetBufferList,
[in] NDIS_PORT_NUMBER PortNumber,
[in] ULONG SendFlags
)
{...}
매개 변수
[in] MiniportAdapterContext
MiniportInitializeEx 함수에 미니포트 드라이버가 할당한 컨텍스트 영역에 대한 핸들입니다. 미니포트 드라이버는 이 컨텍스트 영역을 사용하여 어댑터에 대한 상태 정보를 유지 관리합니다.
[in] NetBufferList
NET_BUFFER_LIST 구조체의 연결된 목록에서 첫 번째 NET_BUFFER_LIST 구조체에 대한 포인터입니다. 목록의 각 NET_BUFFER_LIST 구조체는 NET_BUFFER 구조의 목록을 설명합니다. 목록의 각 NET_BUFFER 구조체는 MDL 체인에 매핑됩니다. MDL에는 네트워크 데이터가 포함됩니다.
[in] PortNumber
미니포트 어댑터 포트를 식별하는 포트 번호입니다. 미니포트 어댑터 포트 번호를 할당하려면 NdisMAllocatePort 함수를 호출합니다. 0 값은 미니포트 어댑터의 기본 포트를 식별합니다.
[in] SendFlags
보내기 작업에 대한 특성을 정의하는 플래그입니다. 플래그를 OR 작업과 결합할 수 있습니다. 모든 플래그를 지우려면 이 멤버를 0으로 설정합니다. 이 함수는 다음 플래그를 지원합니다.
NDIS_SEND_FLAGS_DISPATCH_LEVEL
현재 IRQL이 DISPATCH_LEVEL 지정합니다. 이 플래그에 대한 자세한 내용은 디스패치 IRQL 추적을 참조하세요.
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
루프백에 대해 NDIS를 검사 지정합니다. 기본적으로 NDIS는 전송 요청을 제출한 드라이버에 데이터를 루프백하지 않습니다. 오버리싱 드라이버는 이 플래그를 설정하여 이 동작을 재정의할 수 있습니다. 이 플래그가 설정되면 NDIS는 바인딩에 대한 수신 조건과 일치하는 데이터를 포함하는 모든 NET_BUFFER 구조를 식별합니다. NDIS는 기준과 일치하는 NET_BUFFER 구조를 오버리싱 드라이버에 나타냅니다. 이 플래그는 다른 바인딩에서 루프백을 확인하거나 다시 반복하는 데 영향을 주지 않습니다.
반환 값
없음
설명
MiniportSendNetBufferLists 는 미니포트 드라이버에 필요한 함수입니다. 오버리싱 드라이버가 NdisSendNetBufferLists 함수를 호출하면 NDIS는 바인딩된 미니포트 드라이버의 MiniportSendNetBufferLists 함수를 호출합니다.
NDIS가 NetBufferLists 매개 변수에 전달하는 네트워크 데이터를 전송할 때 미니포트 드라이버는 다음 지침을 사용해야 합니다.
- 각 NET_BUFFER_LIST 구조체에서 NET_BUFFER 구조체의 순서는 유지되어야 합니다.
- 동일한 연결에서 전송되는 경우 NET_BUFFER_LIST 구조체의 순서를 유지해야 합니다.
-
NET_BUFFER_LIST 구조가 서로 다른 연결에서 전송되는 경우 다음 기능을 사용하는 경우 여러 전송 큐로 분할할 수 있습니다. 이 경우 각 연결에 대한 NET_BUFFER_LIST 구조의 순서가 유지되어야 합니다.
- RSS(수신 쪽 크기 조정)( NET_BUFFER_LIST 구조의 RSS 해시 값은 RSS 간접 참조 테이블의 인덱스로 사용할 수 있습니다.)
- VMQ(Virtual Machine Queue)(나가는 큐의 큐 식별자는 NetBufferListFilteringInfo OOB 정보에 설정됩니다. 자세한 내용은 VMQ 전송 경로를 참조하세요.)
- IEEE 802.1 DCB(데이터 센터 브리징)(TC(트래픽 클래스)를 키오프할 수 있습니다.)
- IEEE 802.1p(DCB 없이 802.1p 태그를 키오프할 수 있습니다.)
미니포트 드라이버는 MiniportSendNetBufferLists 함수를 호출하여 NDIS가 만드는 모든 보내기 요청을 수락합니다. 미니포트 드라이버가 송신 요청을 즉시 완료할 수 없는 경우 드라이버는 요청을 완료할 때까지 큐에 요청을 보관해야 합니다. 송신 요청이 보류 중인 동안 미니포트 드라이버는 NET_BUFFER_LIST 구조체 및 NET_BUFFER_LIST 구조와 연결된 모든 프로토콜 할당 리소스의 소유권을 유지합니다.
미니포트 드라이버는 다음을 호출해야 합니다.모든 NET_BUFFER_LIST 구조에 대한 보내기 요청을 완료하는 NdisMSendNetBufferListsComplete 함수입니다. 시스템 성능을 향상시키기 위해 드라이버는 여러 송신 요청의 NET_BUFFER_LIST 구조를 포함하는 연결된 목록을 만들 수 있습니다. 그런 다음 드라이버는 NdisMSendNetBufferListsComplete에 대한 단일 호출에서 이러한 연결된 목록을 전달할 수 있습니다.NET_BUFFER_LIST 구조체 및 기타 연결된 리소스는 드라이버가 NdisMSendNetBufferListsComplete를 호출하는 즉시 미니포트 드라이버에서 액세스할 수 없는 것으로 처리되어야 합니다.
MiniportSendNetBufferLists 함수는 네트워크 데이터의 내부 큐에 대한 액세스를 동일한 큐에 액세스하는 드라이버의 다른 MiniportXxx 함수와 동기화해야 합니다. 미니포트 드라이버는 스핀 잠금을 사용하여 큐에 대한 액세스를 동기화할 수 있습니다.
프로토콜 드라이버는 바인딩된 미니포트 드라이버가 선택한 중간 유형에 따라 필요한 네트워크 데이터를 결정합니다. 그러나 프로토콜 드라이버는 선택한 매체의 최소 패킷 크기보다 짧은 패킷을 지정하는 네트워크 데이터를 제공할 수 있습니다. 이 경우 선택한 매체가 전송 패킷 크기에 최소 길이 요구 사항을 적용하는 경우 MiniportSendNetBufferLists 는 패킷을 0으로 채워야 합니다.
NDIS가 OID_GEN_MAC_OPTIONS OID를 쿼리할 때 미니포트 드라이버가 NDIS_MAC_OPTION_NO_LOOPBACK 플래그를 설정한 경우 미니포트 드라이버는 네트워크 데이터를 루프백하려고 시도해서는 안 됩니다. NDIS는 이러한 드라이버에 대한 소프트웨어 루프백 지원을 제공합니다.
NDIS는 IRQL<= DISPATCH_LEVEL MiniportSendNetBufferLists를 호출합니다.
예
MiniportSendNetBufferLists 함수를 정의하려면 먼저 정의 중인 함수의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 함수 형식 집합을 제공합니다. 함수 형식을 사용하여 함수를 선언하면 드라이버에 대한 코드 분석, SDV( 정적 드라이버 검증 도구 ) 및 기타 확인 도구에서 오류를 찾을 수 있으며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.예를 들어 " MySendNetBufferLists"라는 MiniportSendNetBufferLists 함수를 정의하려면 다음 코드 예제와 같이 MINIPORT_SEND_NET_BUFFER_LISTS 형식을 사용합니다.
MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;
그런 다음 다음과 같이 함수를 구현합니다.
_Use_decl_annotations_
VOID
MySendNetBufferLists(
NDIS_HANDLE MiniportAdapterContext,
PNET_BUFFER_LIST NetBufferList,
NDIS_PORT_NUMBER PortNumber,
ULONG SendFlags
)
{...}
MINIPORT_SEND_NET_BUFFER_LISTS 함수 형식은 Ndis.h 헤더 파일에 정의되어 있습니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 Use_decl_annotations 주석을 추가해야 합니다. Use_decl_annotations 주석은 헤더 파일의 MINIPORT_SEND_NET_BUFFER_LISTS 함수 형식에 적용되는 주석이 사용되도록 합니다. 함수 선언 요구 사항에 대한 자세한 내용은 NDIS 드라이버에 함수 역할 형식을 사용하여 함수 선언을 참조하세요.
Use_decl_annotations 대한 자세한 내용은 함수 동작 주석 지정을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | NDIS 6.0 이상에서 지원됩니다. |
대상 플랫폼 | Windows |
헤더 | ndis.h(Ndis.h 포함) |
IRQL | <= DISPATCH_LEVEL |
DDI 규정 준수 규칙 | NdisTimedDataHang, NdisTimedDataSend |