summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Graf <tgraf@redhat.com>2011-10-21 11:31:15 +0200
committerThomas Graf <tgraf@redhat.com>2011-10-21 11:31:15 +0200
commit2bcd8ecd27a4c3bad006b43926703c0b60158f42 (patch)
tree5b182fd6f074d812d2dd5eea4aac1b5423cc721e
parent30d3f8c199d38d830ff340e521b862d8fe4395b6 (diff)
downloadlibnl-2bcd8ecd27a4c3bad006b43926703c0b60158f42.tar.gz
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.
-rw-r--r--include/netlink/cache-api.h7
-rw-r--r--lib/cache_mngr.c6
2 files changed, 13 insertions, 0 deletions
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);
}