nl :: 짜다:: 체계:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
패킷 버퍼 클래스는 일반적으로 Bluetooth 또는 인터넷 프로토콜과 같은 데이터 통신 네트워크의 컨텍스트에서 옥텟 직렬화 된 데이터의 패킷을 조작하는 데 사용되는 핵심 구조입니다.
요약
LwIP 기반 환경에서이 클래스는 해당 라이브러리에 정의 된 pbuf 구조 위에 빌드됩니다. LwIP가없는 경우 Weave는 malloc 기반 구현 또는 딥 임베디드 장치의 메모리 문제에 근접한 풀 기반 구현을 제공합니다.
PacketBuffer 클래스는 계층화 된 네트워크 스택에서 사용되는 많은 유사한 구조와 마찬가지로 구성 가능한 통신 스택의 각 계층에서 프로토콜 헤더를위한 공간을 예약하는 메커니즘을 제공합니다. 자세한 내용은 PacketBuffer::New()
및 LwIP 설명서를 참조하십시오.
PacketBuffer 객체는 참조 횟수가 계산되며 Weave 내에서 널리 사용되는 사용 모드는 "fire-and-forget"입니다. 패킷 (및 기본 PacketBuffer 객체)이 다양한 프로토콜 계층을 통해 발송되므로 계층 간의 성공적인 상향 호출 또는 하향 호출은 소유권 이전을 의미하며 수신자는 버퍼를 해제해야합니다. 계층 간 호출이 실패하면 버퍼를 해제하는 책임은 호출자에게 있습니다.
PacketBuffer 클래스의 새 개체는 내부 버퍼 풀에서 표준 C 라이브러리 힙의 LwIP pbuf 대상 풀과 같은 기본 환경에서 얻은 메모리 할당의 시작 부분에 초기화됩니다. 간단한 경우 데이터 버퍼의 크기는 WEAVE_SYSTEM_PACKETBUFFER_SIZE 입니다. 다른 크기의 데이터 버퍼 사용을 허용하는 작성기가 제공됩니다.
PacketBuffer 객체는 더 큰 페이로드를 수용하기 위해 연결될 수 있습니다. 그러나 연결은 투명하지 않으며 클래스 사용자는 연결 지원을 명시 적으로 결정해야합니다. 체인 지원으로 작성된 클래스의 예는 다음과 같습니다.
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
계승
상속 : pbuf공공 기능 | |
---|---|
AddRef (void) | void 현재 버퍼의 참조 횟수를 늘립니다. |
AddToEnd ( PacketBuffer *aPacket) | void 주어진 패킷 버퍼를 버퍼 체인 끝에 추가하여 체인에있는 각 버퍼의 총 길이를 적절히 조정합니다. |
AlignPayload (uint16_t aAlignBytes) | bool 지정된 바이트 경계에 버퍼 페이로드를 맞 춥니 다. |
AllocSize (void) const | size_t 예약 된 데이터 공간과 페이로드 데이터 공간을 포함하지만 PacketBuffer 구조에 할당 된 공간은 포함하지 않는 할당 크기를 반환합니다. |
AvailableDataLength (void) const | uint16_t 현재 시작 위치와 데이터 길이가 주어지면 현재 버퍼에 추가 할 수있는 데이터의 바이트 수를 가져옵니다. |
CompactHead (void) | void 데이터가 가득 찰 때까지 체인의 후속 버퍼에서 현재 버퍼로 데이터를 이동합니다. |
Consume (uint16_t aConsumeLength) | 버퍼 체인에서 데이터를 소비합니다. |
ConsumeHead (uint16_t aConsumeLength) | void 소비 된 데이터 양을 나타내도록 현재 버퍼를 조정합니다. |
DataLength (void) const | uint16_t 패킷 버퍼의 데이터 길이 (바이트)를 가져옵니다. |
DetachTail (void) | 체인에서 현재 버퍼를 분리하고 나머지 버퍼에 대한 포인터를 반환합니다. |
EnsureReservedSize (uint16_t aReservedSize) | bool 버퍼에 최소한 지정된 양의 예약 된 공간이 있는지 확인하십시오. |
MaxDataLength (void) const | uint16_t 현재 시작 위치와 버퍼 크기가 주어지면 버퍼에 들어갈 최대 데이터 양 (바이트)을 가져옵니다. |
Next (void) const | 체인의 다음 버퍼에 대한 포인터를 가져옵니다. |
ReservedSize (void) const | uint16_t 버퍼의 시작과 현재 데이터 시작 위치 사이의 현재 버퍼 내의 바이트 수를 가져옵니다. |
SetDataLength (uint16_t aNewLen, PacketBuffer *aChainHead) | void 버퍼에있는 데이터의 길이 (바이트)를 설정하고 그에 따라 총 길이를 조정합니다. |
SetStart (uint8_t *aNewStart) | void 버퍼에 시작 데이터를 설정하고 그에 따라 길이와 전체 길이를 조정합니다. |
Start (void) const | uint8_t * 버퍼의 데이터 시작 포인터를 가져옵니다. |
TotalLength (void) const | uint16_t 버퍼 체인에있는 패킷 데이터의 총 길이를 가져옵니다. |
공개 정적 함수 | |
---|---|
Free ( PacketBuffer *aPacket) | void 체인의 모든 패킷 버퍼를 해제합니다. |
FreeHead ( PacketBuffer *aPacket) | 체인의 첫 번째 버퍼를 해제하고 나머지 버퍼에 대한 포인터를 반환합니다. |
New (void) | 페이로드에 기본 예약 크기 ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE )를 사용하여 기본 최대 크기 ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX )의 단일 PacketBuffer 를 할당합니다. |
New (uint16_t aReservedSize) | 특정 헤더 예약 크기로 최대 총 크기의 단일 PacketBuffer 를 할당합니다. |
NewWithAvailableSize (size_t aAvailableSize) | 헤더의 페이로드에 기본 예약 크기 ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE )로 PacketBuffer 를 할당하고 초기 커서 포인터 이후의 추가 데이터를 위해 최소 aAllocSize 바이트 공간을 aAllocSize 합니다. |
NewWithAvailableSize (uint16_t aReservedSize, size_t aAvailableSize) | 를 할당은 PacketBuffer의 이상과 목적 aReservedSize 헤더의 페이로드에 예약하고, 적어도 바이트 aAllocSize 초기 커서 포인터 후 추가 데이터 공간의 바이트. |
RightSize ( PacketBuffer *aPacket) | 해당되는 경우 주어진 버퍼를 올바른 크기의 버퍼에 복사합니다. |
공공 기능
AddRef
void AddRef( void )
현재 버퍼의 참조 횟수를 늘립니다.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
주어진 패킷 버퍼를 버퍼 체인 끝에 추가하여 체인에있는 각 버퍼의 총 길이를 적절히 조정합니다.
세부 | |||
---|---|---|---|
매개 변수 |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
지정된 바이트 경계에 버퍼 페이로드를 맞 춥니 다.
필요한 경우 버퍼의 페이로드를 앞으로 이동합니다.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | true 정렬이 성공하면, false 경우 버퍼에 충분한 공간이 아니다. |
AllocSize
size_t AllocSize( void ) const
예약 된 데이터 공간과 페이로드 데이터 공간을 포함하지만 PacketBuffer 구조에 할당 된 공간은 포함하지 않는 할당 크기를 반환합니다.
세부 | |
---|---|
보고 | 할당 크기 |
AvailableDataLength
uint16_t AvailableDataLength( void ) const
현재 시작 위치와 데이터 길이가 주어지면 현재 버퍼에 추가 할 수있는 데이터의 바이트 수를 가져옵니다.
세부 | |
---|---|
보고 | 현재 시작 위치와 데이터 길이가 주어지면 현재 버퍼에 들어갈 데이터의 길이 (바이트). |
CompactHead
void CompactHead( void )
데이터가 가득 찰 때까지 체인의 후속 버퍼에서 현재 버퍼로 데이터를 이동합니다.
현재 버퍼 만 압축됩니다. 현재 버퍼 내의 데이터가 버퍼의 맨 앞으로 이동하여 예약 된 공간이 제거됩니다. 남은 사용 가능한 공간은 현재 버퍼가 가득 찰 때까지 체인의 후속 버퍼에서 이동 한 데이터로 채워집니다. 체인의 후속 버퍼가 전체적으로 현재 버퍼로 이동되면 체인에서 제거되고 해제됩니다. 이 메서드는 매개 변수를 사용하지 않고 결과를 반환하지 않으며 실패 할 수 없습니다.
바싹 여위다
PacketBuffer * Consume( uint16_t aConsumeLength )
버퍼 체인에서 데이터를 사용합니다.
현재 버퍼에서 시작하여 체인의 나머지 버퍼를 통해 진행되는 버퍼 체인의 데이터를 소비합니다. 완전히 소비 된 각 버퍼는 해제되고 함수는 나머지 데이터를 포함하는 첫 번째 버퍼 (있는 경우)를 반환합니다. 현재 버퍼는 버퍼 체인의 헤드 여야합니다.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | 남아있는 데이터를 포함하는 현재 체인의 첫 번째 버퍼. 데이터가 남아 있지 않으면 NULL이 반환됩니다. |
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
소비 된 데이터의 양을 나타내도록 현재 버퍼를 조정합니다.
버퍼의 데이터 길이까지 지정된 양 (바이트)만큼 현재 버퍼의 데이터 시작 위치를 앞 당깁니다. 소비 된 양만큼 길이와 총 길이를 줄이십시오.
세부 | |||
---|---|---|---|
매개 변수 |
|
DataLength
uint16_t DataLength( void ) const
패킷 버퍼의 데이터 길이 (바이트)를 가져옵니다.
세부 | |
---|---|
보고 | 길이 (바이트) (현재 페이로드 길이) |
DetachTail
PacketBuffer * DetachTail( void )
체인에서 현재 버퍼를 분리하고 나머지 버퍼에 대한 포인터를 반환합니다.
현재 버퍼는 체인의 헤드 여야합니다.
세부 | |
---|---|
보고 | 현재 버퍼 체인의 꼬리 또는 현재 버퍼가 체인의 유일한 버퍼 인 경우 NULL입니다. |
ensureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
버퍼에 최소한 지정된 양의 예약 된 공간이 있는지 확인하십시오.
필요한 경우 공간을 확보하기 위해 버퍼에있는 데이터를 앞으로 이동시키는 예약 된 공간이 버퍼에 최소한 지정되어 있는지 확인하십시오.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | 요청 된 예약 크기를 사용할 수 있으면 true , 버퍼에 충분한 공간이 없으면 false 입니다. |
MaxDataLength
uint16_t MaxDataLength( void ) const
현재 시작 위치와 버퍼 크기가 주어지면 버퍼에 들어갈 최대 데이터 양 (바이트)을 가져옵니다.
세부 | |
---|---|
보고 | 현재 시작 위치에서 버퍼에 맞는 바이트 수입니다. |
다음
PacketBuffer * Next( void ) const
체인의 다음 버퍼에 대한 포인터를 가져옵니다.
세부 | |
---|---|
보고 | 체인의 다음 버퍼에 대한 포인터. 체인에 버퍼가 없으면 NULL 이 반환됩니다. |
ReservedSize
uint16_t ReservedSize( void ) const
버퍼의 시작과 현재 데이터 시작 위치 사이의 현재 버퍼 내의 바이트 수를 가져옵니다.
세부 | |
---|---|
보고 | 버퍼의 시작과 현재 데이터 시작 위치 사이의 공간 (바이트)입니다. |
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
버퍼에있는 데이터의 길이 (바이트)를 설정하고 그에 따라 총 길이를 조정합니다.
이 함수는 버퍼에있는 데이터의 길이 (바이트)를 설정하여 총 길이를 적절하게 조정합니다. 버퍼가 버퍼 체인의 헤드가 아닌 경우 (일반적인 경우 : 호출자가 상위 계층을 호출하기 전에 PacketBuffer 체인의 마지막 버퍼에 데이터를 추가 함) aChainHead 를 전달하여 각 버퍼의 총 길이를 적절하게 조정 해야합니다. 현재 버퍼의.
세부 | |||||
---|---|---|---|---|---|
매개 변수 |
|
SetStart
void SetStart( uint8_t *aNewStart )
버퍼에 시작 데이터를 설정하고 그에 따라 길이와 전체 길이를 조정합니다.
세부 | |||
---|---|---|---|
매개 변수 |
|
스타트
uint8_t * Start( void ) const
버퍼의 데이터 시작 포인터를 가져옵니다.
세부 | |
---|---|
보고 | 데이터 시작을 가리키는 포인터. |
총 길이
uint16_t TotalLength( void ) const
버퍼 체인에있는 패킷 데이터의 총 길이를 가져옵니다.
세부 | |
---|---|
보고 | 총 길이 (옥텟). |
공개 정적 함수
비어 있는
void Free( PacketBuffer *aPacket )
체인의 모든 패킷 버퍼를 해제합니다.
현재 체인의 모든 버퍼에 대한 참조 횟수를 줄입니다. 참조 횟수가 0에 도달하면 각 버퍼가 해제되거나 적절하게 할당 풀로 반환됩니다. 일반적으로 사용자는이 메서드를 free()
함수와 동일하게 취급해야하며 호출 후 인수를 사용하지 않아야합니다.
세부 | |||
---|---|---|---|
매개 변수 |
|
프리 헤드
PacketBuffer * FreeHead( PacketBuffer *aPacket )
체인의 첫 번째 버퍼를 해제하고 나머지 버퍼에 대한 포인터를 반환합니다.
* @note When the buffer chain is referenced by multiple callers,
FreeHead () `는 헤드를 분리하지만 헤드 버퍼를 강제로 할당 해제하지는 않습니다.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | 입력 버퍼의 꼬리로 구성된 패킷 버퍼 체인 ( NULL 일 수 있음). |
새로운
PacketBuffer * New( void )
페이로드에 기본 예약 크기 ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE )를 사용하여 기본 최대 크기 ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX )의 단일 PacketBuffer 를 할당합니다.
예약 된 크기 ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE )는 WeaveMessageLayer
및 WeaveExchangeLayer
필요한 헤더뿐만 아니라 전송 계층 헤더를 보유하기에 충분히 WeaveExchangeLayer
.
새로운
PacketBuffer * New( uint16_t aReservedSize )
특정 헤더 예약 크기로 최대 총 크기의 단일 PacketBuffer 를 할당합니다.
전달 된 매개 변수는 할당 할 버퍼의 전체 크기가 아니라 다른 스택 계층의 패킷 헤더를 수용하기 위해 페이로드 이전에 예약 된 크기입니다. WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX 버퍼의 크기는 호출에 지정되지 않습니다.
-
PacketBuffer::New(0)
:이 방식으로 호출하면 헤더가 예약되지 않고 버퍼가 반환되므로 호출자가 전체 페이로드를 사용할 수 있습니다. 이 패턴은 사용자가 페이로드가 적절한 헤더 보유하거나 만드는 최종 메시지로 내보내는 것이다 아는 경우, 네트워크 스택의 하위 계층에서 특히 유용 PacketBuffer를 체인에 추가된다 PacketBuffer 통해PacketBuffer::AddToEnd()
.매개 변수 [in] aReservedSize
예약 할 헤더 공간의 양.보고 성공시 PacketBuffer에 대한 포인터, 실패시NULL
입니다.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
헤더의 페이로드에 기본 예약 크기 ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE )로 PacketBuffer 를 할당하고 초기 커서 포인터 이후의 추가 데이터에 대해 최소 aAllocSize
바이트 공간을 aAllocSize
합니다.
이 사용법은 애플리케이션 계층 메시지에 대한 PacketBuffer 를 할당 할 때 가장 적합합니다.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | 성공시 할당 된 블록의 PacketBuffer 에 대한 포인터. 실패시 NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
를 할당은 PacketBuffer의 이상과 목적 aReservedSize
헤더의 페이로드에 예약하고, 적어도 바이트 aAllocSize
초기 커서 포인터 후 추가 데이터 공간의 바이트.
세부 | |||||
---|---|---|---|---|---|
매개 변수 |
| ||||
보고 | 성공시 할당 된 블록의 PacketBuffer 에 대한 포인터. 실패시 NULL . |
맞는 치수
PacketBuffer * RightSize( PacketBuffer *aPacket )
해당되는 경우 주어진 버퍼를 올바른 크기의 버퍼에 복사합니다.
이 함수는 소켓에 대해 작동하지 않습니다.
세부 | |||
---|---|---|---|
매개 변수 |
| ||
보고 | 새 패킷 버퍼 또는 원래 버퍼 |