Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
NDIS-miniportdrivrutiner (Network Driver Interface Specification) kan avlasta segmenteringen av stora TCP-paket som är större än den maximala överföringsenheten (MTU) för nätverksmediet. Ett nätverkskort som stöder segmentering av stora TCP-paket måste också kunna:
Beräkna IP-kontrollsummor för att skicka paket som innehåller IP-alternativ.
Beräkna TCP-kontrollsummor för att skicka paket som innehåller TCP-alternativ.
NDIS versioner 6.0 och senare stöder large send offload version 1 (LSOv1), som liknar large send offload (LSO) i NDIS 5.x. NDIS versioner 6.0 och senare stöder även offload av stora sändningar version 2 (LSOv2), som tillhandahåller förbättrade tjänster för segmentering av stora paket, inklusive stöd för IPv6.
En miniportdrivrutin som stöder LSOv2 och LSOv1 måste fastställa avlastningstypen genom NET_BUFFER_LIST strukturens utanför bandet (OOB) information. Drivrutinen kan använda -typ-medlem i NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO-strukturen för att avgöra om drivrutinsstacken använder LSOv2 eller LSOv1 och utföra lämpliga offload-tjänster. Alla NET_BUFFER_LIST struktur som innehåller LSOv1- eller LSOv2 OOB-data innehåller också en enda NET_BUFFER struktur. Mer information om NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFOfinns i Att få tillgång till TCP/IP Offload NET_BUFFER_LIST-information.
I de fall där miniporten har fått OID_TCP_OFFLOAD_PARAMETERS för att stänga av LSO-funktionen och efter att miniporten har slutfört OID:en framgångsrikt, ska miniporten släppa alla NET_BUFFER_LIST som innehåller LSOv1- eller LSOv2 OOB-data som inte är lika med noll (NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO).
TCP/IP-transporten avlastar endast de stora TCP-paket som uppfyller följande kriterier:
Paketet är ett TCP-paket. TCP/IP-transporten avlastar inte stora UDP-paket för segmentering.
Paketet måste vara delbart med minst det antal segment som anges av miniportdrivrutinen. Mer information finns i Rapportering av ett NIC:s LSOv1 TCP-Packet-Segmentation Kapabiliteter och Rapportering av ett NIC:s LSOv2 TCP-Packet-Segmentation Kapabiliteter.
Paketet är inte ett loopback-paket.
Paketet skickas inte via en tunnel.
Innan du avlastar ett stort TCP-paket för segmentering ska TCP/IP-transporten:
- Uppdaterar segmenteringsinformationen för stora paket som är associerad med den NET_BUFFER_LIST strukturen. Den här informationen är en NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO-struktur som är del av informationen NET_BUFFER_LIST och är associerad med NET_BUFFER_LIST-struktur. Mer information om NET_BUFFER_LIST finns i Accessing TCP/IP Offload NET_BUFFER_LIST Information. TCP/IP-transporten anger värdet MSS till den maximala segmentstorleken.
För LSOv1 skriver den totala längden på det stora TCP-paketet till fältet
Total Lengthi paketets IP-huvud. Den totala längden inkluderar längden på IP-huvudet, längden på IP-alternativen om de finns, längden på TCP-huvudet, längden på TCP-alternativen om de finns och längden på TCP-nyttolasten. För LSOv2 sätter fältetTotal Lengthför paketets IP-header till 0. Miniportdrivrutiner bör bestämma paketets längd från längden på den första NET_BUFFER-strukturen i NET_BUFFER_LIST-strukturen.Beräknar ens komplementsumma för TCP-pseudohuvudet och skriver den här summan till fältet
Checksumi TCP-huvudet. TCP/IP-transporten beräknar komplementsumman för följande fält i pseudoheader:Source IP Address,Destination IP AddressochProtocol. Den enas komplementsumma för pseudoheader som tillhandahålls av TCP/IP-transporten ger nätverkskortet en tidig start vid beräkningen av den verkliga TCP-kontrollsumman för varje paket som nätverkskortet härleder från det stora TCP-paketet utan att behöva undersöka IP-huvudet. Observera att RFC 793 anger att kontrollsumman för pseudorubriker beräknas överSource IP Address,Destination IP Address,ProtocolochTCP Length. (TCP-längden är längden på TCP-huvudet plus längden på TCP-nyttolasten. TCP-längden inkluderar inte längden på pseudorubriken.) Men eftersom den underliggande miniportdrivrutinen och NIC genererar TCP-segment från det stora paket som skickas av TCP/IP-transporten, vet transporten inte storleken på TCP-nyttolasten för varje TCP-segment och kan därför inte inkludera TCP-längden i pseudorubriken. Enligt beskrivningen nedan utökar nätverkskortet i stället kontrollsumman för pseudorubriker som tillhandahölls av TCP/IP-transporten för att täcka TCP-längden för varje genererat TCP-segment.Skriver rätt sekvensnummer till fältet
Sequence Numberi TCP-huvudet. Sekvensnumret identifierar den första byte av TCP-nyttolasten.
När miniportdrivrutinen har hämtat strukturen NET_BUFFER_LIST i sin funktion MiniportSendNetBufferLists eller MiniportCoSendNetBufferLists, kan den använda makrot NET_BUFFER_LIST_INFO med en _Id av TcpLargeSendNetBufferListInfo för att erhålla MSS-värdet som har skrivits av TCP/IP-transporten.
Miniportdrivrutinen hämtar den totala längden på det stora paketet från paketets IP-huvud och använder MSS-värdet för att dela upp det stora TCP-paketet i mindre paket. Vart och ett av de mindre paketen innehåller MSS eller mindre användardatabyte. Endast det sista paketet som skapades från det segmenterade stora paketet ska innehålla mindre än MSS-användardatabyte. Alla andra paket som har skapats från det segmenterade paketet ska innehålla MSS-användardatabyte. Om du inte följer den här regeln kan skapande och överföring av onödiga extra paket försämra prestandan.
Miniportdrivrutinen fäster MAC-, IP- och TCP-huvuden till varje segment som härleds från det stora paketet. Miniportdrivrutinen måste beräkna IP- och TCP-kontrollsummorna för dessa härledda paket. För att beräkna TCP-kontrollsumman för varje paket som härleddes från det stora TCP-paketet beräknar nätverkskortet variabeldelen av TCP-kontrollsumman (för TCP-huvudet och TCP-nyttolasten), lägger till den här kontrollsumman till den enas komplementsumma för pseudoheader som beräknas av TCP/IP-transporten och beräknar sedan 16-bitarskomplementet för kontrollsumman. Mer information om hur du beräknar sådana kontrollsummor finns i RFC 793 och RFC 1122.
Följande bild visar segmenteringen av ett stort paket.
Längden på TCP-användardata i det stora TCP-paketet ska vara lika med eller mindre än det värde som miniportdrivrutinen tilldelar till MaxOffLoadSize-värdet. Mer information om MaxOffLoadSize-värdet finns i Rapportera en NIC:s LSOv1 TCP-Packet-Segmentation Kapabiliteter och Rapportera en NIC:s LSOv2 TCP-Packet-Segmentation Kapabiliteter.
När en drivrutin utfärdar en statusindikering för att ange en ändring av MaxOffLoadSize-värdet får drivrutinen inte krascha om den tar emot en LSO-sändningsbegäran som använder det tidigare MaxOffLoadSize värdet. Drivrutinen kan i stället misslyckas med att skicka begäran.
En mellanliggande drivrutin som oberoende utfärdar statusindikationer som rapporterar en ändring i MaxOffLoadSize-värdet måste se till att det underliggande miniportkortet som inte har utfärdat någon statusindikering inte får några paket som är större än det MaxOffLoadSize värde som miniportkortet rapporterade.
En miniport-mellanliggande drivrutin som svarar på OID_TCP_OFFLOAD_PARAMETERS för att stänga av LSO-tjänster måste vara förberedd för en kort tidsperiod där LSO-sändningsbegäranden fortfarande kan nå miniportdrivrutinen.
Längden på TCP-användardata i ett segmentpaket måste vara mindre än eller lika med MSS. MSS är det ULONG-värde som TCP-transporten skickar med hjälp av LSO-NET_BUFFER_LIST-information som är associerad med en NET_BUFFER_LIST-struktur. Endast det sista paketet som skapades från det segmenterade stora paketet ska innehålla mindre än MSS-användardatabyte. Alla andra paket som har skapats från det segmenterade paketet ska innehålla MSS-användardatabyte. Om du inte följer den här regeln kan skapande och överföring av onödiga extra paket försämra prestandan.
Antalet segmentpaket som härleddes från det stora TCP-paketet måste vara lika med eller större än det MinSegmentCount värde som anges av miniportdrivrutinen. Mer information om MinSegmentCount-värdet finns i Rapportera en NIC:s LSOv1 TCP-Packet-Segmentation Kapabiliteter och Rapportera en NIC:s LSOv2 TCP-Packet-Segmentation Kapabiliteter.
Följande antaganden och begränsningar gäller för bearbetning av IP- och TCP-huvuden för alla LSO-kompatibla miniportdrivrutiner oavsett version:
MF-biten i IP-huvudet för det stora TCP-paketet som TCP/IP-transporten avlastade kommer inte att vara satt, och fragmentförskjutningen i IP-huvudet kommer att vara noll.
URG, RSToch SYN flaggor i TCP-huvudet för det stora TCP-paketet anges inte och den brådskande förskjutningen (pekaren) i TCP-huvudet blir noll.
Om biten FIN i TCP-huvudet på det stora paketet är satt, ska miniportdrivrutinen ange den här biten i TCP-huvudet för det sista paketet som det skapar från det stora TCP-paketet.
Om den PSH- biten i TCP-huvudet för det stora TCP-paketet har angetts måste miniportdrivrutinen ange den här biten i TCP-huvudet för det sista paketet som skapas från det stora TCP-paketet.
Om biten CWR i TCP-huvudet för det stora TCP-paketet är satt, måste miniportdrivrutinen ange denna bit i TCP-huvudet för det första paketet som den skapar från det stora TCP-paketet. Miniportdrivrutinen kan välja att ange den här biten i TCP-huvudet för det senaste paketet som skapas från det stora TCP-paketet, även om det är mindre önskvärt.
Om det stora TCP-paketet innehåller IP-alternativ eller TCP-alternativ (eller båda) kopierar miniportdrivrutinen dessa alternativ, oförändrade, till varje paket som det härleds från det stora TCP-paketet. Specifikt kommer nätverkskortet inte att öka alternativet tidsstämpel.
Alla pakethuvuden (Ethernet, IP, TCP) finns i paketets första MDL. Rubrikerna delas inte över flera MDL:er.
Tips
Det här antagandet är giltigt när LSO är aktiverat. Om LSO inte är aktiverat kan miniportdrivrutiner inte förutsätta att IP-huvuden finns i samma MDL som Ethernet-huvuden.
Miniportdrivrutinen måste skicka paketen i NET_BUFFER_LIST strukturer i den ordning som den tar emot NET_BUFFER_LIST strukturer från TCP/IP-transporten.
När du bearbetar ett stort TCP-paket ansvarar miniportkortet bara för att segmentera paketet och fästa MAC-, IP- och TCP-huvuden på paketen som härleds från det stora TCP-paketet. TCP/IP-transporten utför alla andra uppgifter (till exempel att justera storleken på sändningsfönstret baserat på fjärrvärdens mottagarfönsterstorlek).
Innan du slutför sändningsåtgärden för det stora paketet (till exempel med NdisMSendNetBufferListsComplete eller NdisMCoSendNetBufferListsComplete), skriver miniportdrivrutinen värdet NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO (NET_BUFFER_LIST information för stora sändningsavlastningar) med det totala antalet TCP-användardatabyte som framgångsrikt skickas i alla paket som har skapats från det stora TCP-paketet.
Förutom de tidigare LSO-kraven måste även LSOv2-kompatibla miniportdrivrutiner:
Stöd för IPv4 eller IPv6, eller både IPv4 och IPv6.
Stöd för replikering av IPv4-alternativen, från det stora paketet, i varje segmentpaket som nätverkskortet (NIC) genererar.
Stöd för replikering av IPv6-tilläggshuvudet från det stora TCP-paketet i varje TCP-segmentpaket.
Stöd för replikering av TCP-alternativ i varje TCP-segmentpaket som miniportdrivrutinen genererar.
Använd IP- och TCP-huvudet i NET_BUFFER_LIST struktur som mall för att generera TCP/IP-huvuden för varje segmentpaket.
Använd IP-identifieringsvärden (IP-ID) i intervallet från 0x0000 till 0x7FFF. (Intervallet från 0x8000 till 0xFFFF är reserverat för TCP chimney-avlastningskompatibla enheter.) Om mallens IP-huvud till exempel börjar med värdet ID-fält på 0x7FFE måste det första TCP-segmentpaketet ha ett IP-ID-värde på 0x7FFE följt av 0x7FFF, 0x0000, 0x0001 och så vidare.
Använd byteförskjutningen i TcpHeaderOffset medlem i NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO för att fastställa platsen för TCP-huvudet, med början från paketets första byte.
Begränsa antalet NET_BUFFER strukturer som är associerade med varje LSOv2-NET_BUFFER_LIST struktur till en.
Anmärkning
Detta är ett nytt krav för LSOv2-kompatibla miniportdrivrutiner. Den här regeln tillämpas inte uttryckligen för LSOv1-miniportdrivrutiner, även om den rekommenderas.
Bestäm den totala längden på paketet från längden på den första
NET_BUFFER-strukturen iNET_BUFFER_LIST-strukturen. Detta skiljer sig från -metoddrivrutinerna för LSOv1.Stöd för TCP-alternativ, IP-alternativ och IP-tilläggshuvuden.
När en sändningsåtgärd är klar måste miniportdrivrutinen ange
LsoV2TransmitComplete.Reservedmedlem i NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO-strukturen till noll ochLsoV2TransmitComplete.Typemedlem tillNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE.