summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-02-29 16:50:55 +0100
committerThomas Haller <thaller@redhat.com>2016-03-01 15:08:31 +0100
commitcc78e06393fbf2d8ea5a5d3488a68ed2a2cd231e (patch)
tree313c91269c55e14fff27e67cedb4ceb1765084c1
parentbe4472bdcd972c5b80873f565532f8d79b9e472c (diff)
downloadNetworkManager-cc78e06393fbf2d8ea5a5d3488a68ed2a2cd231e.tar.gz
platform: track ifa_flags for cached IPv4 addresses
It's useful to track the flags for IPv4 addresses too. - we might want to sort IPv4 addresses according to whether they are permanent or dynamic. - later we want to set IFA_F_NOPREFIXROUTE also for IPv4 addresses. While the ability to "set" a flag doesn't necessarily require that we also keep the flags present in NMPlatformIP4Address, it is more consistent.
-rw-r--r--src/platform/nm-linux-platform.c8
-rw-r--r--src/platform/nm-platform.c36
-rw-r--r--src/platform/nm-platform.h6
3 files changed, 34 insertions, 16 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 196e75cb1f..b05c68324c 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -1673,11 +1673,9 @@ _new_from_nl_addr (struct nlmsghdr *nlh, gboolean id_only)
obj->ip_address.source = NM_IP_CONFIG_SOURCE_KERNEL;
- if (!is_v4) {
- obj->ip6_address.n_ifa_flags = tb[IFA_FLAGS]
- ? nla_get_u32 (tb[IFA_FLAGS])
- : ifa->ifa_flags;
- }
+ obj->ip_address.n_ifa_flags = tb[IFA_FLAGS]
+ ? nla_get_u32 (tb[IFA_FLAGS])
+ : ifa->ifa_flags;
if (is_v4) {
if (tb[IFA_LABEL]) {
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 69f9812acd..05f9172b58 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -2368,6 +2368,26 @@ _to_string_dev (NMPlatform *self, int ifindex, char *buf, size_t size)
return buf;
}
+#define TO_STRING_IFA_FLAGS_BUF_SIZE 256
+
+static const char *
+_to_string_ifa_flags (guint32 ifa_flags, char *buf, gsize size)
+{
+#define S_FLAGS_PREFIX " flags "
+ nm_assert (buf && size >= TO_STRING_IFA_FLAGS_BUF_SIZE && size > NM_STRLEN (S_FLAGS_PREFIX));
+
+ if (!ifa_flags)
+ buf[0] = '\0';
+ else {
+ nm_platform_addr_flags2str (ifa_flags, &buf[NM_STRLEN (S_FLAGS_PREFIX)], size - NM_STRLEN (S_FLAGS_PREFIX));
+ if (buf[NM_STRLEN (S_FLAGS_PREFIX)] == '\0')
+ buf[0] = '\0';
+ else
+ memcpy (buf, S_FLAGS_PREFIX, NM_STRLEN (S_FLAGS_PREFIX));
+ }
+ return buf;
+}
+
/******************************************************************/
gboolean
@@ -3364,6 +3384,7 @@ nm_platform_lnk_vxlan_to_string (const NMPlatformLnkVxlan *lnk, char *buf, gsize
const char *
nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address, char *buf, gsize len)
{
+ char s_flags[TO_STRING_IFA_FLAGS_BUF_SIZE];
char s_address[INET_ADDRSTRLEN];
char s_peer[INET_ADDRSTRLEN];
char str_dev[TO_STRING_DEV_BUF_SIZE];
@@ -3401,10 +3422,11 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address, char *bu
str_time_p = _lifetime_summary_to_string (now, address->timestamp, address->preferred, address->lifetime, str_time, sizeof (str_time));
g_snprintf (buf, len,
- "%s/%d lft %s pref %s%s%s%s%s src %s",
+ "%s/%d lft %s pref %s%s%s%s%s%s src %s",
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
str_peer ? str_peer : "",
str_dev,
+ _to_string_ifa_flags (address->n_ifa_flags, s_flags, sizeof (s_flags)),
str_label,
source_to_string (address->source));
g_free (str_peer);
@@ -3475,8 +3497,7 @@ NM_UTILS_ENUM2STR_DEFINE (nm_platform_route_scope2str, int,
const char *
nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address, char *buf, gsize len)
{
-#define S_FLAGS_PREFIX " flags "
- char s_flags[256];
+ char s_flags[TO_STRING_IFA_FLAGS_BUF_SIZE];
char s_address[INET6_ADDRSTRLEN];
char s_peer[INET6_ADDRSTRLEN];
char str_lft[30], str_pref[30], str_time[50];
@@ -3497,12 +3518,6 @@ nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address, char *bu
_to_string_dev (NULL, address->ifindex, str_dev, sizeof (str_dev));
- nm_platform_addr_flags2str (address->n_ifa_flags, &s_flags[NM_STRLEN (S_FLAGS_PREFIX)], sizeof (s_flags) - NM_STRLEN (S_FLAGS_PREFIX));
- if (s_flags[NM_STRLEN (S_FLAGS_PREFIX)] == '\0')
- s_flags[0] = '\0';
- else
- memcpy (s_flags, S_FLAGS_PREFIX, NM_STRLEN (S_FLAGS_PREFIX));
-
str_lft_p = _lifetime_to_string (address->timestamp,
address->lifetime ? address->lifetime : NM_PLATFORM_LIFETIME_PERMANENT,
now, str_lft, sizeof (str_lft)),
@@ -3518,7 +3533,7 @@ nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address, char *bu
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
str_peer ? str_peer : "",
str_dev,
- s_flags,
+ _to_string_ifa_flags (address->n_ifa_flags, s_flags, sizeof (s_flags)),
source_to_string (address->source));
g_free (str_peer);
return buf;
@@ -3843,6 +3858,7 @@ nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4A
_CMP_FIELD (a, b, timestamp);
_CMP_FIELD (a, b, lifetime);
_CMP_FIELD (a, b, preferred);
+ _CMP_FIELD (a, b, n_ifa_flags);
_CMP_FIELD_STR (a, b, label);
return 0;
}
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 6d5bd0722e..215c512ff8 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -222,6 +222,11 @@ typedef struct {
guint32 timestamp; \
guint32 lifetime; /* seconds since timestamp */ \
guint32 preferred; /* seconds since timestamp */ \
+ \
+ /* ifa_flags in 'struct ifaddrmsg' from <linux/if_addr.h>, extended to 32 bit by
+ * IFA_FLAGS attribute. */ \
+ guint32 n_ifa_flags; \
+ \
int plen; \
;
@@ -270,7 +275,6 @@ struct _NMPlatformIP6Address {
__NMPlatformIPAddress_COMMON;
struct in6_addr address;
struct in6_addr peer_address;
- guint32 n_ifa_flags; /* ifa_flags from <linux/if_addr.h>, field type "unsigned int" is as used in rtnl_addr_get_flags. */
};
typedef union {