NOTE: this is patch 1/3 over feat_ipv6_transport branch, commit 1b96baa8fc964bfba8bfba87f1e0e1fbabf0b47b
- setsockopt IPV6_RECVPKTINFO (not IPV6_PKTINFO!) - do check for setsockopt() failures - append %<iface> in INFO msg Signed-off-by: JuanJo Ciarlante <j...@google.com> --- socket.c | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-) diff --git a/socket.c b/socket.c index 810bb23..08cab0e 100644 --- a/socket.c +++ b/socket.c @@ -813,7 +813,9 @@ create_socket_udp (const unsigned int flags) else if (flags & SF_USE_IP_PKTINFO) { int pad = 1; - setsockopt (sd, SOL_IP, IP_PKTINFO, (void*)&pad, sizeof(pad)); + if (setsockopt (sd, SOL_IP, IP_PKTINFO, + (void*)&pad, sizeof(pad)) < 0) + msg(M_SOCKERR, "UDP: failed setsockopt for IP_PKTINFO"); } #endif return sd; @@ -831,7 +833,9 @@ create_socket_udp6 (const unsigned int flags) else if (flags & SF_USE_IP_PKTINFO) { int pad = 1; - setsockopt (sd, IPPROTO_IPV6, IPV6_PKTINFO, (void*)&pad, sizeof(pad)); + if (setsockopt (sd, IPPROTO_IPV6, IPV6_RECVPKTINFO, + (void*)&pad, sizeof(pad)) < 0) + msg(M_SOCKERR, "UDP: failed setsockopt for IPV6_RECVPKTINFO"); } #endif return sd; @@ -2423,6 +2427,7 @@ print_link_socket_actual_ex (const struct link_socket_actual *act, { if (act) { + char ifname[IF_NAMESIZE] = "[undef]"; struct buffer out = alloc_buf_gc (128, gc); buf_printf (&out, "%s", print_sockaddr_ex (&act->dest, separator, flags, gc)); #if ENABLE_IP_PKTINFO @@ -2438,7 +2443,10 @@ print_link_socket_actual_ex (const struct link_socket_actual *act, CLEAR (sa); sa.addr.in4.sin_family = AF_INET; sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst; - buf_printf (&out, " (via %s)", print_sockaddr_ex (&sa, separator, 0, gc)); + if_indextoname(act->pi.in4.ipi_ifindex, ifname); + buf_printf (&out, " (via %s%%%s)", + print_sockaddr_ex (&sa, separator, 0, gc), + ifname); } #ifdef USE_PF_INET6 break; @@ -2449,13 +2457,12 @@ print_link_socket_actual_ex (const struct link_socket_actual *act, CLEAR(sin6); sin6.sin6_family = AF_INET6; sin6.sin6_addr = act->pi.in6.ipi6_addr; - { - if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), - buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) - buf_printf (&out, " (via %s)", buf); - else - buf_printf (&out, " (via [getnameinfo() err])"); - } + if_indextoname(act->pi.in6.ipi6_ifindex, ifname); + if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), + buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) + buf_printf (&out, " (via %s%%%s)", buf, ifname); + else + buf_printf (&out, " (via [getnameinfo() err]%%%s)", ifname); } break; } -- 1.7.1 oO Juan Jose Ciarlante - juanjosec Ogmail.com - jjo O{um.edu.ar,google.com} Oo gpg --keyserver wwwkeys.eu.pgp.net --recv-key 81276430
signature.asc
Description: Digital signature