1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-10 05:18:17 +03:00

basic SO_REUSEPORT support

This commit is contained in:
Shawn Landden 2013-07-08 18:28:14 +00:00 committed by Lennart Poettering
parent 4c5420a0c1
commit f7db7a691c
5 changed files with 29 additions and 0 deletions

View File

@ -504,6 +504,17 @@
for details.</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>ReusePort=</varname></term>
<listitem><para>Takes a boolean
value. If true allows multiple bind()s
to this TCP or UDP port. This
controls the SO_REUSEPORT socket
option. See
<citerefentry><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
for details.</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>SmackLabel=</varname></term>
<term><varname>SmackLabelIPIn=</varname></term>

View File

@ -67,6 +67,7 @@
" <property name=\"MessageQueueMessageSize\" type=\"x\" access=\"read\"/>\n" \
" <property name=\"Listen\" type=\"a(ss)\" access=\"read\"/>\n" \
" <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"ReusePort\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"SmackLabel\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"SmackLabelIPIn\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"SmackLabelIPOut\" type=\"s\" access=\"read\"/>\n" \
@ -194,6 +195,7 @@ static const BusProperty bus_socket_properties[] = {
{ "MessageQueueMaxMessages", bus_property_append_long, "x", offsetof(Socket, mq_maxmsg) },
{ "MessageQueueMessageSize", bus_property_append_long, "x", offsetof(Socket, mq_msgsize) },
{ "Result", bus_socket_append_socket_result, "s", offsetof(Socket, result) },
{ "ReusePort", bus_property_append_bool, "b", offsetof(Socket, reuseport) },
{ "SmackLabel", bus_property_append_string, "s", offsetof(Socket, smack), true },
{ "SmackLabelIPIn", bus_property_append_string, "s", offsetof(Socket, smack_ip_in), true },
{ "SmackLabelIPOut",bus_property_append_string, "s", offsetof(Socket, smack_ip_out), true },

View File

@ -536,6 +536,11 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
"%sMessageQueueMessageSize: %li\n",
prefix, s->mq_msgsize);
if (s->reuseport)
fprintf(f,
"%sReusePort: %s\n",
prefix, yes_no(s->reuseport));
if (s->smack)
fprintf(f,
"%sSmackLabel: %s\n",
@ -792,6 +797,12 @@ static void socket_apply_socket_options(Socket *s, int fd) {
if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
log_warning_unit(UNIT(s)->id, "TCP_CONGESTION failed: %m");
if (s->reuseport) {
int b = s->reuseport;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &b, sizeof(b)))
log_warning_unit(UNIT(s)->id, "SO_REUSEPORT failed: %m");
}
#ifdef HAVE_SMACK
if (s->smack_ip_in)
if (fsetxattr(fd, "security.SMACK64IPIN", s->smack_ip_in, strlen(s->smack_ip_in), 0) < 0)

View File

@ -144,6 +144,7 @@ struct Socket {
size_t pipe_size;
char *bind_to_device;
char *tcp_congestion;
bool reuseport;
long mq_maxmsg;
long mq_msgsize;

View File

@ -266,3 +266,7 @@ static inline int name_to_handle_at(int fd, const char *name, struct file_handle
#ifndef TFD_TIMER_CANCEL_ON_SET
#define TFD_TIMER_CANCEL_ON_SET (1 << 1)
#endif
#ifndef SO_REUSEPORT
#define SO_REUSEPORT 15
#endif