다음을 통해 공유


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

이 항목에서는 확장 가능한 스위치 전달 확장 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 확장 가능한 스위치 보내기 및 받기 플래그참조하세요.