summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-05-11 09:42:27 +0200
committerLuca Boccassi <luca.boccassi@gmail.com>2023-05-13 13:37:17 +0200
commit0c3ea0c2222df1b34c12ad5354dc5f835686fc5c (patch)
treefe6198255652c38d44531ee748a1269df7c36bf7
parentMerge pull request #27605 from YHNdnzj/dbus-activation-followup (diff)
downloadsystemd-0c3ea0c2222df1b34c12ad5354dc5f835686fc5c.tar.xz
systemd-0c3ea0c2222df1b34c12ad5354dc5f835686fc5c.zip
sd-dhcp-server: also send DNS servers or friends on DHCPOFFER
From RFC 2131 section 4.3.1 (https://www.rfc-editor.org/rfc/rfc2131#section-4.3.1): ---- The server MUST return to the client: - Parameters requested by the client, according to the following rules: -- IF the server has been explicitly configured with a default value for the parameter, the server MUST include that value in an appropriate option in the 'option' field, ---- The sentence is not only for ACK, but for all (positive) responses, that is DHCPOFFER and DHCPACK. Fixes #27471.
-rw-r--r--src/libsystemd-network/sd-dhcp-server.c57
1 files changed, 27 insertions, 30 deletions
diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c
index 55290ee0f1..196867360f 100644
--- a/src/libsystemd-network/sd-dhcp-server.c
+++ b/src/libsystemd-network/sd-dhcp-server.c
@@ -564,6 +564,15 @@ static int server_send_offer_or_ack(
be32_t address,
uint8_t type) {
+ static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
+ [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
+ [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
+ [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
+ [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
+ [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
+ [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
+ };
+
_cleanup_free_ DHCPPacket *packet = NULL;
sd_dhcp_option *j;
be32_t lease_time;
@@ -619,38 +628,26 @@ static int server_send_offer_or_ack(
return r;
}
- if (type == DHCP_ACK) {
- static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
- [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
- [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
- [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
- [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
- [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
- [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
- };
-
- for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
- if (server->servers[k].size <= 0)
- continue;
-
- r = dhcp_option_append(
- &packet->dhcp, req->max_optlen, &offset, 0,
- option_map[k],
- sizeof(struct in_addr) * server->servers[k].size,
- server->servers[k].addr);
- if (r < 0)
- return r;
- }
+ for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
+ if (server->servers[k].size <= 0)
+ continue;
+ r = dhcp_option_append(
+ &packet->dhcp, req->max_optlen, &offset, 0,
+ option_map[k],
+ sizeof(struct in_addr) * server->servers[k].size,
+ server->servers[k].addr);
+ if (r < 0)
+ return r;
+ }
- if (server->timezone) {
- r = dhcp_option_append(
- &packet->dhcp, req->max_optlen, &offset, 0,
- SD_DHCP_OPTION_TZDB_TIMEZONE,
- strlen(server->timezone), server->timezone);
- if (r < 0)
- return r;
- }
+ if (server->timezone) {
+ r = dhcp_option_append(
+ &packet->dhcp, req->max_optlen, &offset, 0,
+ SD_DHCP_OPTION_TZDB_TIMEZONE,
+ strlen(server->timezone), server->timezone);
+ if (r < 0)
+ return r;
}
ORDERED_SET_FOREACH(j, server->extra_options) {