W_TCP_OFFLOAD_RECEIVE_HANDLER 콜백 함수(ndischimney.h)

[TCP 굴뚝 오프로드 기능은 더 이상 사용되지 않으며 사용하지 않아야 합니다.]

NDIS는 MiniportTcpOffloadReceive 함수를 호출하여 오프로드된 TCP 연결에 수신 요청(수신 버퍼)을 게시합니다.

구문

W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;

NDIS_STATUS WTcpOffloadReceiveHandler(
  [in] IN NDIS_HANDLE MiniportAdapterContext,
  [in] IN PVOID MiniportOffloadContext,
  [in] IN PNET_BUFFER_LIST NetBufferList
)
{...}

매개 변수

[in] MiniportAdapterContext

오프로드 대상이 어댑터의 이 instance 대한 상태 정보를 유지하는 오프로드 대상 할당 컨텍스트 영역에 대한 핸들입니다. 미니포트 드라이버는 이 핸들을 호출할 때 NDIS에 제공했습니다. NdisMSetMiniportAttributes MiniportInitializeEx 함수입니다.

[in] MiniportOffloadContext

PVOID 값이 포함된 메모리 위치에 대한 포인터입니다. 이 PVOID 값은 수신 요청이 게시되는 TCP 연결에 대한 상태 개체를 포함하는 미니포트 오프로드 컨텍스트를 참조합니다. 오프로드 대상은 TCP 연결 상태 개체를 오프로드할 때 이 PVOID 값을 제공했습니다.

[in] NetBufferList

NET_BUFFER_LIST 구조체에 대한 포인터입니다. 이 구조체는 독립 실행형 구조체이거나 NET_BUFFER_LIST 구조체의 연결된 목록에서 첫 번째 구조체일 수 있습니다. 목록의 각 NET_BUFFER_LIST 구조체는 하나의 NET_BUFFER 구조를 설명합니다. NET_BUFFER 구조체는 MDL(메모리 설명자 목록) 체인에 매핑됩니다. NET_BUFFER_LIST 및 연결된 구조체는 물리적 메모리에 상주할 수 있도록 잠깁니다. 그러나 시스템 메모리에 매핑되지 않습니다.

반환 값

NDIS_STATUS_PENDING 허용되는 유일한 반환 값입니다. 오프로드 대상은 항상 를 호출하여 게시된 수신 요청을 비동기적으로 완료(반환)합니다. NdisTcpOffloadReceiveComplete.

설명

클라이언트 애플리케이션은 오프로드된 TCP 연결에 수신 요청을 게시할 수 있습니다. 오프로드 대상은 이러한 요청을 사용하여 클라이언트 애플리케이션에 대한 연결에서 받은 데이터를 전송합니다. 수신 요청이 연결에 게시되는 경우 오프로드 대상은 항상 이를 사용하여 연결에서 수신된 데이터를 전송해야 합니다. 자세한 내용은 배달 알고리즘을 참조하세요.

오프로드 대상은 게시된 NET_BUFFER_LIST 구조체를 FIFO(첫 번째 출력) 순서로 큐에 대기합니다. 오프로드 대상은 각 NET_BUFFER_LIST 구조체의 MiniportReserved 멤버를 사용하여 구조를 큐에 대기합니다.

MiniportTcpOffloadReceive 함수에 전달된 각 NET_BUFFER_LIST 구조체에는 연결된 NET_BUFFER 구조가 하나만 있습니다.

오프로드 대상은 수신 데이터를 게시된 수신 요청에 FIFO 순서로 배치해야 합니다. 즉, 먼저 받은 데이터는 게시된 첫 번째 수신 요청에 배치되어야 합니다.

호스트 스택은 연결별로 MiniportTcpOffloadReceive 함수에 대한 호출을 직렬화합니다. 해당 연결에서 MiniportTcpOffloadReceive 함수에 대한 호출이 진행되는 동안 호스트 스택은 연결에서 MiniportTcpOffloadReceive 함수를 호출하지 않습니다. 이렇게 하면 수신 요청이 항상 오프로드 대상의 MiniportTcpOffloadReceive 함수에 올바른 순서로 게시됩니다.

그러나 호스트 스택은 오프로드 대상이 동일한 연결에서 MiniportTcpOffloadReceive 함수에 대한 하나 이상의 이전 호출을 완료하기 전에 연결에서 MiniportTcpOffloadReceive 함수를 호출할 수 있습니다. 또한 호스트 스택은 한 연결에서 오프로드 대상의 MiniportTcpOffloadReceive 함수를 호출할 수 있으며 MiniportTcpOffloadReceive 함수에 대한 하나 이상의 호출은 다른 연결에서 진행 중입니다.

게시된 수신 요청은 필요에 따라 다음 두 가지 모드 중 하나에 있을 수 있습니다.

  • 푸시 모드
  • 비퍼시 모드
오프로드 대상은 푸시 모드와 비퍼시 모드를 모두 지원해야 합니다. .

버퍼가 있는 모드를 결정하기 위해 오프로드 대상은 NET_BUFFER_LIST_INFO 매크로를 호출하여 TcpReceiveNoPush 값을 가져옵니다. 값이 TRUE이면 수신 요청이 비퍼시 모드에 있습니다.

수신 요청이 푸시 모드인 경우 오프로드 대상은 NET_BUFFER_LIST_INFO 매크로를 호출하여 TcpReceiveBytesTransferred 값을 검색합니다. 이 값이 0이 아닌 경우 오프로드 대상은 연결에 대한 푸시 타이머 를 즉시 시작합니다. 이 값이 0이면 오프로드 대상이 수신 데이터의 첫 번째 바이트를 수신 요청에 배치하는 즉시 오프로드 대상이 연결에 대한 푸시 타이머를 시작합니다. 오프로드 대상은 항상 채워진 수신 요청을 즉시 완료합니다. 오프로드 대상은 다음 중 하나가 발생하는 경우 푸시 모드에 있는 부분적으로 채워진 수신 요청을 완료합니다.

  • 푸시 타이머가 만료됩니다.
  • 오프로드 대상은 PSH 비트가 설정된 연결에서 TCP 세그먼트를 받습니다.
수신 요청이 비push 모드인 경우 오프로드 대상은 푸시 타이머를 시작하지 않습니다. 오프로드 대상은 수신 요청이 채워진 경우에만 수신 요청을 완료합니다. 오프로드 대상은 연결에서 수신하는 TCP 세그먼트의 PSH 비트를 무시합니다.

푸시 타이머가 실행되는 동안 오프로드된 연결에서 데이터를 수신하는 경우 오프로드 대상은 해당 연결에 대한 푸시 타이머를 다시 시작해야 합니다.

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 ndischimney.h(Ndischimney.h 포함)
IRQL 모든 수준

추가 정보

MiniportInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMSetMiniportAttributes

NdisTcpOffloadReceiveComplete