UDP-ontvangstsegmentcoalescentie-offload (URO)
Vanaf Windows 11, versie 24H2, maakt UDP-ontvangstsegment-samenvoegingsoffload (URO) het voor netwerkinterfacekaarten (NIC's) mogelijk om UDP-ontvangstsegmenten samen te voegen. NIC's kunnen UDP-gegevensgrammen uit dezelfde stroom combineren die overeenkomen met een set regels in een logisch aaneengesloten buffer. Deze gecombineerde datagrammen worden vervolgens aan de Windows-netwerkstack aangegeven als één groot pakket.
Het samenvoegen van UDP-gegevensgrammen vermindert de CPU-kosten voor het verwerken van pakketten in stromen met hoge bandbreedte, wat resulteert in een hogere doorvoer en minder cycli per byte.
In de volgende secties worden de regels beschreven voor het samenvoegen van UDP-pakketten en het schrijven van een URO-minipoortstuurprogramma.
- regels voor het samenvoegen van UDP-pakketten
- Schrijf een URO-minipoortstuurprogramma
- Programmeringsoverwegingen voor URO-stuurprogramma's
Regels voor het samenvoegen van UDP-pakketten
URO coalescing kan alleen worden uitgevoerd op pakketten die voldoen aan alle volgende criteria:
-
IpHeader.Version
is identiek voor alle pakketten. -
IpHeader.SourceAddress
enIpHeader.DestinationAddress
zijn identiek voor alle pakketten. -
UdpHeader.SourcePort
enUdpHeader.DestinationPort
zijn identiek voor alle pakketten. -
UdpHeader.Length
is identiek voor alle pakketten, met uitzondering van het laatste pakket, wat minder kan zijn. -
UdpHeader.Length
moet niet-nul zijn. -
UdpHeader.Checksum
moet, indien niet nul, correct zijn voor alle pakketten. Dit betekent dat het ontvangen van de checksum-offload het pakket moet valideren. -
Layer 2 headers
moet identiek zijn voor alle pakketten.
Als de pakketten IPv4 zijn, moeten ze ook voldoen aan de volgende criteria:
-
IPv4Header.Protocol
== 17 (UDP) voor alle pakketten. -
EthernetHeader.EtherType
== 0x0800 voor alle pakketten. - De
IPv4Header.HeaderChecksum
op ontvangen pakketten moet juist zijn. Dit betekent dat de ontvangen checksum-offload de kop moet valideren. -
IPv4Header.HeaderLength
== 5 (geen IPv4-optieheaders) voor alle pakketten. -
IPv4Header.ToS
is identiek voor alle pakketten. -
IPv4Header.ECN
is identiek voor alle pakketten. -
IPv4Header.DontFragment
is identiek voor alle pakketten. -
IPv4Header.TTL
is identiek voor alle pakketten. -
IPv4Header.TotalLength
==UdpHeader.Length
* + length(IPv4Header
) voor alle pakketten.
Als de pakketten IPv6 zijn, moeten ze ook voldoen aan de volgende criteria:
-
IPv6Header.NextHeader
== 17 (UDP) voor alle pakketten (zonder uitbreidingsheaders). -
EthernetHeader.EtherType
== 0x86dd (IPv6) voor alle pakketten. -
IPv6Header.TrafficClass
enIPv6Header.ECN
zijn identiek voor alle pakketten. -
IPv6Header.FlowLabel
is identiek voor alle pakketten. -
IPv6Header.HopLimit
is identiek voor alle pakketten. -
IPv6Header.PayloadLength
==UdpHeader.Length
voor alle pakketten.
URO-pakketstructuur
De resulterende enkele samengevoegde eenheid (SCU) moet één IP-header en één UDP-header hebben, gevolgd door de UDP-nettolading voor alle samengevoegde datagrammen die samen zijn gevoegd.
URO-aanduidingen moeten het IPv4Header.TotalLength
veld instellen op de totale lengte van de SCU of IPv6Header.PayloadLength
veld op de lengte van de UDP-nettolading en UdpHeader.Length
veld op de lengte van de samengevoegde nettoladingen.
Als er L2-headers (laag 2) aanwezig zijn in samengevoegde datagrammen, moet de SCU een geldige L2-header bevatten. De L2-header in de SCU moet lijken op de L2-header van de samengevoegde datagrammen.
Controlesomvalidatie en aanduiding
URO-indicaties moeten de velden IPv4Header.HeaderChecksum
en UdpHeader.Checksum
op nul instellen en de out-of-band controleinformatie voor de checksum offload invullen op de SCU, waarmee wordt aangegeven dat de IPv4- en UDP-controlesommen zijn geslaagd.
Een pakket dat aan alle voorwaarden voor samenvoeging voldoet, maar niet slaagt voor de controlesomvalidatie, moet afzonderlijk worden aangegeven. Pakketten die zijn ontvangen nadat deze niet mogen worden samengesamend met pakketten die vóór het pakket zijn ontvangen.
Stel dat pakketten 1, 2, 3, 4 en 5 worden ontvangen van dezelfde stroom, maar pakket 3 mislukt de controlesomvalidatie. Pakketten 1 en 2 kunnen worden samengevoegd en pakketten 4 en 5 kunnen worden samengevoegd, maar pakket 3 mag niet worden samengevoegd met beide SCU's. Pakketten 1 en 2 mogen niet worden samengevoegd met pakketten 4 en 5. Pakket 2 is het laatste pakket in een SCU en pakket 4 start een nieuwe SCU. Bovendien moet de SCU met pakketten 1 en 2 worden aangegeven voordat pakket 3 wordt aangegeven en pakket 3 moet worden aangegeven voordat de SCU pakketten 4 en 5 bevat.
Pakketsamenvoeging en stroomscheiding
Pakketten van meerdere stromen kunnen parallel worden samengevoegd, voor zover hardware en geheugen dit toestaan. Pakketten van verschillende stromen mogen niet samen worden samengevoegd.
Interleaved pakketten van meerdere ontvangsten kunnen worden gescheiden en samengevoegd met hun respectieve stromen. Als bijvoorbeeld stromen A, B en C binnenkomen in de volgorde A, A, B, B, A, A, kunnen de pakketten van de A-stroom worden samengevoegd in AAA en kunnen de pakketten uit de B-stroom worden samengevoegd in BB, terwijl het pakket van de C-stroom normaal kan worden aangegeven of samengevoegd met een wachtende SCU van stroom C.
De pakketten binnen een bepaalde stroom mogen niet opnieuw worden gerangschikt met betrekking tot elkaar. De pakketten van de A-stroom moeten bijvoorbeeld worden gegroepeerd in de volgorde die wordt ontvangen, ongeacht de pakketten van de B- en C-stromen die daartussen worden ontvangen.
INF-trefwoord voor het beheren van URO
Het volgende trefwoord kan worden gebruikt om URO in of uit te schakelen met een registersleutelinstelling:
*UdpRsc
Opsommingsgestandaardiseerde INF-trefwoorden hebben de volgende kenmerken:
SubkeyName: de naam van het trefwoord dat u moet opgeven in het INF-bestand en dat wordt weergegeven in het register.
ParamDesc: de weergavetekst die is gekoppeld aan SubkeyName.
waarde: de opsommingswaarde voor gehele getallen die aan elke optie in de lijst is gekoppeld. Deze waarde wordt opgeslagen in NDI\params\SubkeyName\Value.
EnumDesc: de weergavetekst die is gekoppeld aan elke waarde die in het menu wordt weergegeven.
Standaard: de standaardwaarde voor het menu.
SubkeyName | ParamDesc | Waarde | EnumDesc |
---|---|---|---|
*UdpRsc |
URO | 0 | Uitgeschakeld |
1 (standaard) | Ingeschakeld |
Zie Opsommingstrefwoordenvoor meer informatie over het gebruik van opsommingstrefwoorden.
Een URO-minipoortstuurprogramma schrijven
Vanaf NDIS 6.89 faciliteert de NDIS-interface voor URO de communicatie tussen TCP/IP en het NDIS miniportstuurprogramma.
Rapportage van URO-capaciteit
Een minipoortstuurprogramma kondigt ondersteuning aan voor URO in het UdpRsc
lid van de NDIS_OFFLOAD structuur, die het doorgeeft aan de NdisMSetMiniportAttributes functie.
Opvragen van URO-mogelijkheid
Om te controleren of een minipoortstuurprogramma URO ondersteunt, kunnen NDIS-stuurprogramma's en andere toepassingen een query uitvoeren op de OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES OID, die de NDIS_OFFLOAD
structuur retourneert.
Opvraag URO-status
Om de huidige URO-status te bepalen, kunnen NDIS-stuurprogramma's en andere toepassingen de OID_TCP_OFFLOAD_CURRENT_CONFIG OID-aanvraag opvragen. NDIS verwerkt deze OID en geeft deze niet door aan de minipoort.
URO-status wijzigen
URO kan worden ingeschakeld of uitgeschakeld door de OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag uit te geven. Deze OID maakt gebruik van een NDIS_OFFLOAD_PARAMETERS structuur. In deze structuur kan het UdpRsc.Enabled
lid de volgende waarden hebben:
Waarde | Betekenis |
---|---|
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE 0 |
Het minipoortstuurprogramma mag de huidige instelling niet wijzigen. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED 1 |
URO is uitgeschakeld. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_INGESCHAKELD 2 |
URO is ingeschakeld. |
Wanneer een stuurprogramma een OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag verwerkt met de NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
vlag die is ingesteld, moet de NIC wachten met het voltooien van de aanvraag totdat alle bestaande samengevoegde segmenten en openstaande URO-indicaties zijn aangegeven. Dit zorgt voor synchronisatie van URO-in-/uitschakelen gebeurtenissen tussen NDIS-onderdelen.
Nadat het minipoortstuurprogramma de OID_TCP_OFFLOAD_PARAMETERS OID-aanvraag heeft verwerkt, moet het minipoortstuurprogramma een NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG statusaanduiding geven met de bijgewerkte offloadstatus.
De NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE
vlag in NDIS_OFFLOAD_PARAMETERS maakt het uitschakelen van URO alleen voor runtime mogelijk. Wijzigingen die zijn aangebracht met deze vlag, worden niet opgeslagen in het register.
Afmelden voor URO in NDIS 6.89 en hoger
Stuurprogramma's die gericht zijn op NDIS 6.89 en hoger, moeten URO-pakketten begrijpen en op een goede manier afhandelen. Afmelden bij URO:
- Lichtgewicht filterstuurprogramma's (LWF) stellen de
NDIS_FILTER_DRIVER_UDP_RSC_NOT_SUPPORTED
-vlag in binnen het NDIS_FILTER_DRIVER_CHARACTERISTICS--structuur. - Protocolstuurprogramma's stellen de vlag
NDIS_PROTOCOL_DRIVER_UDP_RSC_NOT_SUPPORTED
in de NDIS_PROTOCOL_DRIVER_CHARACTERISTICS-structuur in.
Deze aanpak zorgt ervoor dat onderdelen die niet bekend zijn met URO geen URO-NBL's ontvangen. NDIS schakelt URO uit op de minipoort tijdens de binding als een LWF- of protocolstuurprogramma dat geen ondersteuning biedt voor URO aanwezig is.
Programmeeroverwegingen voor URO-stuurprogramma's
Houd rekening met de volgende problemen bij het implementeren van een minipoortstuurprogramma dat geschikt is voor URO.
Winsock URO-API
Zie IPPROTO_UDP socketoptiesvoor meer informatie over de Winsock URO-API. Zie de informatie over UDP_RECV_MAX_COALESCED_SIZE
en UDP_COALESCED_INFO
.
Windows TCP/IP-stack-updates
Het Microsoft TCP/IP-transport maakt URO mogelijk tijdens bindtijd met NDIS, tenzij de configuratie dit voorkomt.
WFP-aankondigingen kunnen FWP_CALLOUT_FLAG_ALLOW_URO
in FWPS_CALLOUT2 gebruiken om hun ondersteuning voor URO te bepalen. Als er een niet-compatibele WFP-callout is geregistreerd op een URO-gevoelige laag, schakelt het besturingssysteem URO uit zolang de callout is geregistreerd.
Als een socket zich aanmeldt voor URO met een maximale samengevoegde grootte die groter is dan of gelijk is aan de hardware-offload-grootte, zal de stack de NBL's ongewijzigd van de hardware naar de socket leveren. Als een socket zich aanmeldt voor een kleinere maximale samengevoegde grootte, breekt de stapel de samengevoegde ontvangst in de kleinere grootte voor de socket.
Als een socket zich niet aanmeldt voor URO, hersegmenteert de stack de ontvangst voor die socket. Als er geen hardware-URO is, blijft de bestaande software-URO-functie beschikbaar.