1 From 240725528c5a756ee9aaff247e3731f4b8517c06 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= <arekm@maven.pl>
3 Date: Tue, 5 Jun 2018 17:38:08 +0200
4 Subject: [PATCH] mtr to a unreachable host is possible again.
6 In mtr 0.87 it was possible to start mtr against unreachable
7 host (that local kernel already knew that it is unreachable).
8 Later it was broken. Make such tracing possible again.
10 packet/probe.c | 28 +++++++++++++++++++++++-----
11 ui/net.c | 10 ++++++++++
12 2 files changed, 33 insertions(+), 5 deletions(-)
14 diff --git a/packet/probe.c b/packet/probe.c
15 index 27bf138..cf95f8a 100644
18 @@ -356,14 +356,32 @@ int find_source_addr(
22 - if (connect(sock, (struct sockaddr *) &dest_with_port, len)) {
26 + if (connect(sock, (struct sockaddr *) &dest_with_port, len) == 0) {
27 + if (getsockname(sock, (struct sockaddr *) srcaddr, &len)) {
33 + /* Linux doesn't require source address, so we can support
34 + * a case when mtr is run against unreachable host (that can become
36 + if (errno != EHOSTUNREACH) {
41 - if (getsockname(sock, (struct sockaddr *) srcaddr, &len)) {
42 + if (destaddr->ss_family == AF_INET6) {
43 + srcaddr6 = (struct sockaddr_in6 *) srcaddr;
44 + srcaddr6->sin6_addr = in6addr_any;
46 + srcaddr4 = (struct sockaddr_in *) srcaddr;
47 + srcaddr4->sin_addr.s_addr = INADDR_ANY;
56 diff --git a/ui/net.c b/ui/net.c
57 index 69d4477..11dd4c8 100644
60 @@ -720,6 +720,16 @@ static void net_find_local_address(
63 (udp_socket, (struct sockaddr *) &remote_sockaddr, addr_length)) {
65 + /* Linux doesn't require source address, so we can support
66 + * a case when mtr is run against unreachable host (that can become
68 + if (errno == EHOSTUNREACH) {
70 + localaddr[0] = '\0';
74 error(EXIT_FAILURE, errno, "udp socket connect failed");