summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-02-20 16:17:55 +0100
committerThomas Haller <thaller@redhat.com>2023-02-21 09:13:08 +0100
commit4c18adbc746997e3687cacf11d0129fc87619822 (patch)
tree603c5abde1a31f034bb1abadea9505eeb48481a9
parent69106d0aef1022bb1959f9badc0515134969e5d5 (diff)
downloadNetworkManager-4c18adbc746997e3687cacf11d0129fc87619822.tar.gz
base: add nm_dhcp_iaid_{from,to}_hexstr() helpers
-rw-r--r--src/libnm-base/nm-base.c30
-rw-r--r--src/libnm-base/nm-base.h8
-rw-r--r--src/libnm-core-impl/tests/test-general.c29
3 files changed, 67 insertions, 0 deletions
diff --git a/src/libnm-base/nm-base.c b/src/libnm-base/nm-base.c
index f81b285c4e..fa64372fd8 100644
--- a/src/libnm-base/nm-base.c
+++ b/src/libnm-base/nm-base.c
@@ -9,3 +9,33 @@
NM_CACHED_QUARK_FCN("nm-crypto-error-quark", _nm_crypto_error_quark);
/*****************************************************************************/
+
+char *
+nm_dhcp_iaid_to_hexstr(guint32 iaid, char buf[static NM_DHCP_IAID_TO_HEXSTR_BUF_LEN])
+{
+ iaid = htobe32(iaid);
+ return nm_utils_bin2hexstr_full(&iaid, sizeof(iaid), ':', FALSE, buf);
+}
+
+gboolean
+nm_dhcp_iaid_from_hexstr(const char *str, guint32 *out_value)
+{
+ union {
+ guint32 num;
+ guint8 bin[sizeof(guint32)];
+ } iaid;
+
+ if (!nm_utils_hexstr2bin_full(str,
+ TRUE,
+ FALSE,
+ FALSE,
+ ":",
+ sizeof(iaid),
+ iaid.bin,
+ sizeof(iaid),
+ NULL))
+ return FALSE;
+
+ NM_SET_OUT(out_value, be32toh(iaid.num));
+ return TRUE;
+}
diff --git a/src/libnm-base/nm-base.h b/src/libnm-base/nm-base.h
index 74e8142f21..77d2ef0a16 100644
--- a/src/libnm-base/nm-base.h
+++ b/src/libnm-base/nm-base.h
@@ -423,4 +423,12 @@ typedef enum {
NM_DNS_IP_CONFIG_TYPE_VPN,
} NMDnsIPConfigType;
+/*****************************************************************************/
+
+#define NM_DHCP_IAID_TO_HEXSTR_BUF_LEN (3 * sizeof(guint32))
+
+char *nm_dhcp_iaid_to_hexstr(guint32 iaid, char buf[static NM_DHCP_IAID_TO_HEXSTR_BUF_LEN]);
+
+gboolean nm_dhcp_iaid_from_hexstr(const char *str, guint32 *out_value);
+
#endif /* __NM_LIBNM_BASE_H__ */
diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c
index f6684bfbc8..316d64fb7a 100644
--- a/src/libnm-core-impl/tests/test-general.c
+++ b/src/libnm-core-impl/tests/test-general.c
@@ -11352,6 +11352,34 @@ test_dnsname(void)
/*****************************************************************************/
+static void
+test_dhcp_iaid_hexstr(void)
+{
+ char str[NM_DHCP_IAID_TO_HEXSTR_BUF_LEN];
+ int i;
+
+ for (i = 0; i < 10; i++) {
+ guint32 iaid = nmtst_get_rand_uint32();
+ guint32 iaid2;
+ char *s;
+ gboolean r;
+
+ s = nm_dhcp_iaid_to_hexstr(iaid, str);
+ g_assert(s == str);
+ g_assert(strlen(s) < sizeof(str));
+
+ r = nm_dhcp_iaid_from_hexstr(str, &iaid2);
+ g_assert(r);
+ g_assert_cmpint(iaid, ==, iaid2);
+ }
+
+ g_assert_cmpstr(nm_dhcp_iaid_to_hexstr(0, str), ==, "00:00:00:00");
+ g_assert_cmpstr(nm_dhcp_iaid_to_hexstr(1, str), ==, "00:00:00:01");
+ g_assert_cmpstr(nm_dhcp_iaid_to_hexstr(0x01002044, str), ==, "01:00:20:44");
+}
+
+/*****************************************************************************/
+
NMTST_DEFINE();
int
@@ -11699,6 +11727,7 @@ main(int argc, char **argv)
g_test_add_func("/core/general/test_direct_string_is_refstr", test_direct_string_is_refstr);
g_test_add_func("/core/general/test_connection_path", test_connection_path);
g_test_add_func("/core/general/test_dnsname", test_dnsname);
+ g_test_add_func("/core/general/test_dhcp_iaid_hexstr", test_dhcp_iaid_hexstr);
return g_test_run();
}