]> git.gsnw.org Git - fping.git/commitdiff
Fix: set ipi_spec_dst from -S source address in sendmsg()
authorGerman Service Network <support@gsnw.de>
Sun, 29 Mar 2026 12:18:15 +0000 (14:18 +0200)
committerSebastian <176771227+gsnw-sebast@users.noreply.github.com>
Sat, 25 Apr 2026 05:42:10 +0000 (07:42 +0200)
src/socket4.c

index 799987bfab4de333c5875a84769d0a0bb2eb5af0..cb986e229cecec03f0f0048865c4b225284727d3 100644 (file)
@@ -53,6 +53,10 @@ size_t ping_pkt_size_ipv4;
 /* Interface index for outgoing packets (0 = not set, use routing table) */
 static int outgoing_iface_idx_ipv4 = 0;
 
+/* Source address for outgoing packets (used to populate ipi_spec_dst) */
+static struct in_addr outgoing_src_addr_ipv4;
+static int outgoing_src_addr_set_ipv4 = 0;
+
 int open_ping_socket_ipv4(int *socktype)
 {
     struct protoent* proto;
@@ -118,6 +122,10 @@ void socket_set_src_addr_ipv4(int s, struct in_addr* src_addr, int *ident)
     struct sockaddr_in sa;
     socklen_t len = sizeof(sa);
 
+    /* Remember source address so we can set ipi_spec_dst in sendmsg() */
+    outgoing_src_addr_ipv4 = *src_addr;
+    outgoing_src_addr_set_ipv4 = 1;
+
     memset(&sa, 0, len);
     sa.sin_family = AF_INET;
     sa.sin_addr = *src_addr;
@@ -208,6 +216,9 @@ int socket_sendto_ping_ipv4(int s, struct sockaddr* saddr, socklen_t saddr_len,
         struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
         memset(pktinfo, 0, sizeof(*pktinfo));
         pktinfo->ipi_ifindex = outgoing_iface_idx_ipv4;
+        if (outgoing_src_addr_set_ipv4) {
+            pktinfo->ipi_spec_dst = outgoing_src_addr_ipv4;
+        }
 
         n = sendmsg(s, &msg, 0);
     } else {