Funzione FwpsConstructIpHeaderForTransportPacket0 (fwpsk.h)

La funzione FwpsConstructIpHeaderForTransportPacket0 viene chiamata da un callout per costruire una nuova intestazione IP o per ricompilare un'intestazione di pacchetto IP preesistente per un solo buffer net.

NotaFwpsConstructIpHeaderForTransportPacket0 è una versione specifica di FwpsConstructIpHeaderForTransportPacket. Per altre informazioni , vedere Nomi Version-Independent WFP e Versioni specifiche di Windows .
 

Sintassi

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

Parametri

[in, out] netBufferList

Puntatore a una struttura NET_BUFFER_LIST che descrive i dati del pacchetto del livello di trasporto clonato per cui deve essere creata o ricompilata una nuova intestazione IP. Per costruire una nuova intestazione IP, individuare l'offset della struttura di NET_BUFFER_LIST clonata all'inizio dell'intestazione di trasporto. Per ricompilare un'intestazione del pacchetto IP preesistente, individuare l'offset all'inizio dell'intestazione IP.

headerIncludeHeaderLength

Se la struttura NET_BUFFER_LIST puntata da NetBufferList contiene già un'intestazione IP, indica le dimensioni totali, in byte, dell'intestazione IP esistente (se presente). Se NetBufferList non contiene un'intestazione IP, headerIncludeHeaderSize è zero. In caso contrario, il valore di questo parametro è uguale al membro ipHeaderSize dell'oggetto FWPS_INCOMING_METADATA_VALUES0 struttura passata alla funzione di callout del driver di classificazioneFn . Si noti che le intestazioni di estensione per un'intestazione IPv6 esistente verranno rimosse quando questa funzione viene chiamata, anche se le opzioni IPv4 verranno mantenute. Per altre informazioni, vedere la sezione Osservazioni.

[in] addressFamily

Una delle famiglie di indirizzi seguenti:

AF_INET

Famiglia di indirizzi IPv4.

AF_INET6

Famiglia di indirizzi IPv6.

[in] sourceAddress

Puntatore all'indirizzo IP di origine che farà parte dell'intestazione IP da costruire. Per IPv4, l'indirizzo è di 4 byte. Per IPv6, l'indirizzo è di 16 byte. I byte degli indirizzi di origine sono sempre in ordine di byte di rete.

[in] remoteAddress

Puntatore a un buffer che specifica l'indirizzo IP remoto che farà parte dell'intestazione IP da costruire.

Il buffer può contenere un indirizzo IPv4 (4 byte) o un indirizzo IPv6 (16 byte) e l'indirizzo deve essere specificato nell'ordine di byte di rete. La versione IP deve corrispondere al parametro addressFamily .

[in] nextProtocol

Specifica il tipo di protocollo IPPROTO della nuova intestazione IP da costruire. Per altre informazioni sull'enumerazione IPPROTO, vedere AF_INET o AF_INET6.

[in, optional] endpointHandle

Handle facoltativo che indica l'endpoint di trasporto dello stack nel percorso di invio dei dati in cui deve essere inserito il pacchetto. Questo handle endpoint viene fornito a un callout tramite il membro transportEndpointHandle del FWPS_INCOMING_METADATA_VALUES0 struttura passata alla funzione di callout del driver di classificazioneFn .

[in, optional] controlData

Puntatore facoltativo a un buffer che contiene i dati di controllo socket specificati dalla funzione WSASendMsg, descritta nella documentazione di Microsoft Windows SDK. Per informazioni sul tipo WSACMSGHDR, vedere CMSGHDR.

Se presente, i dati del controllo socket vengono forniti a un callout con il membro controlData dell'oggetto FWPS_INCOMING_METADATA_VALUES0 struttura passata alla funzione di callout del driver di classificazioneFn .

Se i dati di controllo socket non sono NULL, deve essere copiato in modo approfondito nell'implementazione del driver di callout della funzione classificazioneFn e il buffer controlData deve essere mantenuto valido finché non viene chiamata la funzione di completamento dell'inserimento.

[in] controlDataLength

Lunghezza, in byte, del parametro controlData .

[in] flags

Flag che specificano se il NBL è destinato al percorso di invio o ricezione. Il parametro flag può avere i valori seguenti:

Valore Significato
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Se impostato, questo flag specifica che il NBL è destinato al percorso di invio.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Se impostato, questo flag specifica che il valore NBL è destinato al percorso di ricezione.

Per i driver di callout che supportano USO o URO, è obbligatorio impostare questo parametro su uno di questi valori. Altri driver di callout possono impostare questo parametro su zero. Questi flag sono supportati solo in Windows Server 2022 23H2 e versioni successive. Nelle versioni precedenti di Windows, i driver di callout devono sempre impostare questo parametro su zero.

reserved

Riservato. I driver di callout devono impostare questo parametro su NULL.

[in, optional] interfaceIndex

Indice dell'interfaccia in cui sono stati ricevuti i dati del pacchetto originale. Un driver di callout deve usare il valore dell'indice dell'interfaccia passato come uno dei valori di dati in ingresso alla funzione di callout di classificazioneFn per questo parametro. Questo parametro è facoltativo e può essere zero.

[in, optional] subInterfaceIndex

Indice della sottointerfazione in cui sono stati ricevuti i dati del pacchetto originale. Un driver di callout deve usare il valore dell'indice subinterface passato come uno dei valori di dati in ingresso alla funzione di callout di classificazioneFn per questo parametro se il pacchetto deve essere inserito nella stessa sottointerfazione in cui è stato indicato il pacchetto originale. Questo parametro è facoltativo e può essere zero.

Valore restituito

La funzione FwpsConstructIpHeaderForTransportPacket0 restituisce uno dei codici NTSTATUS seguenti.

Codice restituito Descrizione
STATUS_SUCCESS
È stata creata correttamente una nuova intestazione IP.
Altri codici di stato
Si è verificato un errore.

Commenti

Da un elenco di buffer net clonato in un livello di trasporto in uscita WFP (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 costruisce una nuova intestazione per ogni buffer net che fa parte della catena di elenco di buffer net. Questa funzione può essere usata anche per ricompilare l'intestazione IP preesistente di un pacchetto, nel qual caso l'elenco di buffer net deve contenere solo un buffer net.

Questa funzione è utile quando l'intestazione IP non è ancora stata creata, ma l'indirizzo IP di origine o la porta di origine deve essere modificato dal livello di trasporto. Anche se normalmente sarebbe possibile attendere l'esecuzione di tali modifiche fino a quando il pacchetto raggiunge il livello di rete, non è possibile eseguire questa operazione in un ambiente IPsec in cui i pacchetti IP vengono crittografati o firmati digitalmente prima di raggiungere il livello di rete.

L'indirizzo IP di origine può essere modificato in modo che sia un altro indirizzo IP definito in locale o un altro indirizzo che non esiste nel computer locale. I pacchetti modificati possono quindi essere inviati o inseriti nel percorso di ricezione o inoltro dei dati.

Se viene specificato un parametro endpointHandle diverso da zero, gli stati della sessione (opzioni socket), se presenti, associati al socket verranno usati per costruire ogni nuova intestazione IP. Analogamente, se vengono specificate opzioni di socket aggiuntive con i parametri controlData e controlDataLength, tali opzioni verranno usate per costruire ogni nuova intestazione IP.

Se l'elenco di buffer net di input è stato clonato da un livello di trasporto WFP in ingresso o se è stato creato come risultato di un'operazione di invio non elaborato, i buffer net contengono già un'intestazione IP. In questo caso, quando questa funzione viene chiamata, le opzioni IPv4 verranno mantenute nella nuova intestazione IP, ma le intestazioni di AH/ESP e le intestazioni di estensione IPv6 verranno rimosse. Poiché lo stack TCP/IP mantiene intestazioni AH/ESP dopo l'elaborazione IPsec, i pacchetti che sono stati indicati dal WFP e clonati da callout non possono essere inseriti facilmente nel percorso dei dati di ricezione. Di conseguenza questa funzione è utile per ricompilare i pacchetti elaborati da IPsec che devono essere inseriti nel percorso dati di ricezione con la funzione FwpsInjectTransportReceiveAsync0 .

Per una sessione di intestazione-include; Ad esempio, per filtrare il traffico Generic Routing Encapsulation (GRE) inviato in un socket non elaborato da livelli di trasporto in uscita, usare la procedura seguente prima di chiamare FwpsConstructIpHeaderForTransportPacket0:

  1. Clonare l'elenco di buffer net chiamando Funzione FwpsAllocateCloneNetBufferList0 .
  2. Se il membro headerIncludeHeaderLength della struttura FWPS_INCOMING_METADATA_VALUES0 a cui punta il parametro inMetaValues della funzione di classificazione è maggiore di zero, ritirare l'elenco di buffer net clonato in base a tale importo; ad esempio, tramite una chiamata a NdisRetreatNetBufferListDataStart.
  3. Copiare il buffer a cui punta il membro headerIncludeHeader di FWPS_INCOMING_METADATA_VALUES0 nell'area appena ritirata dell'elenco di buffer net clonato. Le dimensioni del buffer devono essere uguali al valore di headerIncludeHeaderLength.
  4. Chiamare FwpsConstructIpHeaderForTransportPacket0 con il parametro NetBufferList che punta all'elenco di buffer net clonato e al parametro headerIncludeHeaderSize impostato sul valore di headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 disabilita l'offload di invio di grandi dimensioni (LSO) e il supporto di offload checksum per l'elenco di buffer net risultante. I checksum completi vengono calcolati per protocolli di livello superiore (TCP, UDP e ICMP). Il checksum IP viene ricalcolato quando viene ricostruita l'intestazione IP.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows Server 2008.
Piattaforma di destinazione Universale
Intestazione fwpsk.h (include Fwpsk.h)
Libreria Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Vedi anche

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn