nl:: Weave:: System:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
فئة المخزن المؤقت للحزم هي البنية الأساسية المستخدمة لمعالجة حزم البيانات المتسلسلة ثماني بتات، عادة في سياق شبكة اتصالات البيانات، مثل البلوتوث أو بروتوكول الإنترنت.
ملخّص
وفي البيئات التي تستند إلى LwIP، يتم إنشاء هذه الفئة أعلى بنية pbuf المحددة في تلك المكتبة. في حال عدم وجود LwIP، يوفر Weave إما تطبيقًا يعتمد على تطوير البرامج (Maloc) أو تنفيذًا يستند إلى مجموعة البيانات التي تعمل على تجميع البيانات يقترب بشكل وثيق من تحديات الذاكرة التي تواجه الأجهزة المضمّنة بشكل كبير.
إنّ فئة PacketBuffer، مثل العديد من البنى المتشابهة المستخدَمة في حِزم الشبكات المتعدّدة الطبقات، توفّر آلية لحجز مساحة لرؤوس البروتوكولات في كل طبقة من طبقات حزمة الاتصال القابلة للضبط. لمعرفة التفاصيل، يمكنك الاطّلاع على PacketBuffer::New()
بالإضافة إلى مستندات LwIP.
يتم إحصاء كائنات PacketBuffer كمرجع، ووضع الاستخدام السائد في Weave هو "fire-and-get". أثناء إرسال الحزمة (وكائن 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)
|
انسخ المخزن المؤقت المحدد إلى مخزن مؤقت بحجم مناسب إن أمكن.
|
وظائف عامة
AddRef
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
احصل على عدد وحدات بايت البيانات التي يمكن إضافتها إلى المخزن المؤقت الحالي استنادًا إلى موضع البدء الحالي وطول البيانات.
التفاصيل | |
---|---|
المرتجعات |
طول البيانات بالبايت والتي تتناسب مع المخزن المؤقت الحالي وفقًا لموضع البدء الحالي وطول البيانات.
|
CompactHead
void CompactHead( void )
نقل البيانات من المخازن المؤقتة اللاحقة في السلسلة إلى المخزن المؤقت الحالي حتى تمتلئ.
ويتم ضغط المورد الاحتياطي الحالي فقط: يتم نقل البيانات الموجودة داخل المورد الاحتياطي الحالي إلى الواجهة الأمامية للمخزن المؤقت، مما يؤدي إلى التخلص من أي مساحة محجوزة. يتم ملء المساحة المتاحة المتبقية بالبيانات التي تم نقلها من الموارد الاحتياطية اللاحقة في السلسلة، حتى يكون المخزن المؤقت الحالي ممتلئًا. إذا تم نقل المخزن الاحتياطي اللاحق في السلسلة إلى المخزن المؤقت الحالي بالكامل، فستتم إزالته من السلسلة وتحريره. لا تستخدم هذه الطريقة أي معلَمات، ولا تعرض أي نتائج ولا يمكن أن تفشل.
استهلاك
PacketBuffer * Consume( uint16_t aConsumeLength )
تستهلك البيانات في سلسلة من الموارد الاحتياطية.
استهلاك البيانات في سلسلة من الموارد الاحتياطية بدءًا من المورد الاحتياطي الحالي والانتقال عبر الموارد الاحتياطية المتبقية في السلسلة يتم تحرير كل مخزن احتياطي يتم استهلاكه بالكامل، وتعرض الدالة المخزن المؤقت الأول (إن وجد) الذي يحتوي على البيانات المتبقية. يجب أن يكون المورد الاحتياطي الحالي رأس سلسلة المورد الاحتياطي.
التفاصيل | |||
---|---|---|---|
المعلمات |
|
||
المرتجعات |
المورد الاحتياطي الأول من السلسلة الحالية التي تحتوي على أي بيانات متبقية. إذا لم تتبق أي بيانات، فسيتم عرض NULL.
|
ConsumeHead
void ConsumeHead( uint16_t aConsumeLength )
قم بضبط المخزن المؤقت الحالي للإشارة إلى كمية البيانات المستهلكة.
تقدّم موضع بدء البيانات في المخزن المؤقت الحالي بمقدار الكمية المحددة، بالبايت، وصولاً إلى طول البيانات في المخزن المؤقت. قلِّل طول الفيديو وإجمالي الطول حسب الكمية المستهلكة.
التفاصيل | |||
---|---|---|---|
المعلمات |
|
DataLength
uint16_t DataLength( void ) const
الحصول على طول البيانات بالبايت في المخزن المؤقت للحزم
التفاصيل | |
---|---|
المرتجعات |
الطول بالبايت (طول الحمولة الحالي).
|
DetachTail
PacketBuffer * DetachTail( void )
فصل المورد الاحتياطي الحالي من سلسلته وإعادة مؤشر إلى الموارد الاحتياطية المتبقية.
يجب أن يكون المورد الاحتياطي الحالي رأس السلسلة.
التفاصيل | |
---|---|
المرتجعات |
ذيل السلسلة الاحتياطية الحالية أو فارغ إذا كان المورد الاحتياطي الحالي هو المورد الاحتياطي الوحيد في السلسلة.
|
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
الحصول على مؤشر لبدء البيانات في المخزن المؤقت
التفاصيل | |
---|---|
المرتجعات |
يشير إلى بداية البيانات.
|
TotalLength
uint16_t TotalLength( void ) const
الحصول على إجمالي طول بيانات الحزمة في سلسلة المخزن المؤقت
التفاصيل | |
---|---|
المرتجعات |
وإجمالي الطول بالثُمانيات.
|
الدوال الثابتة العامة
مجانًا
void Free( PacketBuffer *aPacket )
حرر جميع المخازن المؤقتة للحزم في سلسلة.
تقليل عدد المراجع إلى كل الموارد الاحتياطية في السلسلة الحالية. إذا وصل عدد المراجع إلى 0، يتم تفريغ الموارد الاحتياطية المعنيّة أو إرجاعها إلى مجموعات التخصيص حسب الحاجة. كقاعدة، على المستخدمين التعامل مع هذه الطريقة باعتبارها مكافئة لدالة free()
وعدم استخدام الوسيطة بعد الاستدعاء.
التفاصيل | |||
---|---|---|---|
المعلمات |
|
FreeHead
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)
: عند طلب ذلك بهذه الطريقة، سيتم عرض المخزن المؤقت بدون حجز أي عنوان، وبالتالي سيكون بإمكان المتصل استخدام الحمولة بالكامل. يفيد هذا النمط بشكل خاص في الطبقات السفلية من حزم الشبكات، في الحالات التي يعلم فيها المستخدم أنّه سيتم نسخ الحمولة إلى الرسالة النهائية مع احتياطيات العناوين المناسبة أو عند إنشاء PacketBuffer التي يتم إلحاقها بسلسلة من 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 )
انسخ المخزن المؤقت المحدد إلى مخزن مؤقت بحجم مناسب إن أمكن.
لا يمكن استخدام هذه الوظيفة للمقابس.
التفاصيل | |||
---|---|---|---|
المعلمات |
|
||
المرتجعات |
المخزن المؤقت الجديد للحزم أو المخزن المؤقت الأصلي
|