[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