[PATCH 1/3] route/link: Add link info compare operation
David Ahern
dsa at cumulusnetworks.com
Fri Oct 30 15:08:39 PDT 2015
Signed-off-by: Balki Raman <ramanb at cumulusnetworks.com>
Signed-off-by: David Ahern <dsa at cumulusnetworks.com>
---
include/netlink-private/route/link/api.h | 6 ++++++
lib/route/link.c | 1 +
lib/route/link/api.c | 22 ++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/include/netlink-private/route/link/api.h b/include/netlink-private/route/link/api.h
index bb98cccb080f..85f83f39539d 100644
--- a/include/netlink-private/route/link/api.h
+++ b/include/netlink-private/route/link/api.h
@@ -60,6 +60,10 @@ struct rtnl_link_info_ops
* in either io_alloc() or io_parse(). */
void (*io_free)(struct rtnl_link *);
+ /** Called to compare link info parameters between two links. */
+ int (*io_compare)(struct rtnl_link *, struct rtnl_link *,
+ uint32_t attrs, int flags);
+
struct nl_list_head io_list;
};
@@ -145,6 +149,8 @@ extern int rtnl_link_af_unregister(struct rtnl_link_af_ops *);
extern int rtnl_link_af_data_compare(struct rtnl_link *a,
struct rtnl_link *b,
int family);
+extern int rtnl_link_info_data_compare(struct rtnl_link *a,
+ struct rtnl_link *b);
#ifdef __cplusplus
}
diff --git a/lib/route/link.c b/lib/route/link.c
index 5c3255022dff..c61965b5df8a 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -949,6 +949,7 @@ static int link_compare(struct nl_object *_a, struct nl_object *_b,
goto protinfo_mismatch;
}
+ diff |= LINK_DIFF(LINKINFO, rtnl_link_info_data_compare(a, b) != 0);
out:
return diff;
diff --git a/lib/route/link/api.c b/lib/route/link/api.c
index 6d1e12f88b21..00893ad051b1 100644
--- a/lib/route/link/api.c
+++ b/lib/route/link/api.c
@@ -391,6 +391,28 @@ int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b,
return ret;
}
+/**
+ * Compare link info data
+ * @arg a Link object a
+ * @arg b Link object b
+ *
+ * This function will compare link_info data between two links
+ * a and b
+ *
+ * @return 0 if link_info data matches or is not present
+ * or != 0 if it mismatches.
+ */
+int rtnl_link_info_data_compare(struct rtnl_link *a, struct rtnl_link *b)
+{
+ if (a->l_info_ops != b->l_info_ops)
+ return ~0;
+
+ if (!a->l_info_ops || !a->l_info_ops->io_compare)
+ return 0;
+
+ return a->l_info_ops->io_compare(a, b, ~0, 0);
+}
+
/** @} */
/** @} */
--
2.1.4
More information about the libnl
mailing list