Uso del filtro di livello 2
Il filtro di livello 2 è supportato in Windows 8 e versioni successive di Windows.
Questa funzionalità WFP consente di filtrare i campi dell'intestazione MAC di livello 2. Questi livelli vengono richiamati per ogni pacchetto per tutti i pacchetti inviati o ricevuti dal computer host. I livelli vengono richiamati prima del riassemblaggio dei pacchetti nel percorso in ingresso e dopo la frammentazione dei pacchetti nel percorso in uscita. Questi livelli sono accessibili da un driver di filtro NDIS leggero (LWF).
Nota
Un callout non deve inserire pacchetti a un livello se non dispone già di un filtro corrispondente a tale livello. L'inserimento delle strutture NET_BUFFER_LIST deve essere coordinato con l'aggiunta e la rimozione del filtro in modo che l'inserimento venga eseguito solo quando il filtro esiste nel livello corrispondente. Inoltre, i provider non devono rimuovere filtri che appartengono ad altri provider.
Questa sezione include gli argomenti seguenti:
- Inserimento di frame MAC
- Classificazione degli elenchi di buffer di rete concatenati
- Livelli e campi del WFP layer 2
Inserimento di frame MAC
Un driver di callback chiama la funzione FwpsInjectMacReceiveAsync0 per reinserire un frame MAC precedentemente assorbito (o un clone del frame) al percorso dati in ingresso di livello 2 intercettato o per inserire un frame MAC inventato nel percorso dati in ingresso.
Un driver di callback chiama la funzione FwpsInjectMacSendAsync0 per reinserire un frame MAC assorbito in precedenza (o un clone del frame) al percorso dei dati in uscita di livello 2 intercettato o per inserire un frame MAC inventato nel percorso dati in uscita.
Il parametro netBufferLists può essere una catena di NET_BUFFER_LIST . Tuttavia, la funzione di completamento può essere richiamata più volte, completando un segmento (o una singola NET_BUFFER_LIST) della catena.
I fotogrammi inseriti potrebbero essere classificati di nuovo se i pacchetti corrispondono allo stesso filtro classificato in origine. Pertanto, come per i callout a livelli IP, i callout di livello 2 devono anche proteggere da un'ispezione infinita dei pacchetti chiamando FwpsQueryPacketPacketPackectionState0.
Inoltre, è necessario avere callout a livello in cui si inserisce. In caso contrario, la NET_BUFFER_LIST inserita non verrà completata alla funzione di completamento e la NET_BUFFER_LIST andrà ulteriormente verso l'alto dello stack. In questo caso, il comportamento non è definito, perché NDIS tenterà di passare il NET_BUFFER_LIST inserito al componente successivo nello stack.
Il membrostatus NET_BUFFER_LIST contiene il risultato dello stato dell'inserimento dello stack. Il risultato dello stato dell'inserimento dello stack è lo stato che lo stack inserisce nella NET_BUFFER_LIST dopo che una funzione di inserimento del WFP restituisce STATUS_SUCCESS. È consigliabile usare la macro NT_SUCCESS per controllare lo stato dell'inserimento dello stack nel membro Status . Se il valore Status è STATUS_SUCCESS, l'inserimento ha avuto esito positivo senza ulteriori informazioni. I valori dei membri di stato maggiori di STATUS_SUCCESS indicano che l'inserimento è riuscito, ma potrebbero esserci altre informazioni sull'inserimento da considerare. I valori dei membri di stato minori di STATUS_SUCCESS indicano che l'inserimento non è riuscito per il motivo specificato nel membro Status .
Classificazione degli elenchi di buffer di rete concatenati
Per impostazione predefinita, un driver di callout può classificare singolarmente solo gli elenchi di buffer di rete. Tuttavia, un driver di callout può classificare NET_BUFFER_LIST catene per prestazioni migliori, se esegue entrambe le operazioni seguenti:
- Specifica il flag FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY nel membro Flags della struttura FWPS_CALLOUT2 .
- Registra una funzione classifyFn2 in grado di classificare NET_BUFFER_LIST catene.
Avviso
Tuttavia, se un driver di callout imposta il flag di FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY , non può usare le funzioni seguenti per modificare NET_BUFFER_LISTs.
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
Con questo flag impostato, FwpsAllocateCloneNetBufferList0 restituirà sempre un errore INVALID_PARAMETER . Ciò potrebbe causare un errore imprevisto da parte di un driver di callout di terze parti di gestire il numero di riferimenti di NET_BUFFER_LISTs, causando l'arresto delle operazioni di invio e ricezione.
Livelli e campi del WFP layer 2
Gli identificatori del livello di filtro in fase di esecuzione per il filtro del commutatore virtuale includono:
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE
Gli identificatori dei campi dati per il filtro dei commutatori virtuali includono:
FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET
FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET