다음을 통해 공유


Net 링 요소 관리

이 항목의 지침에 따라 네트워크 데이터 전송 중에 NET_RING 구조와 해당 요소를 관리합니다. 이 항목의 규칙은 클라이언트 드라이버가 수정할 수 있는 net 링 요소의 멤버와 데이터 경로 시나리오에 따라 클라이언트 드라이버가 이러한 구조에 유의해야 하는 일반적인 정보를 설명합니다.

중요

클라이언트 드라이버는 개발의 모든 단계에서 이러한 지침을 준수해야 합니다. 드라이버 검증 도구로 테스트하는 동안 클라이언트 드라이버가 이러한 지침을 준수하지 않는 경우 드라이버 검증 도구는 위반을 보고하고 테스트 중인 디바이스에서 버그 검사 트리거합니다.

NET_RING

NET_RING 부모 패킷 큐가 시작되면 링의 모든 인덱스가 0으로 초기화됩니다.

다음 표에서는 클라이언트 드라이버가 수정할 수 있는 net 링의 멤버에 대해 설명합니다.

필드 클라이언트 드라이버를 수정할 수 있습니다.
OSReserved1 No
ElementStride No
NumberOfElements No
ElementIndexMask No
EndIndex No
OSReserved0 No
OSReserved2 No
BeginIndex 예(필수)
NextIndex 예(선택 사항) 참고: 프레임워크는 NextIndex를 읽지 않습니다.
스크래치 예(선택 사항) 참고: 프레임워크는 스크래치를 읽지 않습니다.
Buffer No

클라이언트 드라이버는 이 구조체의 읽기 전용 멤버를 수정해서는 안 되며, EvtPacketQueueAdvance를 호출하는 동안 EndIndex를 지나 BeginIndex를 증가시키지 않아야 합니다.

net 링의 인덱스 소유권에 대한 자세한 내용은 net 링 소개를 참조하세요.

NET_PACKET

NET_PACKET 필드는 데이터 경로가 작동하는 다양한 컨텍스트에 민감합니다. 패킷의 무시 필드가 설정되었는지 여부 및 드라이버가 수신 중인지(Rx) 또는 전송(Tx) 패킷이 패킷에 적용되는 규칙 집합을 변경하는지 여부입니다.

다음 표에서는 각 시나리오의 드라이버에 대한 지침을 제공합니다.

Rx 또는 Tx 무시 필드는 다음을 통해 설정됩니다. 참고
Rx 클라이언트 드라이버
  • Rx 중에 클라이언트 드라이버는 필요한 경우 무시 를 설정하고 프레임워크는 이를 읽습니다. 클라이언트 드라이버는 Rx 중에 언제든지 무시 를 읽을 필요가 없습니다.
  • 클라이언트 드라이버가 Rx 중에 무시 필드를 설정하는 경우 다음을 수행합니다.
    • 하드웨어에 성공적으로 프로그래밍되지 않은 패킷에 대한 Rx 작업을 취소할 때 클라이언트 드라이버는 무시 필드에 씁니다. 자세한 내용은 네트워크 링으로 네트워크 데이터 취소를 참조하세요.
    • 클라이언트 드라이버는 해제되지 않으므로 리소스를 패킷과 연결해서는 안 됩니다.
  • 클라이언트 드라이버가 Rx 중에 무시 필드를 설정하지 않으면 다음을 수행합니다.
    • 클라이언트 드라이버는 FragmentIndex, FragmentCount레이아웃의 모든 필드를 채워야 합니다.
    • FragmentIndex 는 조각 링에서 BeginIndex 포함 및 EndIndex 배타적 사이여야 합니다.
    • FragmentCount는 조각 링에서 BeginIndex 포함 및 EndIndex 전용 사이의 조각 수를 초과할 수 없습니다.
    • 클라이언트 드라이버는 해당 조각 링 BeginIndex 를 이동하는 경우 패킷 링 BeginIndex를 이동해야 합니다.
    • EvtPacketQueueAdvance를 호출한 후 클라이언트 드라이버가 패킷 링 BeginIndex를 증가시키는 경우 드라이버는 해당 패킷에 대한 조각을 지나서 조각 링 BeginIndex를 증가시켜야 합니다. 즉, 조각 링 BeginIndex 는 이전 패킷 조각의 EndIndex 로 이동해야 합니다.
Tx NetAdapterCx
  • 클라이언트 드라이버는 스크래치를 제외한 모든 패킷의 필드를 수정해서는 안 됩니다.
  • 클라이언트 드라이버는 Ignore 값을 읽을 수 있지만 절대로 읽지 않아야 합니다.
  • Tx 패킷이 무시되면 드라이버가 필요한 경우 Scratch를 제외한 필드를 읽지 않아야 합니다.

NET_PACKET_LAYOUT

Rx 작업 중에 NET_PACKET레이아웃 필드에는 다음 규칙이 적용됩니다.

  • Reserved0을 제외한 모든 필드는 클라이언트 드라이버에서 초기화해야 합니다.
  • Layer2TypeNetPacketLayer2TypeEthernet으로 설정된 경우 Layer2HeaderLength14 이상이어야 합니다.
  • Layer2TypeNetPacketLayer2TypeNull로 설정된 경우 Layer2HeaderLength0으로 설정해야 합니다.
  • Layer3Type이 IPv4 형식인 경우 Layer3HeaderLength20 이상이어야 합니다.
  • Layer3Type이 IPv6 형식인 경우 Layer3HeaderLength40 이상이어야 합니다.
  • Layer4TypeTcp로 설정된 경우 Layer4HeaderLength40 이상이어야 합니다.
  • Layer4TypeUdp로 설정된 경우 Layer4HeaderLength8 이상이어야 합니다.
  • 레이어 형식 필드는 적절한 열거형 범위 내에 있어야 합니다.

레이아웃 은 Tx 중에 사용되지 않습니다.

NET_FRAGMENT

NET_FRAGMENT 필드 규칙은 드라이버가 수신 또는 전송하는지 여부와 드라이버 또는 프레임워크에서 조각 버퍼가 패킷에 연결되어 있는지 여부에 따라 달라집니다.

Rx 또는 Tx 참고
Rx
  • 클라이언트 드라이버는 OsReserved_Bounced 필드에 쓸 수 없습니다.
  • 드라이버가 연결되지 않는 경우 용량을 수정하지 않아야 하지만 ValidLengthOffset 을 수정해야 합니다.
  • 드라이버가 연결되면 용량, ValidLengthOffset 을 모두 수정해야 합니다.
  • 오프셋 + ValidLength용량보다 작아야 합니다.
Tx
  • 클라이언트 드라이버는 스크래치를 제외한 모든 필드를 수정할 수 없습니다.