nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
Lớp vùng đệm gói là cấu trúc cốt lõi dùng để thao tác với các gói dữ liệu chuyển đổi tuần tự octet, thường trong bối cảnh mạng truyền thông dữ liệu, như Bluetooth hoặc giao thức Internet.
Tóm tắt
Trong các môi trường dựa trên LwIP, lớp này được xây dựng dựa trên cấu trúc pbuf được xác định trong thư viện đó. Khi không có LwIP, Weave cung cấp phương thức triển khai dựa trên Malloc hoặc phương thức triển khai dựa trên nhóm gần đúng những thách thức về bộ nhớ của các thiết bị được nhúng sâu.
Lớp PacketBuffer, giống như nhiều cấu trúc tương tự được dùng trong ngăn xếp mạng phân lớp, cung cấp một cơ chế để dành không gian cho các tiêu đề giao thức ở mỗi lớp của ngăn xếp giao tiếp có thể định cấu hình. Để biết thông tin chi tiết, hãy xem PacketBuffer::New()
cũng như tài liệu về LwIP.
Các đối tượng PacketBuffer được tính tham chiếu và chế độ sử dụng phổ biến trong Weave là "fire-and-forget" (phóng và quên). Vì gói (và đối tượng PacketBuffer cơ bản) được gửi qua nhiều lớp giao thức, lệnh gọi lên hoặc lệnh gọi xuống thành công giữa các lớp ngụ ý việc chuyển quyền sở hữu và hàm được gọi chịu trách nhiệm giải phóng bộ đệm. Khi lệnh gọi giữa nhiều lớp không thành công, phương thức gọi có trách nhiệm giải phóng vùng đệm.
Các đối tượng mới của lớp PacketBuffer được khởi tạo tại thời điểm bắt đầu quá trình phân bổ bộ nhớ thu được từ môi trường cơ bản, ví dụ: từ nhóm mục tiêu LwIP pbuf, từ vùng nhớ khối xếp thư viện C tiêu chuẩn, từ một nhóm bộ đệm nội bộ. Trong trường hợp đơn giản, dung lượng của vùng đệm dữ liệu là WEAVE_SYSTEM_PACKETBUFFER_SIZE. Một trình soạn thảo được cung cấp cho phép sử dụng các vùng đệm dữ liệu ở kích thước khác.
Các đối tượng PacketBuffer có thể được xâu chuỗi để chứa các tải trọng lớn hơn. Tuy nhiên, việc tạo chuỗi không minh bạch và người dùng trong lớp phải quyết định rõ ràng có hỗ trợ tạo chuỗi hay không. Sau đây là ví dụ về các lớp được viết có hỗ trợ chuỗi:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
Tính kế thừa
Kế thừa từ: pbuf
Hàm công khai |
|
---|---|
AddRef(void)
|
void
Tăng số lượng tham chiếu của vùng đệm hiện tại.
|
AddToEnd(PacketBuffer *aPacket)
|
void
Thêm bộ đệm gói đã cho vào cuối chuỗi bộ đệm, điều chỉnh tổng chiều dài của mỗi bộ đệm trong chuỗi sao cho phù hợp.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
Căn chỉnh tải trọng vùng đệm trên ranh giới byte được chỉ định.
|
AllocSize(void) const
|
size_t
Trả về kích thước của quá trình phân bổ, bao gồm cả không gian dữ liệu dành riêng và không gian dữ liệu tải trọng, nhưng không bao gồm dung lượng được phân bổ cho cấu trúc PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
Lấy số byte dữ liệu có thể thêm vào vùng đệm hiện tại dựa vào vị trí bắt đầu và độ dài dữ liệu hiện tại.
|
CompactHead(void)
|
void
Di chuyển dữ liệu từ các bộ đệm tiếp theo trong chuỗi vào bộ đệm hiện tại cho đến khi bộ đệm đầy.
|
Consume(uint16_t aConsumeLength)
|
Sử dụng dữ liệu trong một chuỗi vùng đệm.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
Điều chỉnh vùng đệm hiện tại để cho biết lượng dữ liệu đã sử dụng.
|
DataLength(void) const
|
uint16_t
Lấy độ dài của dữ liệu tính bằng byte trong vùng đệm gói.
|
DetachTail(void)
|
Tách vùng đệm hiện tại khỏi chuỗi của vùng đệm và trả về một con trỏ đến các vùng đệm còn lại.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
Đảm bảo vùng đệm có ít nhất mức dung lượng dành riêng đã chỉ định.
|
MaxDataLength(void) const
|
uint16_t
Lấy dung lượng dữ liệu tối đa (tính bằng byte) sẽ vừa với vùng đệm dựa trên vị trí bắt đầu hiện tại và dung lượng vùng đệm.
|
Next(void) const
|
Nhận con trỏ đến vùng đệm tiếp theo trong chuỗi.
|
ReservedSize(void) const
|
uint16_t
Lấy số byte trong vùng đệm hiện tại từ vị trí bắt đầu vùng đệm đến vị trí bắt đầu dữ liệu hiện tại.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
Thiết lập độ dài (tính bằng byte) của dữ liệu trong vùng đệm và điều chỉnh tổng độ dài tương ứng.
|
SetStart(uint8_t *aNewStart)
|
void
Thiết lập dữ liệu bắt đầu trong vùng đệm, điều chỉnh độ dài và tổng thời lượng sao cho phù hợp.
|
Start(void) const
|
uint8_t *
Lấy con trỏ bắt đầu dữ liệu trong vùng đệm.
|
TotalLength(void) const
|
uint16_t
Lấy tổng độ dài của dữ liệu gói trong chuỗi vùng đệm.
|
Hàm tĩnh công khai |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
Giải phóng tất cả vùng đệm gói trong một chuỗi.
|
FreeHead(PacketBuffer *aPacket)
|
Giải phóng vùng đệm đầu tiên trong một chuỗi, trả về một con trỏ đến các vùng đệm còn lại.
|
New(void)
|
Phân bổ một PacketBuffer có kích thước tối đa mặc định (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) với kích thước dành riêng mặc định (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) trong tải trọng.
|
New(uint16_t aReservedSize)
|
Phân bổ một PacketBuffer có tổng kích thước tối đa tương ứng với một kích thước dành riêng cho tiêu đề cụ thể.
|
NewWithAvailableSize(size_t aAvailableSize)
|
Phân bổ một PacketBuffer có kích thước dành riêng mặc định (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) trong tải trọng cho tiêu đề và ít nhất
aAllocSize byte không gian cho dữ liệu bổ sung sau con trỏ con trỏ ban đầu. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
Phân bổ một đối tượng PacketBuffer có ít nhất
aReservedSize byte dành riêng trong tải trọng cho tiêu đề và ít nhất aAllocSize byte không gian cho dữ liệu bổ sung sau con trỏ con trỏ ban đầu. |
RightSize(PacketBuffer *aPacket)
|
Sao chép vùng đệm đã cho vào một vùng đệm có kích thước phù hợp (nếu có).
|
Hàm công khai
AddRef
void AddRef( void )
Tăng số lượng tham chiếu của vùng đệm hiện tại.
AddToEnd
void AddToEnd( PacketBuffer *aPacket )
Thêm bộ đệm gói đã cho vào cuối chuỗi bộ đệm, điều chỉnh tổng chiều dài của mỗi bộ đệm trong chuỗi sao cho phù hợp.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
Căn chỉnh tải trọng vùng đệm trên ranh giới byte được chỉ định.
Di chuyển tải trọng trong vùng đệm về phía trước nếu cần.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
true nếu căn chỉnh thành công, false nếu không có đủ chỗ trong vùng đệm. |
AllocSize
size_t AllocSize( void ) const
Trả về kích thước của quá trình phân bổ, bao gồm cả không gian dữ liệu dành riêng và không gian dữ liệu tải trọng, nhưng không bao gồm dung lượng được phân bổ cho cấu trúc PacketBuffer.
Thông tin chi tiết | |
---|---|
Trả về |
quy mô phân bổ
|
AvailableDataLength
uint16_t AvailableDataLength( void ) const
Lấy số byte dữ liệu có thể thêm vào vùng đệm hiện tại dựa vào vị trí bắt đầu và độ dài dữ liệu hiện tại.
Thông tin chi tiết | |
---|---|
Trả về |
độ dài (tính bằng byte) của dữ liệu sẽ vừa với vùng đệm hiện tại dựa trên vị trí bắt đầu và độ dài dữ liệu hiện tại.
|
CompactHead
void CompactHead( void )
Di chuyển dữ liệu từ các vùng đệm tiếp theo trong chuỗi vào vùng đệm hiện tại cho đến khi bộ đệm đầy.
Chỉ vùng đệm hiện tại được nén: dữ liệu trong vùng đệm hiện tại được di chuyển lên trước vùng đệm, loại bỏ mọi không gian dành riêng. Không gian trống còn lại sẽ được lấp đầy bằng dữ liệu được chuyển từ các vùng đệm tiếp theo trong chuỗi cho đến khi vùng đệm hiện tại đầy. Nếu vùng đệm tiếp theo trong chuỗi được di chuyển vào vùng đệm hiện tại thì vùng đệm đó sẽ bị xoá khỏi chuỗi và được giải phóng. Phương thức này không nhận tham số, không trả về kết quả và không thể bị lỗi.
Tiêu thụ
PacketBuffer * Consume( uint16_t aConsumeLength )
Sử dụng dữ liệu trong một chuỗi vùng đệm.
Sử dụng dữ liệu trong một chuỗi vùng đệm bắt đầu với vùng đệm hiện tại và tiếp tục qua các vùng đệm còn lại trong chuỗi. Mỗi vùng đệm được tiêu thụ hoàn toàn sẽ được giải phóng và hàm trả về vùng đệm đầu tiên (nếu có) chứa dữ liệu còn lại. Vùng đệm hiện tại phải là phần đầu của chuỗi vùng đệm.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
vùng đệm đầu tiên từ chuỗi hiện tại chứa mọi dữ liệu còn lại. Nếu không còn dữ liệu, hàm sẽ trả về giá trị NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
Điều chỉnh vùng đệm hiện tại để cho biết lượng dữ liệu đã sử dụng.
Tăng vị trí bắt đầu dữ liệu trong vùng đệm hiện tại theo lượng đã chỉ định (tính bằng byte) lên đến độ dài dữ liệu trong vùng đệm. Hãy giảm thời lượng và tổng thời lượng theo mức tiêu thụ.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
DataLength
uint16_t DataLength( void ) const
Lấy độ dài của dữ liệu tính bằng byte trong vùng đệm gói.
Thông tin chi tiết | |
---|---|
Trả về |
độ dài, tính bằng byte (chiều dài tải trọng hiện tại).
|
DetachTail
PacketBuffer * DetachTail( void )
Tách vùng đệm hiện tại khỏi chuỗi của vùng đệm và trả về một con trỏ đến các vùng đệm còn lại.
Vùng đệm hiện tại phải là phần đầu của chuỗi.
Thông tin chi tiết | |
---|---|
Trả về |
đuôi của chuỗi vùng đệm hiện tại hoặc giá trị NULL nếu vùng đệm hiện tại là vùng đệm duy nhất trong chuỗi.
|
EnsureReservedSize
bool EnsureReservedSize( uint16_t aReservedSize )
Đảm bảo vùng đệm có ít nhất mức dung lượng dành riêng đã chỉ định.
Đảm bảo vùng đệm có tối thiểu lượng không gian dành riêng được chỉ định để di chuyển dữ liệu trong vùng đệm về phía trước để tạo chỗ trống nếu cần.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
true nếu có dung lượng đặt trước được yêu cầu, false nếu không có đủ dung lượng trong vùng đệm. |
MaxDataLength
uint16_t MaxDataLength( void ) const
Lấy dung lượng dữ liệu tối đa (tính bằng byte) sẽ vừa với vùng đệm dựa trên vị trí bắt đầu hiện tại và dung lượng vùng đệm.
Thông tin chi tiết | |
---|---|
Trả về |
số byte vừa với vùng đệm dựa vào vị trí bắt đầu hiện tại.
|
Tiếp theo
PacketBuffer * Next( void ) const
Nhận con trỏ đến vùng đệm tiếp theo trong chuỗi.
Thông tin chi tiết | |
---|---|
Trả về |
một con trỏ đến vùng đệm tiếp theo trong chuỗi.
NULL được trả về khi không có vùng đệm trong chuỗi. |
ReservedSize
uint16_t ReservedSize( void ) const
Lấy số byte trong vùng đệm hiện tại từ vị trí bắt đầu vùng đệm đến vị trí bắt đầu dữ liệu hiện tại.
Thông tin chi tiết | |
---|---|
Trả về |
dung lượng (tính bằng byte) giữa vị trí bắt đầu vùng đệm và vị trí bắt đầu dữ liệu hiện tại.
|
SetDataLength
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
Thiết lập độ dài (tính bằng byte) của dữ liệu trong vùng đệm và điều chỉnh tổng độ dài tương ứng.
Hàm này thiết lập độ dài (tính bằng byte) của dữ liệu trong vùng đệm, điều chỉnh tổng độ dài thích hợp. Khi vùng đệm không phải là phần đầu của chuỗi vùng đệm (trường hợp phổ biến: phương thức gọi thêm dữ liệu vào vùng đệm cuối cùng trong chuỗi PacketBuffer trước khi gọi lớp cao hơn), aChainHead phải được truyền vào để điều chỉnh đúng tổng độ dài của từng vùng đệm trước vùng đệm hiện tại.
Thông tin chi tiết | |||||
---|---|---|---|---|---|
Tham số |
|
SetStart
void SetStart( uint8_t *aNewStart )
Thiết lập dữ liệu bắt đầu trong vùng đệm, điều chỉnh độ dài và tổng thời lượng sao cho phù hợp.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
Bắt đầu
uint8_t * Start( void ) const
Lấy con trỏ bắt đầu dữ liệu trong vùng đệm.
Thông tin chi tiết | |
---|---|
Trả về |
con trỏ đến đầu dữ liệu.
|
TotalLength
uint16_t TotalLength( void ) const
Lấy tổng độ dài của dữ liệu gói trong chuỗi vùng đệm.
Thông tin chi tiết | |
---|---|
Trả về |
tổng độ dài, tính bằng octet.
|
Hàm tĩnh công khai
Miễn phí
void Free( PacketBuffer *aPacket )
Giải phóng tất cả vùng đệm gói trong một chuỗi.
Giảm số lượng tham chiếu cho tất cả các vùng đệm trong chuỗi hiện tại. Nếu số lượng tham chiếu đạt đến 0, thì các vùng đệm tương ứng được giải phóng hoặc được trả về nhóm phân bổ khi phù hợp. Theo quy tắc, người dùng nên coi phương thức này tương đương với hàm free()
và không sử dụng đối số sau lệnh gọi.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
FreeHead
PacketBuffer * FreeHead( PacketBuffer *aPacket )
Giải phóng vùng đệm đầu tiên trong một chuỗi, trả về một con trỏ đến các vùng đệm còn lại.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()` sẽ tách phần đầu nhưng không buộc phân bổ vùng đệm phần đầu.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
chuỗi vùng đệm gói bao gồm phần đuôi của vùng đệm đầu vào (có thể là
NULL ). |
Mới
PacketBuffer * New( void )
Phân bổ một PacketBuffer có kích thước tối đa mặc định (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX) với kích thước dành riêng mặc định (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) trong tải trọng.
Kích thước dành riêng (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) đủ lớn để chứa các tiêu đề lớp truyền tải cũng như các tiêu đề theo yêu cầu của WeaveMessageLayer
và WeaveExchangeLayer
.
Mới
PacketBuffer * New( uint16_t aReservedSize )
Phân bổ một PacketBuffer có tổng kích thước tối đa tương ứng với một kích thước dành riêng cho tiêu đề cụ thể.
Tham số được truyền vào là kích thước được đặt trước trước tải trọng để chứa tiêu đề gói từ nhiều lớp ngăn xếp, không phải là kích thước tổng thể của vùng đệm cần phân bổ. Kích thước của vùng đệm WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX và không được chỉ định trong lệnh gọi.
PacketBuffer::New(0)
: khi được gọi theo cách này, vùng đệm sẽ được trả về mà không dành riêng tiêu đề nào, do đó phương thức gọi có thể sử dụng toàn bộ tải trọng. Mẫu này đặc biệt hữu ích tại các lớp thấp hơn của ngăn xếp mạng, trong trường hợp người dùng biết rằng tải trọng sẽ được sao chép vào thông báo cuối cùng với lượng dự trữ tiêu đề phù hợp hoặc trong việc tạo PacketBuffer được thêm vào chuỗi PacketBuffer thông quaPacketBuffer::AddToEnd()
. Tham số[in] aReservedSize
lượng không gian cho tiêu đề cần đặt trước.Khi thành công, một con trỏ đến PacketBuffer, khi gặp lỗiNULL
.
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
Phân bổ một PacketBuffer có kích thước dành riêng mặc định (WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE) trong tải trọng cho tiêu đề và ít nhất aAllocSize
byte không gian cho dữ liệu bổ sung sau con trỏ con trỏ ban đầu.
Cách sử dụng này thích hợp nhất khi phân bổ PacketBuffer cho một thông báo lớp ứng dụng.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
Khi thành công, một con trỏ đến PacketBuffer trong khối được phân bổ. Khi không thành công,
NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
Phân bổ một đối tượng PacketBuffer có ít nhất aReservedSize
byte dành riêng trong tải trọng cho tiêu đề và ít nhất aAllocSize
byte không gian cho dữ liệu bổ sung sau con trỏ con trỏ ban đầu.
Thông tin chi tiết | |||||
---|---|---|---|---|---|
Tham số |
|
||||
Trả về |
Khi thành công, một con trỏ đến PacketBuffer trong khối được phân bổ. Khi không thành công,
NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
Sao chép vùng đệm đã cho vào một vùng đệm có kích thước phù hợp (nếu có).
Hàm này không hoạt động đối với ổ cắm.
Thông tin chi tiết | |||
---|---|---|---|
Tham số |
|
||
Trả về |
vùng đệm gói mới hoặc vùng đệm ban đầu
|