diff options
-rw-r--r-- | include/netlink/route/link/api.h | 3 | ||||
-rw-r--r-- | lib/route/link/api.c | 32 |
2 files changed, 35 insertions, 0 deletions
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; +} + /** @} */ /** @} */ |