summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-11-27 10:38:26 (GMT)
committerThomas Haller <thaller@redhat.com>2014-11-27 11:53:38 (GMT)
commita60b3e46e74f91bde3264c5f5382b87d05fcb917 (patch)
tree892e7603df8bd58f3349570f5390fd037d7da7e4
parentb5a6d365e48051263a6b99500b54b55dba404415 (diff)
downloadlibnl-a60b3e46e74f91bde3264c5f5382b87d05fcb917.zip
libnl-a60b3e46e74f91bde3264c5f5382b87d05fcb917.tar.gz
libnl-a60b3e46e74f91bde3264c5f5382b87d05fcb917.tar.bz2
route/addr: consider CACHEINFO in addr_compare()/nl_object_diff()
Indicate this change of behavior with the capability NL_CAPABILITY_ROUTE_ADDR_COMPARE_CACHEINFO. This is a behavioral change as we now consider an additional field when comparing addresses. Acked-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r--include/netlink/utils.h8
-rw-r--r--lib/route/addr.c2
-rw-r--r--lib/utils.c2
3 files changed, 11 insertions, 1 deletions
diff --git a/include/netlink/utils.h b/include/netlink/utils.h
index 431502f..a172f3a 100644
--- a/include/netlink/utils.h
+++ b/include/netlink/utils.h
@@ -121,6 +121,14 @@ enum {
NL_CAPABILITY_ROUTE_LINK_GET_KERNEL_FAIL_OPNOTSUPP = 5,
#define NL_CAPABILITY_ROUTE_LINK_GET_KERNEL_FAIL_OPNOTSUPP NL_CAPABILITY_ROUTE_LINK_GET_KERNEL_FAIL_OPNOTSUPP
+ /**
+ * Also consider the a_cacheinfo field (ADDR_ATTR_CACHEINFO) that contains the
+ * address timestamps and expiry when comparing struct rtnl_addr objects with
+ * nl_object_diff().
+ */
+ NL_CAPABILITY_ROUTE_ADDR_COMPARE_CACHEINFO = 6,
+#define NL_CAPABILITY_ROUTE_ADDR_COMPARE_CACHEINFO NL_CAPABILITY_ROUTE_ADDR_COMPARE_CACHEINFO
+
__NL_CAPABILITY_MAX
#define NL_CAPABILITY_MAX (__NL_CAPABILITY_MAX - 1)
};
diff --git a/lib/route/addr.c b/lib/route/addr.c
index 426b4dc..3bde2bf 100644
--- a/lib/route/addr.c
+++ b/lib/route/addr.c
@@ -448,6 +448,8 @@ static int addr_compare(struct nl_object *_a, struct nl_object *_b,
b->a_multicast));
diff |= ADDR_DIFF(BROADCAST, nl_addr_cmp(a->a_bcast, b->a_bcast));
diff |= ADDR_DIFF(ANYCAST, nl_addr_cmp(a->a_anycast, b->a_anycast));
+ diff |= ADDR_DIFF(CACHEINFO, memcmp(&a->a_cacheinfo, &b->a_cacheinfo,
+ sizeof (a->a_cacheinfo)));
if (flags & LOOSE_COMPARISON)
diff |= ADDR_DIFF(FLAGS,
diff --git a/lib/utils.c b/lib/utils.c
index 795eeb7..5e853f1 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -1149,7 +1149,7 @@ int nl_has_capability (int capability)
NL_CAPABILITY_ROUTE_LINK_CLS_ADD_ACT_OWN_REFERENCE,
NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE,
NL_CAPABILITY_ROUTE_LINK_GET_KERNEL_FAIL_OPNOTSUPP,
- 0,
+ NL_CAPABILITY_ROUTE_ADDR_COMPARE_CACHEINFO,
0,
0),
#undef _NL_SET