PD_BUFFER 구조체(ndis.h)

이 구조체는 PD(PacketDirect) 패킷 또는 큐에 있는 PD 패킷의 일부를 나타냅니다.

구문

typedef struct _PD_BUFFER {
  struct _PD_BUFFER   *NextPDBuffer;
  struct _PD_BUFFER   *NextPartialPDBuffer;
  PVOID               PDClientReserved;
  PVOID               PDClientContext;
  PUCHAR              DataBufferVirtualAddress;
  DMA_LOGICAL_ADDRESS DataBufferDmaLogicalAddress;
  ULONG               DataBufferSize;
  USHORT              PDClientContextSize;
  USHORT              Attributes;
  USHORT              Flags;
  USHORT              DataStart;
  ULONG               DataLength;
  union {
    struct {
      union {
        ULONG64 RxFilterContext;
        ULONG64 GftFlowEntryId;
      };
      ULONG                         RxHashValue;
      union {
        struct {
          ULONG RxIPHeaderChecksumSucceeded : 1;
          ULONG RxTCPChecksumSucceeded : 1;
          ULONG RxUDPChecksumSucceeded : 1;
          ULONG RxIPHeaderChecksumFailed : 1;
          ULONG RxTCPChecksumFailed : 1;
          ULONG RxUDPChecksumFailed : 1;
          ULONG RxHashComputed : 1;
          ULONG RxHashWithL4PortNumbers : 1;
          ULONG RxGftDirectionIngress : 1;
          ULONG RxGftExceptionPacket : 1;
          ULONG RxGftCopyPacket : 1;
          ULONG RxGftSamplePacket : 1;
          ULONG RxReserved1 : 4;
          ULONG RxCoalescedSegCount : 16;
          ULONG RxRscTcpTimestampDelta;
        };
        ULONG RxOffloads[2];
      };
      union {
        struct {
          ULONG TxIsIPv4 : 1;
          ULONG TxIsIPv6 : 1;
          ULONG TxTransportHeaderOffset : 10;
          ULONG TxMSS : 20;
          ULONG TxComputeIPHeaderChecksum : 1;
          ULONG TxComputeTCPChecksum : 1;
          ULONG TxComputeUDPChecksum : 1;
          ULONG TxIsEncapsulatedPacket : 1;
          ULONG TxInnerPacketOffsetsValid : 1;
          ULONG TxReserved1 : 11;
          ULONG TxInnerFrameOffset : 8;
          ULONG TxInnerIpHeaderRelativeOffset : 6;
          ULONG TxInnerIsIPv6 : 1;
          ULONG TxInnerTcpOptionsPresent : 1;
        };
        ULONG TxOffloads[2];
      };
      PD_BUFFER_VIRTUAL_SUBNET_INFO VirtualSubnetInfo;
      PD_BUFFER_8021Q_INFO          Ieee8021qInfo;
      USHORT                        GftSourceVPortId;
      ULONG                         Reserved;
      UINT64                        ProviderScratch;
    } MetaDataV0;
  };
} PD_BUFFER;

멤버

NextPDBuffer

큐의 다음 PD_BUFFER 구조체에 대한 포인터입니다.

NextPartialPDBuffer

큐의 다음 부분 PD_BUFFER 구조체에 대한 포인터입니다.

PDClientReserved

시스템에서 사용하도록 예약되었습니다. 사용하지 마십시오.

PDClientContext

클라이언트와 공급자는 이 필드를 수정할 수 없습니다. 클라이언트가 ClientContextSize에 대해 0이 아닌 값으로 PD_BUFFER 할당한 경우 PDClientContext는 ClientContextSize의 버퍼 크기를 나타냅니다. 그렇지 않으면 이 필드는 NULL입니다.

DataBufferVirtualAddress

이 필드는 호스트 및 소프트웨어가 패킷 콘텐츠에 액세스/수정하는 데 사용할 수 있는 주소를 나타냅니다. 실제 패킷 데이터는 항상 DataBufferVirtualAddress+DataStart에 있습니다. 공급자와 플랫폼은 PD_BUFFER 초기화 후에 이 필드의 값을 수정하지 않습니다.

DataBufferDmaLogicalAddress

이 필드는 패킷 데이터를 저장하는 데 사용되는 논리적 메모리 위치를 나타냅니다. 공급자는 DMA에 를 사용해야 합니다. 실제 패킷 데이터는 항상 DataBufferDmaLogicalAddress+DataStart에 있습니다. 공급자와 플랫폼은 PD_BUFFER 초기화 후에 이 필드의 값을 수정해서는 안됩니다.

DataBufferSize

할당된 데이터 버퍼의 총 크기입니다. 공급자와 플랫폼은 PD_BUFFER 초기화 후에 이 필드의 값을 수정해서는 안됩니다. 이 데이터 형식은 큰 송신 오프로드로 인해 USHORT 대신 ULONG입니다.

PDClientContextSize

이 값이 0이 아닌 경우 PDClientContext가 가리키는 버퍼의 크기입니다. 이 필드의 값은 플랫폼에서만 수정해야 합니다. 플랫폼은 PD_BUFFER 할당 후에 이 필드의 값을 변경하지 않습니다.

Attributes

공급자가 특성을 수정해서는 안 됩니다. 아래 표에는 이 PD_BUFFER 구조체에 있을 수 있는 특성이 나와 있습니다.

attribute Description
PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER 자체 데이터 버퍼와 함께 할당된 PD_BUFFER 이 특성이 설정됩니다. PD_BUFFER 특성은 클라이언트 또는 공급자가 수정해서는 안 됩니다.

Flags

다음 표에서는 이 PD_BUFFER 구조체에 있을 수 있는 플래그를 나열합니다.

플래그 설명
PD_BUFFER_FLAG_PARTIAL_PACKET_HEAD 이 버퍼가 부분 패킷의 헤드임을 나타냅니다.

DataStart

이 필드는 할당된 데이터 버퍼의 원래 시작 주소를 기준으로 패킷이 시작되는 위치를 표시합니다. 공급자는 이 필드를 수정해서는 안됩니다. 공급자는 이 값을 DataBufferDmaLogicalAddress 값에 추가하여 패킷 수신/전송에 대한 실제 대상 DMA 주소를 파생합니다. 예를 들어 PD_BUFFER 수신/전송 큐에 게시될 때 하드웨어 수신/전송 설명자의 대상 DMA 주소 값을 DataBufferDmaLogicalAddress+DataStart로 설정해야 합니다.

DataLength

이 패킷 또는 부분 패킷 데이터의 길이입니다.

MetaDataV0

MetaDataV0.RxFilterContext

공급자는 패킷을 수신 큐로 조정한 일치하는 필터에서 가져온 필터 컨텍스트 값으로 설정합니다. 필터 컨텍스트 값은 필터를 구성할 때 클라이언트에서 지정합니다.

MetaDataV0.GftFlowEntryId

RxGftExceptionPacket 또는 RxGftCopyPacket 또는 RxGftSamplePacket 비트 중 하나가 설정된 경우 RxFilterContext 값은 GFT 흐름 항목 ID 값으로 덮어씁니다.

MetaDataV0.RxHashValue

RSS를 사용하여 수신 큐로 조정되는 들어오는 패킷에 대해 계산된 해시 값입니다.

MetaDataV0.RxIPHeaderChecksumSucceeded

IP 헤더 체크섬이 성공했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxTCPChecksumSucceeded

TCP 체크섬이 성공했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxUDPChecksumSucceeded

UDP 체크섬이 성공했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxIPHeaderChecksumFailed

IP 헤더 체크섬이 실패했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxTCPChecksumFailed

TCP 체크섬이 실패했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxUDPChecksumFailed

UDP 체크섬이 실패했는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxHashComputed

해시가 계산되는지를 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxHashWithL4PortNumbers

해시가 L4 포트 번호로 계산됨을 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxGftDirectionIngress

MetaDataV0.RxGftExceptionPacket

GFT 예외 패킷임을 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxGftCopyPacket

이것이 GFT 복사 패킷임을 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxGftSamplePacket

GFT 샘플 패킷임을 나타내는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxReserved1

예약되어 있습니다.

MetaDataV0.RxCoalescedSegCount

병합된 세그먼트의 양을 포함하는 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxRscTcpTimestampDelta

RSC 및 TCP 타임스탬프 차이가 포함된 일반적인 RX 오프로드 필드입니다.

MetaDataV0.RxOffloads[2]

이 버퍼에 대한 RX 오프로드입니다.

MetaDataV0.TxIsIPv4

이 패킷이 IPv4임을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxIsIPv6

이 패킷이 IPv6임을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxTransportHeaderOffset

패킷의 헤더 오프셋을 포함하는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxMSS

이 패킷의 최대 세그먼트 크기를 포함하는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxComputeIPHeaderChecksum

IP 헤더 체크섬이 계산됨을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxComputeTCPChecksum

TCP 체크섬이 계산됨을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxComputeUDPChecksum

UDP 체크섬이 계산됨을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxIsEncapsulatedPacket

패킷이 캡슐화되었음을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxInnerPacketOffsetsValid

내부 패킷 오프셋이 유효하다는 것을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxReserved1

예약되어 있습니다.

MetaDataV0.TxInnerFrameOffset

내부 프레임 오프셋을 포함하는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxInnerIpHeaderRelativeOffset

내부 IP 헤더 상대 오프셋을 포함하는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxInnerIsIPv6

내부 패킷이 IPv6임을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxInnerTcpOptionsPresent

내부 TCP 옵션이 있음을 나타내는 일반적인 TX 오프로드 필드입니다.

MetaDataV0.TxOffloads[2]

이 버퍼에 대한 TX 오프로드입니다.

MetaDataV0.VirtualSubnetInfo

가상 서브넷 정보입니다.

MetaDataV0.Ieee8021qInfo

IEEE 802.1Q 정보입니다.

MetaDataV0.GftSourceVPortId

GFT 원본 가상 포트 ID입니다.

MetaDataV0.Reserved

시스템에서 사용하도록 예약되었습니다.

MetaDataV0.ProviderScratch

PD_BUFFER 공급자 큐에 있는 동안 PD 공급자가 자체 용도로 사용할 수 있는 스크래치 필드입니다(즉, 클라이언트가 게시했지만 클라이언트가 아직 드레이닝하지 않음). 클라이언트에서 PD_BUFFER 드레이닝되면 이 필드의 내용이 유지된다는 보장은 없습니다.

설명

L2 패킷이 여러 PD_BUFFER 구조체로 표시되는 경우 첫 번째 PD_BUFFER PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER 플래그를 설정해야 하며 NextPartialPDBuffer 필드는 전체 패킷을 구성하는 부분 PD_BUFFER 구조를 가리킵니다. 각 부분 PD_BUFFER 구조체는 NextPDBuffer 필드가 아닌 NextPartialPDBuffer를 사용하여 다음 부분 PD_BUFFER 가리킵니다. NextPDBuffer 필드는 헤드 버퍼를 제외한 모든 부분 PD_BUFFER 구조에서 NULL이어야 합니다. 헤드 버퍼를 제외한 모든 부분 PD_BUFFER 구조체에는 PD_BUFFER_ATTR_BUILT_IN_DATA_BUFFER 플래그가 지워져야 합니다. 마지막 부분 PD_BUFFER NextPartialPDBuffer 필드가 NULL로 설정되어 있어야 합니다. L2 패킷의 총 길이는 각 부분 PD_BUFFER DataLength 필드의 합계입니다. 헤드 PD_BUFFER IP 전송(TCP, UDP, SCTP 등) 헤더까지 포함해야 합니다. 캡슐화 또는 이중 캡슐화의 경우 가장 안쪽에 있는 IP 전송 헤더가 헤드 PD_BUFFER 포함되어야 합니다.

큐를 수신하기 위해 PD_BUFFER 구조를 게시할 때 공급자가 DataLength를 무시합니다(자세한 내용은 NDIS_PD_QUEUE_PARAMETERS 구조의 ReceiveDataLength 설명을 참조하세요). 수신 큐에서 완료된 PD_BUFFER 구조를 드레이닝할 때 공급자는 수신된 패킷의 길이를 DataLength 필드에 저장합니다. 길이에는 FCS 또는 제거된 801Q 헤더가 포함되지 않습니다. 큐를 전송하기 위해 PD_BUFFER 구조를 게시할 때 DataLength는 전송할 패킷의 길이를 나타냅니다. 전송 큐에서 완료된 PD_BUFFER 구조를 드레이닝하면 공급자는 DataLength 필드를 수정되지 않은 상태로 둡니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10
지원되는 최소 서버 Windows Server 2016
머리글 ndis.h