Condividi tramite


Aggiunta di dati della porta di destinazione estendibile a un pacchetto

In questo argomento viene descritto il modo in cui le estensioni di inoltro di commutatori Hyper-V possono specificare il recapito di pacchetti in una o più porte di destinazione. Queste estensioni possono anche inoltrare pacchetti a singole schede di rete fisiche associate alla scheda di rete esterna estendibile.

Nota Solo un'estensione di inoltro o il commutatore stesso può inoltrare pacchetti a porte di commutatori estendibili o a singole schede di rete.

Nella figura seguente viene illustrato il percorso dei dati per il traffico dei pacchetti tramite lo stack di driver di commutatore estendibile per NDIS 6.40 (Windows Server 2012 R2) e versioni successive. Entrambe le figure mostrano anche il percorso dei dati per il traffico di pacchetti verso o dalle schede di rete connesse alle porte di commutatore estendibili.

Diagramma di flusso che mostra il percorso dei dati per il traffico dei pacchetti verso o da schede di rete connesse alle porte di commutatore estendibili per NDIS 6.40 (Windows Server 2012 R2) e versioni successive.

Nella figura seguente viene illustrato il percorso dei dati per il traffico dei pacchetti tramite lo stack di driver di commutatore estendibile per NDIS 6.30 (Windows Server 2012).

Diagramma di flusso che mostra il percorso dei dati per il traffico di pacchetti verso o da schede di rete connesse alle porte di commutatore estendibili per NDIS 6.30 (Windows Server 2012).

Ogni porta di destinazione del commutatore estendibile viene specificata da un elemento NDIS_SWITCH_PORT_DESTINATION all'interno della struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Questa matrice è contenuta nel contesto di inoltro out-of-band (OOB) della struttura di NET_BUFFER_LIST del pacchetto. Per altre informazioni su questo contesto, vedere Contesto di inoltro del commutatore estendibile Hyper-V.

Se un'estensione di inoltro è associata e abilitata nello stack di driver di commutatore estendibile, è responsabile della determinazione delle porte di destinazione per ogni pacchetto ottenuto dal percorso dati in ingresso estendibile, a meno che il pacchetto non sia un pacchetto NVGRE. Per altre informazioni su questo percorso dati, vedere Panoramica del percorso dati estendibile Hyper-V. Per altre informazioni sui pacchetti NVGRE, vedere Inoltro ibrido.

Nota Se un'estensione di inoltro non è associata o abilitata nello stack di driver, l'opzione estendibile determina le porte di destinazione per i pacchetti ottenuti dal percorso dati in ingresso.

L'estensione di inoltro deve seguire queste linee guida quando determina le porte di destinazione per un pacchetto ottenuto nel percorso dati in ingresso:

  • L'estensione deve inizializzare una struttura NDIS_SWITCH_PORT_DESTINATION all'interno della struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY con le informazioni sulla porta di destinazione.

    Se la porta di destinazione non è connessa alla scheda di rete esterna, l'estensione deve impostare il membro NicIndex della struttura NDIS_SWITCH_PORT_DESTINATION su NDIS_SWITCH_DEFAULT_NIC_INDEX.

    Se la porta di destinazione è connessa alla scheda di rete esterna del commutatore estendibile, l'estensione può specificare l'indice di una scheda di rete fisica sottostante a cui inoltrare la richiesta di invio. L'estensione esegue questa operazione impostando il membro NicIndex sul valore non zero NDIS_SWITCH_NIC_INDEX della scheda di rete di destinazione associata alla scheda di rete esterna.

    Per altre informazioni, vedere Inoltro di pacchetti a schede di rete fisiche.

  • L'estensione deve aggiungere porte di destinazione ai dati OOB di un pacchetto solo per le porte con connessioni della scheda di rete attive. Se l'estensione ha inoltrato una richiesta di OID_SWITCH_NIC_DISCONNECT , non deve aggiungere una porta di destinazione associata alla scheda di rete disconnessa.

  • Per migliorare le prestazioni, l'estensione deve aggiungere solo destinazioni di porta valide per il recapito dei pacchetti. In questo caso, l'estensione deve impostare il membro IsExcluded della struttura di NDIS_SWITCH_PORT_DESTINATION della porta di destinazione su FALSE.

  • Per conservare i dati VLAN (Virtual Local Network) 802.1Q in un pacchetto prima di essere recapitati a una porta, l'estensione imposta il membro PreserveVLAN su TRUE.

    Per rimuovere i dati VLAN (802.1Q Virtual Local Network) in un pacchetto prima di essere recapitati a una porta, l'estensione imposta il membro PreserveVLAN su FALSE.

  • Per conservare i dati di priorità 802.1Q in un pacchetto prima di essere recapitati a una porta, l'estensione imposta il membro PreservePriority su TRUE.

    Per rimuovere i dati di priorità 802.1Q in un pacchetto prima che venga recapitato a una porta, l'estensione imposta il membro PreservePriority su FALSE.

  • Se l'estensione di inoltro aggiunge più porte di destinazione per un pacchetto, è necessario seguire questa procedura:

    1. L'estensione accede prima alla struttura NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO del pacchetto usando la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . L'estensione legge quindi il membro NumAvailableDestinations per determinare il numero di elementi della porta di destinazione inutilizzati disponibili nella matrice di porte di destinazione. Se l'estensione richiede più porte di destinazione che sono disponibili nella matrice, deve chiamare la funzione GrowNetBufferListDestinations per allocare spazio per le porte di destinazione aggiuntive nella matrice.

      Quando l'estensione chiama GrowNetBufferListDestinations, imposta il parametro NumberOfNewDestinations sul numero di nuove porte di destinazione da aggiungere al pacchetto.

      L'estensione imposta anche il parametro NetBufferLists su un puntatore alla struttura NET_BUFFER_LIST del pacchetto.

      Nota Se nella matrice sono disponibili porte di destinazione, l'estensione non deve chiamare GrowNetBufferListDestinations.

    2. Se la funzione GrowNetBufferListDestinations restituisce correttamente, ha aggiunto le porte di destinazione aggiuntive alla fine della matrice di destinazione nella struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Viene restituito un puntatore a questa struttura nel parametro Destination .

      Nota Se la funzione GrowNetBufferListDestinations non può allocare il numero richiesto di porte di destinazione, restituisce NDIS_STATUS_RESOURCES.

    3. L'estensione specifica nuovi elementi della porta di destinazione nella struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . L'estensione inizializza ogni nuova porta di destinazione come struttura NDIS_SWITCH_PORT_DESTINATION .

      L'estensione inizializza nuove porte di destinazione alla matrice a partire dall'offset NumDestinations . NumDestinations è un membro della struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .

    4. Al termine dell'aggiunta o modifica degli elementi della porta di destinazione, l'estensione deve chiamare UpdateNetBufferListDestinations per eseguire il commit di tali modifiche.

  • Se l'estensione aggiunge una singola porta di destinazione per un pacchetto, è necessario seguire questa procedura:

    1. L'estensione inizializza le informazioni sulla porta di destinazione per il pacchetto in una struttura di NDIS_SWITCH_PORT_DESTINATION allocata dall'estensione.

    2. L'estensione chiama AddNetBufferListDestination per eseguire il commit delle modifiche alla struttura NET_BUFFER_LIST per il pacchetto. L'estensione passa l'indirizzo della struttura NDIS_SWITCH_PORT_DESTINATION nel parametro Destination .

      Nota L'estensione non deve chiamare la funzione UpdateNetBufferListDestinations per eseguire il commit delle modifiche a un pacchetto con una sola porta di destinazione.

  • Quando l'estensione di inoltro chiama AddNetBufferListDestination o UpdateNetBufferListDestinations per eseguire il commit delle modifiche per le porte di destinazione, l'interfaccia commutatore estendibile non eliminerà le porte di commutatore estendibili specificate negli elementi della struttura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY. Al termine dell'operazione di invio o ricezione del pacchetto, l'interfaccia è libera di eliminare la porta se necessario.

    Nota Dopo che l'estensione di inoltro esegue il commit delle modifiche per le porte di destinazione nel contesto di inoltro, le porte di destinazione non possono essere rimosse e solo il membro IsExcluded della struttura NDIS_SWITCH_PORT_DESTINATION di una porta di destinazione può essere modificato. Per altre informazioni, vedere Esclusione del recapito dei pacchetti alle porte di destinazione estendibili.

  • L'estensione di inoltro deve sincronizzare la gestione delle richieste di set di identificatori di oggetto (OID) di OID_SWITCH_NIC_DISCONNECT con il codice che aggiunge le porte di destinazione per la scheda di rete disconnessa.

    Se l'estensione di inoltro FilterOidRequest viene chiamata per una richiesta di OID_SWITCH_NIC_DISCONNECT , l'estensione può eseguire una delle operazioni seguenti:

    • Se l'estensione denominata NdisFOidRequest per inoltrare questa richiesta OID, non deve specificare la porta con la scheda di rete disconnessa come porta di destinazione per il pacchetto.

      Nota Se l'unica porta di destinazione per il pacchetto è quella con la scheda di rete disconnessa, l'estensione deve eliminare il pacchetto.

    • L'estensione può restituire NDIS_STATUS_PENDING per completare la richiesta in modo asincrono. Ciò consente all'estensione di aggiungere la porta con la scheda di rete disconnessa come porta di destinazione per il pacchetto. Ciò consente anche all'estensione di chiamare AddNetBufferListDestination o UpdateNetBufferListDestinations e completare l'aggiunta di porte di destinazione a un pacchetto.

      L'estensione potrebbe voler eseguire questa operazione per i pacchetti che deve inoltrare a una porta prima di essere distrutta.

      Nota Se l'estensione restituisce NDIS_STATUS_PENDING, può anche chiamare ReferenceSwitchPort per incrementare il contatore di riferimento per la porta con la scheda di rete disconnessa. Tuttavia, l'estensione non può inoltrare la richiesta OID fino a quando non chiama DereferenceSwitchPort per decre il contatore di riferimento per la porta.

  • Se il numero di porte di destinazione è zero, l'estensione di inoltro deve chiamare NdisMSendNetBufferListsComplete per eliminare il pacchetto. L'estensione deve anche chiamare ReportFilteredNetBufferLists per notificare all'interfaccia del commutatore estendibile il pacchetto eliminato.

    Nota Se l'estensione di inoltro ha ottenuto un elenco collegato di strutture NET_BUFFER_LIST per più pacchetti dal percorso dati in ingresso, deve creare un elenco separato di pacchetti eliminati. A questo scopo, l'estensione può chiamare NdisMSendNetBufferListsComplete e ReportFilteredNetBufferLists una sola volta.

  • Se il numero di porte di destinazione è maggiore di zero, l'estensione di inoltro deve chiamare NdisFSendNetBufferLists per inoltrare il pacchetto sul percorso dati in ingresso al bordo miniport del commutatore estendibile.

    Nota Se l'estensione di inoltro ha ottenuto un elenco collegato di strutture NET_BUFFER_LIST per più pacchetti dal percorso dati in ingresso, deve creare un elenco separato di pacchetti inoltrati. A questo scopo, l'estensione può chiamare NdisFSendNetBufferLists una sola volta per inoltrare l'elenco di pacchetti. Inoltre, l'estensione deve mantenere elenchi separati per inoltrare pacchetti con le stesse porte di destinazione. Per altre informazioni, vedere Invio e ricezione del commutatore estendibile Hyper-V.