summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-06-20 18:25:56 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-07-05 11:04:32 +0200
commit584298b7dade06005b7edc62f9cd029f2262ec99 (patch)
tree7cf92c754dcc2bfa213324e0e041fd3b4acce629
parent0280fd1a808ed55ca58f6c0c137e2f53d0d1686e (diff)
downloadNetworkManager-584298b7dade06005b7edc62f9cd029f2262ec99.tar.gz
dhcp: nettools: support the FQDN option
Add option 81 (FQDN) when the ipv4.dhcp-fqdn property is set. We don't support changing the FQDN flags yet.
-rw-r--r--src/dhcp/nm-dhcp-nettools.c53
1 files changed, 45 insertions, 8 deletions
diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
index 9c5506cb69..693c4955b5 100644
--- a/src/dhcp/nm-dhcp-nettools.c
+++ b/src/dhcp/nm-dhcp-nettools.c
@@ -40,6 +40,7 @@
#include "platform/nm-platform.h"
#include "nm-dhcp-client-logging.h"
#include "n-dhcp4/src/n-dhcp4.h"
+#include "systemd/nm-sd-utils-shared.h"
/*****************************************************************************/
@@ -97,6 +98,7 @@ G_DEFINE_TYPE (NMDhcpNettools, nm_dhcp_nettools, NM_TYPE_DHCP_CLIENT)
#define DHCP_OPTION_IP_ADDRESS_LEASE_TIME 51
#define DHCP_OPTION_SERVER_IDENTIFIER 54
#define DHCP_OPTION_CLIENT_IDENTIFIER 61
+#define DHCP_OPTION_CLIENT_FQDN 81
#define DHCP_OPTION_DOMAIN_SEARCH_LIST 119
#define DHCP_OPTION_CLASSLESS_STATIC_ROUTE 121
#define DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE 249
@@ -106,6 +108,15 @@ G_DEFINE_TYPE (NMDhcpNettools, nm_dhcp_nettools, NM_TYPE_DHCP_CLIENT)
#define DHCP_OPTION_IP_ADDRESS 1024
#define DHCP_OPTION_EXPIRY 1025
+#define DHCP_MAX_FQDN_LENGTH 255
+
+enum {
+ DHCP_FQDN_FLAG_S = (1 << 0),
+ DHCP_FQDN_FLAG_O = (1 << 1),
+ DHCP_FQDN_FLAG_E = (1 << 2),
+ DHCP_FQDN_FLAG_N = (1 << 3),
+};
+
enum {
NM_IN_ADDR_CLASS_A,
NM_IN_ADDR_CLASS_B,
@@ -1244,14 +1255,40 @@ ip4_start (NMDhcpClient *client,
hostname = nm_dhcp_client_get_hostname (client);
if (hostname) {
- /* XXX: select hostname/FQDN */
- r = n_dhcp4_client_probe_config_append_option (config,
- DHCP_OPTION_HOST_NAME,
- hostname,
- strlen (hostname));
- if (r) {
- nm_utils_error_set_errno (error, r, "failed to set DHCP hostname: %s");
- return FALSE;
+ if (nm_dhcp_client_get_use_fqdn (client)) {
+ uint8_t buffer[3 + DHCP_MAX_FQDN_LENGTH];
+
+ buffer[0] = DHCP_FQDN_FLAG_S | /* Request server to perform A RR DNS updates */
+ DHCP_FQDN_FLAG_E; /* Canonical wire format */
+ buffer[1] = 0; /* RCODE1 (deprecated) */
+ buffer[2] = 0; /* RCODE2 (deprecated) */
+
+ r = nm_sd_dns_name_to_wire_format (hostname,
+ buffer + 3,
+ sizeof (buffer) - 3,
+ FALSE);
+ if (r < 0) {
+ nm_utils_error_set_errno (error, r, "failed to convert DHCP FQDN: %s");
+ return FALSE;
+ }
+
+ r = n_dhcp4_client_probe_config_append_option (config,
+ DHCP_OPTION_CLIENT_FQDN,
+ buffer,
+ 3 + r);
+ if (r) {
+ nm_utils_error_set_errno (error, r, "failed to set DHCP FQDN: %s");
+ return FALSE;
+ }
+ } else {
+ r = n_dhcp4_client_probe_config_append_option (config,
+ DHCP_OPTION_HOST_NAME,
+ hostname,
+ strlen (hostname));
+ if (r) {
+ nm_utils_error_set_errno (error, r, "failed to set DHCP hostname: %s");
+ return FALSE;
+ }
}
}