mturoute: A utility that measures hop-by-hop path MTU

I wanted to get in-depth details on how various MTU parameters interact in GRE/IPSec/MPLS environment. Before going into router configuration details, I wanted to have a tool that would reliably measure actual path MTU between the endpoints. After a while, Google gave me a usable link: supposedly the tracepath program on Linux does what I needed. As I'm a purely Windows user (for me, PCs are just a tool), I needed a Windows equivalent … and found mturoute, the utility that does exactly what I was looking for. Unfortunately, the original mturoute had an interesting bug: ICMP unreachable generated due to DF bit on oversized packet was accepted as a successful ping. The second run of the program always reported the correct MTU size (as Windows caches the maximum MTU per destination host), but I wanted to be more precise. Half a day later, after installing Windows SDK and Visual Studio Express on my PC, rediscovering my C programming skills and reading a lot of Winsock documentation, I've managed to fix the bugs and even add a “retry on ping timeout” feature. You can download the fixed version (source + exe) from the Articles area of my web site. It was compiled and tested on Windows XP, if you can test it on other platforms (2000, Vista), please let me know the results.

Here is a sample run of the program (the reduced path MTU is due to an MPLS-enabled GRE tunnel in the path):
$ mturoute -t
mturoute to, 30 hops max, variable sized packets
* ICMP Fragmentation is not permitted. *
* Maximum payload is 10000 bytes. *
1 --+---+++-+++-++ host: max: 1500 bytes
2 --+---++---+++ host: max: 1476 bytes
3 --+---+-+++++++ host: max: 1472 bytes


  1. Tried but no luck:
    The system cannot execute the specified program.
    (Windows XP SP2)
    Thanx anyway for reminding about unix tracepath ;)
  2. Works here - XP SP2

    mturoute to, 30 hops max, variable sized packets
    * ICMP Fragmentation is not permitted. *
    * Maximum payload is 10000 bytes. *
    1 ---++++-+---++ host: max: 1300 bytes
    2 ---++++-+---++ host: x1.x2.x3.x4 max: 1300 bytes
    3 4 ---++++-+---++ host: y1.y2.y3.y4 max: 1300 bytes
    5 ---++++-+---++ host: z1.z2.z3.z4 max: 1300 bytes
    6 ---++++-+---++ host: max: 1300 bytes
    7 ---++++-+---++ host: max: 1300 bytes
    *7 (An additional device responded for
    8 ---++++-+---++ host: max: 1300 bytes
    9 -------------- host: max: 120 bytes
    10 ---++-+++++++++ host: max: 1202 bytes
    11 ---++++-+---++ host: max: 1300 bytes
    12 ---++++-+---++ host: max: 1300 bytes

    Wonder if the tool is buggy - if not, ATT has some issue @ - 120 bytes MTU ?
  3. @Mikhail: that's weird. I have XP SP2 as well ... and I have no idea what might have gone wrong (this was my first try at compiling a C program on an Intel platform since MS-DOS days).

    @Anonymous: I suspect they are blocking pings to a specific device. It responds to the TTL-limited probe (that's how we get its IP address), but then probably rejects the ICMP packets ... and I obviously need to check other ICMP unreachables as well.

    Thanks for the feedback!
  4. @Anonymous: Just did some tests, it's definitely not an access-list, the program reports weird errors when hitting an IOS inbound access-list (but interestingly enough measures the MTU correctly).

    Can't imagine what would cause the problem. It looks like the ICMP echo packets are actively replied to, but with a weird reply that the program takes as a failure; if there would be no reply, you should see dots (timeouts). Can you take a Wireshark capture and send me the ICMP-related traffic?
  5. Does not work with Vista, which is to bad,

    The application has failed to start because its side-by-side configuration is incorrect. Please see
    the application event log for more detail.

    and here is the eventlog

    Activation context generation failed for "C:\mturoute\mturoute.exe". Dependent Assembly Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.20706.1" could not be found. Please use sxstrace.exe for detailed diagnosis.
  6. It looks like you have to install VC++ runtime library to run the program. They can be downloaded from Microsoft. Anyhow, this is a shame ... maybe I should install another compiler as well ;)
  7. Thanks for showing us this great little app. We use IPSec and GRE tunnels all the time and this could have saved us some trouble a few weeks ago.

    Question on the output; what is the significance of the "---", "+++", or "..."?

    THere is my output:
    C:\temp\mroute>mturoute -t
    mturoute to, 30 hops max, variable sized packets
    * ICMP Fragmentation is not permitted. *
    * Maximum payload is 10000 bytes. *
    1 ---++++-+---++ host: max: 1300 bytes
    2 ---...-...-...-...-...-...-...-...-...-...-...- host: max:
    3 ---++++-+---++ host: max: 1300 bytes
    4 ---++++-+---++ host: max: 1300 bytes
    5 ---++++-+---++ host: max: 1300 bytes
    6 ---...-...-...-...-...-...-...-...-...-...-...- host: max
    20 bytes
    7 ---u+...-...-..u+.u+.u+.u+.u+.u+.u+...-u+.u+ host: max:
    8 ---++++-+---++ host: max: 1300 bytes
    9 ---++++-+---++ host: max: 1300 bytes
    10 ---++++-+---++ host: max: 1300 bytes
    11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

  8. Will write a separate post documenting the outputs, just give me a few days; I'd like to implement some more debugging options to figure out what the line full of minus signs really means.
  9. ivan are u the author of many cisco press books.
  10. Click on the "About the author" link at the top of the page :) Yes, I wrote a few books for Cisco Press.
  11. I'm looking for an IPv6 capable version of this.

Add comment