체크섬 작업 오프로드

NDIS는 런타임에 TCP/IP 체크섬 작업 오프로드를 지원합니다.

참고

 체크섬 오프로드 OOB(out-of-band) 데이터는 NET_BUFFER_LIST 정보 배열에 저장됩니다. OOB 데이터에 대한 자세한 내용은 TCP/IP 오프로드 NET_BUFFER_LIST 정보 액세스를 참조하세요.

미니포트 드라이버가 체크섬 작업을 수행할 패킷에 대한 NET_BUFFER_LIST 구조를 미니포트 드라이버에 전달하기 전에 TCP/IP 전송은 NET_BUFFER_LIST 구조와 연결된 체크섬 정보를 지정합니다. 이 정보는 NET_BUFFER_LIST 구조와 연결된 NET_BUFFER_LIST 정보(대역 외 데이터)의 일부인 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 구조체에 의해 지정됩니다.

TCP 패킷에 대한 체크섬 계산을 오프로드하기 전에 TCP/IP 전송은 TCP 의사 헤더에 대한 보수 합계를 계산합니다. TCP/IP 전송은 원본 IP 주소, 대상 IP 주소, 프로토콜 및 TCP 패킷에 대한 TCP 길이를 포함하여 의사 헤더의 모든 필드에서 하나의 보수 합계를 계산합니다. TCP/IP 전송은 TCP 헤더의 체크섬 필드에 있는 의사 헤더에 대한 보수 합계를 입력합니다.

TCP/IP 전송에서 제공하는 의사 헤더에 대한 보수 합계는 NIC가 송신 패킷에 대한 실제 TCP 체크섬을 계산하는 초기 시작을 제공합니다. 실제 TCP 체크섬을 계산하기 위해 NIC는 TCP 체크섬의 변수 부분을 계산하고(TCP 헤더 및 페이로드의 경우) TCP/IP 전송에서 계산한 의사 헤더의 보수 합계에 이 체크섬을 추가하고 체크섬에 대한 16비트 1의 보수를 계산합니다. 이러한 체크섬을 계산하는 방법에 대한 자세한 내용은 RFC 793 및 RFC 1122를 참조하세요.

참고

TCP/IP 전송은 TCP 패킷과 동일한 단계를 사용하여 UDP 패킷의 의사 헤더에 대한 보수 합계를 계산하고 UDP 헤더의 체크섬 필드에 값을 저장합니다.

TCP/IP 전송은 항상 패킷을 기본 미니포트 드라이버에 전달하기 전에 패킷의 IP 헤더에 있는 체크섬 필드가 0으로 설정되어 있는지 확인합니다. 미니포트 드라이버는 IP 헤더의 체크섬 필드를 무시해야 합니다. 미니포트 드라이버는 체크섬 필드가 0으로 설정되어 있고 이 필드를 0으로 설정할 필요가 없는지 확인할 필요가 없습니다.

MiniportSendNetBufferLists 또는 MiniportCoSendNetBufferLists 함수 에서 NET_BUFFER_LIST 구조를 받은 후 미니포트 드라이버는 일반적으로 다음 체크섬 처리를 수행합니다.

  1. 미니포트 드라이버는 TcpIpChecksumNetBufferListInfo_Id 사용하여 NET_BUFFER_LIST_INFO 매크로를 호출하여 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 구조를 가져옵니다.

  2. 미니포트 드라이버는 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 구조에서 IsIPv4IsIPv6 플래그를 테스트합니다. IsIPv4IsIPv6 플래그가 모두 설정되지 않은 경우 NIC는 패킷에 대해 체크섬 작업을 수행하지 않아야 합니다.

  3. IsIPv4 또는 IsIPv6 플래그가 설정된 경우 미니포트 드라이버는 TcpChecksum, UdpChecksumIpHeaderChecksum 플래그를 테스트하여 NIC가 패킷에 대해 계산해야 하는 체크섬을 결정합니다.

  4. 미니포트 드라이버는 패킷에 대한 적절한 체크섬을 계산하는 NIC에 패킷을 전달합니다. 패킷에 터널 IP 헤더와 전송 IP 헤더가 모두 있는 경우 IP 체크섬 오프로드를 지원하는 NIC는 터널 헤더에서만 IP 체크섬 작업을 수행합니다. TCP/IP 전송은 전송 IP 헤더에서 IP 체크섬 작업을 수행합니다.

체크섬 작업을 수행하는 수신 패킷에 대한 NET_BUFFER_LIST 구조를 나타내기 전에 미니포트 드라이버는 적절한 체크섬의 유효성을 검사하고 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 구조에서 적절한 XxxChecksumFailed 또는 XxxChecksumSucceeded 플래그를 설정합니다.

LSO(대규모 송신 오프로드)가 사용하도록 설정된 경우 주소 체크섬 오프로드를 해제해도 미니포트 드라이버가 LSO 기능에서 생성된 패킷에 체크섬을 계산하고 삽입하는 것을 방지할 수 없습니다. 이 경우 주소 체크섬 오프로드를 사용하지 않도록 설정하려면 사용자도 LSO를 사용하지 않도록 설정해야 합니다.