다음을 통해 공유


패킷 삽입 함수

콜아웃 드라이버는 다음 WFP 함수를 호출하여 보류 중이거나 수정된 패킷 데이터를 TCP/IP 스택에 삽입할 수 있습니다. 데이터를 삽입할 수 있는 해당 계층과 가능한 대상은 다음 표에 나와 있습니다.

Injection function Applicable layer Destination

FwpsInjectForwardAsync0

network layer

전달 데이터 경로

FwpsInjectNetworkReceiveAsync0

network layer

수신 데이터 경로

FwpsInjectNetworkSendAsync0

network layer

데이터 보내기 경로

FwpsInjectTransportReceiveAsync0

전송, 데이터그램 데이터, ICMP 오류 또는 ALE 계층의 패킷 데이터

수신 데이터 경로

FwpsInjectTransportSendAsync0

전송, 데이터그램 데이터, ICMP 오류 또는 ALE 계층의 패킷 데이터

데이터 보내기 경로

FwpsStreamInjectAsync0

TCP 데이터 세그먼트

데이터 스트림

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

콜아웃이 삽입 함수에 필요한 모든 정보를 제공할 수 있고 네트 버퍼 목록이 삽입 함수가 기대하는 형식을 갖고 있는 경우 계층 간 삽입이 활성화됩니다. 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.

스트림(TCP 데이터) 주입을 제외하고 들어오는 패킷을 스택 및 WFP 계층의 "아래쪽"에서 다시 입력하고, 나가는 패킷은 스택 및 WFP 계층의 "위쪽"에서 다시 입력합니다. 예를 들어 들어오는 데이터그램 데이터 계층에서 삽입된 UDP 패킷은 스택을 다시 입력하고 네트워크 계층, 전송 계층, ALE 수신 또는 수락 계층(선택 사항)을 트래버스한 후 데이터그램 데이터 계층으로 돌아갑니다. 나가는 네트워크 계층에서 삽입된 또 다른 UDP 패킷은 스택을 다시 입력하고 ALE(선택 사항), 데이터그램 데이터 및 전송 계층을 트래버스하고 네트워크 계층으로 돌아갑니다.

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

WFP 콜아웃 드라이버에 의해 삽입된 패킷은 패킷 수정으로 인해 원래 필터 조건을 충족하지 못하게 되는 경우를 제외하고 콜아웃에 다시 표시됩니다. WFP provides the FwpsQueryPacketInjectionState0 function for callouts to query whether the packet was injected (or injected earlier) by the callout. 무한 루프를 방지하려면 콜아웃에서 자체 삽입된 패킷을 허용해야 합니다.

콜아웃은 IP 패킷을 수정한 후에 IP 또는 전송 계층 체크섬, 또는 둘 다를 조정해야 합니다. 콜아웃은 IPv4를 통한 UDP 패킷의 체크섬을 0으로 설정할 수 있습니다. 전송 계층 체크섬 오프로드와 호환되도록 하며 전체 체크섬과 의사 체크섬 계산을 적절히 조정하기 위해, 콜아웃이 다음 논리를 사용할 수 있습니다.

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.

Windows Vista SP1(서비스 팩 1) 및 Windows Server 2008에서 inMetaValues->headerIncludeHeaderLength가 0보다 큰 경우 발신 패킷은 IP 헤더를 포함하는 RAW 송신 재삽입입니다. SP1 및 Windows Server 2008을 사용하는 Windows Vista에서 IP 헤더를 포함하는 RAW 전송 재삽입을 수행하려면 복제된 패킷을 inMetaValues->headerIncludeHeaderLength의 길이만큼 되돌리고, 새로 확장된 공간에 inMetaValues->headerIncludeHeader를 복사해야 합니다. Then, use FwpsInjectTransportSendAsync0 with the net buffer list for the packet and leave the FWPS_TRANSPORT_SEND_PARAMS0 parameter set to NULL. 순 버퍼 목록의 후퇴 작업에 대한 자세한 내용은 후퇴와 전진 작업을 참조하세요.

Note For raw send operations, the net buffer list must contain only a single net buffer. 순 버퍼 목록에 둘 이상의 순 버퍼가 포함된 경우 순 버퍼 목록을 일련의 순 버퍼 목록으로 변환해야 하며 계열의 각 항목에는 단일 net 버퍼가 포함되어야 합니다. For more information about net buffer list management, see NET_BUFFER Architecture.