]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-client: set TOS and socket priority by default 42129/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 2 May 2026 17:50:37 +0000 (02:50 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 16 May 2026 16:34:44 +0000 (01:34 +0900)
Also this renames sd_dhcp_client_set_service_type() to _set_ip_service_type().

src/libsystemd-network/dhcp-client-internal.h
src/libsystemd-network/dhcp-client-send.c
src/libsystemd-network/sd-dhcp-client.c
src/network/networkd-dhcp4.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/systemd/sd-dhcp-client.h

index 7db0a91fa94a1448b8349b281b4fd8ce5c533b1a..9e4d0dac8657f58049c3c90d5398c1ae14d76b04 100644 (file)
@@ -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;
index e8b91a3e7c0bddf3cbc8dfa29105c6f0abe9c36f..a77f3c2ae70f9bbcb8463c0a98a3c4565f42d928 100644 (file)
@@ -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;
index e6e844550ee7d3ae8d28ce364471178924a91d32..5b17a56a4d79bede4315124c5f450db53603ed28 100644 (file)
@@ -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) {
index 909f41563acb269c4f98ac5deb49f9e1995b74d4..468c3eb920b9a88611bed183072b6ccc63aa0a1c 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include <linux/if_arp.h>
+#include <linux/pkt_sched.h>
 #include <linux/rtnetlink.h>
 #include <netinet/in.h>
 #include <netinet/ip.h>
@@ -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;
 }
 
index b925cd3a2b47da47a68684a785990c86885bba80..a5afeed1cb43f5212a5b45c5ce61ff8bdc5ec58b 100644 (file)
@@ -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)
index 5cd47ca0a81ee5dfa3072bb38fb02824b34b2a8d..17cf78db37af046feecb1c56b02cc2b44c009e59 100644 (file)
@@ -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,
index c4020a4341af1e005c605eca1d3ba06c3df5f875..d1765a2bf46d354e04739bc8d0f65a19fd63ab9d 100644 (file)
@@ -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;
index 324cc34156cd566cfe6ff4012ff351454faca9d7..c0216d36386c06ab65e516820696c338f2cf8108 100644 (file)
@@ -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);