]> granicus.if.org Git - libnl/commitdiff
Add new rtnl_link_af_data_compare function to compare af_data
authorroopa <roopa@cumulusnetworks.com>
Fri, 18 Jan 2013 00:29:03 +0000 (16:29 -0800)
committerThomas Graf <tgraf@suug.ch>
Fri, 18 Jan 2013 13:41:58 +0000 (14:41 +0100)
This patch adds a new api rtnl_linl_af_data_compare to
compare link af_data

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
include/netlink/route/link/api.h
lib/route/link/api.c

index 92a48f76acceaec2fc9b2f751229fbe7c05d34d3..28f246479899aab3708c1fae7baef129cba90609 100644 (file)
@@ -142,6 +142,9 @@ extern void *                       rtnl_link_af_data(const struct rtnl_link *,
                                                const struct rtnl_link_af_ops *);
 extern int                     rtnl_link_af_register(struct rtnl_link_af_ops *);
 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);
 
 #ifdef __cplusplus
 }
index a12eb0931aade455cc6469655577ecd4f26692fc..9387bc59319b2aac7b9aefbaec6ae9ab9f839c2e 100644 (file)
@@ -350,6 +350,38 @@ errout:
        return err;
 }
 
+/**
+ * Compare af data for a link address family
+ * @arg a              Link object a
+ * @arg b              Link object b
+ * @arg family         af data family
+ *
+ * This function will compare af_data between two links
+ * a and b of family given by arg family
+ *
+ * @return 0 if address family specific data matches or is not present
+ * or != 0 if it mismatches.
+ */
+int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b,
+                             int family)
+{
+       struct rtnl_link_af_ops *af_ops = rtnl_link_af_ops_lookup(family);
+
+       if (!af_ops)
+               return ~0;
+
+       if (!a->l_af_data[family] && !b->l_af_data[family])
+               return 0;
+
+       if (!a->l_af_data[family] || !b->l_af_data[family])
+               return ~0;
+
+       if (af_ops->ao_compare)
+               return af_ops->ao_compare(a, b, family, ~0, 0);
+
+       return 0;
+}
+
 /** @} */
 
 /** @} */