Share via


FwpsConstructIpHeaderForTransportPacket0 함수(fwpsk.h)

FwpsConstructIpHeaderForTransportPacket0 함수는 설명선에 의해 호출되어 새 IP 헤더를 생성하거나 하나의 net 버퍼에 대해서만 기존 IP 패킷 헤더를 다시 빌드합니다.

참고FwpsConstructIpHeaderForTransportPacket0FwpsConstructIpHeaderForTransportPacket의 특정 버전입니다. 자세한 내용은 WFP Version-Independent 이름 및 특정 버전의 Windows 대상 지정 을 참조하세요.
 

구문

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

매개 변수

[in, out] netBufferList

새 IP 헤더를 생성하거나 다시 작성할 복제된 전송 계층 패킷 데이터를 설명하는 NET_BUFFER_LIST 구조체에 대한 포인터입니다. 새 IP 헤더를 생성하려면 전송 헤더의 시작 부분에서 복제된 NET_BUFFER_LIST 구조체의 오프셋을 찾습니다. 기존 IP 패킷 헤더를 다시 빌드하려면 IP 헤더의 시작 부분에서 오프셋을 찾습니다.

headerIncludeHeaderLength

NetBufferList가 가리키는 NET_BUFFER_LIST 구조에 이미 IP 헤더가 포함된 경우 는 기존 IP 헤더의 총 크기(바이트)를 나타냅니다(있는 경우). NetBufferList에 IP 헤더가 없는 경우 headerIncludeHeaderSize는 0입니다. 그렇지 않으면 이 매개 변수의 값은 의 ipHeaderSize 멤버와 같습니다. 설명 선 드라이버의 classifyFn 설명선 함수에 전달되는 구조체를 FWPS_INCOMING_METADATA_VALUES0. IPv4 옵션은 유지되지만 기존 IPv6 헤더에 대한 확장 헤더는 이 함수가 호출될 때 제거됩니다. 자세한 내용은 설명 부분을 참조하세요.

[in] addressFamily

다음 주소 패밀리 중 하나입니다.

AF_INET

IPv4 주소 패밀리입니다.

AF_INET6

IPv6 주소 패밀리입니다.

[in] sourceAddress

생성할 IP 헤더의 일부가 될 원본 IP 주소에 대한 포인터입니다. IPv4의 경우 주소는 4바이트입니다. IPv6의 경우 주소는 16바이트입니다. 원본 주소 바이트는 항상 네트워크 바이트 순서입니다.

[in] remoteAddress

생성할 IP 헤더의 일부가 될 원격 IP 주소를 지정하는 버퍼에 대한 포인터입니다.

버퍼에는 IPv4 주소(4바이트) 또는 IPv6 주소(16바이트)가 포함될 수 있으며 주소는 네트워크 바이트 순서로 지정해야 합니다. IP 버전은 addressFamily 매개 변수와 일치해야 합니다.

[in] nextProtocol

생성할 새 IP 헤더의 IPPROTO 프로토콜 유형을 지정합니다. IPPROTO 열거형에 대한 자세한 내용은 AF_INET 또는 AF_INET6 참조하세요.

[in, optional] endpointHandle

패킷을 삽입할 송신 데이터 경로의 스택 전송 엔드포인트를 나타내는 선택적 핸들입니다. 이 엔드포인트 핸들은 의 transportEndpointHandle 멤버를 통해 콜아웃에 제공됩니다. 설명 선 드라이버의 classifyFn 설명선 함수에 전달되는 구조체를 FWPS_INCOMING_METADATA_VALUES0.

[in, optional] controlData

WSASendMsg 함수에서 지정한 소켓 제어 데이터를 포함하는 버퍼에 대한 선택적 포인터로, Microsoft Windows SDK 설명서에 설명되어 있습니다. WSACMSGHDR 형식에 대한 자세한 내용은 CMSGHDR을 참조하세요.

있는 경우 소켓 제어 데이터는 의 controlData 멤버를 사용하여 콜아웃에 제공됩니다. 설명 선 드라이버의 classifyFn 설명선 함수에 전달되는 구조체를 FWPS_INCOMING_METADATA_VALUES0.

소켓 제어 데이터가 NULL이 아닌 경우 classifyFn 함수의 설명선 드라이버 구현에서 깊이 복사해야 하며 삽입 완료 함수가 호출될 때까지 controlData 버퍼를 유효한 상태로 유지해야 합니다.

[in] controlDataLength

controlData 매개 변수의 길이(바이트)입니다.

[in] flags

NBL이 보내기 또는 수신 경로에 대한 것인지 여부를 지정하는 플래그입니다. flags 매개 변수에는 다음 값이 있을 수 있습니다.

의미
FWPS_CONSTRUCT_IPHEADER_FOR_SEND 설정하면 이 플래그는 NBL이 전송 경로를 위한 것임을 지정합니다.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE 이 플래그를 설정하면 NBL이 수신 경로용으로 지정됩니다.

USO 또는 URO를 지원하는 콜아웃 드라이버의 경우 이 매개 변수를 이러한 값 중 하나로 설정해야 합니다. 다른 콜아웃 드라이버는 이 매개 변수를 0으로 설정할 수 있습니다. 이러한 플래그는 Windows Server 2022 23H2 이상에서만 지원됩니다. Windows의 이전 릴리스에서 설명선 드라이버는 항상 이 매개 변수를 0으로 설정해야 합니다.

reserved

예약되어 있습니다. 콜아웃 드라이버는 이 매개 변수를 NULL로 설정해야 합니다.

[in, optional] interfaceIndex

원래 패킷 데이터를 받은 인터페이스의 인덱스입니다. 설명선 드라이버는 이 매개 변수의 classifyFn 설명선 함수에 들어오는 데이터 값 중 하나로 전달되는 인터페이스 인덱스의 값을 사용해야 합니다. 이 매개 변수는 선택 사항이며 0일 수 있습니다.

[in, optional] subInterfaceIndex

원래 패킷 데이터를 받은 하위 표면의 인덱스입니다. 설명선 드라이버는 원본 패킷이 표시된 동일한 하위 위치에 패킷을 삽입할 경우 이 매개 변수에 대해 들어오는 데이터 값 중 하나로 전달되는 하위 표면 인덱스 값을 이 매개 변수의 classifyFn 설명선 함수에 사용해야 합니다. 이 매개 변수는 선택 사항이며 0일 수 있습니다.

반환 값

FwpsConstructIpHeaderForTransportPacket0 함수는 다음 NTSTATUS 코드 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS
새 IP 헤더가 성공적으로 생성되었습니다.
기타 상태 코드
오류가 발생했습니다.

설명

WFP 아웃바운드 전송 계층(FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx)에 복제된 순 버퍼 목록에서 FwpsConstructIpHeaderForTransportPacket0 은 순 버퍼 목록 체인의 일부인 각 순 버퍼에 대해 새 헤더를 생성합니다. 이 함수를 사용하여 패킷의 기존 IP 헤더를 다시 작성할 수도 있습니다. 이 경우 net buffer 목록에는 하나의 순 버퍼만 포함되어야 합니다.

이 함수는 IP 헤더가 아직 만들어지지 않았지만 원본 IP 주소 또는 원본 포트를 전송 계층에서 수정해야 하는 경우에 유용합니다. 일반적으로 패킷이 네트워크 계층에 도달할 때까지 이러한 수정을 수행할 때까지 기다릴 수 있지만 IP 패킷이 네트워크 계층에 도달하기 전에 암호화되거나 디지털 서명되는 IPsec 환경에서는 이 작업을 수행할 수 없습니다.

원본 IP 주소는 로컬로 정의된 다른 IP 주소 또는 로컬 컴퓨터에 없는 다른 주소로 수정할 수 있습니다. 수정된 패킷은 수신 또는 전달 데이터 경로에 보내거나 삽입할 수 있습니다.

0이 아닌 endpointHandle 매개 변수를 지정하면 세션 상태(소켓 옵션)가 있는 경우 소켓과 연결된 세션 상태를 사용하여 각 새 IP 헤더를 생성합니다. 마찬가지로 controlData 및 controlDataLength 매개 변수를 사용하여 추가 소켓 옵션을 지정하는 경우 이러한 옵션을 사용하여 각 새 IP 헤더를 생성합니다.

입력 순 버퍼 목록이 인바운드 WFP 전송 계층에서 복제되었거나 원시 송신 작업의 결과로 만들어진 경우 net 버퍼에 이미 IP 헤더가 포함됩니다. 이 경우 이 함수가 호출되면 IPv4 옵션이 새 IP 헤더에 유지되지만 AH/ESP 헤더 및 IPv6 확장 헤더는 제거됩니다. TCP/IP 스택은 IPsec 처리 후 AH/ESP 헤더를 유지하므로 WFP로 표시되고 설명선으로 복제된 패킷을 수신 데이터 경로에 쉽게 삽입할 수 없습니다. 따라서 이 함수는 FwpsInjectTransportReceiveAsync0 함수를 사용하여 수신 데이터 경로에 삽입할 IPsec 처리 패킷을 다시 빌드하는 데 유용합니다.

헤더 포함 세션의 경우 예를 들어 아웃바운드 전송 계층에서 원시 소켓에 전송된 GRE(일반 라우팅 캡슐화) 트래픽(IP 프로토콜 47)을 필터링하려면 FwpsConstructIpHeaderForTransportPacket0을 호출하기 전에 다음 절차를 사용합니다.

  1. 를 호출하여 순 버퍼 목록을 복제합니다. FwpsAllocateCloneNetBufferList0 함수입니다.
  2. classifyFn 함수의 inMetaValues 매개 변수가 가리키는 FWPS_INCOMING_METADATA_VALUES0 구조체의 headerIncludeHeaderLength 멤버가 0보다 크면 복제된 순 버퍼 목록을 해당 양만큼 퇴각합니다. 예를 들어 NdisRetreatNetBufferListDataStart를 호출합니다.
  3. FWPS_INCOMING_METADATA_VALUES0 headerIncludeHeader 멤버가 가리키는 버퍼를 복제된 순 버퍼 목록의 새로 퇴각된 영역에 복사합니다. 버퍼의 크기는 headerIncludeHeaderLength 값과 같아야 합니다.
  4. 복제된 Net 버퍼 목록을 가리키는 NetBufferList 매개 변수와 headerIncludeHeaderSize 매개 변수가 headerIncludeHeaderLength 값으로 설정된 FwpsConstructIpHeaderForTransportPacket0을 호출합니다.
FwpsConstructIpHeaderForTransportPacket0 은 결과 순 버퍼 목록에 대한 대규모 LSO(송신 오프로드) 및 체크섬 오프로드 지원을 사용하지 않도록 설정합니다. 전체 체크섬은 상위 수준 프로토콜(TCP, UDP 및 ICMP)에 대해 계산됩니다. IP 헤더가 다시 구성되면 IP 체크섬이 다시 계산됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Server 2008부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 fwpsk.h(Fwpsk.h 포함)
라이브러리 Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

추가 정보

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn