pingsock = create_icmp_socket();
pingaddr.sin = lsa->sin;
- if (source_lsa)
- xbind(pingsock, &lsa->sa, lsa->len);
+ if (source_lsa) {
+ if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
+ &source_lsa->sa, source_lsa->len))
+ bb_error_msg_and_die("can't set multicast source interface");
+ xbind(pingsock, &source_lsa->sa, source_lsa->len);
+ }
/* enable broadcast pings */
setsockopt_broadcast(pingsock);
pingaddr.sin6 = lsa->sin6;
/* untested whether "-I addr" really works for IPv6: */
if (source_lsa)
- xbind(pingsock, &lsa->sa, lsa->len);
+ xbind(pingsock, &source_lsa->sa, source_lsa->len);
#ifdef ICMP6_FILTER
{
printf("PING %s (%s)", hostname, dotted);
if (source_lsa) {
printf(" from %s",
- xmalloc_sockaddr2dotted_noport(&lsa->sa, lsa->len));
+ xmalloc_sockaddr2dotted_noport(&source_lsa->sa, source_lsa->len));
}
printf(": %d data bytes\n", datalen);
if_index = if_nametoindex(opt_I);
if (!if_index) {
/* TODO: I'm not sure it takes IPv6 unless in [XX:XX..] format */
- /* (ping doesn't support source IPv6 addresses yet anyway) */
source_lsa = xdotted2sockaddr(opt_I, 0);
}
}