1"use strict";(self.webpackChunkmeshtastic=self.webpackChunkmeshtastic||[]).push([[2752],{13003:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var a=n(13274),r=n(49511),o=n(88242),i=n(77007);const l={id:"traceroute",title:"Traceroute Module Usage",sidebar_label:"Traceroute",description:"The traceroute module allows you to understand the path a message took to reach the final destination over the mesh."},u=void 0,s={id:"configuration/module/traceroute",title:"Traceroute Module Usage",description:"The traceroute module allows you to understand the path a message took to reach the final destination over the mesh.",source:"@site/docs/configuration/module/traceroute.mdx",sourceDirName:"configuration/module",slug:"/configuration/module/traceroute",permalink:"/docs/configuration/module/traceroute",draft:!1,unlisted:!1,editUrl:"https://github.com/meshtastic/meshtastic/edit/master/docs/configuration/module/traceroute.mdx",tags:[],version:"current",lastUpdatedBy:"rcarteraz",frontMatter:{id:"traceroute",title:"Traceroute Module Usage",sidebar_label:"Traceroute",description:"The traceroute module allows you to understand the path a message took to reach the final destination over the mesh."},sidebar:"Sidebar",previous:{title:"Telemetry",permalink:"/docs/configuration/module/telemetry"},next:{title:"Remote Nodes",permalink:"/docs/configuration/remote-admin"}},c={},d=[{value:"Overview",id:"overview",level:2},{value:"Repeater Behavior",id:"repeater-behavior",level:2},{value:"Traceroute Module Client Availability",id:"traceroute-module-client-availability",level:2},{value:"Android",id:"android",level:4},{value:"Apple",id:"apple",level:4},{value:"CLI",id:"cli",level:4},{value:"Web",id:"web",level:4}];function h(e){const t={code:"code",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(t.p,{children:"Due to the limited bandwidth of LoRa, Meshtastic does not keep track of the nodes a message used to hop to the destination. However, from firmware 2.0.8 on, there is a Traceroute Module that can show you this."}),"\n",(0,a.jsx)(t.p,{children:"Only nodes that know the encryption key of the channel you use can be tracked. Also note that a message may arrive via multiple routes due to duplication because of rebroadcasting. This module will only track the hops of the first packet containing the traceroute request that arrived at the destination."}),"\n",(0,a.jsx)(t.p,{children:"In order to use it, make sure your devices use firmware version 2.0.8 or higher."}),"\n",(0,a.jsx)("object",{data:"https://www.youtube.com/embed/PKUmaELKaUo?autohide=1&autoplay=0",width:"100%",height:"400"}),"\n",(0,a.jsx)(t.h2,{id:"repeater-behavior",children:"Repeater Behavior"}),"\n",(0,a.jsx)(t.p,{children:'Repeater nodes will appear in the traceroute log if they have the encryption key, but if they are not in the node list they might appear as "Unknown" depending on the app.'}),"\n",(0,a.jsx)(t.h2,{id:"traceroute-module-client-availability",children:"Traceroute Module Client Availability"}),"\n",(0,a.jsxs)(o.A,{groupId:"settings",defaultValue:"cli",values:[{label:"Android",value:"android"},{label:"Apple",value:"apple"},{label:"CLI",value:"cli"},{label:"Web",value:"web"}],children:[(0,a.jsxs)(i.A,{value:"android",children:[(0,a.jsx)(t.h4,{id:"android",children:"Android"}),(0,a.jsx)(t.p,{children:"Within the node list, long hold a destination node and select 'Traceroute' to send the request. Depending on the amount of hops that is needed, this might take a while. The result will be shown using a pop-up."})]}),(0,a.jsxs)(i.A,{value:"apple",children:[(0,a.jsx)(t.h4,{id:"apple",children:"Apple"}),(0,a.jsx)(t.p,{children:"Within the node list, long hold a destination node and select 'Trace Route' to send the request. Depending on the amount of hops, this might take a while. On iOS/iPadOS 17 and macOS 14+, the results will be shown in the node's Trace Route Log in the node details. For earlier versions, check Settings > Logging > Mesh Log."})]}),(0,a.jsxs)(i.A,{value:"cli",children:[(0,a.jsx)(t.h4,{id:"cli",children:"CLI"}),(0,a.jsx)(t.p,{children:"Make sure the CLI is at least version 2.0.6. Then use this command:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="CLI traceroute command"',children:"meshtastic --traceroute 'destinationId'\n"})}),(0,a.jsxs)(t.p,{children:["Where for ",(0,a.jsx)(t.code,{children:"destinationId"})," you have to fill in the ID of the destination you want to track the hops to, which you can get from running ",(0,a.jsx)(t.code,{children:"meshtastic --nodes"}),". Depending on your OS, you might need quotation marks around the ID. Then it will send a specific message to track the hops. For example, this is what you will get:"]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="Traceroute from !25048234 to !bff18ce4"',children:"meshtastic --traceroute '!bff18ce4'\nConnected to radio\nSending traceroute request to !bff18ce4 (this could take a while)\nRoute traced:\n!25048234 --\x3e !ba4bf9d0 --\x3e !bff18ce4\n"})}),(0,a.jsx)(t.p,{children:"The first ID shown is the device you are connected to with the CLI. As you can see, this packet went through one other node to get to its destination."})]}),(0,a.jsxs)(i.A,{value:"web",children:[(0,a.jsx)(t.h4,{id:"web",children:"Web"}),(0,a.jsx)(t.p,{children:"Not yet implemented."})]})]})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},77007:(e,t,n)=>{n.d(t,{A:()=>i});n(79474);var a=n(28923);const r={tabItem:"tabItem_wvL0"};var o=n(13274);function i(e){var t=e.children,n=e.hidden,i=e.className;return(0,o.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,i),hidden:n,children:t})}},88242:(e,t,n)=>{n.d(t,{A:()=>j});var a=n(79474),r=n(28923),o=n(55408),i=n(20241),l=n(48867),u=n(3421),s=n(31666),c=n(71018);function d(e){var t,n;return null!=(t=null==(n=a.Children.toArray(e).filter((function(e){return"\n"!==e})).map((function(e){if(!e||(0,a.isValidElement)(e)&&((t=e.props)&&"object"==typeof t&&"value"in t))return e;var t;throw new Error("Docusaurus error: Bad <Tabs>
1 child <"+("string"==typeof e.type?e.type:e.type.name)+'>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.')})))?void 0:n.filter(Boolean))?t:[]}function h(e){var t=e.values,n=e.children;return(0,a.useMemo)((function(){var e=null!=t?t:function(e){return d(e).map((function(e){var t=e.props;return{value:t.value,label:t.label,attributes:t.attributes,default:t.default}}))}(n);return function(e){var t=(0,s.X)(e,(function(e,t){return e.value===t.value}));if(t.length>0)throw new Error('Docusaurus error: Duplicate values "'+t.map((function(e){return e.value})).join(", ")+'" found in <Tabs>. Every value needs to be unique.')}(e),e}),[t,n])}function p(e){var t=e.value;return e.tabValues.some((function(e){return e.value===t}))}function v(e){var t=e.queryString,n=void 0!==t&&t,r=e.groupId,o=(0,i.W6)(),l=function(e){var t=e.queryString,n=void 0!==t&&t,a=e.groupId;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return null!=a?a:null}({queryString:n,groupId:r});return[(0,u.aZ)(l),(0,a.useCallback)((function(e){if(l){var t=new URLSearchParams(o.location.search);t.set(l,e),o.replace(Object.assign({},o.location,{search:t.toString()}))}}),[l,o])]}function f(e){var t,n,r,o,i=e.defaultValue,u=e.queryString,s=void 0!==u&&u,d=e.groupId,f=h(e),m=(0,a.useState)((function(){return function(e){var t,n=e.defaultValue,a=e.tabValues;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!p({value:n,tabValues:a}))throw new Error('Docusaurus error: The <Tabs> has a defaultValue "'+n+'" but none of its children has the corresponding value. Available values are: '+a.map((function(e){return e.value})).join(", ")+". If you intend to show no default tab, use defaultValue={null} instead.");return n}var r=null!=(t=a.find((function(e){return e.default})))?t:a[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:i,tabValues:f})})),b=m[0],g=m[1],w=v({queryString:s,groupId:d}),y=w[0],x=w[1],j=(t=function(e){return e?"docusaurus.tab."+e:null}({groupId:d}.groupId),n=(0,c.Dv)(t),r=n[0],o=n[1],[r,(0,a.useCallback)((function(e){t&&o.set(e)}
1),[t,o])]),k=j[0],T=j[1],I=function(){var e=null!=y?y:k;return p({value:e,tabValues:f})?e:null}();return(0,l.A)((function(){I&&g(I)}),[I]),{selectedValue:b,selectValue:(0,a.useCallback)((function(e){if(!p({value:e,tabValues:f}))throw new Error("Can't select invalid tab value="+e);g(e),x(e),T(e)}),[x,T,f]),tabValues:f}}var m=n(70241);const b={tabList:"tabList_jQjR",tabItem:"tabItem_dzqc"};var g=n(13274);function w(e){var t=e.className,n=e.block,a=e.selectedValue,i=e.selectValue,l=e.tabValues,u=[],s=(0,o.a_)().blockElementScrollPositionUntilNextRender,c=function(e){var t=e.currentTarget,n=u.indexOf(t),r=l[n].value;r!==a&&(s(t),i(r))},d=function(e){var t,n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":var a,r=u.indexOf(e.currentTarget)+1;n=null!=(a=u[r])?a:u[0];break;case"ArrowLeft":var o,i=u.indexOf(e.currentTarget)-1;n=null!=(o=u[i])?o:u[u.length-1]}null==(t=n)||t.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((function(e){var t=e.value,n=e.label,o=e.attributes;return(0,g.jsx)("li",Object.assign({role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:function(e){return u.push(e)},onKeyDown:d,onClick:c},o,{className:(0,r.A)("tabs__item",b.tabItem,null==o?void 0:o.className,{"tabs__item--active":a===t}),children:null!=n?n:t}),t)}))})}function y(e){var t=e.lazy,n=e.children,r=e.selectedValue,o=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){var i=o.find((function(e){return e.props.value===r}));return i?(0,a.cloneElement)(i,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:o.map((function(e,t){return(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r})}))})}function x(e){var t=f(e);return(0,g.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,g.jsx)(w,Object.assign({},e,t)),(0,g.jsx)(y,Object.assign({},e,t))]})}function j(e){var t=(0,m.A)();return(0,g.jsx)(x,Object.assign({},e,{children:d(e.children)}),String(t))}},49511:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var a=n(79474);const r={},o=a.createContext(r);function i(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.