core: add new PassPacketInfo= socket unit property

This commit is contained in:
Lennart Poettering 2020-05-27 19:36:56 +02:00
parent 35a3eb9bdc
commit a3d19f5d99
8 changed files with 26 additions and 0 deletions

View File

@ -429,6 +429,7 @@ Most socket unit settings are available to transient units.
✓ Broadcast= ✓ Broadcast=
✓ PassCredentials= ✓ PassCredentials=
✓ PassSecurity= ✓ PassSecurity=
✓ PassPacketInfo=
✓ TCPCongestion= ✓ TCPCongestion=
✓ ReusePort= ✓ ReusePort=
✓ MessageQueueMaxMessages= ✓ MessageQueueMaxMessages=

View File

@ -709,6 +709,15 @@
Defaults to <option>false</option>.</para></listitem> Defaults to <option>false</option>.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>PassPacketInfo=</varname></term>
<listitem><para>Takes a boolean value. This controls the <constant>IP_PKTINFO</constant>,
<constant>IPV6_RECVPKTINFO</constant> and <constant>NETLINK_PKTINFO</constant> socket options, which
enable reception of additional per-packet metadata as ancillary message, on
<constant>AF_INET</constant>, <constant>AF_INET6</constant> and <constant>AF_UNIX</constant> sockets.
Defaults to <option>false</option>.</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><varname>TCPCongestion=</varname></term> <term><varname>TCPCongestion=</varname></term>
<listitem><para>Takes a string value. Controls the TCP <listitem><para>Takes a string value. Controls the TCP

View File

@ -104,6 +104,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool, offsetof(Socket, broadcast), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool, offsetof(Socket, broadcast), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool, offsetof(Socket, pass_cred), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool, offsetof(Socket, pass_cred), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool, offsetof(Socket, pass_sec), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool, offsetof(Socket, pass_sec), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PassPacketInfo", "b", bus_property_get_bool, offsetof(Socket, pass_pktinfo), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool, offsetof(Socket, remove_on_stop), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool, offsetof(Socket, remove_on_stop), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen, 0, SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("Symlinks", "as", NULL, offsetof(Socket, symlinks), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Symlinks", "as", NULL, offsetof(Socket, symlinks), SD_BUS_VTABLE_PROPERTY_CONST),
@ -202,6 +203,9 @@ static int bus_socket_set_transient_property(
if (streq(name, "PassSecurity")) if (streq(name, "PassSecurity"))
return bus_set_transient_bool(u, name, &s->pass_sec, message, flags, error); return bus_set_transient_bool(u, name, &s->pass_sec, message, flags, error);
if (streq(name, "PassPacketInfo"))
return bus_set_transient_bool(u, name, &s->pass_pktinfo, message, flags, error);
if (streq(name, "ReusePort")) if (streq(name, "ReusePort"))
return bus_set_transient_bool(u, name, &s->reuse_port, message, flags, error); return bus_set_transient_bool(u, name, &s->reuse_port, message, flags, error);

View File

@ -396,6 +396,7 @@ Socket.Transparent, config_parse_bool, 0,
Socket.Broadcast, config_parse_bool, 0, offsetof(Socket, broadcast) Socket.Broadcast, config_parse_bool, 0, offsetof(Socket, broadcast)
Socket.PassCredentials, config_parse_bool, 0, offsetof(Socket, pass_cred) Socket.PassCredentials, config_parse_bool, 0, offsetof(Socket, pass_cred)
Socket.PassSecurity, config_parse_bool, 0, offsetof(Socket, pass_sec) Socket.PassSecurity, config_parse_bool, 0, offsetof(Socket, pass_sec)
Socket.PassPacketInfo, config_parse_bool, 0, offsetof(Socket, pass_pktinfo)
Socket.TCPCongestion, config_parse_string, 0, offsetof(Socket, tcp_congestion) Socket.TCPCongestion, config_parse_string, 0, offsetof(Socket, tcp_congestion)
Socket.ReusePort, config_parse_bool, 0, offsetof(Socket, reuse_port) Socket.ReusePort, config_parse_bool, 0, offsetof(Socket, reuse_port)
Socket.MessageQueueMaxMessages, config_parse_long, 0, offsetof(Socket, mq_maxmsg) Socket.MessageQueueMaxMessages, config_parse_long, 0, offsetof(Socket, mq_maxmsg)

View File

@ -635,6 +635,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
"%sBroadcast: %s\n" "%sBroadcast: %s\n"
"%sPassCredentials: %s\n" "%sPassCredentials: %s\n"
"%sPassSecurity: %s\n" "%sPassSecurity: %s\n"
"%sPassPacketInfo: %s\n"
"%sTCPCongestion: %s\n" "%sTCPCongestion: %s\n"
"%sRemoveOnStop: %s\n" "%sRemoveOnStop: %s\n"
"%sWritable: %s\n" "%sWritable: %s\n"
@ -654,6 +655,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
prefix, yes_no(s->broadcast), prefix, yes_no(s->broadcast),
prefix, yes_no(s->pass_cred), prefix, yes_no(s->pass_cred),
prefix, yes_no(s->pass_sec), prefix, yes_no(s->pass_sec),
prefix, yes_no(s->pass_pktinfo),
prefix, strna(s->tcp_congestion), prefix, strna(s->tcp_congestion),
prefix, yes_no(s->remove_on_stop), prefix, yes_no(s->remove_on_stop),
prefix, yes_no(s->writable), prefix, yes_no(s->writable),
@ -1070,6 +1072,12 @@ static void socket_apply_socket_options(Socket *s, int fd) {
log_unit_warning_errno(UNIT(s), r, "SO_PASSSEC failed: %m"); log_unit_warning_errno(UNIT(s), r, "SO_PASSSEC failed: %m");
} }
if (s->pass_pktinfo) {
r = socket_pass_pktinfo(fd, true);
if (r < 0)
log_unit_warning_errno(UNIT(s), r, "Failed to enable packet info socket option: %m");
}
if (s->priority >= 0) { if (s->priority >= 0) {
r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority); r = setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, s->priority);
if (r < 0) if (r < 0)

View File

@ -121,6 +121,7 @@ struct Socket {
bool broadcast; bool broadcast;
bool pass_cred; bool pass_cred;
bool pass_sec; bool pass_sec;
bool pass_pktinfo;
/* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */ /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
SocketAddressBindIPv6Only bind_ipv6_only; SocketAddressBindIPv6Only bind_ipv6_only;

View File

@ -1632,6 +1632,7 @@ static int bus_append_socket_property(sd_bus_message *m, const char *field, cons
"Broadcast", "Broadcast",
"PassCredentials", "PassCredentials",
"PassSecurity", "PassSecurity",
"PassPacketInfo",
"ReusePort", "ReusePort",
"RemoveOnStop", "RemoveOnStop",
"SELinuxContextFromNet")) "SELinuxContextFromNet"))

View File

@ -164,6 +164,7 @@ PIDFile=
PartOf= PartOf=
PassCredentials= PassCredentials=
PassSecurity= PassSecurity=
PassPacketInfo=
PathChanged= PathChanged=
PathExists= PathExists=
PathExistsGlob= PathExistsGlob=