summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Giudici <fgiudici@redhat.com>2019-05-17 12:37:46 +0200
committerFrancesco Giudici <fgiudici@redhat.com>2019-07-05 15:08:31 +0200
commitf42754c8d7e1fb62a268edc412da835e754e30c3 (patch)
tree90085ec1678c8b0f45860f4e9b95358a4862438a
parenta6036b2352a904dec0a574fcf6c221b31cf33fb9 (diff)
downloadNetworkManager-f42754c8d7e1fb62a268edc412da835e754e30c3.tar.gz
dhcp/internal: expose on D-Bus all the private dhcp options
when dhclient is used as the dhcp client in NetworkManager we expose on D-Bus all the variables that are passed to our script file. In particular, we use the variable names there as labels (stripping the heading "new") taking whatever dhclient passes us. There are few exception to this. Dhclient allows to redefine option variable names and we use this functionality for a few dhcp options: dhcp option code 121 --> "rfc3442_classless_static_routes" dhcp option code 249 --> "ms_classless_static_routes" dhcp option code 252 --> "wpad" Note that for private dhcp options (224-254) default dhclient labels are in the form "unknown_$OPTNUM".
-rw-r--r--src/dhcp/nm-dhcp-systemd.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c
index 671fe0be6a..336b47aa97 100644
--- a/src/dhcp/nm-dhcp-systemd.c
+++ b/src/dhcp/nm-dhcp-systemd.c
@@ -37,6 +37,7 @@
#include "platform/nm-platform.h"
#include "nm-dhcp-client-logging.h"
#include "systemd/nm-sd.h"
+#include "systemd/nm-sd-utils-dhcp.h"
/*****************************************************************************/
@@ -81,6 +82,37 @@ G_DEFINE_TYPE (NMDhcpSystemd, nm_dhcp_systemd, NM_TYPE_DHCP_CLIENT)
#define DHCP_OPTION_NIS_DOMAIN 40
#define DHCP_OPTION_NIS_SERVERS 41
+#define DHCP_OPTION_PRIVATE_224 SD_DHCP_OPTION_PRIVATE_BASE
+#define DHCP_OPTION_PRIVATE_225 225
+#define DHCP_OPTION_PRIVATE_226 226
+#define DHCP_OPTION_PRIVATE_227 227
+#define DHCP_OPTION_PRIVATE_228 228
+#define DHCP_OPTION_PRIVATE_229 229
+#define DHCP_OPTION_PRIVATE_230 230
+#define DHCP_OPTION_PRIVATE_231 231
+#define DHCP_OPTION_PRIVATE_232 232
+#define DHCP_OPTION_PRIVATE_233 233
+#define DHCP_OPTION_PRIVATE_234 234
+#define DHCP_OPTION_PRIVATE_235 235
+#define DHCP_OPTION_PRIVATE_236 236
+#define DHCP_OPTION_PRIVATE_237 237
+#define DHCP_OPTION_PRIVATE_238 238
+#define DHCP_OPTION_PRIVATE_239 239
+#define DHCP_OPTION_PRIVATE_240 240
+#define DHCP_OPTION_PRIVATE_241 241
+#define DHCP_OPTION_PRIVATE_242 242
+#define DHCP_OPTION_PRIVATE_243 243
+#define DHCP_OPTION_PRIVATE_244 244
+#define DHCP_OPTION_PRIVATE_245 245
+#define DHCP_OPTION_PRIVATE_246 246
+#define DHCP_OPTION_PRIVATE_247 247
+#define DHCP_OPTION_PRIVATE_248 248
+#define DHCP_OPTION_PRIVATE_249 SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE
+#define DHCP_OPTION_PRIVATE_250 250
+#define DHCP_OPTION_PRIVATE_251 251
+#define DHCP_OPTION_PRIVATE_252 SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY
+#define DHCP_OPTION_PRIVATE_253 253
+#define DHCP_OPTION_PRIVATE_254 SD_DHCP_OPTION_PRIVATE_LAST
/* Internal values */
#define DHCP_OPTION_IP_ADDRESS 1024
@@ -138,6 +170,37 @@ static const ReqOption dhcp4_requests[] = {
REQ (SD_DHCP_OPTION_RENEWAL_T1_TIME, "dhcp_renewal_time", FALSE ),
REQ (SD_DHCP_OPTION_REBINDING_T2_TIME, "dhcp_rebinding_time", FALSE ),
REQ (SD_DHCP_OPTION_NEW_TZDB_TIMEZONE, "tcode", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_224, "private_224", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_225, "private_225", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_226, "private_226", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_227, "private_227", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_228, "private_228", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_229, "private_229", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_230, "private_230", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_231, "private_231", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_232, "private_232", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_233, "private_233", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_234, "private_234", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_235, "private_235", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_236, "private_236", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_237, "private_237", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_238, "private_238", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_239, "private_239", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_240, "private_240", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_241, "private_241", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_242, "private_242", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_243, "private_243", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_244, "private_244", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_245, "private_245", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_246, "private_246", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_247, "private_247", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_248, "private_248", FALSE ),
+ /* DHCP_OPTION_PRIVATE_249 = SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE */
+ REQ (DHCP_OPTION_PRIVATE_250, "private_250", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_251, "private_251", FALSE ),
+ /* DHCP_OPTION_PRIVATE_252 = SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY */
+ REQ (DHCP_OPTION_PRIVATE_253, "private_253", FALSE ),
+ REQ (DHCP_OPTION_PRIVATE_254, "private_254", FALSE ),
/* Internal values */
REQ (DHCP_OPTION_IP_ADDRESS, "ip_address", FALSE ),
@@ -282,6 +345,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
guint32 a_lifetime;
guint32 renewal;
guint32 rebinding;
+ gs_free nm_sd_dhcp_option *private_options = NULL;
g_return_val_if_fail (lease != NULL, NULL);
@@ -626,6 +690,27 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
metered = !!memmem (data, data_len, "ANDROID_METERED", NM_STRLEN ("ANDROID_METERED"));
nm_ip4_config_set_metered (ip4_config, metered);
+ num = nm_sd_dhcp_lease_get_private_options (lease, &private_options);
+ if (num > 0) {
+ for (i = 0; i < num; i++) {
+ char *option_string;
+
+ option_string = nm_utils_bin2hexstr_full (private_options[i].data,
+ private_options[i].data_len,
+ ':', FALSE, NULL);
+ LOG_LEASE (LOGD_DHCP4, "%s '%s'",
+ request_string (dhcp4_requests, private_options[i].code),
+ option_string);
+ if (!options) {
+ g_free (option_string);
+ continue;
+ }
+ take_option (options,
+ dhcp4_requests,
+ private_options[i].code,
+ option_string);
+ }
+ }
NM_SET_OUT (out_options, g_steal_pointer (&options));
return g_steal_pointer (&ip4_config);
}