1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */ 2*4dc78e53SAndroid Build Coastguard Worker /* 3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2012 Thomas Graf <[email protected]> 4*4dc78e53SAndroid Build Coastguard Worker */ 5*4dc78e53SAndroid Build Coastguard Worker 6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_CACHE_H_ 7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_CACHE_H_ 8*4dc78e53SAndroid Build Coastguard Worker 9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h> 10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/msg.h> 11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h> 12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h> 13*4dc78e53SAndroid Build Coastguard Worker 14*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus 15*4dc78e53SAndroid Build Coastguard Worker extern "C" { 16*4dc78e53SAndroid Build Coastguard Worker #endif 17*4dc78e53SAndroid Build Coastguard Worker 18*4dc78e53SAndroid Build Coastguard Worker enum { 19*4dc78e53SAndroid Build Coastguard Worker NL_ACT_UNSPEC, 20*4dc78e53SAndroid Build Coastguard Worker NL_ACT_NEW, 21*4dc78e53SAndroid Build Coastguard Worker NL_ACT_DEL, 22*4dc78e53SAndroid Build Coastguard Worker NL_ACT_GET, 23*4dc78e53SAndroid Build Coastguard Worker NL_ACT_SET, 24*4dc78e53SAndroid Build Coastguard Worker NL_ACT_CHANGE, 25*4dc78e53SAndroid Build Coastguard Worker __NL_ACT_MAX, 26*4dc78e53SAndroid Build Coastguard Worker }; 27*4dc78e53SAndroid Build Coastguard Worker 28*4dc78e53SAndroid Build Coastguard Worker #define NL_ACT_MAX (__NL_ACT_MAX - 1) 29*4dc78e53SAndroid Build Coastguard Worker 30*4dc78e53SAndroid Build Coastguard Worker struct nl_cache; 31*4dc78e53SAndroid Build Coastguard Worker typedef void (*change_func_t)(struct nl_cache *, struct nl_object *, int, void *); 32*4dc78e53SAndroid Build Coastguard Worker typedef void (*change_func_v2_t)(struct nl_cache *, struct nl_object *old_obj, 33*4dc78e53SAndroid Build Coastguard Worker struct nl_object *new_obj, uint64_t, int, void *); 34*4dc78e53SAndroid Build Coastguard Worker 35*4dc78e53SAndroid Build Coastguard Worker /** 36*4dc78e53SAndroid Build Coastguard Worker * @ingroup cache 37*4dc78e53SAndroid Build Coastguard Worker * Explicitely iterate over all address families when updating the cache 38*4dc78e53SAndroid Build Coastguard Worker */ 39*4dc78e53SAndroid Build Coastguard Worker #define NL_CACHE_AF_ITER 0x0001 40*4dc78e53SAndroid Build Coastguard Worker 41*4dc78e53SAndroid Build Coastguard Worker /* Access Functions */ 42*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_nitems(struct nl_cache *); 43*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_nitems_filter(struct nl_cache *, 44*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 45*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache_ops * nl_cache_get_ops(struct nl_cache *); 46*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object * nl_cache_get_first(struct nl_cache *); 47*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object * nl_cache_get_last(struct nl_cache *); 48*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object * nl_cache_get_next(struct nl_object *); 49*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object * nl_cache_get_prev(struct nl_object *); 50*4dc78e53SAndroid Build Coastguard Worker 51*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * nl_cache_alloc(struct nl_cache_ops *); 52*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_alloc_and_fill(struct nl_cache_ops *, 53*4dc78e53SAndroid Build Coastguard Worker struct nl_sock *, 54*4dc78e53SAndroid Build Coastguard Worker struct nl_cache **); 55*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_alloc_name(const char *, 56*4dc78e53SAndroid Build Coastguard Worker struct nl_cache **); 57*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * nl_cache_subset(struct nl_cache *, 58*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 59*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * nl_cache_clone(struct nl_cache *); 60*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_clear(struct nl_cache *); 61*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_get(struct nl_cache *); 62*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_free(struct nl_cache *); 63*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_put(struct nl_cache *cache); 64*4dc78e53SAndroid Build Coastguard Worker 65*4dc78e53SAndroid Build Coastguard Worker /* Cache modification */ 66*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_add(struct nl_cache *, 67*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 68*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_parse_and_add(struct nl_cache *, 69*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *); 70*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_move(struct nl_cache *, 71*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 72*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_remove(struct nl_object *); 73*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_refill(struct nl_sock *, 74*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *); 75*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_pickup(struct nl_sock *, 76*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *); 77*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_pickup_checkdup(struct nl_sock *, 78*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *); 79*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_resync(struct nl_sock *, 80*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *, 81*4dc78e53SAndroid Build Coastguard Worker change_func_t, 82*4dc78e53SAndroid Build Coastguard Worker void *); 83*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_include(struct nl_cache *, 84*4dc78e53SAndroid Build Coastguard Worker struct nl_object *, 85*4dc78e53SAndroid Build Coastguard Worker change_func_t, 86*4dc78e53SAndroid Build Coastguard Worker void *); 87*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_include_v2(struct nl_cache *, 88*4dc78e53SAndroid Build Coastguard Worker struct nl_object *, 89*4dc78e53SAndroid Build Coastguard Worker change_func_v2_t, 90*4dc78e53SAndroid Build Coastguard Worker void *); 91*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_set_arg1(struct nl_cache *, int); 92*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_set_arg2(struct nl_cache *, int); 93*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_set_flags(struct nl_cache *, unsigned int); 94*4dc78e53SAndroid Build Coastguard Worker 95*4dc78e53SAndroid Build Coastguard Worker /* General */ 96*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_is_empty(struct nl_cache *); 97*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object * nl_cache_search(struct nl_cache *, 98*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 99*4dc78e53SAndroid Build Coastguard Worker extern struct nl_object *nl_cache_find(struct nl_cache *, 100*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 101*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_mark_all(struct nl_cache *); 102*4dc78e53SAndroid Build Coastguard Worker 103*4dc78e53SAndroid Build Coastguard Worker /* Dumping */ 104*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_dump(struct nl_cache *, 105*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *); 106*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_dump_filter(struct nl_cache *, 107*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *, 108*4dc78e53SAndroid Build Coastguard Worker struct nl_object *); 109*4dc78e53SAndroid Build Coastguard Worker 110*4dc78e53SAndroid Build Coastguard Worker /* Iterators */ 111*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_foreach(struct nl_cache *, 112*4dc78e53SAndroid Build Coastguard Worker void (*cb)(struct nl_object *, 113*4dc78e53SAndroid Build Coastguard Worker void *), 114*4dc78e53SAndroid Build Coastguard Worker void *arg); 115*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_foreach_filter(struct nl_cache *, 116*4dc78e53SAndroid Build Coastguard Worker struct nl_object *, 117*4dc78e53SAndroid Build Coastguard Worker void (*cb)(struct 118*4dc78e53SAndroid Build Coastguard Worker nl_object *, 119*4dc78e53SAndroid Build Coastguard Worker void *), 120*4dc78e53SAndroid Build Coastguard Worker void *arg); 121*4dc78e53SAndroid Build Coastguard Worker 122*4dc78e53SAndroid Build Coastguard Worker /* --- cache management --- */ 123*4dc78e53SAndroid Build Coastguard Worker 124*4dc78e53SAndroid Build Coastguard Worker /* Cache type management */ 125*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache_ops * nl_cache_ops_lookup(const char *); 126*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache_ops * nl_cache_ops_lookup_safe(const char *); 127*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache_ops * nl_cache_ops_associate(int, int); 128*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache_ops * nl_cache_ops_associate_safe(int, int); 129*4dc78e53SAndroid Build Coastguard Worker extern struct nl_msgtype * nl_msgtype_lookup(struct nl_cache_ops *, int); 130*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_ops_foreach(void (*cb)(struct nl_cache_ops *, void *), void *); 131*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngt_register(struct nl_cache_ops *); 132*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngt_unregister(struct nl_cache_ops *); 133*4dc78e53SAndroid Build Coastguard Worker 134*4dc78e53SAndroid Build Coastguard Worker /* Global cache provisioning/requiring */ 135*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_mngt_provide(struct nl_cache *); 136*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_mngt_unprovide(struct nl_cache *); 137*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * nl_cache_mngt_require(const char *); 138*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * nl_cache_mngt_require_safe(const char *); 139*4dc78e53SAndroid Build Coastguard Worker extern struct nl_cache * __nl_cache_mngt_require(const char *); 140*4dc78e53SAndroid Build Coastguard Worker 141*4dc78e53SAndroid Build Coastguard Worker struct nl_cache_mngr; 142*4dc78e53SAndroid Build Coastguard Worker 143*4dc78e53SAndroid Build Coastguard Worker #define NL_AUTO_PROVIDE 1 144*4dc78e53SAndroid Build Coastguard Worker #define NL_ALLOCATED_SOCK 2 /* For internal use only, do not use */ 145*4dc78e53SAndroid Build Coastguard Worker 146*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_alloc(struct nl_sock *, 147*4dc78e53SAndroid Build Coastguard Worker int, int, 148*4dc78e53SAndroid Build Coastguard Worker struct nl_cache_mngr **); 149*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_alloc_ex(struct nl_sock *, 150*4dc78e53SAndroid Build Coastguard Worker struct nl_sock *, 151*4dc78e53SAndroid Build Coastguard Worker int, int, 152*4dc78e53SAndroid Build Coastguard Worker struct nl_cache_mngr **); 153*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_add(struct nl_cache_mngr *, 154*4dc78e53SAndroid Build Coastguard Worker const char *, 155*4dc78e53SAndroid Build Coastguard Worker change_func_t, 156*4dc78e53SAndroid Build Coastguard Worker void *, 157*4dc78e53SAndroid Build Coastguard Worker struct nl_cache **); 158*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_add_cache(struct nl_cache_mngr *mngr, 159*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *cache, 160*4dc78e53SAndroid Build Coastguard Worker change_func_t cb, void *data); 161*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_add_cache_v2(struct nl_cache_mngr *mngr, 162*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *cache, 163*4dc78e53SAndroid Build Coastguard Worker change_func_v2_t cb, void *data); 164*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_get_fd(struct nl_cache_mngr *); 165*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_poll(struct nl_cache_mngr *, 166*4dc78e53SAndroid Build Coastguard Worker int); 167*4dc78e53SAndroid Build Coastguard Worker extern int nl_cache_mngr_data_ready(struct nl_cache_mngr *); 168*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_mngr_info(struct nl_cache_mngr *, 169*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *); 170*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_mngr_free(struct nl_cache_mngr *); 171*4dc78e53SAndroid Build Coastguard Worker 172*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_ops_get(struct nl_cache_ops *); 173*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_ops_put(struct nl_cache_ops *); 174*4dc78e53SAndroid Build Coastguard Worker extern void nl_cache_ops_set_flags(struct nl_cache_ops *, 175*4dc78e53SAndroid Build Coastguard Worker unsigned int); 176*4dc78e53SAndroid Build Coastguard Worker 177*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus 178*4dc78e53SAndroid Build Coastguard Worker } 179*4dc78e53SAndroid Build Coastguard Worker #endif 180*4dc78e53SAndroid Build Coastguard Worker 181*4dc78e53SAndroid Build Coastguard Worker #endif 182