From 36e77218a0d54b6f9be3a9d98efb145dda6b52ad Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 27 Apr 2015 18:06:59 +0200 Subject: [PATCH] platform: add addr parameter to NMPlatformLink --- src/platform/nm-linux-platform.c | 12 ++++++++++++ src/platform/nm-platform.c | 13 +++++++++++++ src/platform/nm-platform.h | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index a711ae2fa..0a2c81a89 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -928,6 +928,7 @@ init_link (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllin GUdevDevice *udev_device; const char *name; char *tmp; + struct nl_addr *nladdr; g_return_val_if_fail (rtnllink, FALSE); @@ -952,6 +953,17 @@ init_link (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllin if (info->type == NM_LINK_TYPE_VLAN) info->vlan_id = rtnl_link_vlan_get_id (rtnllink); + if ((nladdr = rtnl_link_get_addr (rtnllink))) { + unsigned int l = 0; + + l = nl_addr_get_len (nladdr); + if (l > 0 && l <= NM_UTILS_HWADDR_LEN_MAX) { + G_STATIC_ASSERT (NM_UTILS_HWADDR_LEN_MAX == sizeof (info->addr.data)); + memcpy (info->addr.data, nl_addr_get_binary_addr (nladdr), l); + info->addr.len = l; + } + } + udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex)); if (udev_device) { info->driver = nmp_utils_udev_get_driver (udev_device); diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 0d9ae57e3..3c91f6d24 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -38,6 +38,8 @@ #include "nm-enum-types.h" #include "nm-core-internal.h" +G_STATIC_ASSERT (sizeof ( ((NMPlatformLink *) NULL)->addr.data ) == NM_UTILS_HWADDR_LEN_MAX); + #define debug(...) nm_log_dbg (LOGD_PLATFORM, __VA_ARGS__) #define NM_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_PLATFORM, NMPlatformPrivate)) @@ -2759,6 +2761,14 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route) return c < 0 ? -1 : 1; \ } G_STMT_END +#define _CMP_FIELD_MEMCMP_LEN(a, b, field, len) \ + G_STMT_START { \ + int c = memcmp (&((a)->field), &((b)->field), \ + MIN (len, sizeof ((a)->field))); \ + if (c != 0) \ + return c < 0 ? -1 : 1; \ + } G_STMT_END + #define _CMP_FIELD_MEMCMP(a, b, field) \ G_STMT_START { \ int c = memcmp (&((a)->field), &((b)->field), \ @@ -2783,9 +2793,12 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b) _CMP_FIELD (a, b, arp); _CMP_FIELD (a, b, mtu); _CMP_FIELD_BOOL (a, b, initialized); + _CMP_FIELD (a, b, addr.len); _CMP_FIELD_STR_INTERNED (a, b, kind); _CMP_FIELD_STR0 (a, b, udi); _CMP_FIELD_STR_INTERNED (a, b, driver); + if (a->addr.len) + _CMP_FIELD_MEMCMP_LEN (a, b, addr.data, a->addr.len); return 0; } diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 8230ee9c4..91245e5b0 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -101,6 +101,12 @@ struct _NMPlatformLink { int master; int parent; + /* rtnl_link_get_addr() */ + struct { + guint8 data[20]; /* NM_UTILS_HWADDR_LEN_MAX */ + guint8 len; + } addr; + /* rtnl_link_vlan_get_id(), IFLA_VLAN_ID */ guint16 vlan_id;