mtr/backport-ip6-udp-fix-probes-with-local-or-remote-port.patch
2023-11-24 17:12:49 +08:00

79 lines
2.8 KiB
Diff

From 513c04b02ff0632ad9c84b2d9b0f3dbf3a25c0b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Markus=20K=C3=B6tter?= <koetter@luis.uni-hannover.de>
Date: Wed, 15 Jan 2020 15:42:58 +0100
Subject: [PATCH] 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
Conflict: NA
Reference:https://github.com/traviscross/mtr/pull/331/commits/513c04b02ff0632ad9c84b2d9b0f3dbf3a25c0b2
---
packet/probe_unix.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
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);
}
/*
--
2.30.0