다음을 통해 공유


체크섬 오프로드

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

TCP/IP 전송이 클라이언트 드라이버에 NET_PACKET 구조를 전달하기 전에 NET_PACKET_CHECKSUM 패킷 확장 의 NET_PACKET 연결된 체크섬 정보를 지정합니다.

TCP/IP 전송은 체크섬 태스크 오프로드에 설명된 대로 TCP/UDP 패킷에 대한 체크섬 계산을 오프로드하기 전에 TCP/UDP 의사 헤더에 대한 보수 합계를 계산합니다.

GSO( 제네릭 구분 오프로드 )가 사용하도록 설정된 경우 체크섬 오프로드를 해제해도 클라이언트 드라이버가 GSO 기능에서 생성된 패킷에 체크섬을 계산하고 삽입하는 것을 방지할 수 없습니다. 체크섬 오프로드를 완전히 사용하지 않도록 설정하려면 GSO도 사용하지 않도록 설정해야 합니다.

체크섬 오프로드를 제어하기 위한 INF 키워드

NetAdapterCx는 레지스트리 키워드를 확인하고 활성 오프로드 기능을 사용하도록 설정할 때 해당 키워드를 적용합니다. 드라이버는 추가 작업을 수행할 필요가 없습니다.

레지스트리 값을 사용하여 작업 오프로드 사용 및 사용 안 함에서 지정한 체크섬 키워드를 사용하여 레지스트리 키 설정으로 체크섬 오프로드를 사용하거나 사용하지 않도록 설정할 수 있습니다. 그룹화된 키워드는 지원되지 않습니다.

키워드(keyword) 값은 REG_SZ 형식이어야 합니다.

체크섬 오프로드 구성

클라이언트 드라이버는 먼저 순 어댑터를 초기화하는 동안 하드웨어의 체크섬 오프로드 기능을 보급합니다. 이 문제는 Net 어댑터를 시작하기 전에 EvtDevicePrepareHardware 콜백 내에서 발생할 수 있습니다.

전송(Tx) 체크섬 오프로드를 구성하려면 클라이언트 드라이버:

  1. NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES 구조를 할당합니다.

  2. NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT 호출하여 구조를 초기화합니다.

  3. NetAdapterOffloadSetTxChecksumCapabilities를 호출하여 NetAdapterCx에 구조를 등록합니다.

NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT 호출하는 동안 클라이언트 드라이버는 EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM 콜백에 대한 포인터를 제공합니다. 활성 오프로드 기능이 변경되면 시스템은 나중에 이 콜백을 호출합니다.

수신(Rx) 체크섬 오프로드를 구성하려면 클라이언트 드라이버:

  1. NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES 구조를 할당합니다.

  2. NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT 호출하여 구조를 초기화합니다.

  3. NetAdapterOffloadSetRxChecksumCapabilities를 호출하여 NetAdapterCx에 구조를 등록합니다.

NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT 호출하는 동안 클라이언트 드라이버는 EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM 콜백에 대한 포인터를 제공합니다. 활성 오프로드 기능이 변경되면 시스템은 나중에 이 콜백을 호출합니다.

하드웨어 전송 체크섬 기능을 나타내는 규칙

  1. NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES 구조체의 Layer3Flags를 설정해야 합니다. Layer4Flags 설정은 선택 사항입니다. Layer3Flags 및 Layer4Flags를 설정하면 NIC가 체크섬 오프로드를 수행할 수 있는 패킷이 표시됩니다.

  2. NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES Layer3HeaderOffsetLimit 및 Layer4HeaderOffsetLimit는 선택 사항입니다. OS가 지정된 제한보다 큰 헤더 오프셋이 있는 패킷을 보내는 경우 해당 계층에 대한 체크섬을 계산하도록 NIC에 요청하지 않습니다.

  3. 옵션/확장이 지원되는 경우 옵션/확장이 없는 IP/TCP 패킷을 지원해야 합니다.

하드웨어 수신 체크섬 기능을 나타내는 규칙

NetAdapterCx는 드라이버가 하드웨어 수신 체크섬 기능을 보급할 필요가 없습니다. 체크섬 오프로드를 사용하는 경우 NIC는 처리할 수 있는 모든 패킷에서 체크섬 오프로드를 수행해야 합니다. NIC가 패킷에서 체크섬 오프로드를 수행할 수 없는 경우 NetAdapterCx는 소프트웨어에서 이를 오프로드합니다.

이 예제에서는 클라이언트 드라이버가 하드웨어 체크섬 오프로드 기능을 설정하는 방법을 보여줍니다.

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's Tx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions |
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
        &txChecksumOffloadCapabilities,
        layer3Flags,
        EvtAdapterOffloadSetTxChecksum);

    txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;

    txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;

    // Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
        &txChecksumOffloadCapabilities);

    // Configure the hardware's Rx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;

    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
        &rxChecksumOffloadCapabilities,
        EvtAdapterOffloadSetRxChecksum);

    // Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
        &rxChecksumOffloadCapabilities);
}

하드웨어 오프로드 업데이트

TCP/IP 스택 또는 지나치게 많은 프로토콜 드라이버가 net 어댑터의 활성 기능 변경을 요청하는 경우 NetAdapterCx는 어댑터 초기화 중에 등록된 클라이언트 드라이버의 EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM 또는 EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM 콜백을 호출합니다. 이러한 함수에서 시스템은 클라이언트 드라이버가 오프로드 기능을 업데이트하기 위해 쿼리하는 NETOFFLOAD 개체에서 업데이트된 기능을 제공합니다.

클라이언트 드라이버는 다음 함수를 호출하여 사용하도록 설정된 체크섬 오프로드를 확인할 수 있습니다.

다음 예제에서는 클라이언트 드라이버가 Tx/Rx 체크섬 오프로드 기능을 업데이트하는 방법을 보여줍니다.

VOID
MyEvtAdapterOffloadSetTxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
    adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
    adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);

    // Update the new hardware Tx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

VOID
MyEvtAdapterOffloadSetRxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
    adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
    adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);

    // Update the new hardware Rx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

체크섬 처리 전송

클라이언트 드라이버는 일반적으로 전송 경로에서 다음 체크섬 처리를 수행합니다.

  1. 클라이언트 드라이버는 패킷 인덱 스를 사용하여 NetExtensionGetPacketChecksum 함수를 호출하여 NET_PACKET_CHECKSUM 구조를 가져옵니다.

  2. 클라이언트 드라이버는 NET_PACKET_CHECKSUM 구조에서 계층별 플래그를 테스트합니다.

    • 플래그가 인 경우 NIC는 NetPacketTxChecksumActionPassthrough해당 계층에서 체크섬 작업을 수행하면 안 됩니다.

    • 플래그가 NetPacketTxChecksumActionRequired인 경우 클라이언트 드라이버는 NET_PACKET_LAYOUT 구조를 사용하여 특정 패킷의 해당 계층에서 사용되는 프로토콜을 결정하고 패킷에 대해 계산해야 하는 체크섬을 NIC에 표시해야 합니다.

  3. 클라이언트 드라이버는 패킷에 대한 적절한 체크섬을 계산하는 NIC에 패킷을 전달합니다.

체크섬 처리 받기

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

플래그는 다음 중 하나일 수 있습니다.

플래그 설명
NetPacketRxChecksumEvaluationNotChecked NIC가 패킷의 체크섬의 유효성을 검사할 수 없습니다.
NetPacketRxChecksumEvaluationValid 패킷의 체크섬이 유효합니다.
NetPacketRxChecksumEvaluationInvalid 패킷의 체크섬이 잘못되었습니다.