fix --multihome for ipv6: IPV6_RECVPKTINFO
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
Signed-off-by JuanJo Ciarlante <[email protected]...>
--- socket.c | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-)
socket.c +17 -10
@@ -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