From: Pieter Baauw Date: Wed, 8 May 2013 21:22:39 +0000 (+0200) Subject: MINOR: tproxy: add support for FreeBSD X-Git-Tag: v1.5-dev19~38 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ff30b6667be509e12adaf264ddd21a9aabbfcdad;p=thirdparty%2Fhaproxy.git MINOR: tproxy: add support for FreeBSD FreeBSD uses (IPPROTO_IP, IP_BINDANY) and (IPPROTO_IPV6, IPV6_BINDANY) to enable transparent proxy on a socket. This patch adds support for the relevant setsockopt() calls. --- diff --git a/include/common/compat.h b/include/common/compat.h index 043a56e48e..efc2a6e043 100644 --- a/include/common/compat.h +++ b/include/common/compat.h @@ -94,6 +94,8 @@ #endif /* CONFIG_HAP_LINUX_TPROXY */ #if defined(IP_FREEBIND) \ + || defined(IP_BINDANY) \ + || defined(IPV6_BINDANY) \ || defined(IP_TRANSPARENT) \ || defined(IPV6_TRANSPARENT) #define CONFIG_HAP_TRANSPARENT diff --git a/src/haproxy.c b/src/haproxy.c index d5606faeca..ee0bd65815 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -326,6 +326,12 @@ void display_build_opts() #endif #if defined(IP_FREEBIND) " IP_FREEBIND" +#endif +#if defined(IP_BINDANY) + " IP_BINDANY" +#endif +#if defined(IPV6_BINDANY) + " IPV6_BINDANY" #endif "\n"); #endif diff --git a/src/proto_tcp.c b/src/proto_tcp.c index f59c23b413..0ae359a767 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -138,6 +138,9 @@ int tcp_bind_socket(int fd, int flags, struct sockaddr_storage *local, struct so #endif #if defined(IP_FREEBIND) || (setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one)) == 0) +#endif +#if defined(IP_BINDANY) + || (setsockopt(fd, IPPROTO_IP, IP_BINDANY, &one, sizeof(one)) == 0) #endif ) foreign_ok = 1; @@ -150,6 +153,9 @@ int tcp_bind_socket(int fd, int flags, struct sockaddr_storage *local, struct so if (0 #if defined(IPV6_TRANSPARENT) || (setsockopt(fd, SOL_IPV6, IPV6_TRANSPARENT, &one, sizeof(one)) == 0) +#endif +#if defined(IPV6_BINDANY) + || (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDANY, &one, sizeof(one)) == 0) #endif ) foreign_ok = 1; @@ -644,6 +650,9 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) #endif #if defined(IP_FREEBIND) && (setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one)) == -1) +#endif +#if defined(IP_BINDANY) + && (setsockopt(fd, IPPROTO_IP, IP_BINDANY, &one, sizeof(one)) == -1) #endif ) { msg = "cannot make listening socket transparent"; @@ -654,6 +663,9 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) if (1 #if defined(IPV6_TRANSPARENT) && (setsockopt(fd, SOL_IPV6, IPV6_TRANSPARENT, &one, sizeof(one)) == -1) +#endif +#if defined(IPV6_BINDANY) + && (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDANY, &one, sizeof(one)) == -1) #endif ) { msg = "cannot make listening socket transparent";