From: German Service Network Date: Sun, 29 Mar 2026 12:18:15 +0000 (+0200) Subject: Fix: set ipi_spec_dst from -S source address in sendmsg() X-Git-Url: https://git.gsnw.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20df7c627aa00fa12e8c57378295fc4866125b2e;p=fping.git Fix: set ipi_spec_dst from -S source address in sendmsg() --- diff --git a/src/socket4.c b/src/socket4.c index 799987b..cb986e2 100644 --- a/src/socket4.c +++ b/src/socket4.c @@ -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 {