Increasing CR with each retransmission#10359
Conversation
…age based on regionProfile settings
…efaultMsScaled calls
…bufs Update protobufs and classes
…presets Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <copilot@github.com>
…smission logic Co-authored-by: Copilot <copilot@github.com>
…g rate restoration Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <copilot@github.com>
|
I compared this with #10327 and the Meshtasticator modeling history. First, current native CI seems to have a real compile break unrelated to the retry CR logic: Second, I think there is an airtime accounting bug in For context, there is another version of this idea in #10327 that I have been testing through Meshtasticator. The simulator-side history is in meshtastic/Meshtasticator#71 and the comparison/repro workflow is in meshtastic/Meshtasticator#74. The main thing we found there is that “increase CR on retransmission” is not uniformly good. It helps when the loss looks like quiet/weak-link loss, but it can hurt when the loss is collision/congestion-driven because the longer airtime creates more collision pressure. A few variants that looked tempting performed badly enough that I would avoid baking them in as unconditional behavior:
So I think the risky part here is the unconditional policy shape: first retry The useful overlap I took from this PR is making the retry attempt explicit in |
Store the initial retransmission countdown in PendingPacket so DCR can derive retry attempts from packet state instead of sender role assumptions. Inspired-by: @NomDeTom in meshtastic#10359
Store the initial retransmission countdown in PendingPacket so DCR can derive retry attempts from packet state instead of sender role assumptions. Inspired-by: @NomDeTom in meshtastic#10359
Possibly: that testing break is based on the re-regionalisation changes, which are part of my preferred base for this pr. I'll have to go around again and check.
This is a good catch: the need to respect the order of operations wasn't obvious to me, and my limited testing didn't pick that up.
This change hasn't been extensively tested with packet success ratios, but I think it's important to add something to make subsequent retries more effective. How are you determining the difference on-device between link-related failure and collision-related failure? Edit: changed some words so I make sense. |
Co-authored-by: Copilot <copilot@github.com>
…tests Co-authored-by: Copilot <copilot@github.com>
|
@Komzpa I'm considering rewriting this to give it some "dwell time" at the higher CR, if it improves packet ack rates. This would go something like: raise the CR each retry and remember it for future packets, and then reduce it by 1 if subsequently 5/5 packets are acked first time. I could put a fall-back behaviour if no packets are acked - falling back to 5, 7, 8 for the 3 retries might be better if the node isn't well connected at all. Does that sound better? Closer to your testing? |
|
I reran this against a rebased Meshtasticator stack, including the current capture-aware collision / empirical PHY-loss model and a policy mode that matches the current PR behavior ( Current PR head tested: One CI note first: native PlatformIO tests are still red, but this looks like the regionalization test compile break rather than this CR policy directly. MethodI compared four policies on two scenarios, with the same simulator physics flags in every run:
Common run shape:
Scenarios:
ResultsBatumi
Delta vs static:
Burning Man
Delta vs static:
Quick visualReadoutThis does not convince me that the current unconditional escalation is ready as-is. In Batumi, The dwell-time idea you mentioned sounds closer to the right shape than this PR, but I would still want guards around it:
For your fallback idea: |
Store the initial retransmission countdown in PendingPacket so DCR can derive retry attempts from packet state instead of sender role assumptions. Inspired-by: @NomDeTom in meshtastic#10359
Store the initial retransmission countdown in PendingPacket so DCR can derive retry attempts from packet state instead of sender role assumptions. Inspired-by: @NomDeTom in meshtastic#10359
This adds dynamic coding-rate escalation for retransmissions, and introduces explicit tracking of retransmission-chain failures.
Net effect: retransmissions are now adaptive and observable, with clearer runtime logs plus a simple failure-trend metric you can compare before/after CR strategy changes.
Addresses #8114
Specifically requires #10120
🤝 Attestations