Funzioni di inserimento pacchetti

Un driver di callout può chiamare le seguenti funzioni WFP per inserire dati di pacchetto penna o modificati nello stack TCP/IP. I livelli applicabili da cui è possibile inserire i dati, insieme alle possibili destinazioni, sono elencati nella tabella seguente.

Funzione di inserimento Livello applicabile Destination

FwpsInjectForwardAsync0

livello di rete

percorso dati di inoltro

FwpsInjectNetworkReceiveAsync0

livello di rete

percorso dei dati di ricezione

FwpsInjectNetworkSendAsync0

livello di rete

percorso dei dati di invio

FwpsInjectTransportReceiveAsync0

dati dei pacchetti dai livelli di trasporto, datagrammi, errore ICMP o ALE

percorso dei dati di ricezione

FwpsInjectTransportSendAsync0

dati dei pacchetti dai livelli di trasporto, datagrammi, errore ICMP o ALE

percorso dei dati di invio

FwpsStreamInjectAsync0

Segmenti di dati TCP

flusso di dati

Inoltre, la funzione FwpsQueryPacketChangectionState0 viene usata per controllare la cronologia di inserimento dei dati dei pacchetti.

L'inserimento tra livelli è abilitato se il callout può fornire tutte le informazioni necessarie necessarie per la funzione di inserimento e l'elenco di buffer net ha il formato previsto dalla funzione di inserimento. Ad esempio, un callout può acquisire un pacchetto nel percorso di inoltro, modificare l'indirizzo di destinazione in quello del computer locale e chiamare FwpsInjectTransportReceiveAsync0 per reindirizzare il pacchetto nello stack TCP/IP del computer locale.

Ad eccezione dell'inserimento del flusso (dati TCP), i pacchetti in ingresso inseriti tornano dal "fondo" dello stack e dei livelli WFP, mentre i pacchetti in uscita vengono inseriti nuovamente dalla parte superiore dello stack e dei livelli WFP. Ad esempio, un pacchetto UDP inserito dal livello di dati datagram in ingresso rientrerà nello stack e attraversa il livello di rete, il livello di trasporto, la ricezione o l'accettazione del livello alE (facoltativo) e il livello di dati del datagram. Un altro pacchetto UDP inserito dal livello di rete in uscita immette lo stack e attraversa l'ALE (facoltativo), i dati del datagram e i livelli di trasporto e torna al livello di rete.

FwpsInjectTransportReceiveAsync0 ignora automaticamente l'elaborazione IPsec per il pacchetto reinsezionato perché in precedenza è stata eseguita la verifica IPsec.

Un pacchetto inserito da un driver di callout WFP verrà ri indicato al callout, ad eccezione dei casi in cui la modifica al pacchetto causa la perdita delle condizioni di filtro originali. WFP fornisce la funzione FwpsQueryPacketChangectionState0 per eseguire query sul fatto che il pacchetto sia stato inserito (o inserito in precedenza) dal callout. Per evitare il ciclo infinito, i callout devono consentire pacchetti inseriti automaticamente.

I callout devono modificare il checksum ip o del livello di trasporto oppure entrambi, dopo aver modificato un pacchetto IP. Un callout può impostare il checksum su 0 per i pacchetti UDP su IPv4. Per essere compatibili con il caricamento offload del checksum del livello di trasporto e per modificare il checksum completo rispetto ai calcoli pseudo checksum, un callout può usare la logica seguente:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

Se ChecksumInfo.Transmit.NdisPacketTcpChecksum è TRUE, l'operazione di invio TCP verrà disattivata. Se ChecksumInfo.Transmit.NdisPacketUdpChecksum è TRUE, l'operazione di invio UDP verrà disattivata.

In Windows Vista con Service Pack 1 (SP1) e Windows Server 2008, se inMetaValues-headerIncludeHeaderLength> è maggiore di 0, il pacchetto in uscita è una reiniiezione di invio RAW che include un'intestazione IP. Per eseguire reinizioni di invio RAW che includono un'intestazione IP per Windows Vista con SP1 e Windows Server 2008, è necessario ritirare il pacchetto clonato per la quantità inMetaValues-headerIncludeHeaderLength e copiare inMetaValues-headerIncludeHeader>> sullo spazio appena esteso. Usare quindi FwpsInjectTransportSendAsync0 con l'elenco di buffer net per il pacchetto e lasciare il parametro FWPS_TRANSPORT_SEND_PARAMS0 impostato su NULL. Per altre informazioni sulle operazioni di ritiro per gli elenchi di buffer net, vedere Ritiro e avanzamento delle operazioni.

Nota Per le operazioni di invio non elaborate, l'elenco di buffer net deve contenere solo un singolo buffer net. Se l'elenco di buffer net contiene più buffer net, è necessario convertire l'elenco di buffer net in una serie di elenchi di buffer net e ognuno di essi deve contenere un singolo buffer di rete. Per altre informazioni sulla gestione degli elenchi di buffer net, vedere architettura NET_BUFFER.