From: roopa Date: Fri, 18 Jan 2013 00:29:03 +0000 (-0800) Subject: Add new rtnl_link_af_data_compare function to compare af_data X-Git-Tag: libnl3_2_20~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99399ca9c07499cfeadf4a24a9b66006d3b48b40;p=libnl Add new rtnl_link_af_data_compare function to compare af_data This patch adds a new api rtnl_linl_af_data_compare to compare link af_data Signed-off-by: Roopa Prabhu Signed-off-by: Thomas Graf --- diff --git a/include/netlink/route/link/api.h b/include/netlink/route/link/api.h index 92a48f7..28f2464 100644 --- a/include/netlink/route/link/api.h +++ b/include/netlink/route/link/api.h @@ -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 } diff --git a/lib/route/link/api.c b/lib/route/link/api.c index a12eb09..9387bc5 100644 --- a/lib/route/link/api.c +++ b/lib/route/link/api.c @@ -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; +} + /** @} */ /** @} */