--- src/openvpn/options.c 2019-05-16 14:22:26.171060000 +0300 +++ src/openvpn/options.c 2019-05-16 15:24:34.439341000 +0300 @@ -5820,6 +5820,10 @@ { options->sockflags |= SF_TCP_NODELAY; } + else if (streq(p[j], "SO_REUSEPORT_LB")) + { + options->sockflags |= SF_USE_REUSEPORT_LB; + } else { msg(msglevel, "unknown socket flag: %s", p[j]); --- src/openvpn/socket.c 2019-05-16 14:22:26.150629000 +0300 +++ src/openvpn/socket.c 2019-05-16 15:41:38.422233000 +0300 @@ -1070,7 +1070,16 @@ } } #endif /* if ENABLE_IP_PKTINFO */ - +#ifdef SO_REUSEPORT_LB + if (flags & SF_USE_REUSEPORT_LB){ + int on = 1; + if (setsockopt(sd, SOL_SOCKET, SO_REUSEPORT_LB, + (void *) &on, sizeof(on)) < 0) + { + msg(M_ERR, "UDP: Cannot setsockopt SO_REUSEPORT_LB on UDP socket"); + } + } +#endif /* if SO_REUSEPORT_LB */ /* set socket file descriptor to not pass across execs, so that * scripts don't have access to it */ set_cloexec(sd); --- src/openvpn/socket.h 2019-05-16 14:22:26.185056000 +0300 +++ src/openvpn/socket.h 2019-05-16 15:22:00.221319000 +0300 @@ -210,6 +210,7 @@ #define SF_PORT_SHARE (1<<2) #define SF_HOST_RANDOMIZE (1<<3) #define SF_GETADDRINFO_DGRAM (1<<4) +#define SF_USE_REUSEPORT_LB (1<<5) unsigned int sockflags; int mark;