summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-02-10 11:54:20 +0100
committerThomas Haller <thaller@redhat.com>2021-02-11 09:23:12 +0100
commit6850e3640e4201316adf6eb1aa1c1bc00aaa9583 (patch)
treeacc231f6023d8bba21df54732f64c51c9f4c0fd8
parenta24b7287d828c715694edecc2f1d03f468639883 (diff)
downloadNetworkManager-6850e3640e4201316adf6eb1aa1c1bc00aaa9583.tar.gz
dhcp/nettools: refactor parsing of DHCP lease (broadcast)
No change in behavior.
-rw-r--r--src/core/dhcp/nm-dhcp-nettools.c27
-rw-r--r--src/core/dhcp/nm-dhcp-utils.c13
-rw-r--r--src/core/dhcp/nm-dhcp-utils.h1
3 files changed, 24 insertions, 17 deletions
diff --git a/src/core/dhcp/nm-dhcp-nettools.c b/src/core/dhcp/nm-dhcp-nettools.c
index 7ba4d9caf3..2456c23a6c 100644
--- a/src/core/dhcp/nm-dhcp-nettools.c
+++ b/src/core/dhcp/nm-dhcp-nettools.c
@@ -513,22 +513,6 @@ lease_parse_server_id(NDhcp4ClientLease *lease, NMIP4Config *ip4_config, GHashTa
}
static void
-lease_parse_broadcast(NDhcp4ClientLease *lease, NMIP4Config *ip4_config, GHashTable *options)
-{
- struct in_addr addr;
- char addr_str[NM_UTILS_INET_ADDRSTRLEN];
-
- if (!lease_get_in_addr(lease, NM_DHCP_OPTION_DHCP4_BROADCAST, &addr))
- return;
-
- _nm_utils_inet4_ntop(addr.s_addr, addr_str);
- nm_dhcp_option_add_option(options,
- _nm_dhcp_option_dhcp4_options,
- NM_DHCP_OPTION_DHCP4_BROADCAST,
- addr_str);
-}
-
-static void
lease_parse_routes(NDhcp4ClientLease *lease,
NMIP4Config * ip4_config,
GHashTable * options,
@@ -821,6 +805,7 @@ lease_to_ip4_config(NMDedupMultiIndex *multi_idx,
const char * v_str;
guint16 v_u16;
gboolean v_bool;
+ in_addr_t v_inaddr;
int r;
g_return_val_if_fail(lease != NULL, NULL);
@@ -832,7 +817,15 @@ lease_to_ip4_config(NMDedupMultiIndex *multi_idx,
return NULL;
lease_parse_server_id(lease, ip4_config, options);
- lease_parse_broadcast(lease, ip4_config, options);
+
+ r = n_dhcp4_client_lease_query(lease, NM_DHCP_OPTION_DHCP4_BROADCAST, &l_data, &l_data_len);
+ if (r == 0 && nm_dhcp_lease_data_parse_in_addr(l_data, l_data_len, &v_inaddr)) {
+ nm_dhcp_option_add_option_in_addr(options,
+ _nm_dhcp_option_dhcp4_options,
+ NM_DHCP_OPTION_DHCP4_BROADCAST,
+ v_inaddr);
+ }
+
lease_parse_routes(lease, ip4_config, options, route_table, route_metric);
lease_parse_address_list(lease, ip4_config, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, options);
diff --git a/src/core/dhcp/nm-dhcp-utils.c b/src/core/dhcp/nm-dhcp-utils.c
index 508c3d0930..b2064153d5 100644
--- a/src/core/dhcp/nm-dhcp-utils.c
+++ b/src/core/dhcp/nm-dhcp-utils.c
@@ -950,3 +950,16 @@ nm_dhcp_lease_data_parse_domain(const guint8 *data, gsize n_data, char **out_val
*out_val = g_steal_pointer(&s);
return TRUE;
}
+
+gboolean
+nm_dhcp_lease_data_parse_in_addr(const guint8 *data, gsize n_data, in_addr_t *out_val)
+{
+ /* - option 28, https://tools.ietf.org/html/rfc2132#section-5.3
+ */
+
+ if (n_data != 4)
+ return FALSE;
+
+ *out_val = unaligned_read_ne32(data);
+ return TRUE;
+}
diff --git a/src/core/dhcp/nm-dhcp-utils.h b/src/core/dhcp/nm-dhcp-utils.h
index 379489a74d..30f850ce1e 100644
--- a/src/core/dhcp/nm-dhcp-utils.h
+++ b/src/core/dhcp/nm-dhcp-utils.h
@@ -48,5 +48,6 @@ gboolean nm_dhcp_lease_data_parse_u16(const guint8 *data, gsize n_data, guint16
gboolean nm_dhcp_lease_data_parse_mtu(const guint8 *data, gsize n_data, guint16 *out_val);
gboolean nm_dhcp_lease_data_parse_cstr(const guint8 *data, gsize n_data, gsize *out_new_len);
gboolean nm_dhcp_lease_data_parse_domain(const guint8 *data, gsize n_data, char **out_val);
+gboolean nm_dhcp_lease_data_parse_in_addr(const guint8 *data, gsize n_data, in_addr_t *out_val);
#endif /* __NETWORKMANAGER_DHCP_UTILS_H__ */