nl:: 매점:: 시스템:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
패킷 버퍼 클래스는 옥텟 직렬화 데이터의 패킷을 조작하는 데 사용되는 핵심 구조로, 일반적으로 블루투스 또는 인터넷 프로토콜과 같은 데이터 통신 네트워크의 컨텍스트에서 사용됩니다.
요약
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_PACKETBUFFER_CAPACITY_MAX)의 단일 PacketBuffer(페이로드에 기본 예약 크기(WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE))를 할당합니다.
|
New(uint16_t aReservedSize)
|
최대 헤더 크기가 하나인 PacketBuffer 하나를 특정 헤더 예약 크기로 할당합니다.
|
NewWithAvailableSize(size_t aAvailableSize)
|
헤더의 페이로드에 기본 예약된 크기 (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE)로 PacketBuffer를 할당하고, 초기 커서 포인터 이후의 추가 데이터를 위해 적어도
aAllocSize 바이트의 공간을 할당합니다. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
헤더의 페이로드에 최소
aReservedSize 바이트가 예약되고 초기 커서 포인터 뒤에 추가 데이터를 위한 aAllocSize 바이트가 있는 PacketBuffer 객체를 할당합니다. |
RightSize(PacketBuffer *aPacket)
|
해당하는 경우 적절한 버퍼를 적절한 크기의 버퍼에 복사합니다.
|
공개 함수
추가 참조
void AddRef( void )
현재 버퍼의 참조 수를 늘립니다.
추가 종료
void AddToEnd( PacketBuffer *aPacket )
지정된 패킷 버퍼를 버퍼 체인 끝에 추가하여 체인에 있는 각 버퍼의 총 길이를 적절하게 조정합니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
버퍼 페이로드를 지정된 바이트 경계에 맞춥니다.
필요한 경우 버퍼에서 페이로드를 앞으로 이동합니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
||
반환 |
정렬이 성공하면
true , 버퍼에 공간이 충분하지 않으면 false 입니다. |
할당 크기
size_t AllocSize( void ) const
예약된 크기 및 페이로드 데이터 공간을 제외하고 할당 크기를 반환하되 PacketBuffer 구조에 할당된 공간은 포함하지 않습니다.
세부정보 | |
---|---|
반환 |
할당 크기
|
사용 가능한 DataLength
uint16_t AvailableDataLength( void ) const
현재 시작 위치와 데이터 길이를 고려하여 현재 버퍼에 추가할 수 있는 데이터 바이트 수를 가져옵니다.
세부정보 | |
---|---|
반환 |
현재 시작 위치와 데이터 길이를 고려하여 현재 버퍼에 맞는 데이터의 길이(바이트)입니다.
|
컴팩트헤드
void CompactHead( void )
체인의 후속 버퍼가 가득 찼을 때 데이터를 현재 버퍼로 이동합니다.
현재 버퍼만 압축됩니다. 현재 버퍼 내의 데이터는 버퍼 앞쪽으로 이동되고, 예약된 공간은 모두 제거됩니다. 사용 가능한 나머지 공간은 현재 버퍼가 가득 찼을 때까지 체인의 후속 버퍼에서 이동한 데이터로 채워집니다. 체인의 후속 버퍼가 현재 버퍼로 전체 이동되면 체인에서 삭제되고 해제됩니다. 이 메서드는 매개변수를 사용하지 않고 결과를 반환하지 않으며 실패할 수 없습니다.
소비
PacketBuffer * Consume( uint16_t aConsumeLength )
버퍼 체인에서 데이터를 사용합니다.
현재 버퍼에서 시작하여 체인의 나머지 버퍼를 진행하면서 버퍼 체인에서 데이터를 사용합니다. 완전히 소비된 각 버퍼는 해제되고 함수는 나머지 데이터를 포함하는 첫 번째 버퍼 (있는 경우)를 반환합니다. 현재 버퍼는 버퍼 체인의 헤드여야 합니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
||
반환 |
현재 데이터가 남아 있는 현재 체인의 첫 번째 버퍼입니다. 남은 데이터가 없으면 NULL이 반환됩니다.
|
콩스헤드 헤드
void ConsumeHead( uint16_t aConsumeLength )
현재 버퍼를 조정하여 소비되는 데이터의 양을 표시합니다.
현재 버퍼의 데이터 시작 위치를 버퍼의 데이터 길이까지 지정된 크기(바이트)만큼 이동합니다. 길이와 총 길이를 소비되는 양을 줄입니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
데이터 길이
uint16_t DataLength( void ) const
패킷 버퍼의 데이터 길이(바이트)를 가져옵니다.
세부정보 | |
---|---|
반환 |
길이(바이트)입니다(현재 페이로드 길이).
|
분리형
PacketBuffer * DetachTail( void )
현재 버퍼를 체인에서 분리하고 나머지 버퍼에 대한 포인터를 반환합니다.
현재 버퍼는 체인의 헤드여야 합니다.
세부정보 | |
---|---|
반환 |
현재 버퍼 체인의 테일, 현재 버퍼가 체인의 유일한 버퍼인 경우 NULL입니다.
|
예약 예약 크기
bool EnsureReservedSize( uint16_t aReservedSize )
버퍼에 지정된 공간 이상의 공간이 있는지 확인합니다.
필요한 경우 여유 공간을 확보하기 위해 버퍼에 지정된 양의 공간이 버퍼에 있는 데이터를 앞으로 이동하는지 확인합니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
||
반환 |
요청된 예약 크기를 사용할 수 있는 경우
true , 버퍼에 공간이 충분하지 않은 경우 false |
최대 데이터 길이
uint16_t MaxDataLength( void ) const
현재 시작 위치와 버퍼 크기를 고려하여 버퍼에 맞는 데이터의 최대 양(바이트)을 가져옵니다.
세부정보 | |
---|---|
반환 |
현재 시작 위치를 고려한 버퍼에 적합한 바이트 수입니다.
|
다음
PacketBuffer * Next( void ) const
체인의 다음 버퍼 포인터를 가져옵니다.
세부정보 | |
---|---|
반환 |
체인의 다음 버퍼를 가리키는 포인터입니다. 체인에 버퍼가 없으면
NULL 가 반환됩니다. |
예약 크기
uint16_t ReservedSize( void ) const
버퍼의 시작과 현재 데이터 시작 위치 사이의 현재 버퍼 내의 바이트 수를 가져옵니다.
세부정보 | |
---|---|
반환 |
버퍼 시작과 현재 데이터 시작 위치 사이의 공간 크기(바이트)입니다.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
총 데이터 길이를 조정하여 버퍼의 데이터 길이(바이트)를 설정합니다.
함수는 버퍼의 데이터 길이를 바이트 단위로 설정하여 총 길이를 적절하게 조정합니다. 버퍼가 버퍼 체인의 헤드가 아닌 경우 (일반적인 경우: 호출자가 더 높은 레이어를 호출하기 전에 PacketBuffer 체인의 마지막 버퍼에 데이터를 추가), 현재 체인보다 먼저 각 버퍼의 총 길이를 적절하게 조정하려면 aChainHead를 반드시 전달해야 합니다.
세부정보 | |||||
---|---|---|---|---|---|
매개변수 |
|
세트 시작
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_PACKETBUFFER_CAPACITY_MAX)의 단일 PacketBuffer(페이로드에 기본 예약 크기(WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE))를 할당합니다.
예약된 크기(WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE)는 전송 계층 헤더 및 WeaveMessageLayer
과 WeaveExchangeLayer
에 필요한 헤더를 수용할 만큼 큽니다.
신규
PacketBuffer * New( uint16_t aReservedSize )
최대 헤더 크기가 하나인 PacketBuffer 하나를 특정 헤더 예약 크기로 할당합니다.
전달된 매개변수는 다른 스택 레이어의 패킷 헤더를 수용하기 위해 페이로드 이전에 할당된 크기이며, 할당할 버퍼의 전체 크기가 아닙니다. 버퍼에 지정된 WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX의 크기입니다.
PacketBuffer::New(0)
: 이 방식으로 호출되면 버퍼는 예약된 헤더 없이 반환되므로 호출자가 전체 페이로드를 사용할 수 있습니다. 이 패턴은 사용자가 적합한 헤더 예약과 함께 최종 메시지로 페이로드가 복사되는 것을 알고 있거나PacketBuffer::AddToEnd()
을 통해 PacketBuffer 체인에 추가된 PacketBuffer를 생성하는 경우 특히 네트워킹 스택의 하위 레이어에서 유용합니다. 매개변수[in] aReservedSize
예약합니다.성공하면NULL
실패 시 PacketBuffer에 대한 포인터가 생성됩니다.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
헤더의 페이로드에 기본 예약된 크기(WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE)로 PacketBuffer를 할당하고, 초기 커서 포인터 이후의 추가 데이터를 위해 적어도 aAllocSize
바이트의 공간을 할당합니다.
이 사용법은 애플리케이션 레이어 메시지에 PacketBuffer를 할당할 때 가장 적합합니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
||
반환 |
성공하면 할당된 블록의 PacketBuffer에 대한 포인터가 생성됩니다. 실패하면
NULL * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
헤더의 페이로드에 최소 aReservedSize
바이트가 예약되고 초기 커서 포인터 뒤에 추가 데이터를 위한 aAllocSize
바이트가 있는 PacketBuffer 객체를 할당합니다.
세부정보 | |||||
---|---|---|---|---|---|
매개변수 |
|
||||
반환 |
성공하면 할당된 블록의 PacketBuffer에 대한 포인터가 생성됩니다. 실패하면
NULL |
오른쪽 크기
PacketBuffer * RightSize( PacketBuffer *aPacket )
해당하는 경우 적절한 버퍼를 적절한 크기의 버퍼에 복사합니다.
이 함수는 소켓의 노옵스(no-ops)입니다.
세부정보 | |||
---|---|---|---|
매개변수 |
|
||
반환 |
새 패킷 버퍼 또는 원래 버퍼
|