Condividi tramite


Clonazione del traffico dei pacchetti

In questo argomento viene descritto come le estensioni del commutatore estendibili Hyper-V clonano o duplicano pacchetti e li inseriscono nel percorso dati di commutatore estendibile. Per altre informazioni sulla clonazione dei pacchetti, vedere Clonate NET_BUFFER_LIST Strutture.

Nota Questa pagina presuppone che si abbia familiarità con le informazioni e i diagrammi in Panoramica del commutatore estendibile Hyper-V e dell'inoltroibrido.

Nota Nell'interfaccia del commutatore estendibile i driver di filtro NDIS sono noti come estensioni di commutatori estendibili e lo stack di driver è noto come stack di driver di commutatore estendibile. Per altre informazioni sulle estensioni, vedere Estensioni di commutatori estendibili Hyper-V.

Il filtro e l'inoltro estendibili delle estensioni possono inserire pacchetti clonati nel percorso dati in ingresso o in uscita del commutatore estendibile seguendo queste linee guida:

  • L'estensione deve innanzitutto allocare una struttura di NET_BUFFER_LIST per il pacchetto clonato. L'estensione deve quindi copiare i dati del pacchetto dal pacchetto originale al pacchetto clonato. Per altre informazioni su come clonare i pacchetti, vedere Strutture derivate NET_BUFFER_LIST.

  • Dopo che l'estensione alloca una struttura NET_BUFFER_LIST , deve chiamare la funzione del gestore AllocateNetBufferListForwardingContext per allocare il contesto di inoltro del commutatore estendibile per il pacchetto.

    Il contesto di inoltro risiede nei dati fuori banda (OOB) del pacchetto. Contiene informazioni di inoltro per il pacchetto, ad esempio la porta di origine e una matrice di una o più porte di destinazione.

    Per altre informazioni sul contesto di inoltro, vedere Contesto di inoltro estendibile Hyper-V.

  • L'estensione deve copiare i dati OOB, inclusa la porta di origine esistente, dal pacchetto originale al pacchetto clonato chiamando CopyNetBufferListInfo. Se l'estensione prevede di inserire il pacchetto nel percorso dati in ingresso, deve anche copiare le porte di destinazione dai dati OOB del pacchetto originale.

    Quando copia i dati OOB, l'estensione deve seguire queste linee guida:

    • Se l'estensione di filtro prevede di inserire il pacchetto nel percorso dati in ingresso, deve chiamare CopyNetBufferListInfo con il flag NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS non specificato. In questo modo le porte di destinazione del pacchetto originale non vengono copiate nei pacchetti clonati. Quando l'estensione di filtro inserisce questo pacchetto nel percorso dati in ingresso, le porte di destinazione verranno aggiunte al pacchetto da un'estensione di inoltro sottostante (se abilitata nello stack di driver) o dal bordo miniport del commutatore estendibile.

    • Se l'estensione di filtro prevede di inserire il pacchetto nel percorso dati in uscita, deve chiamare CopyNetBufferListInfo con il flag NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS specificato. Ciò causa la copia delle porte di destinazione del pacchetto originale nei pacchetti clonati.

  • Se l'estensione di filtro clona o duplica un pacchetto ottenuto dal percorso dati in uscita, può modificare le porte di destinazione per il pacchetto dopo che chiama CopyNetBufferListInfo con il flag NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS specificato. Per altre informazioni su questa procedura, vedere Modifica dei dati della porta di origine estendibile di un pacchetto.

  • Se l'estensione di inoltro clona o duplica un pacchetto ottenuto dal percorso dati in ingresso, deve aggiungere nuove porte di destinazione per il pacchetto prima di inserire il pacchetto nel percorso dati in ingresso. Per altre informazioni su questa procedura, vedere Aggiunta dei dati della porta di destinazione estendibile a un pacchetto.

  • Dopo che l'estensione chiama CopyNetBufferListInfo, il pacchetto verrà assegnato allo stesso tipo di informazioni sulla porta di origine contenute nel pacchetto originale.

    L'estensione può chiamare SetNetBufferListSource per modificare le informazioni sulla porta di origine nei dati OOB (out-of-band) del pacchetto.

    L'estensione può voler che il pacchetto venga considerato come se sia stato generato da una determinata porta. In questo modo, i criteri per la porta devono essere applicati al pacchetto. L'estensione chiama SetNetBufferListSource per modificare la porta di origine per il pacchetto.

    Tuttavia, potrebbero verificarsi situazioni in cui l'estensione potrebbe voler assegnare l'identificatore della porta di origine del pacchetto a NDIS_SWITCH_DEFAULT_PORT_ID. Ad esempio, l'estensione potrebbe voler impostare l'identificatore della porta di origine su NDIS_SWITCH_DEFAULT_PORT_ID per i pacchetti di controllo proprietari inviati a un dispositivo nella rete esterna.

  • Nel percorso dati NDIS standard, i dati OOB non estendibili spesso hanno valori diversi a seconda che il pacchetto venga indicato come invio o ricezione. Ad esempio, i dati NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB sono un'unione di strutture specifiche di invio e ricezione

    Nel percorso dati del commutatore estendibile tutti i pacchetti si spostano nello stack di driver di estensione come invia e riceve. A causa di questo, i dati OOB non estendibili all'interno della struttura di NET_BUFFER_LIST del pacchetto saranno in un formato di invio o ricezione attraverso la durata del flusso attraverso lo stack di driver.

    Il formato di questi dati OOB dipende dalla porta del commutatore estendibile di origine da cui il pacchetto è arrivato al commutatore estendibile. Se la porta di origine è connessa alla scheda di rete esterna, i dati OOB non estendibili saranno in un formato di ricezione. Per altre porte, questi dati OOB saranno in formato di invio.

    Le informazioni sulla porta di origine vengono archiviate nell'unione NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO nei dati OOB della struttura NET_BUFFER_LIST del pacchetto. L'estensione ottiene i dati usando la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .

    Nota Se l'estensione clona la struttura NET_BUFFER_LIST di un pacchetto, deve prendere in considerazione i dati OOB non estendibili se aggiunge o modifica i dati OOB. L'estensione può chiamare CopyNetBufferListInfo per copiare tutti i dati OOB da un pacchetto di origine a un pacchetto clonato. Questa funzione manterrà il formato OOB di invio o ricezione quando i dati vengono copiati nel pacchetto.

  • Quando l'estensione clona un pacchetto, i dati dei pacchetti clonati si trovano in locale o attendibile, memoria nel sistema operativo padre della partizione padre Hyper-V. Questa memoria non può essere accessibile dalla partizione figlio. Pertanto, è considerato "sicuro" dagli aggiornamenti non sincronizzati dal sistema operativo guest in esecuzione in tale partizione.

    Dopo aver clonato il pacchetto originale, l'estensione deve ottenere l'unione NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO nel pacchetto clonato usando la macroNET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL. L'estensione deve impostare il membro IsPacketDataSafe su TRUE. Questo specifica che tutti i dati del pacchetto si trovano in memoria attendibile.

I filtri e le estensioni di inoltro devono seguire queste linee guida per inserire pacchetti clonati nel percorso dati in ingresso o in uscita:

  • L'estensione deve chiamare NdisFSendNetBufferLists per inserire il pacchetto clonato nel percorso dati in ingresso. L'estensione deve impostare il parametro SendFlags con le impostazioni del flag di commutatore estendibili appropriate. Per altre informazioni su queste impostazioni di flag, vedere Invio e ricezione di flag estendibili Hyper-V.

    Quando NDIS chiama la funzione FilterSendNetBufferListsComplete dell'estensione per completare la richiesta di invio del pacchetto clonato, l'estensione deve chiamare FreeNetBufferListForwardingContext per liberare il contesto di inoltro allocato. L'estensione deve eseguire questa operazione prima di liberare o riutilizzare la struttura di NET_BUFFER_LIST per il pacchetto.

    Nota L'estensione deve inserire il pacchetto clonato nel percorso dati in ingresso se modifica i dati del pacchetto o la porta di origine per un pacchetto ottenuto dal percorso dati in uscita. Deve anche inserire il pacchetto clonato nel percorso dati in ingresso se le porte di destinazione del pacchetto non vengono mantenute.

  • L'estensione deve chiamare NdisFIndicateReceiveNetBufferLists per inserire il pacchetto clonato nel percorso dati in uscita. L'estensione deve impostare il parametro ReceiveFlags con le impostazioni del flag di commutatore estendibili appropriate.

    Quando NDIS chiama la funzione FilterReturnNetBufferLists dell'estensione per completare la richiesta di ricezione del pacchetto clonato, l'estensione deve chiamare FreeNetBufferListForwardingContext prima di liberare o riutilizzare la struttura di NET_BUFFER_LIST per il pacchetto.

    Nota Prima che l'estensione di inoltro chiami NdisFIndicateReceiveNetBufferLists, deve aver determinato le porte di destinazione del pacchetto clonato e aggiunto questi dati ai dati OOB del pacchetto.

  • Se l'estensione clona la struttura NET_BUFFER_LIST di un pacchetto, deve mantenere la proprietà della struttura NET_BUFFER_LIST del pacchetto originale fino al completamento della richiesta di invio o ricezione del pacchetto clonato. L'estensione deve usare il membro ParentNetBufferList della struttura NET_BUFFER_LIST del pacchetto clonato per collegare la struttura di NET_BUFFER_LIST del pacchetto originale.

    Nota In NDIS 6.30 (Windows Server 2012), l'estensione può usare il membro ParentNetBufferList per collegare il pacchetto originale, ma non è necessario farlo. In NDIS 6.40 (Windows Server 2012 R2) e versioni successive, l'estensione è necessaria per usare il membro ParentNetBufferList per collegare il pacchetto originale.

    Al termine dell'invio o della ricezione del pacchetto clonato, l'estensione deve completare l'invio o la richiesta di ricezione del pacchetto originale.

    Nota Se l'estensione ha clonato la struttura NET_BUFFER_LIST di un pacchetto, può completare l'invio o la richiesta di ricezione del pacchetto originale dopo la clonazione.

  • Se l'estensione clona un pacchetto, può completare l'invio o la richiesta di ricezione del pacchetto originale non appena clonata.

Se l'estensione di inoltro o filtro ottiene un pacchetto nel percorso dati in uscita, non può inserire una versione clonata del pacchetto in questo percorso dati se l'estensione ha modificato i dati del pacchetto o ha modificato la porta di origine. Tuttavia, l'estensione può inserire questi pacchetti nel percorso dati in ingresso. In questo modo, il pacchetto deve essere inoltrato e filtrato correttamente tramite il percorso dati di commutatore estendibile.

Nota Le estensioni di filtro possono inserire solo pacchetti clonati nel percorso dati in ingresso se le porte di destinazione del pacchetto non vengono mantenute.

Si supponga, ad esempio, che un pacchetto con più porte di destinazione sia stato ottenuto nel percorso dati estendibile del commutatore in uscita. Se una porta di destinazione richiede una gestione speciale, ad esempio l'incapsulamento dei dati, l'estensione di inoltro o filtro gestisce questa operazione seguendo questa procedura:

  1. Escludere il recapito dei pacchetti alla porta che richiede una gestione speciale. L'estensione esegue questa operazione impostando il membro IsExcluded della struttura NDIS_SWITCH_PORT_DESTINATION della porta di destinazione su un valore di uno. Per altre informazioni su questa procedura, vedere Esclusione del recapito dei pacchetti alle porte di destinazione estendibili.

  2. Clonare il pacchetto originale ed eseguire la gestione necessaria dei dati del pacchetto.

    Nota L'estensione di filtro non deve aggiungere una porta di destinazione per il pacchetto clonato. Questi dati verranno aggiunti più avanti dall'estensione di inoltro o dal bordo miniport del commutatore estendibile.

  3. Inoltrare il pacchetto originale nel percorso dati in uscita chiamando NdisMIndicateReceiveNetBufferLists.

  4. Inserire il pacchetto clonato nel percorso dati in ingresso chiamando NdisFSendNetBufferLists.

Per altre informazioni sui percorsi di dati di ingresso e uscita estendibili, vedere Percorso dati estendibile di commutatore estendibile Hyper-V.

Nota L'acquisizione di estensioni non può clonare il traffico dei pacchetti. Tuttavia, possono originarne il traffico di pacchetti. Per altre informazioni, vedere Traffico di pacchetti di origine.