Skip to content

Commit 976c2bc

Browse files
authored
[trel] explicitly request trel ack for broadcast tx to known neighbors (openthread#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.
1 parent 6d40977 commit 976c2bc

3 files changed

Lines changed: 19 additions & 2 deletions

File tree

src/core/radio/trel_interface.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ const Counters *Interface::GetCounters(void) const { return otPlatTrelGetCounter
110110

111111
void Interface::ResetCounters(void) { otPlatTrelResetCounters(&GetInstance()); }
112112

113-
Error Interface::Send(const Packet &aPacket, bool aIsDiscovery)
113+
Error Interface::Send(Packet &aPacket, bool aIsDiscovery)
114114
{
115115
Error error = kErrorNone;
116116
Peer *peerEntry;
@@ -123,12 +123,28 @@ Error Interface::Send(const Packet &aPacket, bool aIsDiscovery)
123123
case Header::kTypeBroadcast:
124124
for (const Peer &peer : Get<PeerTable>())
125125
{
126+
uint16_t originalPacketNumber = aPacket.GetHeader().GetPacketNumber();
127+
Header::AckMode originalAckMode = aPacket.GetHeader().GetAckMode();
128+
Neighbor *neighbor;
129+
126130
if (!aIsDiscovery && (peer.GetExtPanId() != Get<MeshCoP::ExtendedPanIdManager>().GetExtPanId()))
127131
{
128132
continue;
129133
}
130134

135+
neighbor = Get<NeighborTable>().FindNeighbor(peer.GetExtAddress(), Neighbor::kInStateAnyExceptInvalid);
136+
137+
if (neighbor != nullptr)
138+
{
139+
aPacket.GetHeader().SetAckMode(Header::kAckRequested);
140+
aPacket.GetHeader().SetPacketNumber(neighbor->mTrelTxPacketNumber++);
141+
neighbor->mTrelCurrentPendingAcks++;
142+
}
143+
131144
otPlatTrelSend(&GetInstance(), aPacket.GetBuffer(), aPacket.GetLength(), &peer.mSockAddr);
145+
146+
aPacket.GetHeader().SetPacketNumber(originalPacketNumber);
147+
aPacket.GetHeader().SetAckMode(originalAckMode);
132148
}
133149
break;
134150

src/core/radio/trel_interface.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class Interface : public InstanceLocator
149149

150150
// Methods used by `Trel::Link`.
151151
void Init(void);
152-
Error Send(const Packet &aPacket, bool aIsDiscovery = false);
152+
Error Send(Packet &aPacket, bool aIsDiscovery = false);
153153

154154
// Callbacks from `otPlatTrel`.
155155
void HandleReceived(uint8_t *aBuffer, uint16_t aLength, const Ip6::SockAddr &aSenderAddr);

src/core/radio/trel_link.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ class Link : public InstanceLocator
220220
class NeighborInfo
221221
{
222222
friend class Link;
223+
friend class Interface;
223224

224225
private:
225226
uint32_t GetPendingTrelAckCount(void) const { return (mTrelPreviousPendingAcks + mTrelCurrentPendingAcks); }

0 commit comments

Comments
 (0)