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ố
[in] aPacket
– vùng đệm gói cần thêm vào cuối chuỗi hiện tại.

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ố
[in] aAlignBytes
- chỉ định số byte căn chỉnh cho con trỏ bắt đầu tải trọng.
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ố
[in] aConsumeLength
– số byte cần sử dụng từ chuỗi hiện tại.
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ố
[in] aConsumeLen
– số byte cần sử dụng từ vùng đệm hiện tại.

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ố
[in] aReservedSize
– số byte mong muốn cho tiêu đề.
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ố
[in] aNewLen
– độ dài mới, tính bằng byte, của vùng đệm này.
[in,out] aChainHead
– phần đầu của chuỗi vùng đệm mà vùng đệm hiện tại thuộc về. Có thể là giá trị NULL nếu vùng đệm hiện tại là phần đầu của chuỗi vùng đệm.

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ố
[in] aNewStart
– Con trỏ tới vị trí tải trọng mới bắt đầu. newStart sẽ được điều chỉnh nội bộ để nằm trong ranh giới của vùng đệm đầu tiên trong chuỗi PacketBuffer.

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ố
[in] aPacket
– bộ đệm gói cần được giải phóng.

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ố
[in] aPacket
– chuỗi vùng đệm.
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 WeaveMessageLayerWeaveExchangeLayer.

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 qua PacketBuffer::AddToEnd(). Tham số
    [in] aReservedSize
    lượng không gian cho tiêu đề cần đặt trước.
    Trả về
    Khi thành công, một con trỏ đến PacketBuffer, khi gặp lỗi NULL.

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ố
[in] aAvailableSize
Số octet cần phân bổ sau con trỏ.
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ố
[in] aReservedSize
Số octet cần đặt trước sau con trỏ.
[in] aAvailableSize
Số octet cần phân bổ sau con trỏ.
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ố
[in] aPacket
– vùng đệm hoặc chuỗi vùng đệm.
Trả về
vùng đệm gói mới hoặc vùng đệm ban đầu