Función FwpsConstructIpHeaderForTransportPacket0 (fwpsk.h)

Una llamada llama a la función FwpsConstructIpHeaderForTransportPacket0 para construir un nuevo encabezado IP o para volver a generar un encabezado de paquete IP existente solo para un búfer neto.

NotaFwpsConstructIpHeaderForTransportPacket0 es una versión específica de FwpsConstructIpHeaderForTransportPacket. Para obtener más información, vea NOMBRES DE Version-Independent DE PMA y versiones específicas de Windows dirigidas a destinatarios.
 

Sintaxis

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
);

Parámetros

[in, out] netBufferList

Puntero a una estructura de NET_BUFFER_LIST que describe los datos de paquetes de la capa de transporte clonados para los que se va a construir o recompilar un nuevo encabezado IP. Para construir un nuevo encabezado IP, busque el desplazamiento de la estructura clonada NET_BUFFER_LIST al principio del encabezado de transporte. Para volver a generar un encabezado de paquete IP preexistente, busque el desplazamiento al principio del encabezado IP.

headerIncludeHeaderLength

Si la estructura de NET_BUFFER_LIST a la que apunta NetBufferList ya contiene un encabezado IP, indica el tamaño total, en bytes, del encabezado IP existente (si existe). Si NetBufferList no contiene un encabezado IP, headerIncludeHeaderSize es cero. De lo contrario, el valor de este parámetro es igual al miembro ipHeaderSize del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada classifyFn del controlador de llamada. Tenga en cuenta que los encabezados de extensión de un encabezado IPv6 existente se quitarán cuando se llame a esta función, aunque se conservarán las opciones de IPv4. Para obtener más información, vea la sección Comentarios.

[in] addressFamily

Una de las siguientes familias de direcciones:

AF_INET

Familia de direcciones IPv4.

AF_INET6

Familia de direcciones IPv6.

[in] sourceAddress

Puntero a la dirección IP de origen que formará parte del encabezado IP que se va a construir. Para IPv4, la dirección es de 4 bytes. Para IPv6, la dirección es de 16 bytes. Los bytes de dirección de origen siempre están en orden de bytes de red.

[in] remoteAddress

Puntero a un búfer que especifica la dirección IP remota que formará parte del encabezado IP que se va a construir.

El búfer puede contener una dirección IPv4 (4 bytes) o una dirección IPv6 (16 bytes) y la dirección debe especificarse en orden de bytes de red. La versión de IP debe coincidir con el parámetro addressFamily .

[in] nextProtocol

Especifica el tipo de protocolo IPPROTO del nuevo encabezado IP que se va a construir. Para obtener más información sobre la enumeración IPPROTO, consulte AF_INET o AF_INET6.

[in, optional] endpointHandle

Identificador opcional que indica el punto de conexión de transporte de pila en la ruta de acceso de envío de datos en la que se insertará el paquete. Este identificador de punto de conexión se proporciona a una llamada a través del miembro transportEndpointHandle del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada classifyFn del controlador de llamada.

[in, optional] controlData

Puntero opcional a un búfer que contiene datos de control de socket especificados por la función WSASendMsg, que se describe en la documentación de Microsoft Windows SDK. Para obtener información sobre el tipo WSACMSGHDR, vea CMSGHDR.

Si está presente, los datos del control de socket se proporcionan a una llamada con el miembro controlData del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada classifyFn del controlador de llamada.

Si los datos del control de socket no son NULL, se deben copiar en profundidad en la implementación del controlador de llamada de la función classifyFn y el búfer controlData debe mantenerse válido hasta que se llame a la función de finalización de inyección.

[in] controlDataLength

Longitud, en bytes, del parámetro controlData .

[in] flags

Marcas que especifican si el NBL está pensado para la ruta de acceso de envío o recepción. El parámetro flags puede tener los siguientes valores:

Valor Significado
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Cuando se establece, esta marca especifica que el NBL está pensado para la ruta de acceso de envío.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Cuando se establece, esta marca especifica que el NBL está pensado para la ruta de acceso de recepción.

En el caso de los controladores de llamada que admiten USO o URO, es obligatorio establecer este parámetro en uno de estos valores. Otros controladores de llamada pueden establecer este parámetro en cero. Estas marcas solo se admiten en Windows Server 2022 23H2 y versiones posteriores. En versiones anteriores de Windows, los controladores de llamada siempre deben establecer este parámetro en cero.

reserved

Reservado. Los controladores de llamada deben establecer este parámetro en NULL.

[in, optional] interfaceIndex

Índice de la interfaz en la que se recibieron los datos del paquete original. Un controlador de llamada debe usar el valor del índice de interfaz que se pasa como uno de los valores de datos entrantes a su función de llamada classifyFn para este parámetro. Este parámetro es opcional y puede ser cero.

[in, optional] subInterfaceIndex

Índice de la subinterfase en la que se recibieron los datos del paquete original. Un controlador de llamada debe usar el valor del índice de subinterfase que se pasa como uno de los valores de datos entrantes a su función de llamada classifyFn para este parámetro si el paquete se va a insertar en el mismo subinterfacio donde se indicó el paquete original. Este parámetro es opcional y puede ser cero.

Valor devuelto

La función FwpsConstructIpHeaderForTransportPacket0 devuelve uno de los siguientes códigos NTSTATUS.

Código devuelto Descripción
STATUS_SUCCESS
Se ha construido correctamente un nuevo encabezado IP.
Otros códigos de estado
Se produjo un error.

Comentarios

Desde una lista de búferes netos clonada en una capa de transporte saliente de PMA (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 crea un nuevo encabezado para cada búfer neto que forma parte de la cadena de lista de búferes netos. Esta función también se puede usar para recompilar el encabezado IP preexistente de un paquete, en cuyo caso la lista de búferes netos debe contener solo un búfer neto.

Esta función es útil cuando aún no se ha creado el encabezado IP, pero la dirección IP de origen o el puerto de origen se deben modificar desde la capa de transporte. Aunque normalmente sería posible esperar a realizar estas modificaciones hasta que el paquete llega a la capa de red, esto no se puede hacer en un entorno IPsec en el que los paquetes IP se cifran o firman digitalmente antes de llegar a la capa de red.

La dirección IP de origen se puede modificar para que sea otra dirección IP definida localmente u otra dirección que no exista en el equipo local. Los paquetes para que se modifiquen se puedan enviar o insertar en la ruta de acceso de recepción o reenvío de datos.

Si se especifica un parámetro endpointHandle distinto de cero, los estados de sesión (opciones de socket), si los hay, asociados al socket se usarán para construir cada nuevo encabezado IP. Del mismo modo, si se especifican opciones de socket adicionales con los parámetros controlData y controlDataLength , esas opciones se usarán para construir cada nuevo encabezado IP.

Si la lista de búferes netos de entrada se clonó de una capa de transporte de PMA de entrada o si se creó como resultado de una operación de envío sin procesar, los búferes netos ya contendrán un encabezado IP. En este caso, cuando se llama a esta función, las opciones IPv4 se conservarán en el nuevo encabezado IP, pero se quitarán los encabezados de extensión AH/ESP e IPv6. Dado que la pila TCP/IP conserva los encabezados AH/ESP después del procesamiento de IPsec, los paquetes indicados por EL PMA y clonados por llamadas no se pueden insertar fácilmente en la ruta de acceso de los datos de recepción. Por lo tanto, esta función es útil para volver a generar paquetes procesados por IPsec que se van a insertar en la ruta de acceso de los datos de recepción con la función FwpsInjectTransportReceiveAsync0 .

Para una sesión de inclusión de encabezado; por ejemplo, para filtrar el tráfico de encapsulación de enrutamiento genérico (GRE) (protocolo IP 47) enviado en un socket sin formato de las capas de transporte salientes, use el procedimiento siguiente antes de llamar a FwpsConstructIpHeaderForTransportPacket0:

  1. Clone la lista de búferes netos mediante una llamada a . Función FwpsAllocateCloneNetBufferList0 .
  2. Si el miembro headerIncludeHeaderLength de la estructura FWPS_INCOMING_METADATA_VALUES0 a la que apunta el parámetro inMetaValues de la función classifyFn es mayor que cero, retire la lista de búferes neto clonados por esa cantidad; por ejemplo, mediante una llamada a NdisRetreatNetBufferListDataStart.
  3. Copie el búfer al que apunta el miembro headerIncludeHeader de FWPS_INCOMING_METADATA_VALUES0 en la región recién retirada de la lista de búferes neto clonados. El tamaño del búfer debe ser igual al valor de headerIncludeHeaderLength.
  4. Llame a FwpsConstructIpHeaderForTransportPacket0 que tiene el parámetro NetBufferList que apunta a la lista de búferes de red clonada y al parámetro headerIncludeHeaderSize establecido en el valor de headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 deshabilita la descarga de envío grande (LSO) y la compatibilidad con la descarga de suma de comprobación para la lista de búferes neto resultante. Las sumas de comprobación completas se calculan para los protocolos de nivel superior (TCP, UDP e ICMP). La suma de comprobación de IP se vuelve a calcular cuando se reconstruye el encabezado IP.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows Server 2008.
Plataforma de destino Universal
Encabezado fwpsk.h (incluya Fwpsk.h)
Library Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Consulte también

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn