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, default=3,
help="The number of times to send an ack packet in response to recieving a packet.", 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 = [ watch_list_opts = [

View File

@ -22,7 +22,7 @@ class PacketList(objectstore.ObjectStoreMixin):
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
if cls._instance is None: if cls._instance is None:
cls._instance = super().__new__(cls) cls._instance = super().__new__(cls)
cls._maxlen = 100 cls._maxlen = CONF.packet_list_maxlen
cls.data = { cls.data = {
"types": {}, "types": {},
"packets": OrderedDict(), "packets": OrderedDict(),
@ -88,11 +88,22 @@ class PacketList(objectstore.ObjectStoreMixin):
@wrapt.synchronized(lock) @wrapt.synchronized(lock)
def stats(self, serializable=False) -> dict: 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 = { stats = {
"total_tracked": self._total_rx + self._total_rx, "total_tracked": self._total_rx + self._total_rx,
"rx": self._total_rx, "rx": self._total_rx,
"tx": self._total_tx, "tx": self._total_tx,
"types": self.data["types"], "types": self.data["types"],
"packets": self.data["packets"], "packets": pkts,
} }
return stats return stats

View File

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