Added new config optons for PacketList

This allows the admin to set the number of packets to store
in the PacketList object for tracking.  For apps like IRC,
we need to store lots more packets to detect dupes.
This commit is contained in:
Hemna 2024-04-14 12:48:09 -04:00
parent 1a7694e7e2
commit 8392d6b8ef
3 changed files with 25 additions and 7 deletions

View File

@ -110,6 +110,16 @@ aprsd_opts = [
default=3,
help="The number of times to send an ack packet in response to recieving a packet.",
),
cfg.IntOpt(
"packet_list_maxlen",
default=100,
help="The maximum number of packets to store in the packet list.",
),
cfg.IntOpt(
"packet_list_stats_maxlen",
default=20,
help="The maximum number of packets to send in the stats dict for admin ui.",
),
]
watch_list_opts = [

View File

@ -22,7 +22,7 @@ class PacketList(objectstore.ObjectStoreMixin):
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._maxlen = 100
cls._maxlen = CONF.packet_list_maxlen
cls.data = {
"types": {},
"packets": OrderedDict(),
@ -88,11 +88,22 @@ class PacketList(objectstore.ObjectStoreMixin):
@wrapt.synchronized(lock)
def stats(self, serializable=False) -> dict:
# limit the number of packets to return to 50
LOG.info(f"PacketList stats called len={len(self.data['packets'])}")
tmp = OrderedDict(reversed(list(self.data["packets"].items())))
pkts = []
count = 1
for packet in tmp:
pkts.append(tmp[packet])
count += 1
if count > CONF.packet_list_stats_maxlen:
break
stats = {
"total_tracked": self._total_rx + self._total_rx,
"rx": self._total_rx,
"tx": self._total_tx,
"types": self.data["types"],
"packets": self.data["packets"],
"packets": pkts,
}
return stats

View File

@ -115,14 +115,11 @@ class APRSDDupeRXThread(APRSDRXThread):
found = False
if not found:
# If we are in the process of already ack'ing
# a packet, we should drop the packet
# because it's a dupe within the time that
# we send the 3 acks for the packet.
# We haven't seen this packet before, so we process it.
pkt_list.rx(packet)
self.packet_queue.put(packet)
elif packet.timestamp - found.timestamp < CONF.packet_dupe_timeout:
# If the packet came in within 60 seconds of the
# If the packet came in within N seconds of the
# Last time seeing the packet, then we drop it as a dupe.
LOG.warning(f"Packet {packet.from_call}:{packet.msgNo} already tracked, dropping.")
else: