Skip to content
Snippets Groups Projects
Commit 8d7cff41 authored by ahedberg's avatar ahedberg
Browse files

make IP_PKTINFO and IPV6_RECVPKTINFO optional

parent 444869bf
No related branches found
No related tags found
No related merge requests found
...@@ -134,6 +134,8 @@ ...@@ -134,6 +134,8 @@
#define GPR_GETPID_IN_UNISTD_H 1 #define GPR_GETPID_IN_UNISTD_H 1
#define GPR_HAVE_MSG_NOSIGNAL 1 #define GPR_HAVE_MSG_NOSIGNAL 1
#define GPR_HAVE_UNIX_SOCKET 1 #define GPR_HAVE_UNIX_SOCKET 1
#define GPR_HAVE_IP_PKTINFO 1
#define GPR_HAVE_IPV6_RECVPKTINFO 1
#elif defined(__linux__) #elif defined(__linux__)
#define GPR_POSIX_CRASH_HANDLER 1 #define GPR_POSIX_CRASH_HANDLER 1
#define GPR_PLATFORM_STRING "linux" #define GPR_PLATFORM_STRING "linux"
...@@ -156,6 +158,8 @@ ...@@ -156,6 +158,8 @@
#define GPR_POSIX_SOCKET 1 #define GPR_POSIX_SOCKET 1
#define GPR_POSIX_SOCKETADDR 1 #define GPR_POSIX_SOCKETADDR 1
#define GPR_HAVE_UNIX_SOCKET 1 #define GPR_HAVE_UNIX_SOCKET 1
#define GPR_HAVE_IP_PKTINFO 1
#define GPR_HAVE_IPV6_RECVPKTINFO 1
#ifdef __GLIBC_PREREQ #ifdef __GLIBC_PREREQ
#if __GLIBC_PREREQ(2, 9) #if __GLIBC_PREREQ(2, 9)
#define GPR_LINUX_EVENTFD 1 #define GPR_LINUX_EVENTFD 1
...@@ -217,6 +221,7 @@ ...@@ -217,6 +221,7 @@
#define GPR_GETPID_IN_UNISTD_H 1 #define GPR_GETPID_IN_UNISTD_H 1
#define GPR_HAVE_SO_NOSIGPIPE 1 #define GPR_HAVE_SO_NOSIGPIPE 1
#define GPR_HAVE_UNIX_SOCKET 1 #define GPR_HAVE_UNIX_SOCKET 1
#define GPR_HAVE_IP_PKTINFO 1
#ifdef _LP64 #ifdef _LP64
#define GPR_ARCH_64 1 #define GPR_ARCH_64 1
#else /* _LP64 */ #else /* _LP64 */
...@@ -246,6 +251,8 @@ ...@@ -246,6 +251,8 @@
#define GPR_GETPID_IN_UNISTD_H 1 #define GPR_GETPID_IN_UNISTD_H 1
#define GPR_HAVE_SO_NOSIGPIPE 1 #define GPR_HAVE_SO_NOSIGPIPE 1
#define GPR_HAVE_UNIX_SOCKET 1 #define GPR_HAVE_UNIX_SOCKET 1
#define GPR_HAVE_IP_PKTINFO 1
#define GPR_HAVE_IPV6_RECVPKTINFO 1
#ifdef _LP64 #ifdef _LP64
#define GPR_ARCH_64 1 #define GPR_ARCH_64 1
#else /* _LP64 */ #else /* _LP64 */
......
...@@ -89,6 +89,16 @@ int grpc_set_socket_no_sigpipe_if_possible(int fd) { ...@@ -89,6 +89,16 @@ int grpc_set_socket_no_sigpipe_if_possible(int fd) {
#endif #endif
} }
int grpc_set_socket_ip_pktinfo_if_possible(int fd) {
#ifdef GPR_HAVE_IP_PKTINFO
int get_local_ip = 1;
return setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
sizeof(get_local_ip));
#else
return 1;
#endif
}
/* set a socket to close on exec */ /* set a socket to close on exec */
int grpc_set_socket_cloexec(int fd, int close_on_exec) { int grpc_set_socket_cloexec(int fd, int close_on_exec) {
int oldflags = fcntl(fd, F_GETFD, 0); int oldflags = fcntl(fd, F_GETFD, 0);
......
...@@ -68,6 +68,16 @@ int grpc_ipv6_loopback_available(void); ...@@ -68,6 +68,16 @@ int grpc_ipv6_loopback_available(void);
If SO_NO_SIGPIPE is not available, returns 1. */ If SO_NO_SIGPIPE is not available, returns 1. */
int grpc_set_socket_no_sigpipe_if_possible(int fd); int grpc_set_socket_no_sigpipe_if_possible(int fd);
/* Tries to set IP_PKTINFO if available on this platform.
Returns 1 on success, 0 on failure.
If IP_PKTINFO is not available, returns 1. */
int grpc_set_socket_ip_pktinfo_if_possible(int fd);
/* Tries to set IPV6_RECVPKTINFO if available on this platform.
Returns 1 on success, 0 on failure.
If IPV6_RECVPKTINFO is not available, returns 1. */
int grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd);
/* An enum to keep track of IPv4/IPv6 socket modes. /* An enum to keep track of IPv4/IPv6 socket modes.
Currently, this information is only used when a socket is first created, but Currently, this information is only used when a socket is first created, but
......
...@@ -208,8 +208,6 @@ static int prepare_socket(int fd, const struct sockaddr *addr, ...@@ -208,8 +208,6 @@ static int prepare_socket(int fd, const struct sockaddr *addr,
size_t addr_len) { size_t addr_len) {
struct sockaddr_storage sockname_temp; struct sockaddr_storage sockname_temp;
socklen_t sockname_len; socklen_t sockname_len;
int get_local_ip;
int rc;
if (fd < 0) { if (fd < 0) {
goto error; goto error;
...@@ -220,14 +218,9 @@ static int prepare_socket(int fd, const struct sockaddr *addr, ...@@ -220,14 +218,9 @@ static int prepare_socket(int fd, const struct sockaddr *addr,
strerror(errno)); strerror(errno));
} }
get_local_ip = 1; if (grpc_set_socket_ip_pktinfo_if_possible(fd) &&
rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip, addr->sa_family == AF_INET6) {
sizeof(get_local_ip)); grpc_set_socket_ipv6_recvpktinfo_if_possible(fd);
if (rc == 0 && addr->sa_family == AF_INET6) {
#if !defined(__APPLE__)
rc = setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
sizeof(get_local_ip));
#endif
} }
GPR_ASSERT(addr_len < ~(socklen_t)0); GPR_ASSERT(addr_len < ~(socklen_t)0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment