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

Attachment: signature.asc
Description: Digital signature

Reply via email to