MINOR: protocol: perform a live check for SO_REUSEPORT support

When testing if a protocol supports SO_REUSEPORT, we're now able to
verify if the OS does really support it. While it may be supported at
build time, it may possibly have been blocked in a container for
example so we'd rather know what it's like.
This commit is contained in:
Willy Tarreau 2023-04-22 18:26:56 +02:00
parent b073573c10
commit f1003ea7fa
2 changed files with 15 additions and 2 deletions

View File

@ -66,6 +66,7 @@ enum proto_type {
/* Flags for protocol->flags */
#define PROTO_F_REUSEPORT_SUPPORTED 0x00000001 /* SO_REUSEPORT is supported */
#define PROTO_F_REUSEPORT_TESTED 0x00000002 /* SO_REUSEPORT support was tested */
/* protocol families define standard functions acting on a given address family
* for a socket implementation, such as AF_INET/PF_INET for example.

View File

@ -21,6 +21,7 @@
#include <haproxy/proto_quic.h>
#include <haproxy/protocol.h>
#include <haproxy/proxy.h>
#include <haproxy/sock.h>
#include <haproxy/tools.h>
@ -92,12 +93,23 @@ void protocol_setf_all(uint flag)
int protocol_supports_flag(struct protocol *proto, uint flag)
{
if (flag == PROTO_F_REUSEPORT_SUPPORTED) {
int ret = 0;
/* check if the protocol supports SO_REUSEPORT */
if (!(_HA_ATOMIC_LOAD(&proto->flags) & PROTO_F_REUSEPORT_SUPPORTED))
return 0;
/* OK it looks like it is supported */
return 1;
/* at least nobody said it was not supported */
if (_HA_ATOMIC_LOAD(&proto->flags) & PROTO_F_REUSEPORT_TESTED)
return 1;
/* run a live check */
ret = _sock_supports_reuseport(proto->fam, proto->sock_type, proto->sock_prot);
if (!ret)
_HA_ATOMIC_AND(&proto->flags, ~PROTO_F_REUSEPORT_SUPPORTED);
_HA_ATOMIC_OR(&proto->flags, PROTO_F_REUSEPORT_TESTED);
return ret;
}
return 0;
}