mirror of
https://github.com/espressif/openthread.git
synced 2026-06-05 21:14:49 +00:00
[trel] explicitly request trel ack for broadcast tx to known neighbors (#11537)
This commit modifies the TREL module to explicitly request TREL acknowledgements for broadcast transmissions directed to known neighbors. This ensures quicker discovery of when a TREL peer is no longer available.
This commit is contained in:
committed by
GitHub
parent
6d40977782
commit
976c2bc4a6
@@ -110,7 +110,7 @@ const Counters *Interface::GetCounters(void) const { return otPlatTrelGetCounter
|
||||
|
||||
void Interface::ResetCounters(void) { otPlatTrelResetCounters(&GetInstance()); }
|
||||
|
||||
Error Interface::Send(const Packet &aPacket, bool aIsDiscovery)
|
||||
Error Interface::Send(Packet &aPacket, bool aIsDiscovery)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Peer *peerEntry;
|
||||
@@ -123,12 +123,28 @@ Error Interface::Send(const Packet &aPacket, bool aIsDiscovery)
|
||||
case Header::kTypeBroadcast:
|
||||
for (const Peer &peer : Get<PeerTable>())
|
||||
{
|
||||
uint16_t originalPacketNumber = aPacket.GetHeader().GetPacketNumber();
|
||||
Header::AckMode originalAckMode = aPacket.GetHeader().GetAckMode();
|
||||
Neighbor *neighbor;
|
||||
|
||||
if (!aIsDiscovery && (peer.GetExtPanId() != Get<MeshCoP::ExtendedPanIdManager>().GetExtPanId()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
neighbor = Get<NeighborTable>().FindNeighbor(peer.GetExtAddress(), Neighbor::kInStateAnyExceptInvalid);
|
||||
|
||||
if (neighbor != nullptr)
|
||||
{
|
||||
aPacket.GetHeader().SetAckMode(Header::kAckRequested);
|
||||
aPacket.GetHeader().SetPacketNumber(neighbor->mTrelTxPacketNumber++);
|
||||
neighbor->mTrelCurrentPendingAcks++;
|
||||
}
|
||||
|
||||
otPlatTrelSend(&GetInstance(), aPacket.GetBuffer(), aPacket.GetLength(), &peer.mSockAddr);
|
||||
|
||||
aPacket.GetHeader().SetPacketNumber(originalPacketNumber);
|
||||
aPacket.GetHeader().SetAckMode(originalAckMode);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ private:
|
||||
|
||||
// Methods used by `Trel::Link`.
|
||||
void Init(void);
|
||||
Error Send(const Packet &aPacket, bool aIsDiscovery = false);
|
||||
Error Send(Packet &aPacket, bool aIsDiscovery = false);
|
||||
|
||||
// Callbacks from `otPlatTrel`.
|
||||
void HandleReceived(uint8_t *aBuffer, uint16_t aLength, const Ip6::SockAddr &aSenderAddr);
|
||||
|
||||
@@ -220,6 +220,7 @@ private:
|
||||
class NeighborInfo
|
||||
{
|
||||
friend class Link;
|
||||
friend class Interface;
|
||||
|
||||
private:
|
||||
uint32_t GetPendingTrelAckCount(void) const { return (mTrelPreviousPendingAcks + mTrelCurrentPendingAcks); }
|
||||
|
||||
Reference in New Issue
Block a user