BUILD/MEDIUM: tcp: set-mark support for OpenBSD
set-mark support for this platform, for routing table purpose.
Follow-up from f7f53afcf9d367d19, this time for OpenBSD.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index 5d1c97b..51f65ae 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -6510,7 +6510,8 @@
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 <fmt> [ { if | unless } <condition> ]
@@ -7171,7 +7172,8 @@
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 <nice> [ { if | unless } <condition> ]
@@ -11908,7 +11910,7 @@
"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 <expr> :
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 02096b0..d288378 100644
--- a/include/haproxy/connection.h
+++ b/include/haproxy/connection.h
@@ -699,6 +699,8 @@
#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 b684bff..3596d31 100644
--- a/src/tcp_act.c
+++ b/src/tcp_act.c
@@ -237,7 +237,7 @@
}
-#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_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 @@
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
}