summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-04-29 21:25:43 +0200
committerLubomir Rintel <lkundrak@v3.sk>2016-05-30 16:19:20 +0200
commite5f63f2a509e0cafdf22fc7bc0acb290f9809e31 (patch)
treef19f14c764dcdf6e665920b8d658551ea59db797
parent0c40bce3140666658d51de7217e3d9eade2aa4d7 (diff)
downloadNetworkManager-e5f63f2a509e0cafdf22fc7bc0acb290f9809e31.tar.gz
platform: remove unnecessary NMPlatformLink.inet6_token.is_valid field
The only user of platform who accesses this field is NMDevice, when calling nm_platform_link_get_ipv6_token(). It cares more about whether the token is all-zero or set to something. Another use of inet6_token.is_valid was so that when we receive a netlink message without IFLA_INET6_TOKEN attribute, that we don't treat the value as zero, although it is just unknown. Fix that instead in a better way by setting the value from the cache, if IFLA_AF_SPEC doesn't provide it. Also, when printing the token in nm_platform_link_to_string() treat it as an IPv6 address (inet_ntop).
-rw-r--r--src/platform/nm-linux-platform.c42
-rw-r--r--src/platform/nm-platform.c24
-rw-r--r--src/platform/nm-platform.h7
3 files changed, 44 insertions, 29 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 86a7b749b1..d824c5d6b8 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -798,9 +798,10 @@ _nl_nlmsg_type_to_str (guint16 type, char *buf, gsize len)
static gboolean
_parse_af_inet6 (NMPlatform *platform,
struct nlattr *attr,
- NMUtilsIPv6IfaceId *out_iid,
- guint8 *out_iid_is_valid,
- guint8 *out_addr_gen_mode_inv)
+ NMUtilsIPv6IfaceId *out_token,
+ gboolean *out_token_valid,
+ guint8 *out_addr_gen_mode_inv,
+ gboolean *out_addr_gen_mode_valid)
{
static struct nla_policy policy[IFLA_INET6_MAX+1] = {
[IFLA_INET6_FLAGS] = { .type = NLA_U32 },
@@ -814,7 +815,8 @@ _parse_af_inet6 (NMPlatform *platform,
struct nlattr *tb[IFLA_INET6_MAX+1];
int err;
struct in6_addr i6_token;
- gboolean iid_is_valid = FALSE;
+ gboolean token_valid = FALSE;
+ gboolean addr_gen_mode_valid = FALSE;
guint8 i6_addr_gen_mode_inv = 0;
gboolean success = FALSE;
@@ -831,8 +833,7 @@ _parse_af_inet6 (NMPlatform *platform,
if (_check_addr_or_errout (tb, IFLA_INET6_TOKEN, sizeof (struct in6_addr))) {
nla_memcpy (&i6_token, tb[IFLA_INET6_TOKEN], sizeof (struct in6_addr));
- if (!IN6_IS_ADDR_UNSPECIFIED (&i6_token))
- iid_is_valid = TRUE;
+ token_valid = TRUE;
}
/* Hack to detect support addrgenmode of the kernel. We only parse
@@ -847,14 +848,18 @@ _parse_af_inet6 (NMPlatform *platform,
* to signal "unset". */
goto errout;
}
+ addr_gen_mode_valid = TRUE;
}
success = TRUE;
- if (iid_is_valid) {
- nm_utils_ipv6_interface_identifier_get_from_addr (out_iid, &i6_token);
- *out_iid_is_valid = TRUE;
+ if (token_valid) {
+ *out_token_valid = token_valid;
+ nm_utils_ipv6_interface_identifier_get_from_addr (out_token, &i6_token);
+ }
+ if (addr_gen_mode_valid) {
+ *out_addr_gen_mode_valid = addr_gen_mode_valid;
+ *out_addr_gen_mode_inv = i6_addr_gen_mode_inv;
}
- *out_addr_gen_mode_inv = i6_addr_gen_mode_inv;
errout:
return success;
}
@@ -1429,6 +1434,8 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
NMPObject *lnk_data = NULL;
gboolean address_complete_from_cache = TRUE;
gboolean lnk_data_complete_from_cache = TRUE;
+ gboolean af_inet6_token_valid = FALSE;
+ gboolean af_inet6_addr_gen_mode_valid = FALSE;
if (!nlmsg_valid_hdr (nlh, sizeof (*ifi)))
return NULL;
@@ -1505,9 +1512,10 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
case AF_INET6:
_parse_af_inet6 (platform,
af_attr,
- &obj->link.inet6_token.iid,
- &obj->link.inet6_token.is_valid,
- &obj->link.inet6_addr_gen_mode_inv);
+ &obj->link.inet6_token,
+ &af_inet6_token_valid,
+ &obj->link.inet6_addr_gen_mode_inv,
+ &af_inet6_addr_gen_mode_valid);
break;
}
}
@@ -1549,7 +1557,9 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
if ( completed_from_cache
&& ( lnk_data_complete_from_cache
- || address_complete_from_cache)) {
+ || address_complete_from_cache
+ || !af_inet6_token_valid
+ || !af_inet6_addr_gen_mode_valid)) {
_lookup_cached_link (cache, obj->link.ifindex, completed_from_cache, &link_cached);
if (link_cached) {
if ( lnk_data_complete_from_cache
@@ -1568,6 +1578,10 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
}
if (address_complete_from_cache)
obj->link.addr = link_cached->link.addr;
+ if (!af_inet6_token_valid)
+ obj->link.inet6_token = link_cached->link.inet6_token;
+ if (!af_inet6_addr_gen_mode_valid)
+ obj->link.inet6_addr_gen_mode_inv = link_cached->link.inet6_addr_gen_mode_inv;
}
}
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 500db9b621..0984fb4f01 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -923,8 +923,8 @@ nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6Iface
pllink = nm_platform_link_get (self, ifindex);
- if (pllink && pllink->inet6_token.is_valid) {
- *iid = pllink->inet6_token.iid;
+ if (pllink && pllink->inet6_token.id) {
+ *iid = pllink->inet6_token;
return TRUE;
}
return FALSE;
@@ -3067,7 +3067,7 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
GString *str_flags;
char str_addrmode[30];
gs_free char *str_addr = NULL;
- gs_free char *str_inet6_token = NULL;
+ char str_inet6_token[NM_UTILS_INET_ADDRSTRLEN];
const char *str_link_type;
if (!nm_utils_to_string_buffer_init_null (link, &buf, &len))
@@ -3104,8 +3104,14 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
if (link->addr.len)
str_addr = nm_utils_hwaddr_ntoa (link->addr.data, MIN (link->addr.len, sizeof (link->addr.data)));
- if (link->inet6_token.is_valid)
- str_inet6_token = nm_utils_hwaddr_ntoa (&link->inet6_token.iid, sizeof (link->inet6_token.iid));
+
+ if (link->inet6_token.id) {
+ struct in6_addr a = IN6ADDR_ANY_INIT;
+
+ nm_utils_ipv6_addr_set_interface_identifier (&a, link->inet6_token);
+ nm_utils_inet6_ntop (&a, str_inet6_token);
+ } else
+ str_inet6_token[0] = '\0';
str_link_type = nm_link_type_to_string (link->type);
@@ -3139,8 +3145,8 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
link->inet6_addr_gen_mode_inv ? nm_platform_link_inet6_addrgenmode2str (_nm_platform_uint8_inv (link->inet6_addr_gen_mode_inv), str_addrmode, sizeof (str_addrmode)) : "",
str_addr ? " addr " : "",
str_addr ? str_addr : "",
- str_inet6_token ? " inet6token " : "",
- str_inet6_token ? str_inet6_token : "",
+ str_inet6_token[0] ? " inet6token " : "",
+ str_inet6_token[0] ? str_inet6_token : "",
link->driver ? " driver " : "",
link->driver ? link->driver : "");
g_string_free (str_flags, TRUE);
@@ -3798,13 +3804,11 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b)
_CMP_FIELD (a, b, arptype);
_CMP_FIELD (a, b, addr.len);
_CMP_FIELD (a, b, inet6_addr_gen_mode_inv);
- _CMP_FIELD (a, b, inet6_token.is_valid);
_CMP_FIELD_STR_INTERNED (a, b, kind);
_CMP_FIELD_STR_INTERNED (a, b, driver);
if (a->addr.len)
_CMP_FIELD_MEMCMP_LEN (a, b, addr.data, a->addr.len);
- if (a->inet6_token.is_valid)
- _CMP_FIELD_MEMCMP (a, b, inet6_token.iid);
+ _CMP_FIELD_MEMCMP (a, b, inet6_token);
return 0;
}
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index ed21632836..b0641e20b4 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -147,11 +147,8 @@ struct _NMPlatformLink {
guint8 len;
} addr;
- /* rtnl_link_inet6_get_token() */
- struct {
- NMUtilsIPv6IfaceId iid;
- guint8 is_valid;
- } inet6_token;
+ /* rtnl_link_inet6_get_token(), IFLA_INET6_TOKEN */
+ NMUtilsIPv6IfaceId inet6_token;
/* The bitwise inverse of rtnl_link_inet6_get_addr_gen_mode(). It is inverse
* to have a default of 0 -- meaning: unspecified. That way, a struct