패킷에 확장 가능한 스위치 대상 포트 데이터 추가

이 항목에서는 Hyper-V 확장 가능 스위치 전달 확장이 하나 이상의 대상 포트에 패킷 배달을 지정할 수 있는 방법에 대해 설명합니다. 이러한 확장은 확장 가능한 스위치 외부 네트워크 어댑터에 바인딩된 개별 실제 네트워크 어댑터에 패킷을 전달할 수도 있습니다.

참고 전달 확장 또는 스위치 자체만 확장 가능한 스위치 포트 또는 개별 네트워크 어댑터에 패킷을 전달할 수 있습니다.

다음 그림에서는 NDIS 6.40(Windows Server 2012 R2) 이상용 확장 가능한 스위치 드라이버 스택을 통한 패킷 트래픽의 데이터 경로를 보여 줍니다. 두 그림 모두 확장 가능한 스위치 포트에 연결된 네트워크 어댑터 간 패킷 트래픽에 대한 데이터 경로도 보여 줍니다.

NDIS 6.40(Windows Server 2012 R2) 이상용 확장 가능한 스위치 포트에 연결된 네트워크 어댑터 간 패킷 트래픽의 데이터 경로를 보여 주는 순서도입니다.

다음 그림에서는 NDIS 6.30(Windows Server 2012)용 확장 가능한 스위치 드라이버 스택을 통한 패킷 트래픽에 대한 데이터 경로를 보여 줍니다.

NDIS 6.30(Windows Server 2012)의 확장 가능한 스위치 포트에 연결된 네트워크 어댑터 간 패킷 트래픽의 데이터 경로를 보여 주는 순서도입니다.

확장 가능한 각 스위치 대상 포트는 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조 내의 NDIS_SWITCH_PORT_DESTINATION 요소에 의해 지정됩니다. 이 배열은 패킷의 NET_BUFFER_LIST 구조체의 OOB(out-of-band) 전달 컨텍스트에 포함됩니다. 이 컨텍스트에 대한 자세한 내용은 Hyper-V 확장 가능한 전환 전달 컨텍스트를 참조하세요.

전달 확장이 바인딩되어 확장 가능한 스위치 드라이버 스택에서 사용하도록 설정된 경우 패킷이 NVGRE 패킷이 아닌 한 확장 가능한 스위치 수신 데이터 경로에서 가져온 모든 패킷의 대상 포트를 결정해야 합니다. 이 데이터 경로에 대한 자세한 내용은 Hyper-V 확장 가능 스위치 데이터 경로 개요를 참조하세요. NVGRE 패킷에 대한 자세한 내용은 하이브리드 전달을 참조하세요.

참고 전달 확장이 드라이버 스택에서 바인딩되거나 활성화되지 않은 경우 확장 가능한 스위치는 수신 데이터 경로에서 가져온 패킷의 대상 포트를 결정합니다.

전달 확장은 수신 데이터 경로에서 가져온 패킷의 대상 포트를 결정할 때 다음 지침을 따라야 합니다.

  • 확장은 대상 포트 정보를 사용하여 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조 내에서 NDIS_SWITCH_PORT_DESTINATION 구조를 초기화해야 합니다.

    대상 포트가 외부 네트워크 어댑터에 연결되지 않은 경우 확장은 NDIS_SWITCH_PORT_DESTINATION 구조체의 NicIndex 멤버를 NDIS_SWITCH_DEFAULT_NIC_INDEX 설정해야 합니다.

    대상 포트가 확장 가능한 스위치 외부 네트워크 어댑터에 연결된 경우 확장은 전송 요청을 전달할 기본 실제 네트워크 어댑터의 인덱스를 지정할 수 있습니다. 확장은 NicIndex 멤버를 외부 네트워크 어댑터에 바인딩된 대상 네트워크 어댑터의 0이 아닌 NDIS_SWITCH_NIC_INDEX 값으로 설정하여 이 작업을 수행합니다.

    자세한 내용은 실제 네트워크 어댑터에 패킷 전달을 참조하세요.

  • 확장은 활성 네트워크 어댑터 연결이 있는 포트에 대해서만 패킷의 OOB 데이터에 대상 포트를 추가해야 합니다. 확장이 OID_SWITCH_NIC_DISCONNECT 요청을 전달한 경우 연결이 끊긴 네트워크 어댑터와 연결된 대상 포트를 추가해서는 안 됩니다.

  • 성능을 향상시키려면 확장은 패킷 배달에 유효한 포트 대상만 추가해야 합니다. 이 경우 확장은 대상 포트의 NDIS_SWITCH_PORT_DESTINATION 구조체의 IsExcluded 멤버를 FALSE로 설정해야 합니다.

  • 포트에 전달되기 전에 패킷에 802.1Q VLAN(가상 로컬 영역 네트워크) 데이터를 유지하려면 확장에서 PreserveVLAN 멤버를 TRUE로 설정합니다.

    포트에 전달되기 전에 패킷에서 802.1Q VLAN(가상 로컬 영역 네트워크) 데이터를 제거하려면 확장에서 PreserveVLAN 멤버를 FALSE로 설정합니다.

  • 포트에 전달되기 전에 패킷에 802.1Q 우선 순위 데이터를 유지하려면 확장에서 PreservePriority 멤버를 TRUE로 설정합니다.

    포트에 전달되기 전에 패킷에서 802.1Q 우선 순위 데이터를 제거하려면 확장에서 PreservePriority 멤버를 FALSE로 설정합니다.

  • 전달 확장이 패킷에 대해 여러 대상 포트를 추가하는 경우 다음 단계를 수행해야 합니다.

    1. 확장은 먼저 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 매크로를 사용하여 패킷의 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 구조에 액세스합니다. 그런 다음, 확장은 NumAvailableDestinations 멤버를 읽어 대상 포트 배열에서 사용할 수 있는 사용되지 않는 대상 포트 요소 수를 결정합니다. 확장에 배열에서 사용할 수 있는 것보다 더 많은 대상 포트가 필요한 경우 GrowNetBufferListDestinations 함수를 호출하여 배열의 추가 대상 포트에 대한 공간을 할당해야 합니다.

      확장이 GrowNetBufferListDestinations를 호출하면 NumberOfNewDestinations 매개 변수를 패킷에 추가할 새 대상 포트 수로 설정합니다.

      또한 확장은 NetBufferLists 매개 변수를 패킷의 NET_BUFFER_LIST 구조에 대한 포인터로 설정합니다.

      참고 배열에 사용 가능한 대상 포트가 있는 경우 확장에서 GrowNetBufferListDestinations를 호출하면 안 됩니다.

    2. GrowNetBufferListDestinations 함수가 성공적으로 반환되면 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조의 대상 배열 끝에 추가 대상 포트가 추가되었습니다. 이 구조체에 대한 포인터는 Destinations 매개 변수에 반환됩니다.

      참고GrowNetBufferListDestinations 함수가 요청된 대상 포트 수를 할당할 수 없는 경우 NDIS_STATUS_RESOURCES 반환합니다.

    3. 확장은 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조의 새 대상 포트 요소를 지정합니다. 확장은 각 새 대상 포트를 NDIS_SWITCH_PORT_DESTINATION 구조로 초기화합니다.

      확장은 NumDestinations 오프셋부터 배열로 새 대상 포트를 초기화합니다. NumDestinationsNDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조체의 멤버입니다.

    4. 확장이 대상 포트 요소 추가 또는 수정을 완료한 후 UpdateNetBufferListDestinations 를 호출하여 해당 변경 내용을 커밋해야 합니다.

  • 확장에서 패킷에 대한 단일 대상 포트를 추가하는 경우 다음 단계를 수행해야 합니다.

    1. 확장은 확장 할당 NDIS_SWITCH_PORT_DESTINATION 구조에서 패킷에 대한 대상 포트 정보를 초기화합니다.

    2. 확장은 AddNetBufferListDestination 을 호출하여 패킷의 NET_BUFFER_LIST 구조에 대한 변경 내용을 커밋합니다. 확장은 Destination 매개 변수에서 NDIS_SWITCH_PORT_DESTINATION 구조체의 주소를 전달합니다.

      참고 확장은 UpdateNetBufferListDestinations 함수를 호출하여 하나의 대상 포트만 있는 패킷에 변경 내용을 커밋하면 안 됩니다.

  • 전달 확장이 AddNetBufferListDestination 또는 UpdateNetBufferListDestinations 를 호출하여 대상 포트에 대한 변경 내용을 커밋하는 경우 확장 가능한 스위치 인터페이스는 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 구조체의 요소에 지정된 확장 가능한 스위치 포트를 삭제하지 않습니다. 패킷 송신 또는 수신 작업이 완료되면 필요한 경우 인터페이스에서 포트를 자유롭게 삭제할 수 있습니다.

    참고 전달 확장이 대상 포트에 대한 변경 내용을 전달 컨텍스트에 커밋한 후에는 대상 포트를 제거할 수 없으며 대상 포트의 NDIS_SWITCH_PORT_DESTINATION 구조체의 IsExcluded 멤버만 변경할 수 있습니다. 자세한 내용은 확장 가능한 스위치 대상 포트에 대한 패킷 배달 제외를 참조하세요.

  • 전달 확장은 연결이 끊긴 네트워크 어댑터에 대한 대상 포트를 추가하는 코드와 OID_SWITCH_NIC_DISCONNECT OID(개체 식별자) 집합 요청의 처리를 동기화해야 합니다.

    전달 확장의 FilterOidRequestOID_SWITCH_NIC_DISCONNECT 요청에 대해 호출되는 경우 확장은 다음 중 하나를 수행할 수 있습니다.

    • 이 OID 요청을 전달하기 위해 NdisFOidRequest 를 호출한 확장의 경우 연결이 끊긴 네트워크 어댑터가 있는 포트를 패킷의 대상 포트로 지정해서는 안 됩니다.

      참고 패킷의 유일한 대상 포트가 연결이 끊어진 네트워크 어댑터를 가진 포트인 경우 확장에서 패킷을 삭제해야 합니다.

    • 확장은 NDIS_STATUS_PENDING 반환하여 요청을 비동기적으로 완료할 수 있습니다. 이렇게 하면 확장에서 연결이 끊긴 네트워크 어댑터가 있는 포트를 패킷의 대상 포트로 추가할 수 있습니다. 또한 확장에서 AddNetBufferListDestination 또는 UpdateNetBufferListDestinations 를 호출하고 패킷에 대상 포트 추가를 완료할 수 있습니다.

      확장은 삭제되기 전에 포트로 전달해야 하는 패킷에 대해 이 작업을 수행할 수 있습니다.

      참고 확장이 NDIS_STATUS_PENDING 반환하는 경우 ReferenceSwitchPort 를 호출하여 연결이 끊긴 네트워크 어댑터를 사용하여 포트에 대한 참조 카운터를 증분할 수도 있습니다. 그러나 확장은 DereferenceSwitchPort 를 호출하여 포트에 대한 참조 카운터를 감소시킬 때까지 OID 요청을 전달할 수 없습니다.

  • 대상 포트 수가 0이면 전달 확장이 NdisMSendNetBufferListsComplete 를 호출하여 패킷을 삭제해야 합니다. 또한 확장은 ReportFilteredNetBufferLists 를 호출하여 삭제된 패킷에 대해 확장 가능한 스위치 인터페이스에 알려야 합니다.

    참고 전달 확장이 수신 데이터 경로에서 여러 패킷에 대한 NET_BUFFER_LIST 구조의 연결된 목록을 가져온 경우 삭제된 패킷의 별도 목록을 만들어야 합니다. 이렇게 하면 확장에서 NdisMSendNetBufferListsCompleteReportFilteredNetBufferLists 를 한 번만 호출할 수 있습니다.

  • 대상 포트 수가 0보다 큰 경우 전달 확장은 NdisFSendNetBufferLists 를 호출하여 수신 데이터 경로를 통해 패킷을 확장 가능한 스위치의 미니포트 에지로 전달해야 합니다.

    참고 전달 확장이 수신 데이터 경로에서 여러 패킷에 대한 NET_BUFFER_LIST 구조의 연결된 목록을 가져온 경우 전달된 패킷의 별도 목록을 만들어야 합니다. 이렇게 하면 확장에서 NdisFSendNetBufferLists를 한 번만 호출하여 패킷 목록을 전달할 수 있습니다. 또한 확장은 동일한 대상 포트가 있는 패킷을 전달하기 위해 별도의 목록을 유지해야 합니다. 자세한 내용은 Hyper-V 확장 가능 스위치 보내기 및 받기 플래그를 참조하세요.