Q&A
Jak funguje traceroute
V Meshtastic firmware traceroute funguje takto:
- Odesílatel vytvoří obyčejný MeshPacket na TRACEROUTE_APP, nastaví:
- to = cílový node
- want_response = true
- want_ack = true
- payload je prázdný RouteDiscovery
- zdroj: TraceRouteModule.cpp (https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.cpp), Router.cpp
(https://github.com/meshtastic/firmware/blob/master/src/mesh/Router.cpp)
Co nese RouteDiscovery:
- route[8]: mezilehlé nody na cestě tam
- snr_towards[8]: SNR pro cestu tam, uložené jako dB × 4
- route_back[8]: mezilehlé nody na cestě zpět
- snr_back[8]: SNR pro cestu zpět
- zdroj: mesh.pb.h (https://github.com/meshtastic/firmware/blob/master/src/mesh/generated/meshtastic/mesh.pb.h)
Jak se request skládá po cestě:
- každý node, který packet zpracuje, v alterReceivedProtobuf():
- případně doplní “unknown hops” podle rozdílu hop_start - hop_limit
- přidá svoje ID a SNR do route / snr_towards
- pokud je packet už na cíli, přidá se jen SNR, ne další node ID
- zdroj: TraceRouteModule.cpp (https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.cpp)
Jak vznikne reply:
- protože request má want_response = true, cílový node přes obecnou reply logiku vytvoří odpověď
- allocReply() v TraceRouteModule zkopíruje payload requestu
- setReplyTo() pak nastaví:
- to = původní odesílatel
- channel = stejný jako request
- decoded.request_id = id původního requestu
- hop_limit pro cestu zpět podle getHopLimitForResponse()
- zdroj: TraceRouteModule.cpp (https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.cpp), MeshModule.cpp
(https://github.com/meshtastic/firmware/blob/master/src/mesh/MeshModule.cpp), RoutingModule.cpp
(https://github.com/meshtastic/firmware/blob/master/src/modules/RoutingModule.cpp)
Jak se skládá návratová trasa:
- na reply packetu každý další node přidává svoje ID a SNR do:
- zároveň updateNextHops() používá vrácenou trasu k doplnění next-hop hintů do lokální routing knowledge
- zdroj: TraceRouteModule.cpp (https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.cpp)
Důležité detaily:
- pole mají délku max 8
- “unknown hops” se doplní, když nějaký relay packet přepošle, ale sám trasu neobohatí; SNR takového hopu je INT8_MIN
- traceroute UI modul má cooldown 30 s a timeout čekání na výsledek 10 s
- zdroj: TraceRouteModule.h (https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.h), TraceRouteModule.cpp
(https://github.com/meshtastic/firmware/blob/master/src/modules/TraceRouteModule.cpp)
Stručně:
- traceroute není samostatný “routing daemon”
- je to floodovaný TRACEROUTE_APP request + odpověď, kterou po cestě oba směry průběžně obohacují relaye o route a SNR