From f2b7ff2b7902e1dcd58c3186b028f60b5c380015 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Fri, 12 Feb 2021 09:40:20 +0800 Subject: [PATCH] an optimization for #681 - make want_ack packets higher priority --- proto | 2 +- src/mesh/MeshPacketQueue.cpp | 20 +++++++++++++++----- src/mesh/generated/mesh.pb.h | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/proto b/proto index 0221e83d..b1aed064 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 0221e83d689f7930ed3e5c474eff4fbb8697efbb +Subproject commit b1aed06442025624841b2288fac273d9bc41c438 diff --git a/src/mesh/MeshPacketQueue.cpp b/src/mesh/MeshPacketQueue.cpp index 7d3d2aa2..2c542c7c 100644 --- a/src/mesh/MeshPacketQueue.cpp +++ b/src/mesh/MeshPacketQueue.cpp @@ -20,19 +20,29 @@ bool CompareMeshPacket::operator()(MeshPacket *p1, MeshPacket *p2) : (p1->id >= p2->id); // prefer smaller packet ids } -MeshPacketQueue::MeshPacketQueue(size_t _maxLen) : maxLen(_maxLen) +MeshPacketQueue::MeshPacketQueue(size_t _maxLen) : maxLen(_maxLen) {} + +/** Some clients might not properly set priority, therefore we fix it here. + */ +void fixPriority(MeshPacket *p) { + // We might receive acks from other nodes (and since generated remotely, they won't have priority assigned. Check for that + // and fix it + if (p->priority == MeshPacket_Priority_UNSET) { + // if acks give high priority + // if a reliable message give a bit higher default priority + p->priority = p->decoded.which_ackVariant ? MeshPacket_Priority_ACK : + (p->want_ack ? MeshPacket_Priority_RELIABLE : MeshPacket_Priority_DEFAULT); + } } /** enqueue a packet, return false if full */ bool MeshPacketQueue::enqueue(MeshPacket *p) { - // We might receive acks from other nodes (and since generated remotely, they won't have priority assigned. Check for that - // and fix it - if (p->priority == MeshPacket_Priority_UNSET) - p->priority = p->decoded.which_ackVariant ? MeshPacket_Priority_ACK : MeshPacket_Priority_DEFAULT; + fixPriority(p); + // fixme if there is something lower priority in the queue that can be deleted to make space, delete that instead if (size() >= maxLen) return false; else { diff --git a/src/mesh/generated/mesh.pb.h b/src/mesh/generated/mesh.pb.h index 7dd097ce..397a313e 100644 --- a/src/mesh/generated/mesh.pb.h +++ b/src/mesh/generated/mesh.pb.h @@ -88,6 +88,7 @@ typedef enum _MeshPacket_Priority { MeshPacket_Priority_MIN = 1, MeshPacket_Priority_BACKGROUND = 10, MeshPacket_Priority_DEFAULT = 64, + MeshPacket_Priority_RELIABLE = 70, MeshPacket_Priority_ACK = 120, MeshPacket_Priority_MAX = 127 } MeshPacket_Priority;