From 2bcd8ecd27a4c3bad006b43926703c0b60158f42 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Fri, 21 Oct 2011 11:31:15 +0200 Subject: [PATCH] cache: event_filter() cache operation to filter notifications Certain notifications need to be filtered out and should not be applied to a cache when a cache is handled by a cache manager. --- include/netlink/cache-api.h | 7 +++++++ lib/cache_mngr.c | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/include/netlink/cache-api.h b/include/netlink/cache-api.h index efae2ed..1b3d099 100644 --- a/include/netlink/cache-api.h +++ b/include/netlink/cache-api.h @@ -201,6 +201,13 @@ struct nl_cache_ops int (*co_msg_parser)(struct nl_cache_ops *, struct sockaddr_nl *, struct nlmsghdr *, struct nl_parser_param *); + /** + * Called whenever a notification has been parsed into an object and + * is considered for inclusion into a cache. Must return NL_SKIP if + * the object should not be included in the cache. + */ + int (*co_event_filter)(struct nl_cache *, struct nl_object *obj); + /** Object operations */ struct nl_object_ops * co_obj_ops; diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c index cfa676b..cf5a951 100644 --- a/lib/cache_mngr.c +++ b/lib/cache_mngr.c @@ -89,12 +89,18 @@ static int include_cb(struct nl_object *obj, struct nl_parser_param *p) { struct nl_cache_assoc *ca = p->pp_arg; + struct nl_cache_ops *ops = ca->ca_cache->c_ops; NL_DBG(2, "Including object %p into cache %p\n", obj, ca->ca_cache); #ifdef NL_DEBUG if (nl_debug >= 4) nl_object_dump(obj, &nl_debug_dp); #endif + + if (ops->co_event_filter) + if (ops->co_event_filter(ca->ca_cache, obj) != NL_OK) + return 0; + return nl_cache_include(ca->ca_cache, obj, ca->ca_change, ca->ca_change_data); }