route/link: add link info compare operation

Signed-off-by: Balki Raman <ramanb@cumulusnetworks.com>
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
David Ahern 2015-10-30 15:08:39 -07:00 committed by Thomas Haller
parent acdeaf498d
commit d1c0190241
3 changed files with 29 additions and 0 deletions

View File

@ -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
}

View File

@ -960,6 +960,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;

View File

@ -391,6 +391,28 @@ out:
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);
}
/** @} */
/** @} */