diff options
author | Thomas Graf <tgraf@redhat.com> | 2011-10-21 11:31:15 +0200 |
---|---|---|
committer | Thomas Graf <tgraf@redhat.com> | 2011-10-21 11:31:15 +0200 |
commit | 2bcd8ecd27a4c3bad006b43926703c0b60158f42 (patch) | |
tree | 5b182fd6f074d812d2dd5eea4aac1b5423cc721e | |
parent | 30d3f8c199d38d830ff340e521b862d8fe4395b6 (diff) | |
download | libnl-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.h | 7 | ||||
-rw-r--r-- | lib/cache_mngr.c | 6 |
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); } |