]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/socket.h
basic SO_REUSEPORT support
[thirdparty/systemd.git] / src / core / socket.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 typedef struct Socket Socket;
25
26 #include "manager.h"
27 #include "unit.h"
28 #include "socket-util.h"
29 #include "mount.h"
30 #include "service.h"
31
32 typedef enum SocketState {
33 SOCKET_DEAD,
34 SOCKET_START_PRE,
35 SOCKET_START_POST,
36 SOCKET_LISTENING,
37 SOCKET_RUNNING,
38 SOCKET_STOP_PRE,
39 SOCKET_STOP_PRE_SIGTERM,
40 SOCKET_STOP_PRE_SIGKILL,
41 SOCKET_STOP_POST,
42 SOCKET_FINAL_SIGTERM,
43 SOCKET_FINAL_SIGKILL,
44 SOCKET_FAILED,
45 _SOCKET_STATE_MAX,
46 _SOCKET_STATE_INVALID = -1
47 } SocketState;
48
49 typedef enum SocketExecCommand {
50 SOCKET_EXEC_START_PRE,
51 SOCKET_EXEC_START_POST,
52 SOCKET_EXEC_STOP_PRE,
53 SOCKET_EXEC_STOP_POST,
54 _SOCKET_EXEC_COMMAND_MAX,
55 _SOCKET_EXEC_COMMAND_INVALID = -1
56 } SocketExecCommand;
57
58 typedef enum SocketType {
59 SOCKET_SOCKET,
60 SOCKET_FIFO,
61 SOCKET_SPECIAL,
62 SOCKET_MQUEUE,
63 _SOCKET_FIFO_MAX,
64 _SOCKET_FIFO_INVALID = -1
65 } SocketType;
66
67 typedef enum SocketResult {
68 SOCKET_SUCCESS,
69 SOCKET_FAILURE_RESOURCES,
70 SOCKET_FAILURE_TIMEOUT,
71 SOCKET_FAILURE_EXIT_CODE,
72 SOCKET_FAILURE_SIGNAL,
73 SOCKET_FAILURE_CORE_DUMP,
74 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
75 _SOCKET_RESULT_MAX,
76 _SOCKET_RESULT_INVALID = -1
77 } SocketResult;
78
79 typedef struct SocketPort {
80 SocketType type;
81 int fd;
82
83 SocketAddress address;
84 char *path;
85 Watch fd_watch;
86
87 LIST_FIELDS(struct SocketPort, port);
88 } SocketPort;
89
90 struct Socket {
91 Unit meta;
92
93 LIST_HEAD(SocketPort, ports);
94
95 unsigned n_accepted;
96 unsigned n_connections;
97 unsigned max_connections;
98
99 unsigned backlog;
100 usec_t timeout_usec;
101
102 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
103 ExecContext exec_context;
104 KillContext kill_context;
105 CGroupContext cgroup_context;
106
107 /* For Accept=no sockets refers to the one service we'll
108 activate. For Accept=yes sockets is either NULL, or filled
109 when the next service we spawn. */
110 UnitRef service;
111
112 SocketState state, deserialized_state;
113
114 Watch timer_watch;
115
116 ExecCommand* control_command;
117 SocketExecCommand control_command_id;
118 pid_t control_pid;
119
120 mode_t directory_mode;
121 mode_t socket_mode;
122
123 SocketResult result;
124
125 bool accept;
126
127 /* Socket options */
128 bool keep_alive;
129 bool free_bind;
130 bool transparent;
131 bool broadcast;
132 bool pass_cred;
133 bool pass_sec;
134
135 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
136 SocketAddressBindIPv6Only bind_ipv6_only;
137
138 int priority;
139 int mark;
140 size_t receive_buffer;
141 size_t send_buffer;
142 int ip_tos;
143 int ip_ttl;
144 size_t pipe_size;
145 char *bind_to_device;
146 char *tcp_congestion;
147 bool reuseport;
148 long mq_maxmsg;
149 long mq_msgsize;
150
151 char *smack;
152 char *smack_ip_in;
153 char *smack_ip_out;
154 };
155
156 /* Called from the service code when collecting fds */
157 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
158
159 /* Called from the service when it shut down */
160 void socket_notify_service_dead(Socket *s, bool failed_permanent);
161
162 /* Called from the mount code figure out if a mount is a dependency of
163 * any of the sockets of this socket */
164 int socket_add_one_mount_link(Socket *s, Mount *m);
165
166 /* Called from the service code when a per-connection service ended */
167 void socket_connection_unref(Socket *s);
168
169 void socket_free_ports(Socket *s);
170
171 extern const UnitVTable socket_vtable;
172
173 const char* socket_state_to_string(SocketState i) _const_;
174 SocketState socket_state_from_string(const char *s) _pure_;
175
176 const char* socket_exec_command_to_string(SocketExecCommand i) _const_;
177 SocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
178
179 const char* socket_result_to_string(SocketResult i) _const_;
180 SocketResult socket_result_from_string(const char *s) _pure_;
181
182 const char* socket_port_type_to_string(SocketPort *p) _pure_;