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:
    • route_back
    • snr_back
  • 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