Creazione di una porta virtuale
Una porta virtuale (VPort) è un oggetto dati che rappresenta una porta interna nel commutatore di interfaccia di rete di una scheda di rete che supporta la virtualizzazione I/O radice singola (SR-IOV). Ogni commutatore della scheda di interfaccia di rete ha le porte seguenti per la connettività di rete:
Una porta fisica esterna per la connettività alla rete fisica esterna.
Una o più VPort interni connessi alla funzione fisica PCI Express (PCIe) o alle funzioni virtuali (PF).
Il pf è collegato alla partizione padre Hyper-V ed è esposto come scheda di rete virtuale nel sistema operativo di gestione in esecuzione in tale partizione.
Un VF viene collegato alla partizione figlio Hyper-V ed è esposto come scheda di rete virtuale nel sistema operativo guest in esecuzione in tale partizione.
Esistono due tipi di VPort:
VPort predefinito
Il VPort predefinito fornisce la connettività di rete ai componenti di rete eseguiti nel sistema operativo di gestione. Il VPort predefinito ha un identificatore di NDIS_DEFAULT_VPORT_ID.
Quando il driver miniport PF crea e configura l'opzione NIC predefinita, il driver crea in modo implicito il VPort predefinito e lo collega al pf. Il VPort predefinito non può essere collegato a un VF.
Il VPort predefinito è sempre in uno stato attivato e non può essere eliminato in modo esplicito. Il driver miniport PF elimina in modo implicito il VPort predefinito solo quando elimina l'opzione di interfaccia di interfaccia di rete predefinita.
Per altre informazioni su come creare un commutatore di interfaccia di interfaccia di rete e il VPort predefinito sull'opzione, vedere Creazione di un commutatore di interfaccia di interfaccia di rete.
VPort non definito
Nondefault VPorts non vengono creati in modo implicito quando viene creata l'opzione di interfaccia di interfaccia di rete. Un driver overlying, ad esempio lo stack di virtualizzazione, crea in modo esplicito queste porte eseguendo richieste di metodo OID di OID_NIC_SWITCH_CREATE_VPORT. I VPort non predefiniti possono essere collegati al pf o a un VF e possono essere creati solo dopo la creazione dell'opzione di interfaccia di interfaccia di rete.
Un VPort non definito collegato a un VF fornisce la connettività di rete ai componenti di rete eseguiti nel sistema operativo guest. Dopo aver creato e collegato al VF, il VPort non definito è in uno stato attivato.
Un VPort non definito collegato a PF offre funzionalità di offload di rete aggiuntive ai componenti di rete eseguiti nel sistema operativo di gestione. Ad esempio, è possibile usare VPort nondefault nel pf per fornire funzionalità di offload simili all'interfaccia VMQ (Virtual Machine Queue).
Nota Nondefault VPorts può essere creato solo dopo la creazione dell'opzione di interfaccia di interfaccia di rete.
Un driver overlying genera una richiesta di metodo OID (Object Identifier) di OID_NIC_SWITCH_CREATE_VPORT per creare un VPort non definito in un commutatore di interfaccia di rete specificato. Questa richiesta OID collega anche il VPort creato al PF della scheda di rete o a un VF allocato in precedenza.
Il membro InformationBuffer della struttura NDIS_OID_REQUEST contiene un puntatore alla strutturaNDIS_NIC_SWITCH_VPORT_PARAMETERS . Dopo aver restituito correttamente la richiesta di OID_NIC_SWITCH_CREATE_VPORT , il membro VPortIddella struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS ha un identificatore VPort univoco tra le VPort nel commutatore di interfaccia di rete.
Il driver overlying inizializza la struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS con le informazioni di configurazione relative al VPort non definito da creare. Le informazioni di configurazione includono la funzione PCIe a cui è associata la VPort nondefault e il numero di coppie di code per il VPort non definito.
Quando inizializza la struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS , il driver overlying deve eseguire le operazioni seguenti:
Il membro SwitchId deve essere impostato sull'identificatore di un commutatore di interfaccia di rete creato in precedenza nella scheda di rete tramite una richiesta di metodo OID di OID_NIC_SWITCH_CREATE_SWITCH.
Nota A partire da Windows Server 2012, l'interfaccia SR-IOV supporta un solo commutatore della scheda di rete nella scheda di rete. Questo commutatore è noto come commutatore di interfaccia di interfaccia di rete predefinito. Quando si crea un VPort non definito, il driver overlying deve impostare il membro SwitchId sull'identificatore NDIS_DEFAULT_SWITCH_ID.
Il membro VPortId deve essere impostato su NDIS_DEFAULT_VPORT_ID.
Il membro AttachedFunctionId deve essere impostato sull'identificatore di VF o PF in cui deve essere collegato il VPort non definito.
Un valore di NDIS_PF_FUNCTION_ID specifica il valore PF. In caso contrario, il valore deve essere impostato sull'identificatore di un VF le cui risorse sono state assegnate in precedenza tramite una richiesta di metodo OID di OID_NIC_SWITCH_ALLOCATE_VF.
Nota Impossibile modificare l'allegato di un VPort non definito in un VF o PF dopo la creazione del VPort non definito.
Il driver overlying può anche specificare il numero di coppie di code assegnate al VPort. Una coppia di code è una coda di trasmissione e ricezione nella scheda di rete assegnata al VPort. Se la scheda di rete supporta coppie di code asimmetriche per VPort nondefault, il driver overlying può specificare un numero diverso di coppie di code per ogni VPort creato dal driver. Per altre informazioni, vedere Assegnazione simmetrica e asimmetrica di coppie di code.
Il driver overlying chiama NdisOidRequest per emettere la richiesta di OID_NIC_SWITCH_CREATE_VPORT al driver PF miniport sottostante. Prima che NDIS inoltra la richiesta del metodo OID al driver miniport, esegue le operazioni seguenti:
NDIS convalida i parametri all'interno della struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS . Se i parametri sono in errore, NDIS ha esito negativo sulla richiesta del metodo OID e non passa la richiesta al driver miniport PF.
NDIS assegna un identificatore per il VPort non definito all'interno dell'intervallo compreso tra uno e (NumVPorts- 1), dove NumVPorts è il numero di VPort configurati dal driver miniport nella scheda di rete. Il driver specifica questo numero nel membro NumVPorts della struttura NDIS_NIC_SWITCH_INFO . Il driver restituisce questa struttura tramite una richiesta di query OID di OID_NIC_SWITCH_ENUM_SWITCHES.
Nota Un identificatore VPort di NDIS_DEFAULT_VPORT_ID è riservato per il VPort predefinito collegato al valore PF nell'opzione di interfaccia di interfaccia di rete predefinita.
L'identificatore VPort assegnato identifica in modo univoco il VPort non definito nel commutatore di interfaccia di rete della scheda di rete.
- NDIS imposta il membro VPortId della struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS con l'identificatore VPort assegnato.
Quando il driver miniport PF viene emesso la richiesta OID, il driver alloca le risorse hardware e software associate al VPort non definito. Dopo aver allocato correttamente tutte le risorse, il driver miniport PF completa correttamente l'OID restituendo NDIS_STATUS_SUCCESS da MiniportOidRequest.
Se la richiesta di OID_NIC_SWITCH_CREATE_VPORT viene completata correttamente, il driver miniport PF e il driver overlying devono conservare il valore VPortId del VPortault non definito per le operazioni successive. Il valore VPortId viene usato durante queste operazioni:
NDIS e i driver overlying usano il valore VPortId per identificare le richieste VPort non definite in successive richieste OID correlate a questo VPort, ad esempio OID_NIC_SWITCH_VPORT_PARAMETERS e OID_NIC_SWITCH_DELETE_VPORT.
Durante le operazioni di invio, NDIS specifica il valore VPortId per identificare il VPort da cui è stato inviato un pacchetto. Questo valore viene specificato all'interno della NDIS_NET_BUFFER_LIST_FILTERING_INFO dati della struttura NET_BUFFER_LIST fuori banda.
Durante le operazioni di ricezione, il driver miniport PF specifica il valore VPortId a cui inviare un pacchetto. Questo valore viene specificato anche nel NDIS_NET_BUFFER_LIST_FILTERING_INFO dati della struttura di NET_BUFFER_LIST .
I punti seguenti si applicano alla creazione di VPort non predefiniti:
I filtri di ricezione per i controlli di accesso multimediale (MAC) e gli identificatori VLAN (Virtual LAN) vengono configurati nel VPort dopo la creazione. I driver overlying impostano dinamicamente questi filtri di ricezione emettendo richieste di metodo OID di OID_RECEIVE_FILTER_SET_FILTER. I filtri di ricezione possono essere spostati anche da un VPort a un altro tramite richieste di set OID di OID_RECEIVE_FILTER_MOVE_FILTER.
Un VPort non definito collegato al VF si trova in uno stato attivato al momento della creazione. Impossibile disattivare VPort se è collegato al VF.
Un VPort non definito collegato al pf è in uno stato disattivato quando viene creato. Un driver overlying, ad esempio il modulo di commutatore estendibile Hyper-V, attiva in modo esplicito il VPort non definito collegato al pf dopo che è stato creato correttamente il VPort. Questa operazione viene eseguita eseguendo una richiesta di metodo OID di OID_NIC_SWITCH_VPORT_PARAMETERS al driver miniport PF.
Quando il driver overlying genera questa richiesta OID, passa una struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS con il membro VPortState impostato su NdisNicSwitchVPortStateActivated.
Dopo che un VPort non definito è in uno stato attivato, il driver miniport PF può allocare memoria condivisa per il VPort chiamando NdisAllocateSharedMemory. Il driver deve impostare il membro VPortId nella struttura NDIS_SHARED_MEMORY_PARAMETERS sul valore dell'identificatore VPort.
Nota Quando un VPort non definito è in uno stato attivato, è impostato solo su uno stato disattivato quando viene eliminato tramite una richiesta di set OID di OID_NIC_SWITCH_DELETE_VPORT.