nl:: بافت:: سیستم:: PacketBuffer

#include <src/system/SystemPacketBuffer.h>

کلاس بافر بسته ساختار هسته ای است که برای دستکاری بسته های داده های سریال هشتگانه، معمولاً در زمینه یک شبکه ارتباطی داده، مانند بلوتوث یا پروتکل اینترنت، استفاده می شود.

خلاصه

در محیط های مبتنی بر LwIP، این کلاس بر روی ساختار pbuf تعریف شده در آن کتابخانه ساخته می شود. در غیاب LwIP، Weave یا یک پیاده‌سازی مبتنی بر malloc یا یک پیاده‌سازی مبتنی بر استخر را ارائه می‌کند که چالش‌های حافظه دستگاه‌های عمیق تعبیه‌شده را نزدیک می‌کند.

کلاس PacketBuffer ، مانند بسیاری از ساختارهای مشابه که در پشته های شبکه لایه ای استفاده می شوند، مکانیزمی را برای رزرو فضا برای سرصفحه های پروتکل در هر لایه از یک پشته ارتباطی قابل تنظیم ارائه می دهد. برای جزئیات، PacketBuffer::New() و همچنین اسناد LwIP را ببینید.

اشیاء PacketBuffer به صورت مرجع شمارش می شوند، و حالت استفاده غالب در Weave "Fire-and-Forget" است. از آنجایی که بسته (و شی PacketBuffer زیرین آن) از طریق لایه‌های پروتکل مختلف ارسال می‌شود، فراخوانی یا کاهش موفقیت‌آمیز بین لایه‌ها به معنای انتقال مالکیت است و تماس گیرنده مسئول آزاد کردن بافر است. در صورت شکست یک تماس چندلایه، مسئولیت آزادسازی بافر بر عهده تماس گیرنده است.

اشیاء جدید کلاس PacketBuffer در ابتدای تخصیص حافظه به دست آمده از محیط زیرین، به عنوان مثال از استخرهای هدف LwIP pbuf، از پشته کتابخانه استاندارد C، از یک مخزن بافر داخلی، مقداردهی اولیه می شوند. در حالت ساده، اندازه بافر داده 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)
یک PacketBuffer را با حداکثر اندازه پیش‌فرض ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX ) با اندازه رزرو شده پیش‌فرض ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) در محموله اختصاص می‌دهد.
New (uint16_t aReservedSize)
یک PacketBuffer منفرد با حداکثر اندازه کل با اندازه ذخیره هدر خاص را اختصاص می دهد.
NewWithAvailableSize (size_t aAvailableSize)
یک PacketBuffer با اندازه رزرو شده پیش‌فرض ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) را در محموله برای سرصفحه‌ها و حداقل یک بایت فضای aAllocSize برای داده‌های اضافی بعد از نشانگر مکان‌نمای اولیه اختصاص می‌دهد.
NewWithAvailableSize (uint16_t aReservedSize, size_t aAvailableSize)
یک شی PacketBuffer را با حداقل aReservedSize بایت های ذخیره شده در محموله برای هدرها و حداقل aAllocSize بایت فضا برای داده های اضافی بعد از نشانگر مکان نما اختصاص می دهد.
RightSize ( PacketBuffer *aPacket)
در صورت وجود بافر داده شده را در یک بافر با اندازه سمت راست کپی کنید.

توابع عمومی

AdRef

void AddRef(
  void
)

تعداد مرجع بافر فعلی را افزایش دهید.

AddToEnd

void AddToEnd(
  PacketBuffer *aPacket
)

بافر بسته داده شده را به انتهای زنجیره بافر اضافه کنید و طول کل هر بافر در زنجیره را متناسب با آن تنظیم کنید.

جزئیات
مولفه های
[in] aPacket
- بافر بسته به انتهای زنجیره جاری اضافه شود.

AlignPayload

bool AlignPayload(
  uint16_t aAlignBytes
)

بار بافر را روی مرز بایت های مشخص تراز کنید.

در صورت لزوم، محموله را در بافر به جلو منتقل کنید.

جزئیات
مولفه های
[in] aAlignBytes
- تعداد تراز بایت ها را برای نشانگر شروع بار مشخص می کند.
برمی گرداند
true اگر تراز موفقیت آمیز باشد، false اگر فضای کافی در بافر وجود نداشته باشد.

AllocSize

size_t AllocSize(
  void
) const 

اندازه تخصیص شامل فضاهای داده رزرو شده و محموله را برگردانید، اما فضای تخصیص داده شده برای ساختار PacketBuffer را شامل نمی شود.

جزئیات
برمی گرداند
اندازه تخصیص

AvailableDataLength

uint16_t AvailableDataLength(
  void
) const 

با توجه به موقعیت شروع فعلی و طول داده، تعداد بایت های داده ای را که می توان به بافر فعلی اضافه کرد، دریافت کنید.

جزئیات
برمی گرداند
طول، بر حسب بایت، داده هایی که با توجه به موقعیت شروع فعلی و طول داده، در بافر جاری جا می شوند.

سر فشرده

void CompactHead(
  void
)

داده ها را از بافرهای بعدی در زنجیره به بافر فعلی منتقل کنید تا زمانی که پر شود.

فقط بافر فعلی فشرده می شود: داده های درون بافر فعلی به جلوی بافر منتقل می شوند و هر فضای رزرو شده را حذف می کند. فضای موجود باقیمانده با داده های منتقل شده از بافرهای بعدی در زنجیره پر می شود تا زمانی که بافر فعلی پر شود. اگر یک بافر بعدی در زنجیره به طور کامل به بافر فعلی منتقل شود، از زنجیره خارج شده و آزاد می شود. این روش هیچ پارامتری را نمی گیرد، هیچ نتیجه ای برمی گرداند و نمی تواند شکست بخورد.

مصرف کردن

PacketBuffer * Consume(
  uint16_t aConsumeLength
)

داده ها را در زنجیره ای از بافرها مصرف کنید.

داده ها را در زنجیره ای از بافرها مصرف کنید که از بافر فعلی شروع می شود و از طریق بافرهای باقی مانده در زنجیره ادامه می یابد. هر بافری که به طور کامل مصرف می شود آزاد می شود و تابع اولین بافر (در صورت وجود) حاوی داده های باقی مانده را برمی گرداند. بافر فعلی باید سر زنجیره بافر باشد.

جزئیات
مولفه های
[in] aConsumeLength
- تعداد بایت های مصرفی از زنجیره فعلی.
برمی گرداند
اولین بافر از زنجیره فعلی که حاوی داده های باقی مانده است. اگر هیچ داده ای باقی نماند، یک NULL برگردانده می شود.

ConsumeHead

void ConsumeHead(
  uint16_t aConsumeLength
)

بافر فعلی را برای نشان دادن میزان مصرف داده تنظیم کنید.

موقعیت شروع داده را در بافر فعلی به میزان مشخص شده، بر حسب بایت، تا طول داده در بافر ارتقا دهید. طول و طول کل را با مقدار مصرف شده کاهش دهید.

جزئیات
مولفه های
[in] aConsumeLen
- تعداد بایت هایی که باید از بافر فعلی مصرف شود.

طول داده

uint16_t DataLength(
  void
) const 

طول داده ها را در بافر بسته به بایت دریافت کنید.

جزئیات
برمی گرداند
طول، بر حسب بایت (طول بار فعلی).

DetachTil

PacketBuffer * DetachTail(
  void
)

بافر فعلی را از زنجیره آن جدا کنید و یک اشاره گر را به بافرهای باقی مانده برگردانید.

بافر فعلی باید سر زنجیره باشد.

جزئیات
برمی گرداند
دم زنجیره بافر فعلی یا NULL اگر بافر فعلی تنها بافر در زنجیره باشد.

EnsureReservedSize

bool EnsureReservedSize(
  uint16_t aReservedSize
)

اطمینان حاصل کنید که بافر حداقل مقدار مشخصی از فضای رزرو شده را دارد.

اطمینان حاصل کنید که بافر حداقل مقدار مشخصی از فضای رزرو شده را دارد که داده ها را در بافر به جلو حرکت می دهد تا در صورت لزوم فضا باز شود.

جزئیات
مولفه های
[in] 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 باید برای تنظیم مناسب طول کل هر بافر پیش رو منتقل شود. از بافر فعلی

جزئیات
مولفه های
[in] aNewLen
- طول جدید، بر حسب بایت، این بافر.
[in,out] aChainHead
- سر زنجیره بافر که بافر فعلی به آن تعلق دارد. اگر بافر فعلی سر زنجیره بافر باشد ممکن است NULL باشد.

SetStart

void SetStart(
  uint8_t *aNewStart
)

داده های شروع را در بافر تنظیم کنید، طول و طول کل را بر این اساس تنظیم کنید.

جزئیات
مولفه های
[in] aNewStart
- اشاره گر به جایی که بار جدید باید شروع شود. newStart به صورت داخلی تنظیم می شود تا در محدوده اولین بافر در زنجیره PacketBuffer قرار گیرد.

شروع کنید

uint8_t * Start(
  void
) const 

نشانگر شروع داده در بافر را دریافت کنید.

جزئیات
برمی گرداند
اشاره گر به شروع داده ها

طول کل

uint16_t TotalLength(
  void
) const 

طول کل داده های بسته را در زنجیره بافر دریافت کنید.

جزئیات
برمی گرداند
طول کل، در هشت.

توابع استاتیک عمومی

رایگان

void Free(
  PacketBuffer *aPacket
)

تمام بافرهای بسته را در یک زنجیره آزاد کنید.

تعداد مراجع را به تمام بافرهای زنجیره فعلی کاهش دهید. اگر تعداد مراجع به 0 برسد، بافرهای مربوطه آزاد می شوند یا در صورت لزوم به استخرهای تخصیص بازگردانده می شوند. به عنوان یک قاعده، کاربران باید این متد را معادل تابع free() در نظر بگیرند و از آرگومان بعد از فراخوانی استفاده نکنند.

جزئیات
مولفه های
[in] aPacket
- بافر بسته آزاد می شود.

فری هد

PacketBuffer * FreeHead(
  PacketBuffer *aPacket
)

اولین بافر در یک زنجیره را آزاد کنید و یک اشاره گر را به بافرهای باقیمانده برگردانید.

* @note When the buffer chain is referenced by multiple callers, FreeHead() ` هد را جدا می کند، اما به اجبار سر بافر را منتقل نمی کند.

جزئیات
مولفه های
[in] aPacket
- زنجیره بافر
برمی گرداند
زنجیره بافر بسته متشکل از دم بافر ورودی (ممکن است NULL باشد).

جدید

PacketBuffer * New(
  void
)

یک PacketBuffer را با حداکثر اندازه پیش‌فرض ( WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX ) با اندازه رزرو شده پیش‌فرض ( 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) : هنگامی که به این روش فراخوانی می شود، بافر بدون رزرو هدر برگردانده می شود، در نتیجه کل payload توسط تماس گیرنده قابل استفاده است. این الگو به‌ویژه در لایه‌های پایینی پشته‌های شبکه مفید است، در مواردی که کاربر می‌داند payload با ذخیره‌های هدر مناسب در پیام نهایی کپی می‌شود یا در ایجاد PacketBuffer که از طریق PacketBuffer::AddToEnd() به زنجیره‌ای از PacketBuffer اضافه می‌شود. PacketBuffer::AddToEnd() . مولفه های
    [in] aReservedSize
    مقدار فضای هدر برای رزرو
    برمی گرداند
    در مورد موفقیت، یک اشاره گر به PacketBuffer ، در مورد شکست NULL .

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  size_t aAvailableSize
)

یک PacketBuffer با اندازه رزرو شده پیش‌فرض ( WEAVE_SYSTEM_CONFIG_HEADER_RESERVE_SIZE ) را در محموله برای سرصفحه‌ها و حداقل یک بایت فضای aAllocSize برای داده‌های اضافی بعد از نشانگر مکان‌نمای اولیه اختصاص می‌دهد.

این استفاده هنگام تخصیص یک PacketBuffer برای پیام لایه برنامه مناسب ترین است.

جزئیات
مولفه های
[in] aAvailableSize
تعداد اکتت برای تخصیص پس از مکان نما.
برمی گرداند
در صورت موفقیت، یک اشاره گر به PacketBuffer در بلوک اختصاص داده شده. در صورت شکست، NULL . *

NewWithAvailableSize

PacketBuffer * NewWithAvailableSize(
  uint16_t aReservedSize,
  size_t aAvailableSize
)

یک شی PacketBuffer را با حداقل aReservedSize بایت های ذخیره شده در محموله برای هدرها و حداقل aAllocSize بایت فضا برای داده های اضافی بعد از نشانگر مکان نما اختصاص می دهد.

جزئیات
مولفه های
[in] aReservedSize
تعداد اکتت برای رزرو پشت مکان نما.
[in] aAvailableSize
تعداد اکتت برای تخصیص پس از مکان نما.
برمی گرداند
در صورت موفقیت، یک اشاره گر به PacketBuffer در بلوک اختصاص داده شده. در صورت شکست، NULL .

سایز درست

PacketBuffer * RightSize(
  PacketBuffer *aPacket
)

در صورت وجود بافر داده شده را در یک بافر با اندازه سمت راست کپی کنید.

این عملکرد برای سوکت ها غیر فعال است.

جزئیات
مولفه های
[in] aPacket
- بافر یا زنجیره بافر.
برمی گرداند
بافر بسته جدید یا بافر اصلی