LSO(대규모 송신 오프로드)에서 NVGRE 지원
NDIS 6.30(Windows Server 2012)에서는 NVGRE(일반 라우팅 캡슐화)를 사용하는 네트워크 가상화를 도입했습니다. LSO(대규모 송신 오프로드) 버전 2(LSOV2)를 수행하는 NDIS 미니포트, 프로토콜 및 필터 드라이버 및 NIC는 NVGRE를 지원하는 방식으로 수행해야 합니다.
참고 이 페이지에서는 큰 TCP 패킷의 분할 오프로드에 있는 정보를 잘 알고 있다고 가정합니다.
NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 경우. IsEncapsulatedPacket은 TRUE이고 TcpIpChecksumNetBufferListInfo OOB(out-of-band) 정보가 유효합니다. 이는 NVGRE 지원이 필요하고 NIC가 NVGRE 형식 패킷에서 LSOV2 오프로드를 수행해야 하며 다음 조건을 충족해야 했음을 나타냅니다.
- NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO 값만 LsoV2Transmit 구조체가 유효합니다. NIC 및 미니포트 드라이버는 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO 값을 참조해서는 안 합니다. LsoV1Transmit 구조체 입니다.
- NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO. LsoV2Transmit.TcpHeaderOffset 멤버에 올바른 오프셋 값이 없으며 NIC 또는 미니포트 드라이버에서 사용하면 안 됩니다.
LSOV2에서 NVGRE를 지원하려면 프로토콜 및 필터 드라이버에서 다음을 변경해야 합니다.
- NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFOMSS 값을 줄입니다. 새 GRE 헤더를 설명하기 위한 LsoV2Transmit 구조체입니다.
- 감소된 MSS 값의 정확한 배수가 아닐 수 있는 TCP 페이로드 길이를 보냅니다.
- GRE 헤더를 고려하도록 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 구조에서 InnerFrameOffset, TransportIpHeaderRelativeOffset 및 TcpHeaderRelativeOffset 값을 조정합니다.
NIC 및 미니포트 드라이버는 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 구조에 제공된 InnerFrameOffset, TransportIpHeaderRelativeOffset 및 TcpHeaderRelativeOffset 값을 사용할 수 있습니다. NIC 또는 미니포트 드라이버는 터널(외부) IP 헤더 또는 후속 헤더에서 필요한 헤더 검사를 수행하여 이러한 오프셋의 유효성을 검사할 수 있습니다.
미니포트 드라이버는 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 경우를 처리해야 합니다. InnerFrameOffset 은 패킷의 시작 부분과 다른 분산형 수집 목록에 있을 수 있습니다. 프로토콜 드라이버는 앞에 추가된 모든 캡슐화 헤더(ETH, IP, GRE)가 물리적으로 연속되고 패킷의 첫 번째 MDL에 포함되도록 보장합니다.
프로토콜 및 필터 드라이버는 총 TCP 페이로드 길이가 감소된 MSS 값의 정확한 배수인지 보장하지 않습니다. 이러한 이유로 미니포트 드라이버와 NIC는 터널(외부) IP 헤더를 업데이트해야 합니다. NIC는 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO 축소된 MSS 값에 따라 가능한 한 많은 전체 크기의 세그먼트를 생성해야 합니다. LsoV2Transmit OOB 정보입니다. LSOv2 전송당 하나의 하위 MSS 세그먼트만 생성될 수 있습니다.
미니포트 드라이버는 다음을 수행해야 합니다.
- 터널(외부) IP 헤더에 대한 체크섬을 계산합니다.
- 모든 패킷에 대해 터널(외부) IP 헤더의 IP ID(IP ID) 값을 증분합니다. 첫 번째 패킷은 원래 터널(외부) IP 헤더에서 IP ID를 사용해야 합니다.
- 모든 패킷에 대한 전송(내부) IP 헤더의 IP ID를 증분합니다. 첫 번째 패킷은 원래 전송(내부) IP 헤더에서 IP ID를 사용해야 합니다.
- TCP 헤더 및 전송(내부) IP 헤더에 대한 체크섬을 계산합니다.
- 캡슐화 터널(외부) 헤더를 포함한 전체 헤더가 생성된 모든 패킷에 추가되었는지 확인합니다.