diff options
author | JuanJo Ciarlante <jjo@google.com> | 2011-02-06 09:52:46 +0100 |
---|---|---|
committer | JuanJo Ciarlante <juanjosec@gmail.com> | 2011-03-25 13:30:31 +0100 |
commit | 5d6dbb03776de4d38f45e429ef674313a2bda8cc (patch) | |
tree | f169156747e626e637b93e1f73cad21c03921ff8 /socket.c | |
parent | 830038fce4a30f317eb265079f91d9555981ad76 (diff) | |
download | openvpn-5d6dbb03776de4d38f45e429ef674313a2bda8cc.tar.gz openvpn-5d6dbb03776de4d38f45e429ef674313a2bda8cc.tar.xz openvpn-5d6dbb03776de4d38f45e429ef674313a2bda8cc.zip |
* fix --multihome for ipv6: IPV6_RECVPKTINFO
- setsockopt IPV6_RECVPKTINFO (not IPV6_PKTINFO!)
- do check for setsockopt() failures
- append %<iface> in INFO msg
Diffstat (limited to 'socket.c')
-rw-r--r-- | socket.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -843,7 +843,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; @@ -861,7 +863,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; @@ -2453,6 +2457,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 @@ -2468,7 +2473,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; @@ -2479,13 +2487,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; } |