Delen via


Pakketverkeer klonen

In dit onderwerp wordt beschreven hoe Hyper-V uitbreidbare switchextensies klonen of dupliceren, pakketten en deze in het uitbreidbare switchgegevenspad injecteren. Zie Cloned NET_BUFFER_LIST Structures voor meer informatie over het klonen van pakketten.

Opmerking Op deze pagina wordt ervan uitgegaan dat u bekend bent met de informatie en diagrammen in Overzicht van de Hyper-V Uitbreidbare switch en Hybrid Forwarding-.

Opmerking In de uitbreidbare switchinterface staan NDIS-filterstuurprogramma's bekend als uitbreidbare switchuitbreidingen en wordt de stuurprogrammastack de uitbreidbare stuurprogrammastackgenoemd. Zie Hyper-V Extensible Switch Extensionsvoor meer informatie over de extensies.

Uitbreidbare switchfilter- en doorstuuruitbreidingen kunnen gekloonde pakketten injecteren in het inkomende of uitgaande pad van de uitbreidbare switch door de volgende richtlijnen te volgen:

  • De extensie moet eerst een NET_BUFFER_LIST structuur toewijzen voor het gekloonde pakket. De extensie moet vervolgens de pakketgegevens van het oorspronkelijke pakket naar het gekloonde pakket kopiëren. Zie Afgeleide NET_BUFFER_LIST Structuren voor meer informatie over het klonen van pakketten.

  • Nadat de extensie een NET_BUFFER_LIST structuur heeft toegewezen, moet deze de handlerfunctie AllocateNetBufferListForwardingContext aanroepen om de uitbreidbare context voor het doorsturen van switches voor het pakket toe te wijzen.

    De doorstuurcontext bevindt zich in de out-of-band-gegevens (OOB) van het pakket. Het bevat doorstuurgegevens voor het pakket, zoals de bronpoort en een matrix van een of meer doelpoorten.

    Zie Hyper-V Extensible Switch Forwarding Contextvoor meer informatie over de doorstuurcontext.

  • De extensie moet de OOB-gegevens, inclusief de bestaande bronpoort, van het oorspronkelijke pakket naar het gekloonde pakket kopiëren door CopyNetBufferListInfo aan te roepen. Als de extensie van plan is om het pakket in te injecteren in het gegevenspad voor inkomend verkeer, moet het ook de doelpoorten kopiëren van de OOB-gegevens van het oorspronkelijke pakket.

    Wanneer de OOB-gegevens worden gekopieerd, moet de extensie de volgende richtlijnen volgen:

    • Als de filterextensie van plan is om het pakket in het gegevenspad voor inkomend verkeer te injecteren, moet CopyNetBufferListInfo aanroepen zonder de NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS vlag op te geven. Hierdoor worden de doelpoorten van het oorspronkelijke pakket niet gekopieerd naar de gekloonde pakketten. Wanneer de filterextensie dit pakket in het gegevenspad voor inkomend verkeer injecteert, worden doelpoorten toegevoegd aan het pakket door een onderliggende doorstuuruitbreiding (indien ingeschakeld in de stuurprogrammastack) of de minipoortrand van de uitbreidbare switch.

    • Als de filterextensie van plan is om het pakket in het uitgaande gegevenspad te injecteren, moet deze CopyNetBufferListInfo aanroepen met de opgegeven NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS vlag. Hierdoor worden de doelpoorten van het oorspronkelijke pakket gekopieerd naar de gekloonde pakketten.

  • Als de filterextensie een pakket kopieert of dupliceert dat is verkregen via het pad naar uitgaande gegevens, kan deze de doelpoorten voor het pakket wijzigen nadat copyNetBufferListInfo is aangeroepen met de opgegeven vlag NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS. Zie Het wijzigen van de uitbreidbare switchpoortgegevens van een pakket voor meer informatie over deze procedure.

  • Als de doorstuurextensie een pakket kopieert of dupliceert dat is verkregen via het gegevenspad voor inkomend verkeer, moet deze nieuwe doelpoorten voor het pakket toevoegen voordat het pakket in het gegevenspad voor inkomend verkeer wordt ingevoerd. Voor meer informatie over deze procedure, zie Extensible Switch Destination Port Data toevoegen aan een pakket.

  • Nadat de extensie CopyNetBufferListInfo aanroept, krijgt het pakket dezelfde bronpoortinformatie toegewezen die in het oorspronkelijke pakket is opgenomen.

    De extensie kan SetNetBufferListSource aanroepen om de bronpoortgegevens in de out-of-band-gegevens (OOB) van het pakket te wijzigen.

    De extensie kan ervoor zorgen dat het pakket wordt behandeld alsof het afkomstig is van een bepaalde poort. Hierdoor kan het beleid voor die poort worden toegepast op het pakket. De extensie roept SetNetBufferListSource aan om de bronpoort voor het pakket te wijzigen.

    Er kunnen echter situaties zijn waarin de extensie mogelijk de bronpoort-id van het pakket aan NDIS_SWITCH_DEFAULT_PORT_IDwilt toewijzen. De extensie kan bijvoorbeeld de bronpoort-id instellen op NDIS_SWITCH_DEFAULT_PORT_ID voor eigen beheerpakketten die naar een apparaat in het externe netwerk worden verzonden.

  • In het standaard NDIS-gegevenspad hebben niet-uitbreidbare OOB-gegevens vaak verschillende waarden, afhankelijk van of het pakket wordt aangegeven als een verzend- of ontvangstbericht. De NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB-gegevens zijn bijvoorbeeld een samenvoeging van structuren die specifiek zijn voor verzenden en ontvangen

    In het uitbreidbare switchgegevenspad verlopen alle pakketten door de extensiestuurprogrammastack zowel bij het verzenden als ontvangen. Daarom zullen de niet-uitbreidbare OOB-gegevens binnen de structuur van de NET_BUFFER_LIST van het pakket zich in een verzend- of ontvangstformaat bevinden tijdens de stroom door de stuurprogrammastack.

    De indeling van deze OOB-gegevens is afhankelijk van de uitbreidbare switchpoort van waaruit het pakket bij de uitbreidbare switch is aangekomen. Als de bronpoort is verbonden met de externe netwerkadapter, zullen de niet-uitbreidbare switch OOB-gegevens in ontvangstaand formaat zijn. Voor andere poorten zal deze OOB-gegevens in een verzendformaat zijn.

    De bronpoortinformatie wordt opgeslagen in de NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO union binnen de OOB-gegevens van de NET_BUFFER_LIST structuur van het pakket. De extensie haalt de gegevens op met behulp van de NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL macro-opdracht.

    Opmerking Als de extensie de NET_BUFFER_LIST-structuur van een pakket kloont, moet het rekening houden met de niet-uitbreidbare OOB-gegevens als het de OOB-gegevens toevoegt of wijzigt. De extensie kan CopyNetBufferListInfo aanroepen om alle OOB-gegevens van een bronpakket naar een gekloond pakket te kopiëren. Met deze functie blijft de indeling voor het verzenden of ontvangen van OOB behouden wanneer de gegevens naar het pakket worden gekopieerd.

  • Wanneer de extensie een pakket kloont, bevinden de gekloonde pakketgegevens zich in het lokale of vertrouwde geheugen in het bovenliggende besturingssysteem van de Hyper-V bovenliggende partitie. Dit geheugen kan niet worden geopend door de kindpartitie. Daarom wordt het beschouwd als 'veilig' van niet-gesynchroniseerde updates door het gastbesturingssysteem dat in die partitie wordt uitgevoerd.

    Nadat het oorspronkelijke pakket is gekloond, moet de extensie de NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO-union in het gekloonde pakket verkrijgen met behulp van de NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL macro. De extensie moet de IsPacketDataSafe lid instellen op TRUE. Hiermee geeft u op dat alle pakketgegevens zich in het vertrouwde geheugen bevinden.

Filteren en doorsturen van extensies moet voldoen aan deze richtlijnen voor het injecteren van gekloonde pakketten in het gegevenspad voor inkomend of uitgaand verkeer:

  • De extensie moet NdisFSendNetBufferLists aanroepen om het gekloonde pakket in het gegevenspad voor inkomend verkeer te injecteren. De extensie moet de parameter SendFlags instellen met de juiste uitbreidbare schakelvlaginstellingen. Zie Hyper-V Extensible Switch Send and Receive Flagsvoor meer informatie over deze vlaginstellingen.

    Wanneer NDIS de functie FilterSendNetBufferListsComplete van de extensie aanroept om de verzendaanvraag van het gekloonde pakket te voltooien, moet de extensie FreeNetBufferListForwardingContext aanroepen om de toegewezen doorstuurcontext vrij te maken. De extensie moet dit doen voordat deze de NET_BUFFER_LIST structuur voor het pakket vrijgeeft of opnieuw gebruikt.

    Notitie De extensie moet het gekloonde pakket in het pad voor inkomend gegevens injecteren als deze de pakketgegevens of bronpoort wijzigt voor een pakket dat is verkregen via het uitgaande gegevenspad. Het moet ook het gekloonde pakket in het gegevenspad voor inkomend verkeer injecteren als de doelpoorten van het pakket niet behouden blijven.

  • De extensie moet NdisFIndicateReceiveNetBufferLists aanroepen om het gekloonde pakket in het gegevenspad voor uitgaand verkeer te injecteren. De extensie moet de parameter ReceiveFlags instellen met de juiste uitbreidbare schakelvlaginstellingen.

    Wanneer NDIS de functie FilterReturnNetBufferLists van de extensie aanroept om de ontvangstaanvraag van het gekloonde pakket te voltooien, moet de extensie FreeNetBufferListForwardingContext aanroepen voordat deze de NET_BUFFER_LIST structuur voor het pakket vrijgeeft of opnieuw gebruikt.

    Notitie Voordat de doorstuurextensie NdisFIndicateReceiveNetBufferLists aanroept, moet het de doelpoorten van het gekloonde pakket hebben bepaald en deze gegevens hebben toegevoegd aan de OOB-gegevens van het pakket.

  • Als de extensie de NET_BUFFER_LIST structuur van een pakket kloont, moet deze het eigendom behouden van de NET_BUFFER_LIST structuur van het oorspronkelijke pakket totdat de verzend- of ontvangstaanvraag van het gekloonde pakket is voltooid. De extensie moet het parentNetBufferList-lid van de NET_BUFFER_LIST structuur van het gekloonde pakket gebruiken om een koppeling te maken naar de NET_BUFFER_LIST structuur van het oorspronkelijke pakket.

    Notitie In NDIS 6.30 (Windows Server 2012) kan de extensie het ParentNetBufferList-lid gebruiken om een koppeling te maken naar het oorspronkelijke pakket, maar dit is niet vereist. In NDIS 6.40 (Windows Server 2012 R2) en hoger is de extensie vereist om het parentNetBufferList-lid te gebruiken om een koppeling naar het oorspronkelijke pakket te maken.

    Zodra de verzend- of ontvangstaanvraag van het gekloonde pakket is voltooid, moet de extensie de aanvraag voor verzenden of ontvangen van het oorspronkelijke pakket voltooien.

    Notitie Als de extensie de NET_BUFFER_LIST structuur van een pakket heeft gekloond, kan het verzenden of ontvangen van het oorspronkelijke pakket worden voltooid nadat het is gekloond.

  • Als de extensie een pakket kloont, kan het verzenden of ontvangen van het oorspronkelijke pakket worden voltooid zodra het is gekloond.

Als de extensie voor doorsturen of filteren een pakket verkrijgt in het uitgaande gegevenspad, kan er geen gekloonde versie van het pakket in dit gegevenspad worden geïnjecteerd als de extensie de pakketgegevens heeft gewijzigd of de bronpoort heeft gewijzigd. De extensie kan deze pakketten echter injecteren in het gegevenspad voor inkomend verkeer. Hierdoor kan het pakket correct worden doorgestuurd en gefilterd via het uitbreidbare switchgegevenspad.

Notitie Filterextensies kunnen alleen gekloonde pakketten injecteren in het gegevenspad voor inkomend verkeer als de doelpoorten van het pakket niet behouden blijven.

Stel dat in het uitbreidbare switch-gegevenspad een pakket met meerdere bestemmingspoorten werd verkregen. Als voor één doelpoort speciale verwerking is vereist, zoals gegevenskapseling, wordt dit door de doorstuur- of filterextensie afgehandeld door de volgende stappen uit te voeren:

  1. Sluit pakketlevering uit naar de poort waarvoor speciale verwerking is vereist. De extensie doet dit door het IsExcluded-lid van de NDIS_SWITCH_PORT_DESTINATION-structuur van de doelpoort in te stellen op een waarde van één. Voor meer informatie over deze procedure, zie Uitsluiten van Pakketlevering naar Uitbreidbare Switchbestemmingspoorten.

  2. Kloon het oorspronkelijke pakket en voer de vereiste verwerking van de pakketgegevens uit.

    Notitie De filterextensie mag geen doelpoort voor het gekloonde pakket toevoegen. Deze gegevens worden later toegevoegd door de doorstuuruitbreiding of de minipoortrand van de uitbreidbare switch.

  3. Stuur het oorspronkelijke pakket door op het uitgaande gegevenspad door de functie NdisMIndicateReceiveNetBufferLists aan te roepen.

  4. Injecteer het gekloonde pakket op het gegevenspad voor inkomend verkeer door NdisFSendNetBufferLists aan te roepen.

Zie Hyper-V Extensible Switch Data Pathvoor meer informatie over de inkomende en uitgaande gegevenspaden van de uitbreidbare switch.

Notitie Het vastleggen van extensies kan pakketverkeer niet klonen. Ze kunnen echter pakketverkeer genereren. Zie Het oorspronkelijke pakketverkeer voor meer informatie.