/*
* validator/val_kcache.h - validator key shared cache with validated keys
*
* Copyright (c) 2007, NLnet Labs. All rights reserved.
*
* This software is open source.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the NLNET LABS nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* \file
*
* This file contains functions for caching validated key entries.
*/
#ifndef VALIDATOR_VAL_KCACHE_H
#define VALIDATOR_VAL_KCACHE_H
#include "util/storage/slabhash.h"
struct key_entry_key;
struct key_entry_data;
struct config_file;
struct regional;
struct module_qstate;
/**
* Key cache
*/
struct key_cache {
/** uses slabhash for storage, type key_entry_key, key_entry_data */
struct slabhash* slab;
};
/**
* Create the key cache
* @param cfg: config settings for the key cache.
* @return new key cache or NULL on malloc failure.
*/
struct key_cache* key_cache_create(struct config_file* cfg);
/**
* Delete the key cache
* @param kcache: to delete
*/
void key_cache_delete(struct key_cache* kcache);
/**
* Insert or update a key cache entry. Note that the insert may silently
* fail if there is not enough memory.
*
* @param kcache: the key cache.
* @param kkey: key entry key, assumed malloced in a region, is copied
* to perform update or insertion. Its data pointer is also copied.
* @param qstate: store errinf reason in case its bad.
*/
void key_cache_insert(struct key_cache* kcache, struct key_entry_key* kkey,
struct module_qstate* qstate);
/**
* Remove an entry from the key cache.
* @param kcache: the key cache.
* @param name: for what name to look; uncompressed wireformat
* @param namelen: length of the name.
* @param key_class: class of the key.
*/
void key_cache_remove(struct key_cache* kcache,
uint8_t* name, size_t namelen, uint16_t key_class);
/**
* Lookup key entry in the cache. Looks up the closest key entry above the
* given name.
* @param kcache: the key cache.
* @param name: for what name to look; uncompressed wireformat
* @param namelen: length of the name.
* @param key_class: class of the key.
* @param region: a copy of the key_entry is allocated in this region.
* @param now: current time.
* @return pointer to a newly allocated key_entry copy in the region, if
* a key entry could be found, and allocation succeeded and TTL was OK.
* Otherwise, NULL is returned.
*/
struct key_entry_key* key_cache_obtain(struct key_cache* kcache,
uint8_t* name, size_t namelen, uint16_t key_class,
struct regional* region, time_t now);
/**
* Get memory in use by the key cache.
* @param kcache: the key cache.
* @return memory in use in bytes.
*/
size_t key_cache_get_mem(struct key_cache* kcache);
#endif /* VALIDATOR_VAL_KCACHE_H */