From d1f9b781499998e6003266e6a8cb44be78664ffb Mon Sep 17 00:00:00 2001
From: JuanJo Ciarlante <jjo@google.com>
Date: Sat, 5 Feb 2011 23:52:57 +0100
Subject: * fix --multihome for IPv6, do check for setsockopt() failures, append %<iface> in INFO msg
---
socket.c | 27 +++++++++++++++++----------
1 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/socket.c b/socket.c
index 810bb23..08cab0e 100644
a
|
b
|
create_socket_udp (const unsigned int flags) |
813 | 813 | else if (flags & SF_USE_IP_PKTINFO) |
814 | 814 | { |
815 | 815 | int pad = 1; |
816 | | setsockopt (sd, SOL_IP, IP_PKTINFO, (void*)&pad, sizeof(pad)); |
| 816 | if (setsockopt (sd, SOL_IP, IP_PKTINFO, |
| 817 | (void*)&pad, sizeof(pad)) < 0) |
| 818 | msg(M_SOCKERR, "UDP: failed setsockopt for IP_PKTINFO"); |
817 | 819 | } |
818 | 820 | #endif |
819 | 821 | return sd; |
… |
… |
create_socket_udp6 (const unsigned int flags) |
831 | 833 | else if (flags & SF_USE_IP_PKTINFO) |
832 | 834 | { |
833 | 835 | int pad = 1; |
834 | | setsockopt (sd, IPPROTO_IPV6, IPV6_PKTINFO, (void*)&pad, sizeof(pad)); |
| 836 | if (setsockopt (sd, IPPROTO_IPV6, IPV6_RECVPKTINFO, |
| 837 | (void*)&pad, sizeof(pad)) < 0) |
| 838 | msg(M_SOCKERR, "UDP: failed setsockopt for IPV6_RECVPKTINFO"); |
835 | 839 | } |
836 | 840 | #endif |
837 | 841 | return sd; |
… |
… |
print_link_socket_actual_ex (const struct link_socket_actual *act, |
2423 | 2427 | { |
2424 | 2428 | if (act) |
2425 | 2429 | { |
| 2430 | char ifname[IF_NAMESIZE] = "[undef]"; |
2426 | 2431 | struct buffer out = alloc_buf_gc (128, gc); |
2427 | 2432 | buf_printf (&out, "%s", print_sockaddr_ex (&act->dest, separator, flags, gc)); |
2428 | 2433 | #if ENABLE_IP_PKTINFO |
… |
… |
print_link_socket_actual_ex (const struct link_socket_actual *act, |
2438 | 2443 | CLEAR (sa); |
2439 | 2444 | sa.addr.in4.sin_family = AF_INET; |
2440 | 2445 | sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst; |
2441 | | buf_printf (&out, " (via %s)", print_sockaddr_ex (&sa, separator, 0, gc)); |
| 2446 | if_indextoname(act->pi.in4.ipi_ifindex, ifname); |
| 2447 | buf_printf (&out, " (via %s%%%s)", |
| 2448 | print_sockaddr_ex (&sa, separator, 0, gc), |
| 2449 | ifname); |
2442 | 2450 | } |
2443 | 2451 | #ifdef USE_PF_INET6 |
2444 | 2452 | break; |
… |
… |
print_link_socket_actual_ex (const struct link_socket_actual *act, |
2449 | 2457 | CLEAR(sin6); |
2450 | 2458 | sin6.sin6_family = AF_INET6; |
2451 | 2459 | sin6.sin6_addr = act->pi.in6.ipi6_addr; |
2452 | | { |
2453 | | if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), |
2454 | | buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) |
2455 | | buf_printf (&out, " (via %s)", buf); |
2456 | | else |
2457 | | buf_printf (&out, " (via [getnameinfo() err])"); |
2458 | | } |
| 2460 | if_indextoname(act->pi.in6.ipi6_ifindex, ifname); |
| 2461 | if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), |
| 2462 | buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) |
| 2463 | buf_printf (&out, " (via %s%%%s)", buf, ifname); |
| 2464 | else |
| 2465 | buf_printf (&out, " (via [getnameinfo() err]%%%s)", ifname); |
2459 | 2466 | } |
2460 | 2467 | break; |
2461 | 2468 | } |