diff options
| author | Michael Biebl <biebl@debian.org> | 2023-08-09 21:55:35 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2023-08-09 21:55:35 +0200 |
| commit | 05e4a733f2141995181a551854d5df929f084adf (patch) | |
| tree | 83bb937740a6667525ba0df046748ecaa829c269 /src/libnm-glib-aux/nm-inet-utils.h | |
| parent | 14b0f3a9dc9ea90d60a3b057350fd4d637dc021a (diff) | |
New upstream version 1.44.0 upstream/1.44.0
Diffstat (limited to 'src/libnm-glib-aux/nm-inet-utils.h')
| -rw-r--r-- | src/libnm-glib-aux/nm-inet-utils.h | 75 |
1 files changed, 52 insertions, 23 deletions
diff --git a/src/libnm-glib-aux/nm-inet-utils.h b/src/libnm-glib-aux/nm-inet-utils.h index 8421929e..65ceeb2e 100644 --- a/src/libnm-glib-aux/nm-inet-utils.h +++ b/src/libnm-glib-aux/nm-inet-utils.h @@ -3,26 +3,28 @@ #ifndef __NM_INET_UTILS_H__ #define __NM_INET_UTILS_H__ -typedef struct _NMIPAddr { - union { - guint8 addr_ptr[sizeof(struct in6_addr)]; - in_addr_t addr4; - struct in_addr addr4_struct; - struct in6_addr addr6; - - /* NMIPAddr is really a union for IP addresses. - * However, as ethernet addresses fit in here nicely, use - * it also for an ethernet MAC address. */ - guint8 ether_addr_octet[6 /*ETH_ALEN*/]; - NMEtherAddr ether_addr; - - guint8 array[sizeof(struct in6_addr)]; - }; +#include "libnm-std-aux/unaligned-fundamental.h" + +typedef union _NMIPAddr { + guint8 addr_ptr[sizeof(struct in6_addr)]; + in_addr_t addr4; + struct in_addr addr4_struct; + struct in6_addr addr6; + + /* This union field only exists, so that it's guaranteed that NMIPAddr has + * a suitable alignment. We use that with nm_ether_addr_zero macro, that + * aliases nm_ip_addr_zero. */ + NMEtherAddr _ether_addr; } NMIPAddr; -#define NM_IP_ADDR_INIT \ - { \ - .array = { 0 } \ +typedef struct _NMIPAddrTyped { + NMIPAddr addr; + gint8 addr_family; +} NMIPAddrTyped; + +#define NM_IP_ADDR_INIT \ + { \ + .addr_ptr = { 0 } \ } #define _NM_IN6ADDR_INIT(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af) \ @@ -90,14 +92,15 @@ nm_ip_addr_set(int addr_family, gpointer dst, gconstpointer src) static inline gboolean nm_ip_addr_is_null(int addr_family, gconstpointer addr) { - NMIPAddr a; + struct in6_addr a6; - nm_ip_addr_set(addr_family, &a, addr); + nm_assert(addr); if (NM_IS_IPv4(addr_family)) - return a.addr4 == 0; + return unaligned_read_ne32(addr) == 0; - return IN6_IS_ADDR_UNSPECIFIED(&a.addr6); + memcpy(&a6, addr, sizeof(struct in6_addr)); + return IN6_IS_ADDR_UNSPECIFIED(&a6); } static inline NMIPAddr @@ -117,7 +120,7 @@ nm_ip_addr_init(int addr_family, gconstpointer src) /* ensure all bytes of the union are initialized. If only to make * valgrind happy. */ - memset(&a.array[sizeof(in_addr_t)], 0, sizeof(a) - sizeof(in_addr_t)); + memset(&a.addr_ptr[sizeof(in_addr_t)], 0, sizeof(a) - sizeof(in_addr_t)); } else memcpy(&a, src, sizeof(struct in6_addr)); @@ -143,6 +146,30 @@ nm_ip_addr_from_packed_array(int addr_family, gconstpointer ipaddr_arr, gsize id /*****************************************************************************/ +static inline int +nm_ip_addr_typed_cmp(const NMIPAddrTyped *a, const NMIPAddrTyped *b) +{ + NM_CMP_SELF(a, b); + NM_CMP_FIELD(a, b, addr_family); + NM_CMP_DIRECT_MEMCMP(&a->addr, &b->addr, nm_utils_addr_family_to_size(a->addr_family)); + return 0; +} + +static inline gboolean +nm_ip_addr_typed_equal(const NMIPAddrTyped *a, const NMIPAddrTyped *b) +{ + return nm_ip_addr_typed_cmp(a, b) == 0; +} + +static inline void +nm_ip_addr_typed_hash_update(NMHashState *h, const NMIPAddrTyped *addr) +{ + nm_hash_update_vals(h, addr->addr_family); + nm_hash_update_mem(h, &addr->addr, nm_utils_addr_family_to_size(addr->addr_family)); +} + +/*****************************************************************************/ + static inline guint32 nm_ip4_addr_netmask_to_prefix(in_addr_t subnetmask) { @@ -342,6 +369,8 @@ nm_inet6_ntop_dup(const struct in6_addr *addr) /*****************************************************************************/ +int nmtst_inet_aton(const char *text, in_addr_t *out_addr); + gboolean nm_inet_parse_bin_full(int addr_family, gboolean accept_legacy, const char *text, |