diff --git a/doc/configuration.txt b/doc/configuration.txt index 5d1c97bd3..51f65ae9d 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -6510,7 +6510,8 @@ http-request set-mark [ { if | unless } ] both in decimal or hexadecimal format (prefixed by "0x"). This can be useful to force certain packets to take a different route (for example a cheaper network path for bulk downloads). This works on Linux - kernels 2.6.32 and above and requires admin privileges, as well on FreeBSD. + kernels 2.6.32 and above and requires admin privileges, as well on FreeBSD + and OpenBSD. http-request set-method [ { if | unless } ] @@ -7171,7 +7172,8 @@ http-response set-mark [ { if | unless } ] It can be expressed both in decimal or hexadecimal format (prefixed by "0x"). This can be useful to force certain packets to take a different route (for example a cheaper network path for bulk downloads). This works on Linux - kernels 2.6.32 and above and requires admin privileges, as well on FreeBSD. + kernels 2.6.32 and above and requires admin privileges, as well on FreeBSD + and OpenBSD. http-response set-nice [ { if | unless } ] @@ -11908,7 +11910,7 @@ tcp-request connection [{if | unless} ] "0x"). This can be useful to force certain packets to take a different route (for example a cheaper network path for bulk downloads). This works on Linux kernels 2.6.32 and above and requires admin privileges, as well - on FreeBSD. + on FreeBSD and OpenBSD. - set-src : Is used to set the source IP address to the value of specified diff --git a/include/haproxy/connection.h b/include/haproxy/connection.h index 02096b036..d28837886 100644 --- a/include/haproxy/connection.h +++ b/include/haproxy/connection.h @@ -699,6 +699,8 @@ static inline void conn_set_mark(const struct connection *conn, int mark) #elif defined(SO_USER_COOKIE) uint32_t mval = (uint32_t)mark; setsockopt(conn->handle.fd, SOL_SOCKET, SO_USER_COOKIE, &mval, sizeof(mval)); +#elif defined(SO_RTABLE) + setsockopt(conn->handle.fd, SOL_SOCKET, SO_RTABLE, &mark, sizeof(mark)); #endif } diff --git a/src/tcp_act.c b/src/tcp_act.c index b684bff43..3596d3125 100644 --- a/src/tcp_act.c +++ b/src/tcp_act.c @@ -237,7 +237,7 @@ static enum act_return tcp_exec_action_silent_drop(struct act_rule *rule, struct } -#if defined(SO_MARK) || defined(SO_USER_COOKIE) +#if defined(SO_MARK) || defined(SO_USER_COOKIE) || defined(SO_RTABLE) static enum act_return tcp_action_set_mark(struct act_rule *rule, struct proxy *px, struct session *sess, struct stream *s, int flags) { @@ -308,7 +308,7 @@ static enum act_parse_ret tcp_parse_set_src_dst(const char **args, int *orig_arg static enum act_parse_ret tcp_parse_set_mark(const char **args, int *cur_arg, struct proxy *px, struct act_rule *rule, char **err) { -#if defined(SO_MARK) || defined(SO_USER_COOKIE) +#if defined(SO_MARK) || defined(SO_USER_COOKIE) || defined(SO_RTABLE) char *endp; unsigned int mark; @@ -331,7 +331,7 @@ static enum act_parse_ret tcp_parse_set_mark(const char **args, int *cur_arg, st global.last_checks |= LSTCHK_NETADM; return ACT_RET_PRS_OK; #else - memprintf(err, "not supported on this platform (SO_MARK|SO_USER_COOKIE undefined)"); + memprintf(err, "not supported on this platform (SO_MARK|SO_USER_COOKIE|SO_RTABLE undefined)"); return ACT_RET_PRS_ERR; #endif }