[RFC PATCH 1/4] Add new object op oo_id_attrs_get

roopa at cumulusnetworks.com roopa at cumulusnetworks.com
Mon Nov 5 08:39:36 EST 2012


From: roopa <roopa at cumulusnetworks.com>

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 <roopa at cumulusnetworks.com>
Reviewed-by: Nolan Leake <nolan at cumulusnetworks.com>
Reviewed-by: Shrijeet Mukherjee <shm at cumulusnetworks.com>
Reviewed-by: Wilson Kok <wkok at cumulusnetworks.com>

---
 include/netlink/object-api.h |    5 +++++
 lib/object.c                 |   10 +++++++++-
 2 files changed, 14 insertions(+), 1 deletions(-)

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;
 
-- 
1.7.2.5




More information about the libnl mailing list