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 )
بافر بسته داده شده را به انتهای زنجیره بافر اضافه کنید و طول کل هر بافر در زنجیره را متناسب با آن تنظیم کنید.
جزئیات | |||
---|---|---|---|
پارامترها |
|
AlignPayload
bool AlignPayload( uint16_t aAlignBytes )
بار بافر را روی مرز بایت های مشخص تراز کنید.
در صورت لزوم، محموله را در بافر به جلو منتقل کنید.
جزئیات | |||
---|---|---|---|
پارامترها |
| ||
برمی گرداند | true اگر تراز موفقیت آمیز باشد، false اگر فضای کافی در بافر وجود نداشته باشد. |
AllocSize
size_t AllocSize( void ) const
اندازه تخصیص شامل فضاهای داده رزرو شده و محموله را برگردانید، اما فضای تخصیص داده شده برای ساختار PacketBuffer را شامل نمی شود.
جزئیات | |
---|---|
برمی گرداند | اندازه تخصیص |
AvailableDataLength
uint16_t AvailableDataLength( void ) const
با توجه به موقعیت شروع فعلی و طول داده، تعداد بایت های داده ای را که می توان به بافر فعلی اضافه کرد، دریافت کنید.
جزئیات | |
---|---|
برمی گرداند | طول، بر حسب بایت، داده هایی که با توجه به موقعیت شروع فعلی و طول داده، در بافر جاری قرار می گیرند. |
سر فشرده
void CompactHead( void )
داده ها را از بافرهای بعدی در زنجیره به بافر فعلی منتقل کنید تا زمانی که پر شود.
فقط بافر فعلی فشرده می شود: داده های درون بافر فعلی به جلوی بافر منتقل می شوند و هر فضای رزرو شده را حذف می کند. فضای موجود باقیمانده با داده های منتقل شده از بافرهای بعدی در زنجیره پر می شود تا زمانی که بافر فعلی پر شود. اگر یک بافر بعدی در زنجیره به طور کامل به بافر فعلی منتقل شود، از زنجیره خارج شده و آزاد می شود. این روش هیچ پارامتری را نمی گیرد، هیچ نتیجه ای برمی گرداند و نمی تواند شکست بخورد.
مصرف کنید
PacketBuffer * Consume( uint16_t aConsumeLength )
داده ها را در زنجیره ای از بافرها مصرف کنید.
داده ها را در زنجیره ای از بافرها مصرف کنید که از بافر فعلی شروع می شود و از طریق بافرهای باقی مانده در زنجیره ادامه می یابد. هر بافری که به طور کامل مصرف می شود آزاد می شود و تابع اولین بافر (در صورت وجود) حاوی داده های باقی مانده را برمی گرداند. بافر فعلی باید سر زنجیره بافر باشد.
جزئیات | |||
---|---|---|---|
پارامترها |
| ||
برمی گرداند | اولین بافر از زنجیره فعلی که حاوی داده های باقی مانده است. اگر هیچ داده ای باقی نماند، یک NULL برگردانده می شود. |
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
بافر فعلی را برای نشان دادن میزان مصرف داده تنظیم کنید.
موقعیت شروع داده را در بافر فعلی به میزان مشخص شده، بر حسب بایت، تا طول داده در بافر ارتقا دهید. طول و طول کل را با مقدار مصرف شده کاهش دهید.
جزئیات | |||
---|---|---|---|
پارامترها |
|
طول داده
uint16_t DataLength( void ) const
طول داده ها را در بافر بسته به بایت دریافت کنید.
جزئیات | |
---|---|
برمی گرداند | طول، بر حسب بایت (طول بار فعلی). |
DetachTil
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 )
یک 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 برای پیام لایه برنامه مناسب ترین است.
جزئیات | |||
---|---|---|---|
پارامترها |
| ||
برمی گرداند | در صورت موفقیت، یک اشاره گر به PacketBuffer در بلوک اختصاص داده شده. در صورت شکست، NULL . * |
NewWithAvailableSize
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
یک شی PacketBuffer را با حداقل aReservedSize
بایت های ذخیره شده در محموله برای هدرها و حداقل aAllocSize
بایت فضا برای داده های اضافی بعد از نشانگر مکان نما اختصاص می دهد.
جزئیات | |||||
---|---|---|---|---|---|
پارامترها |
| ||||
برمی گرداند | در صورت موفقیت، یک اشاره گر به PacketBuffer در بلوک اختصاص داده شده. در صورت شکست، NULL . |
RightSize
PacketBuffer * RightSize( PacketBuffer *aPacket )
در صورت وجود بافر داده شده را در یک بافر با اندازه سمت راست کپی کنید.
این عملکرد برای سوکت ها غیر فعال است.
جزئیات | |||
---|---|---|---|
پارامترها |
| ||
برمی گرداند | بافر بسته جدید یا بافر اصلی |