From: Yu Watanabe Date: Sat, 2 May 2026 17:50:37 +0000 (+0900) Subject: sd-dhcp-client: set TOS and socket priority by default X-Git-Tag: v261-rc1~134^2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=ff32569f2a3aaec0308ac0bfee2b75718707b880;p=thirdparty%2Fsystemd.git sd-dhcp-client: set TOS and socket priority by default Also this renames sd_dhcp_client_set_service_type() to _set_ip_service_type(). --- diff --git a/src/libsystemd-network/dhcp-client-internal.h b/src/libsystemd-network/dhcp-client-internal.h index 7db0a91fa94..9e4d0dac865 100644 --- a/src/libsystemd-network/dhcp-client-internal.h +++ b/src/libsystemd-network/dhcp-client-internal.h @@ -78,9 +78,8 @@ struct sd_dhcp_client { void *state_userdata; sd_dhcp_lease *lease; usec_t start_delay; - int ip_service_type; + uint8_t ip_service_type; int socket_priority; - bool socket_priority_set; bool ipv6_acquired; bool bootp; bool send_release; diff --git a/src/libsystemd-network/dhcp-client-send.c b/src/libsystemd-network/dhcp-client-send.c index e8b91a3e7c0..a77f3c2ae70 100644 --- a/src/libsystemd-network/dhcp-client-send.c +++ b/src/libsystemd-network/dhcp-client-send.c @@ -93,7 +93,7 @@ static int client_send_raw( &client->bcast_addr, client->arp_type, client->port, - client->socket_priority_set, + /* so_priority_set= */ true, client->socket_priority); if (fd < 0) return fd; diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index e6e844550ee..5b17a56a4d7 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -22,6 +22,7 @@ #include "network-common.h" #include "random-util.h" #include "set.h" +#include "socket-util.h" #include "string-table.h" #include "string-util.h" #include "time-util.h" @@ -515,7 +516,7 @@ int sd_dhcp_client_get_lease(sd_dhcp_client *client, sd_dhcp_lease **ret) { return 0; } -int sd_dhcp_client_set_service_type(sd_dhcp_client *client, int type) { +int sd_dhcp_client_set_ip_service_type(sd_dhcp_client *client, uint8_t type) { assert_return(client, -EINVAL); assert_return(!sd_dhcp_client_is_running(client), -EBUSY); @@ -528,7 +529,6 @@ int sd_dhcp_client_set_socket_priority(sd_dhcp_client *client, int socket_priori assert_return(client, -EINVAL); assert_return(!sd_dhcp_client_is_running(client), -EBUSY); - client->socket_priority_set = true; client->socket_priority = socket_priority; return 0; @@ -1425,7 +1425,8 @@ int sd_dhcp_client_new(sd_dhcp_client **ret) { .port = DHCP_PORT_CLIENT, .server_port = DHCP_PORT_SERVER, .max_discover_attempts = UINT64_MAX, - .ip_service_type = -1, + .ip_service_type = IPTOS_CLASS_CS6, /* Defaults to CS6 (Internetwork Control). */ + .socket_priority = tos_to_priority(IPTOS_CLASS_CS6), }; FOREACH_ELEMENT(opt, default_req_opts) { diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 909f41563ac..468c3eb920b 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include #include @@ -1670,12 +1671,13 @@ static int dhcp4_configure(Link *link) { } if (link->network->dhcp_ip_service_type >= 0) { - r = sd_dhcp_client_set_service_type(link->dhcp_client, link->network->dhcp_ip_service_type); + assert(link->network->dhcp_ip_service_type <= UINT8_MAX); + r = sd_dhcp_client_set_ip_service_type(link->dhcp_client, link->network->dhcp_ip_service_type); if (r < 0) return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set IP service type: %m"); } - if (link->network->dhcp_socket_priority_set) { + if (link->network->dhcp_socket_priority >= 0) { r = sd_dhcp_client_set_socket_priority(link->dhcp_client, link->network->dhcp_socket_priority); if (r < 0) return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set socket priority: %m"); @@ -2005,14 +2007,13 @@ int config_parse_dhcp_socket_priority( void *data, void *userdata) { - Network *network = ASSERT_PTR(data); - int a, r; + int r, a, *priority = ASSERT_PTR(data); assert(lvalue); assert(rvalue); if (isempty(rvalue)) { - network->dhcp_socket_priority_set = false; + *priority = -1; return 0; } @@ -2022,10 +2023,13 @@ int config_parse_dhcp_socket_priority( "Failed to parse socket priority, ignoring: %s", rvalue); return 0; } + if (a < 0 || a > TC_PRIO_MAX) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Invalid socket priority, must be in 0…%i, ignoring: %i", TC_PRIO_MAX, a); + return 0; + } - network->dhcp_socket_priority_set = true; - network->dhcp_socket_priority = a; - + *priority = a; return 0; } diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index b925cd3a2b4..a5afeed1cb4 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -292,7 +292,7 @@ DHCPv4.SendDecline, config_parse_bool, DHCPv4.DenyList, config_parse_in_addr_prefixes, AF_INET, offsetof(Network, dhcp_deny_listed_ip) DHCPv4.AllowList, config_parse_in_addr_prefixes, AF_INET, offsetof(Network, dhcp_allow_listed_ip) DHCPv4.IPServiceType, config_parse_dhcp_ip_service_type, 0, offsetof(Network, dhcp_ip_service_type) -DHCPv4.SocketPriority, config_parse_dhcp_socket_priority, 0, 0 +DHCPv4.SocketPriority, config_parse_dhcp_socket_priority, 0, offsetof(Network, dhcp_socket_priority) DHCPv4.SendOption, config_parse_dhcp_option_tlv, 0, offsetof(Network, dhcp_extra_options) DHCPv4.SendVendorOption, config_parse_dhcp_option_tlv, 0, offsetof(Network, dhcp_vendor_options) DHCPv4.RouteMTUBytes, config_parse_mtu, AF_INET, offsetof(Network, dhcp_route_mtu) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 5cd47ca0a81..17cf78db37a 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -404,6 +404,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp_client_identifier = _DHCP_CLIENT_ID_INVALID, .dhcp_route_table = RT_TABLE_MAIN, .dhcp_ip_service_type = -1, + .dhcp_socket_priority = -1, .dhcp_broadcast = -1, .dhcp_ipv6_only_mode = -1, .dhcp_6rd_prefix_route_type = RTN_UNREACHABLE, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index c4020a4341a..d1765a2bf46 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -140,7 +140,6 @@ typedef struct Network { int dhcp_critical; int dhcp_ip_service_type; int dhcp_socket_priority; - bool dhcp_socket_priority_set; bool dhcp_anonymize; bool dhcp_send_hostname; bool dhcp_send_hostname_set; diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index 324cc34156c..c0216d36386 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -132,9 +132,9 @@ int sd_dhcp_client_set_mud_url( int sd_dhcp_client_get_lease( sd_dhcp_client *client, sd_dhcp_lease **ret); -int sd_dhcp_client_set_service_type( +int sd_dhcp_client_set_ip_service_type( sd_dhcp_client *client, - int type); + uint8_t type); int sd_dhcp_client_set_socket_priority( sd_dhcp_client *client, int socket_priority);