NDIS_TCP_OFFLOAD_EVENT_INDICATE 콜백 함수(ndischimney.h)

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

오프로드 대상은 NdisTcpOffloadEventHandler 함수를 호출하여 오프로드된 TCP 연결과 관련된 이벤트를 나타냅니다.

구문

NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;

void NdisTcpOffloadEventIndicate(
  [in] IN NDIS_HANDLE NdisOffloadHandle,
  [in] IN ULONG EventType,
  [in] IN ULONG EventSpecificInformation
)
{...}

매개 변수

[in] NdisOffloadHandle

표시가 이루어지는 오프로드된 TCP 연결을 식별하는 핸들입니다. 연결이 오프로드되었을 때 이 핸들은 다음의 NdisOffloadHandle 멤버에 제공되었습니다.연결 상태와 연결된 NDIS_MINIPORT_OFFLOAD_BLOCK_LIST 구조체입니다.

[in] EventType

다음 TCP_OFFLOAD_EVENT_TYPE 값 중 하나로 표시되는 이벤트입니다.

TcpIndicateDisconnect

원격 호스트가 연결에 FIN 세그먼트를 전송하여 정상 연결 끊기를 시작했음을 나타냅니다.

TcpIndicateRetrieve

오프로드 대상이 호스트 스택에 TCP 연결의 오프로드를 종료하도록 요청하고 있음을 나타냅니다.

TcpIndicateAbort

원격 호스트가 연결에서 허용 가능한 RST 세그먼트를 전송하여 중단된 연결 끊기를 시작했음을 나타냅니다.

TcpIndicateSendBacklogChange

기본 송신 백로그 크기가 변경되었음을 나타냅니다.

[in] EventSpecificInformation

다음과 같이 표시되는 이벤트에 대한 추가 정보를 지정합니다.

TcpIndicateDisconnect

의미가 없습니다.

TcpIndicateRetrieve

업로드 요청의 이유를 TCP_UPLOAD_REASON 값으로 나타냅니다. 자세한 내용은 설명 부분을 참조하세요.

TcpIndicateAbort

의미가 없습니다.

TcpIndicateSendBacklogChange

호스트 스택이 오프로드 대상에서 미해결 상태여야 하는 최적의 전송 데이터 바이트 수를 지정합니다.

반환 값

없음

설명

정상 연결 끊기 표시

오프로드 대상은 다음과 같은 경우에만 정상 연결 끊기를 나타내야 합니다.
  • 원격 호스트에서 FIN 세그먼트를 받았습니다.
  • FIN 세그먼트 수신 전에 연결에서 받은 모든 데이터는 클라이언트 애플리케이션에서 사용되었습니다(즉, 연결에 표시할 수신 데이터가 없음).
오프로드 대상은 호스트 스택이 연결의 오프로드를 종료할 때까지 연결에 대한 리소스를 해제해서는 안 됩니다.

정상 연결 해제는 연결의 수신 절반만 종료합니다. 연결의 보내기 절반을 종료하지 않습니다.

중단 연결 끊기 표시

오프로드 대상이 TCP 연결에서 허용되는 RST 세그먼트를 수신하는 경우 다음을 수행해야 합니다.
  1. 연결의 내부 상태에서 연결을 중단된 것으로 표시합니다.
  2. TcpIndicateAbortEventType을 사용하여 NdisTcpOffloadEventHandler 함수를 호출합니다.
    참고 미니포트가 TcpIndicateAbort 이벤트를 나타내는 경우 호스트 TCP/IP 스택은 연결의 오프로드를 종료합니다. 오프로드 대상은 RST 세그먼트가 도착하는 즉시 TcpIndicateAbort 이벤트를 자유롭게 나타낼 수 있습니다.
     
  3. NDIS_STATUS_REQUEST_ABORTED 연결에 대한 모든 미해결 송신 요청 및 연결 끊기 요청을 완료합니다. 오프로드 대상은 연결된 목록에 있는 각 NET_BUFFER_LIST 구조체의 상태 멤버에 이 상태 값을 씁니다. NdisTcpOffloadSendComplete 함수 또는 NdisTcpOffloadDisconnectComplete 함수입니다.
오프로드 대상은 호스트 스택이 연결의 오프로드를 종료할 때까지 연결에 대한 리소스를 해제해서는 안 됩니다.

TCP 연결 종료 요청

오프로드 대상은 종료 요청의 이유를 NdisTcpOffloadEventHandler 함수에 전달하는 EventSpecificInformation 매개 변수의 TCP_UPLOAD_REASON 값으로 지정합니다. 이에 대한 응답으로 호스트 스택은 오프로드 대상의 MiniportTerminateOffload 함수를 호출합니다.

오프로드 대상은 NdisTcpOffloadEventHandler 호출당 하나의 TCP 연결만 종료하도록 요청할 수 있습니다. 오프로드 대상은 인접 상태 개체 또는 경로 상태 개체의 종료를 요청할 수 없습니다. 호스트 스택만 인접 또는 경로 상태 개체의 종료를 시작할 수 있습니다.

다음 표에서는 오프로드 대상이 TCP 연결의 오프로드 종료를 요청할 수 있는 이벤트 또는 상황을 설명합니다.

오른쪽에 있는 열은 각 TCP_UPLOAD_REASON 호스트 스택이 항상 연결을 업로드하는지(필수) 연결(선택 사항)을 업로드할지 여부를 나타냅니다. 필수 경우 오프로드 대상은 오프로드된 연결을 계속 처리하지 않습니다. 선택적 경우 호스트 스택이 해당 연결의 오프로드를 종료하지 않는 경우 오프로드 대상은 오프로드된 연결에서 처리를 계속할 수 있어야 합니다.

이벤트/상황 TCP_UPLOAD_REASON 호스트 스택의 TCP 연결 종료
연결을 추적하는 데 사용되는 하드웨어 상태가 손상되었습니다. HardwareFailure 필수
오프로드 대상은 무효화된 상태 개체에 따라 달라지는 TCP 연결에서 데이터를 보내려고 했습니다. InvalidState 필수
오프로드 대상은 TCP 헤더에서 URG 비트가 설정된 세그먼트를 받습니다. 오프로드 대상은 긴급 데이터를 승인하기 위해 ACK를 보내지 않습니다. ReceivedUrgentData 필수
TCP 연결에서 시간 제한이 발생했습니다. TimeoutExpiration 필수
오프로드 대상은 지정되지 않은 이유로 업로드를 요청합니다. UploadRequested 필수
오프로드 대상은 TCP 연결에서 너무 많은 전송 세그먼트가 삭제되고 있음을 감지했습니다. HighDropRate 선택 사항
오프로드 대상은 TCP 연결에서 너무 많은 조각이 수신되고 있음을 감지했습니다. HighFragmentation 선택 사항
오프로드 대상은 TCP 연결에서 너무 많은 순서가 잘못된 세그먼트를 수신했습니다. HighOutofOrderPackets 선택 사항
TCP 연결의 활동(송신/수신)이 너무 낮습니다. LowActivity 선택 사항
TCP 연결에 대한 미리 게시된 수신 버퍼가 없습니다. NoBufferProposting 선택 사항
TCP 연결에 대해 게시된 수신된 버퍼가 너무 작습니다. SmallIO 선택 사항
 

해당 연결이 다음 상태 중 하나에 있는 경우 오프로드 대상은 반쯤 닫힌 TCP 연결의 종료를 시작해서는 안 됩니다.

  • FIN_WAIT1-- 로컬 호스트 스택이 TCP 연결을 닫았지만 연결이 원격 엔드포인트에서 데이터를 수신하고 있을 수 있습니다.
  • FIN_WAIT2-- 로컬 호스트가 TCP 연결을 닫고 보낸 FIN 세그먼트에 대한 ACK를 받았지만 오프로드된 연결은 원격 호스트에서 데이터를 여전히 수신하고 있을 수 있습니다.
  • CLOSE_WAIT-- 로컬 호스트가 여전히 데이터를 전송하고 있을 수 있습니다.
오프로드 대상은 오프로드된 모든 TCP 연결의 종료를 요청할 수 있습니다. 자세한 내용은 NdisMOffloadEventIndicate를 참조하세요.

백로그 보내기 크기의 변경 내용 표시

송신 백로그 크기는 연결, 인터페이스 대역폭 및 기타 매개 변수에 대한 RTT(왕복 시간)의 함수일 수 있습니다. 오프로드 대상이 백로그 보내기 크기를 계산하는 데 사용하는 특정 변수 및 알고리즘은 구현에 따라 다릅니다. 예를 들어 오프로드 대상은 최소 대역폭 지연 제품 및 보급된 수신 창을 알고리즘으로 사용할 수 있습니다. 그러나 송신 백로그 크기는 현재 연결에 전송하기 위해 게시된 데이터 바이트 수에 따라 달라지지 않습니다.

오프로드 대상은 SendBacklogSize 값이 너무 자주 또는 너무 적은 양으로 변경될 경우 오프로드 대상이 SendBacklogSize 이벤트를 나타내지 않도록 제한 메커니즘을 구현해야 합니다. 이렇게 하면 이벤트 표시의 폭풍이 발생하지 않습니다.

요구 사항

   
대상 플랫폼 유니버설
헤더 ndischimney.h(Ndischimney.h 포함)
IRQL DISPATCH_LEVEL

참고 항목

TCP Chimney-Specific 이벤트 표시

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

FIN 또는 RST 세그먼트 수신에 응답