diff --git a/include/netlink/object-api.h b/include/netlink/object-api.h index 70a4ddd..cfd5699 100644 --- a/include/netlink/object-api.h +++ b/include/netlink/object-api.h @@ -337,6 +337,11 @@ struct nl_object_ops char *(*oo_attrs2str)(int, char *, size_t); + + /** + * Get key attributes by family function + */ + uint32_t (*oo_id_attrs_get)(struct nl_object *); }; /** @} */ diff --git a/lib/object.c b/lib/object.c index 055a208..585189e 100644 --- a/lib/object.c +++ b/lib/object.c @@ -291,7 +291,15 @@ int nl_object_identical(struct nl_object *a, struct nl_object *b) if (ops != obj_ops(b)) return 0; - req_attrs = ops->oo_id_attrs; + if (ops->oo_id_attrs_get) { + int req_attrs_a = ops->oo_id_attrs_get(a); + int req_attrs_b = ops->oo_id_attrs_get(b); + if (req_attrs_a != req_attrs_b) + return 0; + req_attrs = req_attrs_a; + } else { + req_attrs = ops->oo_id_attrs; + } if (req_attrs == 0xFFFFFFFF) req_attrs = a->ce_mask & b->ce_mask;