Ricezione di dati di rete

La figura seguente illustra un'operazione di ricezione di base, che prevede un driver miniport, NDIS e un driver di protocollo.

Diagramma che illustra un'operazione di ricezione di rete di base.

I driver Miniport chiamano la funzione NdisMIndicateReceiveNetBufferLists per indicare NET_BUFFER strutture a driver di livello superiore. Ogni struttura NET_BUFFER deve essere in genere collegata a una struttura NET_BUFFER_LIST separata. In questo modo i driver di protocollo possono creare un subset dell'elenco originale di strutture NET_BUFFER_LIST e inoltrarle a client diversi. Alcuni driver, ad esempio driver miniport IEEE 802.11 nativi, potrebbero collegare più di una struttura NET_BUFFER a una struttura NET_BUFFER_LIST.

Dopo aver collegato tutte le strutture NET_BUFFER_LIST, un driver miniport passa un puntatore alla prima struttura NET_BUFFER_LIST nell'elenco alla funzione NdisMIndicateReceiveNetBufferLists . NDIS esamina le strutture NET_BUFFER_LIST e chiama la funzione ProtocolReceiveNetBufferLists di ogni driver di protocollo associato alle strutture NET_BUFFER_LIST. NDIS passa un subset dell'elenco che include solo le strutture NET_BUFFER_LIST associate all'associazione corretta a ogni driver di protocollo. NDIS corrisponde al valore NetBufferListFrameType specificato nella struttura NET_BUFFER_LIST al tipo di frame registrato da ogni driver di protocollo.

Se viene impostato il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags passato alla funzione ProtocolReceiveNetBufferLists di un driver di protocollo, NDIS recupera la proprietà delle strutture NET_BUFFER_LIST immediatamente dopo il ritorno della chiamata ProtocolReceiveNetBufferLists .

Nota Se il flag NDIS_RECEIVE_FLAGS_RESOURCES è impostato, il driver del protocollo deve mantenere il set originale di strutture NET_BUFFER_LIST nell'elenco collegato. Ad esempio, quando questo flag viene impostato, il driver potrebbe elaborare le strutture e indicare loro lo stack uno alla volta, ma prima che la funzione restituisca deve ripristinare l'elenco collegato originale.

Se il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags passato alla funzione ProtocolReceiveNetBufferLists di un driver di protocollo non è impostato, il driver del protocollo può mantenere la proprietà delle strutture NET_BUFFER_LIST. In questo caso, il driver del protocollo deve restituire le strutture NET_BUFFER_LIST chiamando la funzione NdisReturnNetBufferLists .

Se un driver miniport è in esecuzione su risorse di ricezione insufficiente, può impostare il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags nella chiamata a NdisMIndicateReceiveNetBufferLists. In tal caso, il driver può recuperare la proprietà di tutte le strutture NET_BUFFER_LIST indicate e le strutture incorporate NET_BUFFER non appena restituisce NdisMIndicateReceiveNetBufferLists . Se si indicano NET_BUFFER strutture con il flag NDIS_RECEIVE_FLAGS_RESOURCES impostato, i driver di protocollo devono copiare i dati e pertanto devono essere evitati. Un driver miniport deve rilevare quando sta per scadere le risorse di ricezione ed eseguire qualsiasi procedura necessaria per evitare questa situazione.

NDIS chiama la funzione MiniportReturnNetBufferLists di un driver miniport dopo che il driver del protocollo chiama NdisReturnNetBufferLists.

Nota Se un driver miniport indica una struttura NET_BUFFER_LIST con il flag NDIS_RECEIVE_FLAGS_RESOURCES impostato, questo non significa che NDIS indicherà la struttura NET_BUFFER_LIST al driver di protocollo con lo stesso stato. Ad esempio, NDIS potrebbe copiare una struttura NET_BUFFER_LIST con il flag NDIS_RECEIVE_FLAGS_RESOURCES impostato e indicare la copia nel driver di protocollo con il flag deselezionato.

NDIS può restituire NET_BUFFER_LIST strutture al driver miniport in qualsiasi ordine arbitrario e in qualsiasi combinazione. Ovvero, l'elenco collegato di strutture NET_BUFFER_LIST restituite a un driver miniport da una chiamata alla relativa funzione MiniportReturnNetBufferLists , può avere strutture NET_BUFFER_LIST da diverse chiamate precedenti a NdisMIndicateReceiveNetBufferLists.

I driver Miniport devono impostare il membro SourceHandle nelle strutture NET_BUFFER_LIST su MiniportAdapterHandle fornito al driver miniport nella funzione MiniportInitializeEx . I driver di filtro devono impostare il membro SourceHandle di ogni NET_BUFFER_LIST struttura originata dal driver di filtro all'NdisFilterHandle del filtro fornito al driver di filtro nella funzione FilterAttach . I driver di filtro non devono modificare il membro SourceHandle in qualsiasi struttura NET_BUFFER_LIST non originata dal driver di filtro.

I driver intermedi impostano anche il membro SourceHandle nella struttura NET_BUFFER_LIST sul valore MiniportAdapterHandle fornito al driver intermedio nella funzione MiniportInitializeEx . Se un driver intermedio inoltra un'indicazione di ricezione, il driver deve salvare il valore SourceHandle fornito dal driver sottostante prima di scrivere nel membro SourceHandle . Quando NDIS restituisce una struttura NET_BUFFER_LIST inoltrata al driver intermedio, il driver intermedio deve ripristinare sourceHandle salvato.