]> git.gsnw.org Git - fping.git/commitdiff
Set ipi6_addr in IPV6_PKTINFO when source address is bound
authorGerman Service Network <support@gsnw.de>
Thu, 23 Apr 2026 16:51:16 +0000 (18:51 +0200)
committerSebastian <176771227+gsnw-sebast@users.noreply.github.com>
Sat, 25 Apr 2026 05:42:10 +0000 (07:42 +0200)
src/socket6.c

index cc77ef7b8e06842a7c9705aea0a576dfeca82888..ab6e199f73fd956ce0a7a142a2602e0ff2d3251a 100644 (file)
@@ -51,6 +51,10 @@ size_t ping_pkt_size_ipv6;
 /* Interface index for outgoing packets (0 = not set, use routing table) */
 static int outgoing_iface_idx_ipv6 = 0;
 
+/* Source address for outgoing packets (used to populate ipi6_addr) */
+static struct in6_addr outgoing_src_addr_ipv6;
+static int outgoing_src_addr_set_ipv6 = 0;
+
 int open_ping_socket_ipv6(int *socktype)
 {
     struct protoent* proto;
@@ -124,6 +128,9 @@ void socket_set_src_addr_ipv6(int s, struct in6_addr* src_addr, int *ident)
     struct sockaddr_in6 sa;
     socklen_t len = sizeof(sa);
 
+    outgoing_src_addr_ipv6 = *src_addr;
+    outgoing_src_addr_set_ipv6 = 1;
+
     memset(&sa, 0, sizeof(sa));
     sa.sin6_family = AF_INET6;
     sa.sin6_addr = *src_addr;
@@ -187,6 +194,10 @@ int socket_sendto_ping_ipv6(int s, struct sockaddr* saddr, socklen_t saddr_len,
         memset(pktinfo, 0, sizeof(*pktinfo));
         pktinfo->ipi6_ifindex = outgoing_iface_idx_ipv6;
 
+        if (outgoing_src_addr_set_ipv6) {
+            pktinfo->ipi6_addr = outgoing_src_addr_ipv6;
+        }
+
         n = sendmsg(s, &msg, 0);
     } else {
         n = sendto(s, icp, ping_pkt_size_ipv6, 0, saddr, saddr_len);