Compartir a través de


Funciones de inyección de paquetes

Un controlador de llamada puede llamar a las siguientes funciones del PMA para insertar datos de paquetes modificados o en lápiz en la pila TCP/IP. Las capas aplicables de las que se pueden insertar datos, junto con posibles destinos, se muestran en la tabla siguiente.

Injection function Applicable layer Destination

FwpsInjectForwardAsync0

network layer

ruta de acceso de datos de reenvío

FwpsInjectNetworkReceiveAsync0

network layer

la ruta de acceso de datos de recepción

FwpsInjectNetworkSendAsync0

network layer

ruta de acceso de envío de datos

FwpsInjectTransportReceiveAsync0

datos de paquetes de los niveles de transporte, datagramas, errores ICMP o ALE

la ruta de acceso de datos de recepción

FwpsInjectTransportSendAsync0

datos de paquetes de los niveles de transporte, datagramas, errores ICMP o ALE

ruta de acceso de envío de datos

FwpsStreamInjectAsync0

Segmentos de datos TCP

un flujo de datos

In addition, the FwpsQueryPacketInjectionState0 function is used to inspect the injection history of packet data.

La inserción entre capas está habilitada si la llamada puede proporcionar toda la información necesaria que requiere la función de inyección y la lista de búferes netos tiene el formato esperado por la función de inyección. For example, a callout can capture a packet at the forward path, modify its destination address to that of the local computer, and call FwpsInjectTransportReceiveAsync0 to redirect the packet into the local computer's TCP/IP stack.

Excepto para la inyección de flujo (datos TCP), los paquetes entrantes insertados vuelven a entrar desde la "parte inferior" de las capas de pila y PMA, mientras que los paquetes salientes insertados vuelven a entrar desde la "parte superior" de las capas de pila y PMA. Por ejemplo, un paquete UDP insertado desde la capa de datos de datagrama entrante volverá a escribir la pila y recorrerá la capa de red, la capa de transporte, la capa de recepción o aceptación de ALE (opcional) y volverá a la capa de datos del datagrama. Otro paquete UDP insertado desde la capa de red saliente volverá a escribir la pila y recorrerá el ALE (opcional), los datos del datagrama y las capas de transporte, y volverá a la capa de red.

FwpsInjectTransportReceiveAsync0 automatically bypasses IPsec processing for the reinjected packet because it had previously gone through IPsec verification.

Un paquete insertado por un controlador de llamada del PMA se volverá a indicar a la llamada, excepto en los casos en los que la modificación del paquete hace que se pierdan las condiciones de filtro originales. WFP provides the FwpsQueryPacketInjectionState0 function for callouts to query whether the packet was injected (or injected earlier) by the callout. Para evitar bucles infinitos, las llamadas deben permitir paquetes autoinsyectados.

Las llamadas deben ajustar la suma de comprobación de la capa de transporte o IP, o ambas, después de modificar un paquete IP. Una llamada puede establecer la suma de comprobación en 0 para UDP a través de paquetes IPv4. Para ser compatible con la descarga de suma de comprobación de la capa de transporte y ajustar la suma de comprobación completa frente a los cálculos de pseudo suma de comprobación en consecuencia, una llamada puede usar la siguiente lógica:

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

If ChecksumInfo.Transmit.NdisPacketTcpChecksum is TRUE, the TCP send operation will be offloaded. If ChecksumInfo.Transmit.NdisPacketUdpChecksum is TRUE, the UDP send operation will be offloaded.

En Windows Vista con Service Pack 1 (SP1) y Windows Server 2008, si inMetaValues-headerIncludeHeaderLength> es mayor que 0, el paquete saliente es una reinjección de envío RAW que incluye un encabezado IP. Para realizar las reinjecciones de envío RAW que incluyen un encabezado IP para Windows Vista con SP1 y Windows Server 2008, debe retirar el paquete clonado por la cantidad de inMetaValues-headerIncludeHeaderLength> y copiar inMetaValues-headerIncludeHeader> sobre el espacio recién extendido. Then, use FwpsInjectTransportSendAsync0 with the net buffer list for the packet and leave the FWPS_TRANSPORT_SEND_PARAMS0 parameter set to NULL. Para obtener más información sobre las operaciones de retiro para las listas de búferes netos, consulte Operaciones de retirada y avance.

Note For raw send operations, the net buffer list must contain only a single net buffer. Si la lista de búferes netos contiene más de un búfer neto, debe convertir la lista de búferes netos en una serie de listas de búferes netos y cada uno de ellos debe contener un único búfer neto. For more information about net buffer list management, see NET_BUFFER Architecture.