Skip to contentSkip to conversation

fix --multihome for ipv6: IPV6_RECVPKTINFO

PATCH New JuanJo Ciarlante 1 participant 1 message Mar 24, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 fix --multihome for ipv6: IPV6_RECVPKTINFO

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

---
 socket.c |   27 +++++++++++++++++----------
 1 files changed, 17 insertions(+), 10 deletions(-)
socket.c +17 -10
index 810bb23..08cab0e 100644
@@ -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;
 	    }
Signature · 4 lines
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