패킷 트래픽 복제
이 항목에서는 Hyper-V 확장 스위치 확장이 패킷을 복제하거나 복제하여 확장 가능한 스위치 데이터 경로에 삽입하는 방법을 설명합니다. 패킷 복제에 대한 자세한 내용은 복제된 NET_BUFFER_LIST 구조를 참조하세요.
참고 이 페이지에서는 Hyper-V 확장 가능 스위치 및 하이브리드 전달 개요의 정보 및 다이어그램에 익숙하다고 가정합니다.
참고 확장 가능한 스위치 인터페이스에서 NDIS 필터 드라이버를 확장 가능한 스위치 확장 이라고 하며 드라이버 스택을 확장 가능한 스위치 드라이버 스택이라고 합니다. 확장에 대한 자세한 내용은 Hyper-V 확장 스위치 확장을 참조하세요.
확장 가능한 스위치 필터링 및 전달 확장은 다음 지침에 따라 복제된 패킷을 확장 가능한 스위치 수신 또는 송신 데이터 경로에 삽입할 수 있습니다.
확장은 먼저 복제된 패킷에 대한 NET_BUFFER_LIST 구조를 할당해야 합니다. 그런 다음 확장은 원본 패킷의 패킷 데이터를 복제된 패킷으로 복사해야 합니다. 패킷을 복제하는 방법에 대한 자세한 내용은 파생 NET_BUFFER_LIST 구조를 참조하세요.
확장에서 NET_BUFFER_LIST 구조를 할당한 후에는 AllocateNetBufferListForwardingContext 처리기 함수를 호출하여 패킷에 대한 확장 가능한 스위치 전달 컨텍스트를 할당해야 합니다.
전달 컨텍스트는 패킷의 OOB(대역 외) 데이터에 상주합니다. 원본 포트 및 하나 이상의 대상 포트 배열과 같은 패킷에 대한 전달 정보가 포함됩니다.
전달 컨텍스트에 대한 자세한 내용은 Hyper-V 확장 가능한 전환 전달 컨텍스트를 참조하세요.
확장은 CopyNetBufferListInfo를 호출하여 원본 패킷에서 복제된 패킷으로 기존 원본 포트를 포함한 OOB 데이터를 복사해야 합니다. 확장에서 패킷을 수신 데이터 경로에 삽입하려는 경우 원래 패킷의 OOB 데이터에서도 대상 포트를 복사해야 합니다.
OOB 데이터를 복사할 때 확장은 다음 지침을 따라야 합니다.
필터링 확장이 수신 데이터 경로에 패킷을 삽입하려는 경우 NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS 플래그가 지정되지 않은 CopyNetBufferListInfo 를 호출해야 합니다. 이렇게 하면 원래 패킷의 대상 포트가 복제된 패킷에 복사되지 않습니다. 필터링 확장이 이 패킷을 수신 데이터 경로에 삽입하면 대상 포트는 기본 전달 확장(드라이버 스택에서 사용하도록 설정된 경우) 또는 확장 가능한 스위치의 미니포트 에지에 의해 패킷에 추가됩니다.
필터링 확장이 송신 데이터 경로에 패킷을 삽입하려는 경우 지정된 NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS 플래그를 사용하여 CopyNetBufferListInfo 를 호출해야 합니다. 이렇게 하면 원래 패킷의 대상 포트가 복제된 패킷에 복사됩니다.
필터링 확장이 송신 데이터 경로에서 가져온 패킷을 복제하거나 복제하는 경우 NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS 플래그가 지정된 CopyNetBufferListInfo 를 호출한 후 패킷의 대상 포트를 변경할 수 있습니다. 이 절차에 대한 자세한 내용은 패킷의 확장 가능한 스위치 원본 포트 데이터 수정을 참조하세요.
전달 확장이 수신 데이터 경로에서 가져온 패킷을 복제하거나 복제하는 경우 패킷을 수신 데이터 경로에 삽입하기 전에 패킷에 대한 새 대상 포트를 추가해야 합니다. 이 절차에 대한 자세한 내용은 패킷에 확장 가능한 스위치 대상 포트 데이터 추가를 참조하세요.
확장에서 CopyNetBufferListInfo를 호출하면 패킷에 원래 패킷에 포함된 것과 동일한 원본 포트 정보가 할당됩니다.
확장은 SetNetBufferListSource 를 호출하여 패킷의 OOB(대역 외) 데이터의 원본 포트 정보를 변경할 수 있습니다.
확장은 패킷이 특정 포트에서 시작된 것처럼 처리되도록 할 수 있습니다. 이렇게 하면 해당 포트에 대한 정책을 패킷에 적용할 수 있습니다. 확장은 SetNetBufferListSource 를 호출하여 패킷의 원본 포트를 변경합니다.
그러나 확장에서 패킷의 원본 포트 식별자를 NDIS_SWITCH_DEFAULT_PORT_ID 할당하려는 경우가 있을 수 있습니다. 예를 들어 확장은 외부 네트워크의 디바이스로 전송되는 독점 제어 패킷에 대해 원본 포트 식별자를 NDIS_SWITCH_DEFAULT_PORT_ID 설정할 수 있습니다.
표준 NDIS 데이터 경로에서 확장할 수 없는 스위치 OOB 데이터는 패킷이 송신 또는 수신으로 표시되는지 여부에 따라 다른 값을 갖는 경우가 많습니다. 예를 들어 NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB 데이터는 송신 및 수신 관련 구조의 통합입니다.
확장 가능한 스위치 데이터 경로에서 모든 패킷은 모두 보내고 받을 때 확장 드라이버 스택을 통해 이동합니다. 이 때문에 패킷의 NET_BUFFER_LIST 구조 내에서 확장할 수 없는 스위치 OOB 데이터는 드라이버 스택을 통해 흐름 기간 동안 전송 또는 수신 형식이 됩니다.
이 OOB 데이터의 형식은 패킷이 확장 가능한 스위치에 도착한 원본 확장 가능한 스위치 포트에 따라 달라집니다. 원본 포트가 외부 네트워크 어댑터에 연결된 경우 확장할 수 없는 스위치 OOB 데이터는 수신 형식이 됩니다. 다른 포트의 경우 이 OOB 데이터는 송신 형식입니다.
원본 포트 정보는 패킷 NET_BUFFER_LIST 구조의 OOB 데이터에서 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 공용 구조체에 저장됩니다. 확장은 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 매크로를 사용하여 데이터를 가져옵니다.
참고 확장이 패킷의 NET_BUFFER_LIST 구조를 복제하는 경우 OOB 데이터를 추가하거나 수정하는 경우 확장할 수 없는 스위치 OOB 데이터를 고려해야 합니다. 확장은 CopyNetBufferListInfo 를 호출하여 원본 패킷의 모든 OOB 데이터를 복제된 패킷으로 복사할 수 있습니다. 이 함수는 데이터가 패킷에 복사될 때 OOB 송신 또는 수신 형식을 유지 관리합니다.
확장이 패킷을 복제하면 복제된 패킷 데이터가 Hyper-V 부모 파티션의 부모 운영 체제에 있는 로컬 또는 신뢰할 수 있는 메모리에 있습니다. 이 메모리는 자식 파티션에서 액세스할 수 없습니다. 따라서 해당 파티션에서 실행되는 게스트 운영 체제의 동기화되지 않은 업데이트로부터 "안전"으로 간주됩니다.
원래 패킷이 복제된 후 확장은 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 매크로를 사용하여 복제된 패킷에서 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 공용 구조체를 가져와야 합니다. 확장은 IsPacketDataSafe 멤버를 TRUE로 설정해야 합니다. 이렇게 하면 모든 패킷 데이터가 신뢰할 수 있는 메모리에 있습니다.
필터링 및 전달 확장은 복제된 패킷을 수신 또는 송신 데이터 경로에 삽입하기 위해 다음 지침을 따라야 합니다.
확장은 NdisFSendNetBufferLists 를 호출하여 복제된 패킷을 수신 데이터 경로에 삽입해야 합니다. 확장은 적절한 확장 가능한 스위치 플래그 설정을 사용하여 SendFlags 매개 변수를 설정해야 합니다. 이러한 플래그 설정에 대한 자세한 내용은 Hyper-V 확장 가능 스위치 보내기 및 수신 플래그를 참조하세요.
NDIS가 확장의 FilterSendNetBufferListsComplete 함수를 호출하여 복제된 패킷의 보내기 요청을 완료하는 경우 확장은 FreeNetBufferListForwardingContext 를 호출하여 할당된 전달 컨텍스트를 해제해야 합니다. 확장은 패킷에 대한 NET_BUFFER_LIST 구조를 해제하거나 재사용하기 전에 이 작업을 수행해야 합니다.
참고 확장은 송신 데이터 경로에서 가져온 패킷에 대한 패킷 데이터 또는 원본 포트를 수정하는 경우 복제된 패킷을 수신 데이터 경로에 삽입해야 합니다. 또한 패킷의 대상 포트가 유지되지 않는 경우 복제된 패킷을 수신 데이터 경로에 삽입해야 합니다.
확장은 NdisFIndicateReceiveNetBufferLists 를 호출하여 복제된 패킷을 송신 데이터 경로에 삽입해야 합니다. 확장은 적절한 확장 가능한 스위치 플래그 설정을 사용하여 ReceiveFlags 매개 변수를 설정해야 합니다.
NDIS가 확장의 FilterReturnNetBufferLists 함수를 호출하여 복제된 패킷의 수신 요청을 완료하는 경우 확장은 패킷에 대한 NET_BUFFER_LIST 구조를 해제하거나 재사용하기 전에 FreeNetBufferListForwardingContext를 호출해야 합니다.
참고 전달 확장이 NdisFIndicateReceiveNetBufferLists를 호출하기 전에 복제된 패킷의 대상 포트를 확인하고 이 데이터를 패킷의 OOB 데이터에 추가해야 합니다.
확장이 패킷의 NET_BUFFER_LIST 구조를 복제하는 경우 복제된 패킷의 송신 또는 수신 요청이 완료될 때까지 원래 패킷의 NET_BUFFER_LIST 구조에 대한 소유권을 유지해야 합니다. 확장은 복제된 패킷의 NET_BUFFER_LIST 구조체의 ParentNetBufferList 멤버를 사용하여 원래 패킷의 NET_BUFFER_LIST 구조에 연결해야 합니다.
참고 NDIS 6.30(Windows Server 2012)에서 확장은 ParentNetBufferList 멤버를 사용하여 원래 패킷에 연결할 수 있지만 그렇게 할 필요는 없습니다. NDIS 6.40(Windows Server 2012 R2) 이상에서는 ParentNetBufferList 멤버를 사용하여 원래 패킷에 연결해야 합니다.
복제된 패킷의 송신 또는 수신 요청이 완료되면 확장은 원래 패킷의 송신 또는 수신 요청을 완료해야 합니다.
참고 확장이 패킷의 NET_BUFFER_LIST 구조를 복제한 경우 복제된 후 원래 패킷의 송신 또는 수신 요청을 완료할 수 있습니다.
확장이 패킷을 복제하는 경우 복제되는 즉시 원래 패킷의 송신 또는 수신 요청을 완료할 수 있습니다.
전달 또는 필터링 확장이 송신 데이터 경로에서 패킷을 가져오는 경우 확장이 패킷 데이터를 수정하거나 원본 포트를 변경한 경우 이 데이터 경로에 복제된 버전의 패킷을 삽입할 수 없습니다. 그러나 확장은 이러한 패킷을 수신 데이터 경로에 삽입할 수 있습니다. 이렇게 하면 확장 가능한 스위치 데이터 경로를 통해 패킷을 올바르게 전달하고 필터링할 수 있습니다.
참고 필터링 확장 프로그램은 패킷의 대상 포트가 유지되지 않는 경우에만 복제된 패킷을 수신 데이터 경로에 삽입할 수 있습니다.
예를 들어 확장 가능한 스위치 송신 데이터 경로에서 여러 대상 포트가 있는 패킷을 얻었다고 가정합니다. 하나의 대상 포트에 데이터 캡슐화와 같은 특수 처리가 필요한 경우 전달 또는 필터링 확장은 다음 단계에 따라 이를 처리합니다.
특수 처리가 필요한 포트에 대한 패킷 배달을 제외합니다. 확장은 대상 포트의 NDIS_SWITCH_PORT_DESTINATION 구조체의 IsExcluded 멤버를 하나의 값으로 설정하여 이 작업을 수행합니다. 이 절차에 대한 자세한 내용은 확장 가능한 스위치 대상 포트로 패킷 배달 제외를 참조하세요.
원래 패킷을 복제하고 패킷 데이터의 필요한 처리를 수행합니다.
참고 필터링 확장은 복제된 패킷에 대한 대상 포트를 추가해서는 안 됩니다. 이 데이터는 나중에 확장 가능 스위치의 전달 확장 또는 미니포트 에지에 의해 추가됩니다.
NdisMIndicateReceiveNetBufferLists를 호출하여 송신 데이터 경로에서 원래 패킷을 전달합니다.
NdisFSendNetBufferLists를 호출하여 수신 데이터 경로에 복제된 패킷을 삽입합니다.
확장 가능한 스위치 수신 및 송신 데이터 경로에 대한 자세한 내용은 Hyper-V 확장 가능한 스위치 데이터 경로를 참조하세요.
참고 확장 캡처는 패킷 트래픽을 복제할 수 없습니다. 그러나 패킷 트래픽을 발생시킬 수 있습니다. 자세한 내용은 원본 패킷 트래픽을 참조하세요.