diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 5dfb393b7..1a7dd6eae 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -687,6 +687,13 @@ def sendTraceRoute( def onResponseTraceRoute(self, p: dict): """on response for trace route""" + if p["decoded"]["portnum"] == "ROUTING_APP": + error = p["decoded"]["routing"]["errorReason"] + if error != "NONE": + print(f"Traceroute failed: {error}") + self._acknowledgment.receivedTraceRoute = True + return + UNK_SNR = -128 # Value representing unknown SNR routeDiscovery = mesh_pb2.RouteDiscovery() diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 8d53628fb..7f0a9f5b1 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -757,3 +757,43 @@ def test_timeago_fuzz(seconds): """Fuzz _timeago to ensure it works with any integer""" val = _timeago(seconds) assert re.match(r"(now|\d+ (secs?|mins?|hours?|days?|months?|years?))", val) + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_onResponseTraceRoute_routing_error(capsys): + """Test that onResponseTraceRoute handles ROUTING_APP error packets correctly.""" + iface = MeshInterface(noProto=True) + + packet = { + "decoded": { + "portnum": "ROUTING_APP", + "routing": {"errorReason": "MAX_RETRANSMIT"}, + } + } + + iface.onResponseTraceRoute(packet) + + assert iface._acknowledgment.receivedTraceRoute is True + out, _ = capsys.readouterr() + assert "Traceroute failed: MAX_RETRANSMIT" in out + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_onResponseTraceRoute_routing_none(capsys): + """Test that onResponseTraceRoute does not print error for ROUTING_APP with NONE errorReason.""" + iface = MeshInterface(noProto=True) + + packet = { + "decoded": { + "portnum": "ROUTING_APP", + "routing": {"errorReason": "NONE"}, + } + } + + iface.onResponseTraceRoute(packet) + + assert iface._acknowledgment.receivedTraceRoute is True + out, _ = capsys.readouterr() + assert "Traceroute failed" not in out