/*
 * A security identifier table (sidtab) is a hash table
 * of security context structures indexed by SID value.
 *
 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
 */

/* Ported to Xen 3.0, George Coker, <gscoker@alpha.ncsc.mil> */

#ifndef _SS_SIDTAB_H_
#define _SS_SIDTAB_H_

#include "context.h"
#include <xen/spinlock.h>

struct sidtab_node {
    u32 sid;        /* security identifier */
    struct context context;    /* security context structure */
    struct sidtab_node *next;
};

#define SIDTAB_HASH_BITS 7
#define SIDTAB_HASH_BUCKETS (1 << SIDTAB_HASH_BITS)
#define SIDTAB_HASH_MASK (SIDTAB_HASH_BUCKETS-1)

#define SIDTAB_SIZE SIDTAB_HASH_BUCKETS

struct sidtab {
    struct sidtab_node **htable;
    unsigned int nel;    /* number of elements */
    unsigned int next_sid;    /* next SID to allocate */
    unsigned char shutdown;
    spinlock_t lock;
};

int sidtab_init(struct sidtab *s);
int sidtab_insert(struct sidtab *s, u32 sid, struct context *context);
struct context *sidtab_search(struct sidtab *s, u32 sid);

int sidtab_map(struct sidtab *s,
    int (*apply) (u32 sid, struct context *context, void *args), void *args);

void sidtab_map_remove_on_error(struct sidtab *s,
    int (*apply) (u32 sid, struct context *context, void *args), void *args);

int sidtab_context_to_sid(struct sidtab *s, struct context *context, u32 *sid);

void sidtab_hash_eval(struct sidtab *h, char *tag);
void sidtab_destroy(struct sidtab *s);
void sidtab_set(struct sidtab *dst, struct sidtab *src);
void sidtab_shutdown(struct sidtab *s);

#endif    /* _SS_SIDTAB_H_ */
