From: Arkadiusz Miƛkiewicz Date: Tue, 5 Jun 2018 13:54:44 +0000 (+0200) Subject: Also try SOCK_RAW/IPPROTO_ICMP when other fail. X-Git-Tag: v0.93~16^2~1^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F261%2Fhead;p=thirdparty%2Fmtr.git Also try SOCK_RAW/IPPROTO_ICMP when other fail. Under Linux Vserver SOCK_RAW is quite limited. Only IPPROTO_ICMP works, so try to use it. check_length_order() also doesn't work because sendto is also limited. Fortunately under linux check_length_order is not needed as described in comment around check_length_order. --- diff --git a/packet/probe_unix.c b/packet/probe_unix.c index 56b670e..2804ecb 100644 --- a/packet/probe_unix.c +++ b/packet/probe_unix.c @@ -128,6 +128,12 @@ void check_length_order( ssize_t bytes_sent; int packet_size; +#ifdef __linux__ + /* Linux will accept either byte order and check below fails to work + * in some cases due to sendto() returning EPERM. */ + return; +#endif + memset(¶m, 0, sizeof(struct probe_param_t)); param.ip_version = 4; param.protocol = IPPROTO_ICMP; @@ -230,7 +236,10 @@ int open_ip4_sockets_raw( send_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (send_socket == -1) { - return -1; + send_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + if (send_socket == -1) { + return -1; + } } /*