mirror of
https://github.com/craigerl/aprsd.git
synced 2024-10-31 15:07:13 -04:00
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:
parent
1a7694e7e2
commit
8392d6b8ef
@ -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 = [
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user