]> git.ipfire.org Git - thirdparty/mtr.git/commitdiff
ip6 udp - fix probes with local or remote port 331/head
authorMarkus Kötter <koetter@luis.uni-hannover.de>
Wed, 15 Jan 2020 14:42:58 +0000 (15:42 +0100)
committerMarkus Kötter <koetter@luis.uni-hannover.de>
Wed, 15 Jan 2020 14:47:04 +0000 (15:47 +0100)
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

packet/probe_unix.c

index bf1e2c96de75868b7e0c8bab90f0229d52404b2d..a749f7d7805cc31d429264d0f1d7c9b23434e48b 100644 (file)
@@ -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);
 }
 
 /*