From 690264a193c2cf548e3561bec3c7bbe3e4407ee4 Mon Sep 17 00:00:00 2001 From: roopa Date: Thu, 1 Nov 2012 07:15:28 -0700 Subject: [PATCH] Add new object op oo_id_attrs_get The current oo_id_attrs nl_object op allows a fixed id attribute list for an cache. But a cache with multiple families may need to specify different id attributes for different families. An example for this is the bridge fdb entries in the neigh cache: neigh entries belonging to the AF_UNSPEC family use (NEIGH_ATTR_IFINDEX | NEIGH_ATTR_DST | NEIGH_ATTR_FAMILY) as id attributes. AF_BRIDGE fdb entries which also support the same msg type, will need to use (NEIGH_ATTR_LLADDR | NEIGH_ATTR_FAMILY) as id attributes. Today you cannot specify different set of attributes to two families belonging to the same cache. This patch adds a new object function oo_id_attrs_get to get the attributes. An example implementation of oo_id_attrs_get for the neigh cache will look like: static uint32_t neigh_id_attrs_get(struct nl_object *obj) { struct rtnl_neigh *neigh = (struct rtnl_neigh *)obj; if (neigh->n_family == AF_BRIDGE) return (NEIGH_ATTR_LLADDR | NEIGH_ATTR_FAMILY); else return (NEIGH_ATTR_IFINDEX | NEIGH_ATTR_DST | NEIGH_ATTR_FAMILY); } Signed-off-by: Roopa Prabhu Reviewed-by: Nolan Leake Reviewed-by: Shrijeet Mukherjee Reviewed-by: Wilson Kok --- include/netlink/object-api.h | 5 +++++ lib/object.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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; -- 2.40.0