]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tproxy: add support for FreeBSD
authorPieter Baauw <piba.nl.dev@gmail.com>
Wed, 8 May 2013 21:22:39 +0000 (23:22 +0200)
committerWilly Tarreau <w@1wt.eu>
Sat, 11 May 2013 06:03:43 +0000 (08:03 +0200)
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.

include/common/compat.h
src/haproxy.c
src/proto_tcp.c

index 043a56e48e387512374f7c5475083725435b65e4..efc2a6e043bf05960b76cefd0322bd093a6e4c7e 100644 (file)
@@ -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
index d5606faeca0a8966b87704e9f79da2bcd702ee63..ee0bd6581571aea1f2c703333723cd45100c7f78 100644 (file)
@@ -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
index f59c23b41315f8ab11142d7e33acd8dc263d2ddb..0ae359a767dbb69baad8c6760a58fa193819d0c9 100644 (file)
@@ -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";