From: Markus Kötter Date: Wed, 15 Jan 2020 14:42:58 +0000 (+0100) Subject: ip6 udp - fix probes with local or remote port X-Git-Tag: v0.94~13^2^2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F331%2Fhead;p=thirdparty%2Fmtr.git ip6 udp - fix probes with local or remote port only set the remote port in raw packet, not as sendto parameter does not fix local and remote port, seq number is checksum then, payload has to be adjusted as with ipv4 --- diff --git a/packet/probe_unix.c b/packet/probe_unix.c index bf1e2c9..a749f7d 100644 --- a/packet/probe_unix.c +++ b/packet/probe_unix.c @@ -52,9 +52,12 @@ int send_packet( int packet_size, const struct sockaddr_storage *sockaddr) { + struct sockaddr_storage dst; int send_socket = 0; int sockaddr_length; + memcpy(&dst, sockaddr, sizeof(struct sockaddr_storage)); + if (sockaddr->ss_family == AF_INET6) { sockaddr_length = sizeof(struct sockaddr_in6); @@ -67,12 +70,17 @@ int send_packet( } else if (param->protocol == IPPROTO_UDP) { if (net_state->platform.ip6_socket_raw) { send_socket = net_state->platform.udp6_send_socket; + /* we got a ipv6 udp raw socket + * the remote port is in the payload + * we do not set in the sockaddr + */ + *sockaddr_port_offset(&dst) = 0; } else { send_socket = net_state->platform.ip6_txrx_udp_socket; if (param->dest_port) { - *sockaddr_port_offset(sockaddr) = htons(param->dest_port); + *sockaddr_port_offset(&dst) = htons(param->dest_port); } else { - *sockaddr_port_offset(sockaddr) = sequence; + *sockaddr_port_offset(&dst) = sequence; } } } @@ -91,9 +99,9 @@ int send_packet( } else if (param->protocol == IPPROTO_UDP) { send_socket = net_state->platform.ip4_txrx_udp_socket; if (param->dest_port) { - *sockaddr_port_offset(sockaddr) = htons(param->dest_port); + *sockaddr_port_offset(&dst) = htons(param->dest_port); } else { - *sockaddr_port_offset(sockaddr) = sequence; + *sockaddr_port_offset(&dst) = sequence; } } } @@ -105,7 +113,7 @@ int send_packet( } return sendto(send_socket, packet, packet_size, 0, - (struct sockaddr *) sockaddr, sockaddr_length); + (struct sockaddr *) &dst, sockaddr_length); } /*