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 |