From 8d86764c234cbd5f9d39d3100d5acd1b9442c49a Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 16 Apr 2024 11:39:46 -0400 Subject: [PATCH] Added support for RX replyacks This patch adds support for processing incoming packets that have the 'new' acks embedded in messages called replyacks as described here: http://www.aprs.org/aprs11/replyacks.txt --- aprsd/packets/core.py | 1 + aprsd/threads/rx.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/aprsd/packets/core.py b/aprsd/packets/core.py index 3f8d449..fa43f3f 100644 --- a/aprsd/packets/core.py +++ b/aprsd/packets/core.py @@ -89,6 +89,7 @@ class Packet: addresse: Optional[str] = field(default=None) format: Optional[str] = field(default=None) msgNo: Optional[str] = field(default=None) # noqa: N815 + ackMsgNo: Optional[str] = field(default=None) # noqa: N815 packet_type: Optional[str] = field(default=None) timestamp: float = field(default_factory=_init_timestamp, compare=False, hash=False) # Holds the raw text string to be sent over the wire diff --git a/aprsd/threads/rx.py b/aprsd/threads/rx.py index 3f0842a..ab861d2 100644 --- a/aprsd/threads/rx.py +++ b/aprsd/threads/rx.py @@ -158,6 +158,14 @@ class APRSDProcessPacketThread(APRSDThread): pkt_tracker = packets.PacketTrack() pkt_tracker.remove(ack_num) + def process_piggyback_ack(self, packet): + """We got an ack embedded in a packet.""" + ack_num = packet.ackMsgNo + LOG.debug(f"Got PiggyBackAck for message {ack_num}") + packets.PacketList().rx(packet) + pkt_tracker = packets.PacketTrack() + pkt_tracker.remove(ack_num) + def process_reject_packet(self, packet): """We got a reject message for a packet. Stop sending the message.""" ack_num = packet.msgNo @@ -200,6 +208,10 @@ class APRSDProcessPacketThread(APRSDThread): ): self.process_reject_packet(packet) else: + if hasattr(packet, "ackMsgNo") and packet.ackMsgNo: + # we got an ack embedded in this packet + # we need to handle the ack + self.process_piggyback_ack(packet) # Only ack messages that were sent directly to us if isinstance(packet, packets.MessagePacket): if to_call and to_call.lower() == our_call: