144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * netlink/cache.h		Caching Module
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
98a3efffa5b3fde252675239914118664d36a2c24Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifndef NETLINK_CACHE_H_
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NETLINK_CACHE_H_
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h>
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/msg.h>
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h>
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/object.h>
19d36d396fd0ae94aa2269546a02b5973b4ec27775Thomas Graf#include <netlink/cache-api.h>
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef __cplusplus
2244d362409d5469aed47d19e7908d19bd194493aThomas Grafextern "C" {
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf
2544d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache;
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf
274ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fetttypedef void (*change_func_t)(struct nl_cache *, struct nl_object *, int, void *);
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Access Functions */
3044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_nitems(struct nl_cache *);
3144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_nitems_filter(struct nl_cache *,
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf						       struct nl_object *);
3344d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_cache_ops *	nl_cache_get_ops(struct nl_cache *);
3444d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_object *	nl_cache_get_first(struct nl_cache *);
3544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_object *	nl_cache_get_last(struct nl_cache *);
3644d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_object *	nl_cache_get_next(struct nl_object *);
3744d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_object *	nl_cache_get_prev(struct nl_object *);
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf
3944d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_cache *	nl_cache_alloc(struct nl_cache_ops *);
408a3efffa5b3fde252675239914118664d36a2c24Thomas Grafextern int			nl_cache_alloc_and_fill(struct nl_cache_ops *,
411155370f520cb64657e25153255cf7dc1424317fThomas Graf							struct nl_sock *,
428a3efffa5b3fde252675239914118664d36a2c24Thomas Graf							struct nl_cache **);
438a3efffa5b3fde252675239914118664d36a2c24Thomas Grafextern int			nl_cache_alloc_name(const char *,
448a3efffa5b3fde252675239914118664d36a2c24Thomas Graf						    struct nl_cache **);
4544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_cache *	nl_cache_subset(struct nl_cache *,
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf						struct nl_object *);
4744d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_clear(struct nl_cache *);
4844d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_free(struct nl_cache *);
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Cache modification */
5144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_add(struct nl_cache *,
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf					     struct nl_object *);
5344d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_parse_and_add(struct nl_cache *,
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf						       struct nl_msg *);
5544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_remove(struct nl_object *);
561155370f520cb64657e25153255cf7dc1424317fThomas Grafextern int			nl_cache_refill(struct nl_sock *,
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf						struct nl_cache *);
581155370f520cb64657e25153255cf7dc1424317fThomas Grafextern int			nl_cache_pickup(struct nl_sock *,
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf						struct nl_cache *);
601155370f520cb64657e25153255cf7dc1424317fThomas Grafextern int			nl_cache_resync(struct nl_sock *,
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf						struct nl_cache *,
624ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fett						change_func_t,
634ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fett						void *);
6444d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_include(struct nl_cache *,
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf						 struct nl_object *,
664ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fett						 change_func_t,
674ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fett						 void *);
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf/* General */
7044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_is_empty(struct nl_cache *);
7144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_mark_all(struct nl_cache *);
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf
7344d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Dumping */
7444d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_dump(struct nl_cache *,
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf					      struct nl_dump_params *);
7644d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_dump_filter(struct nl_cache *,
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf						     struct nl_dump_params *,
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf						     struct nl_object *);
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Iterators */
8144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_foreach(struct nl_cache *,
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf						 void (*cb)(struct nl_object *,
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf							    void *),
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf						 void *arg);
8544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_foreach_filter(struct nl_cache *,
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf							struct nl_object *,
8744d362409d5469aed47d19e7908d19bd194493aThomas Graf							void (*cb)(struct
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf								   nl_object *,
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf								   void *),
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf							void *arg);
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf/* --- cache management --- */
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Cache type management */
9544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_cache_ops *	nl_cache_ops_lookup(const char *);
96d36d396fd0ae94aa2269546a02b5973b4ec27775Thomas Grafextern struct nl_cache_ops *	nl_cache_ops_associate(int, int);
97d36d396fd0ae94aa2269546a02b5973b4ec27775Thomas Grafextern struct nl_msgtype *	nl_msgtype_lookup(struct nl_cache_ops *, int);
98d36d396fd0ae94aa2269546a02b5973b4ec27775Thomas Grafextern void			nl_cache_ops_foreach(void (*cb)(struct nl_cache_ops *, void *), void *);
9944d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_mngt_register(struct nl_cache_ops *);
10044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_mngt_unregister(struct nl_cache_ops *);
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Global cache provisioning/requiring */
10344d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_mngt_provide(struct nl_cache *);
10444d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_mngt_unprovide(struct nl_cache *);
10544d362409d5469aed47d19e7908d19bd194493aThomas Grafextern struct nl_cache *	nl_cache_mngt_require(const char *);
10644d362409d5469aed47d19e7908d19bd194493aThomas Graf
10744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache_mngr;
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf#define NL_AUTO_PROVIDE		1
11044d362409d5469aed47d19e7908d19bd194493aThomas Graf
1111155370f520cb64657e25153255cf7dc1424317fThomas Grafextern int			nl_cache_mngr_alloc(struct nl_sock *,
1128a3efffa5b3fde252675239914118664d36a2c24Thomas Graf						    int, int,
1138a3efffa5b3fde252675239914118664d36a2c24Thomas Graf						    struct nl_cache_mngr **);
1148a3efffa5b3fde252675239914118664d36a2c24Thomas Grafextern int			nl_cache_mngr_add(struct nl_cache_mngr *,
11544d362409d5469aed47d19e7908d19bd194493aThomas Graf						  const char *,
1168a3efffa5b3fde252675239914118664d36a2c24Thomas Graf						  change_func_t,
1174ab22ccd47319e7d9a972bcf018e1a03870f64f0Andreas Fett						  void *,
1188a3efffa5b3fde252675239914118664d36a2c24Thomas Graf						  struct nl_cache **);
11944d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_mngr_get_fd(struct nl_cache_mngr *);
12044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_mngr_poll(struct nl_cache_mngr *,
12144d362409d5469aed47d19e7908d19bd194493aThomas Graf						   int);
12244d362409d5469aed47d19e7908d19bd194493aThomas Grafextern int			nl_cache_mngr_data_ready(struct nl_cache_mngr *);
12344d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void			nl_cache_mngr_free(struct nl_cache_mngr *);
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf
12544d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef __cplusplus
12644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
12744d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif
12844d362409d5469aed47d19e7908d19bd194493aThomas Graf
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif
130