@@ -302,20 +302,6 @@ class RouteTlv : public Tlv, public TlvInfo<Tlv::kRoute>
302302#endif
303303 }
304304
305- /* *
306- * Sets the Route Data entry count.
307- *
308- * @param[in] aCount The number of Route Data entries in the Route TLV.
309- */
310- void SetRouteDataEntryCount (uint8_t aCount)
311- {
312- #if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
313- SetLength (sizeof (mRouterIdMask ) + aCount);
314- #else
315- SetLength (sizeof (mRouterIdMask ) + aCount + (aCount + 1 ) / 2 );
316- #endif
317- }
318-
319305 /* *
320306 * Returns the Route Cost value for a given Router index.
321307 *
@@ -364,32 +350,42 @@ class RouteTlv : public Tlv, public TlvInfo<Tlv::kRoute>
364350#endif
365351 }
366352
353+ #if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
367354 /* *
368- * Sets the Route Data (Link Quality In/Out and Route Cost) for a given Router index .
355+ * Appends a Route Data entry (Link Quality In/Out and Route Cost) to a message .
369356 *
370- * @param[in] aRouterIndex The Router index .
371- * @param[in] aLinkQualityIn The Link Quality In value.
372- * @param[in] aLinkQualityOut The Link Quality Out value.
357+ * @param[in] aMessage The message to append to .
358+ * @param[in] aLqIn The Link Quality In value.
359+ * @param[in] aLqOut The Link Quality Out value.
373360 * @param[in] aRouteCost The Route Cost value.
361+ *
362+ * @retval kErrorNone Successfully appended the data.
363+ * @retval kErrorNoBufs Insufficient available buffers to grow the message.
374364 */
375- void SetRouteData (uint8_t aRouterIndex, LinkQuality aLinkQualityIn, LinkQuality aLinkQualityOut, uint8_t aRouteCost)
376- {
377- #if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
378- mRouteData [aRouterIndex] = 0 ;
379-
380- WriteBits<uint8_t , kLinkQualityInMask >(mRouteData [aRouterIndex], aLinkQualityIn);
381- WriteBits<uint8_t , kLinkQualityOutMask >(mRouteData [aRouterIndex], aLinkQualityOut);
382- WriteBits<uint8_t , kRouteCostMask >(mRouteData [aRouterIndex], aRouteCost);
365+ static Error AppendRouteDataEntry (Message &aMessage, LinkQuality aLqIn, LinkQuality aLqOut, uint8_t aRouteCost);
383366#else
384- uint16_t data = 0 ;
385-
386- WriteBits<uint16_t , kLinkQualityOutMask >(data, aLinkQualityOut);
387- WriteBits<uint16_t , kLinkQualityInMask >(data, aLinkQualityIn);
388- WriteBits<uint16_t , kRouteCostMask >(data, aRouteCost);
389-
390- WriteEntry (aRouterIndex, data);
367+ /* *
368+ * Appends a Route Data entry (Link Quality In/Out and Route Cost) to a message.
369+ *
370+ * Under `OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE`, each route data entry uses 1.5 bytes (12 bits). Two entries
371+ * are packed into 3 bytes. @p aIsEven is used to indicate whether this is an even (first) or an odd (second) entry.
372+ *
373+ * @param[in] aMessage The message to append to.
374+ * @param[in] aLqIn The Link Quality In value.
375+ * @param[in] aLqOut The Link Quality Out value.
376+ * @param[in] aRouteCost The Route Cost value.
377+ * @param[in] aIsEven Indicates whether this is an even (first) entry.
378+ *
379+ * @retval kErrorNone Successfully appended the data.
380+ * @retval kErrorNoBufs Insufficient available buffers to grow the message.
381+ * @retval kErrorParse Message length is invalid for parsing route data.
382+ */
383+ static Error AppendRouteDataEntry (Message &aMessage,
384+ LinkQuality aLqIn,
385+ LinkQuality aLqOut,
386+ uint8_t aRouteCost,
387+ bool aIsEven);
391388#endif
392- }
393389
394390private:
395391#if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
@@ -398,6 +394,8 @@ class RouteTlv : public Tlv, public TlvInfo<Tlv::kRoute>
398394 // | LQOut | LQIn | Route Cost |
399395 // +---+---+---+---+---+---+---+---+
400396
397+ typedef uint8_t EntryType;
398+
401399 static constexpr uint8_t kLinkQualityOutMask = 0x03 << 6 ;
402400 static constexpr uint8_t kLinkQualityInMask = 0x03 << 4 ;
403401 static constexpr uint8_t kRouteCostMask = 0x0f << 0 ;
@@ -409,6 +407,8 @@ class RouteTlv : public Tlv, public TlvInfo<Tlv::kRoute>
409407 // remaining 8 bits are for the route cost. The even and odd
410408 // entries are staggered.
411409
410+ typedef uint16_t EntryType;
411+
412412 static constexpr uint16_t kEvenEntryMask = 0xfff << 4 ;
413413 static constexpr uint16_t kOddEntryMask = 0xfff << 0 ;
414414
@@ -434,25 +434,6 @@ class RouteTlv : public Tlv, public TlvInfo<Tlv::kRoute>
434434
435435 return data;
436436 }
437-
438- void WriteEntry (uint8_t aRouterIndex, uint16_t aData)
439- {
440- uint16_t offset = (aRouterIndex + aRouterIndex / 2 );
441- uint16_t existing;
442-
443- existing = BigEndian::ReadUint16 (&mRouteData [offset]);
444-
445- if (aRouterIndex & 0x1 )
446- {
447- WriteBits<uint16_t , kOddEntryMask >(existing, aData);
448- }
449- else
450- {
451- WriteBits<uint16_t , kEvenEntryMask >(existing, aData);
452- }
453-
454- BigEndian::WriteUint16 (existing, &mRouteData [offset]);
455- }
456437#endif // OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
457438
458439 RouterIdMask mRouterIdMask ;
0 commit comments