Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * An extensible bitmap is a bitmap that supports an
  3 * arbitrary number of bits.  Extensible bitmaps are
  4 * used to represent sets of values, such as types,
  5 * roles, categories, and classes.
  6 *
  7 * Each extensible bitmap is implemented as a linked
  8 * list of bitmap nodes, where each bitmap node has
  9 * an explicitly specified starting bit position within
 10 * the total bitmap.
 11 *
 12 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
 13 */
 14#ifndef _SS_EBITMAP_H_
 15#define _SS_EBITMAP_H_
 16
 17#include <net/netlabel.h>
 18
 19#ifdef CONFIG_64BIT
 20#define	EBITMAP_NODE_SIZE	64
 21#else
 22#define	EBITMAP_NODE_SIZE	32
 23#endif
 24
 25#define EBITMAP_UNIT_NUMS	((EBITMAP_NODE_SIZE-sizeof(void *)-sizeof(u32))\
 26					/ sizeof(unsigned long))
 27#define EBITMAP_UNIT_SIZE	BITS_PER_LONG
 28#define EBITMAP_SIZE		(EBITMAP_UNIT_NUMS * EBITMAP_UNIT_SIZE)
 29#define EBITMAP_BIT		1ULL
 30#define EBITMAP_SHIFT_UNIT_SIZE(x)					\
 31	(((x) >> EBITMAP_UNIT_SIZE / 2) >> EBITMAP_UNIT_SIZE / 2)
 32
 33struct ebitmap_node {
 34	struct ebitmap_node *next;
 35	unsigned long maps[EBITMAP_UNIT_NUMS];
 36	u32 startbit;
 37};
 38
 39struct ebitmap {
 40	struct ebitmap_node *node;	/* first node in the bitmap */
 41	u32 highbit;	/* highest position in the total bitmap */
 42};
 43
 44#define ebitmap_length(e) ((e)->highbit)
 45
 46static inline unsigned int ebitmap_start_positive(struct ebitmap *e,
 47						  struct ebitmap_node **n)
 48{
 49	unsigned int ofs;
 50
 51	for (*n = e->node; *n; *n = (*n)->next) {
 52		ofs = find_first_bit((*n)->maps, EBITMAP_SIZE);
 53		if (ofs < EBITMAP_SIZE)
 54			return (*n)->startbit + ofs;
 55	}
 56	return ebitmap_length(e);
 57}
 58
 59static inline void ebitmap_init(struct ebitmap *e)
 60{
 61	memset(e, 0, sizeof(*e));
 62}
 63
 64static inline unsigned int ebitmap_next_positive(struct ebitmap *e,
 65						 struct ebitmap_node **n,
 66						 unsigned int bit)
 67{
 68	unsigned int ofs;
 69
 70	ofs = find_next_bit((*n)->maps, EBITMAP_SIZE, bit - (*n)->startbit + 1);
 71	if (ofs < EBITMAP_SIZE)
 72		return ofs + (*n)->startbit;
 73
 74	for (*n = (*n)->next; *n; *n = (*n)->next) {
 75		ofs = find_first_bit((*n)->maps, EBITMAP_SIZE);
 76		if (ofs < EBITMAP_SIZE)
 77			return ofs + (*n)->startbit;
 78	}
 79	return ebitmap_length(e);
 80}
 81
 82#define EBITMAP_NODE_INDEX(node, bit)	\
 83	(((bit) - (node)->startbit) / EBITMAP_UNIT_SIZE)
 84#define EBITMAP_NODE_OFFSET(node, bit)	\
 85	(((bit) - (node)->startbit) % EBITMAP_UNIT_SIZE)
 86
 87static inline int ebitmap_node_get_bit(struct ebitmap_node *n,
 88				       unsigned int bit)
 89{
 90	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
 91	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
 92
 93	BUG_ON(index >= EBITMAP_UNIT_NUMS);
 94	if ((n->maps[index] & (EBITMAP_BIT << ofs)))
 95		return 1;
 96	return 0;
 97}
 98
 99static inline void ebitmap_node_set_bit(struct ebitmap_node *n,
100					unsigned int bit)
101{
102	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
103	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
104
105	BUG_ON(index >= EBITMAP_UNIT_NUMS);
106	n->maps[index] |= (EBITMAP_BIT << ofs);
107}
108
109static inline void ebitmap_node_clr_bit(struct ebitmap_node *n,
110					unsigned int bit)
111{
112	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
113	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
114
115	BUG_ON(index >= EBITMAP_UNIT_NUMS);
116	n->maps[index] &= ~(EBITMAP_BIT << ofs);
117}
118
119#define ebitmap_for_each_positive_bit(e, n, bit)	\
120	for (bit = ebitmap_start_positive(e, &n);	\
121	     bit < ebitmap_length(e);			\
122	     bit = ebitmap_next_positive(e, &n, bit))	\
123
124int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2);
125int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src);
126int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2, u32 last_e2bit);
127int ebitmap_get_bit(struct ebitmap *e, unsigned long bit);
 
128int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
129void ebitmap_destroy(struct ebitmap *e);
130int ebitmap_read(struct ebitmap *e, void *fp);
131int ebitmap_write(struct ebitmap *e, void *fp);
 
132
133#ifdef CONFIG_NETLABEL
134int ebitmap_netlbl_export(struct ebitmap *ebmap,
135			  struct netlbl_lsm_catmap **catmap);
136int ebitmap_netlbl_import(struct ebitmap *ebmap,
137			  struct netlbl_lsm_catmap *catmap);
138#else
139static inline int ebitmap_netlbl_export(struct ebitmap *ebmap,
140					struct netlbl_lsm_catmap **catmap)
141{
142	return -ENOMEM;
143}
144static inline int ebitmap_netlbl_import(struct ebitmap *ebmap,
145					struct netlbl_lsm_catmap *catmap)
146{
147	return -ENOMEM;
148}
149#endif
150
151#endif	/* _SS_EBITMAP_H_ */
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * An extensible bitmap is a bitmap that supports an
  4 * arbitrary number of bits.  Extensible bitmaps are
  5 * used to represent sets of values, such as types,
  6 * roles, categories, and classes.
  7 *
  8 * Each extensible bitmap is implemented as a linked
  9 * list of bitmap nodes, where each bitmap node has
 10 * an explicitly specified starting bit position within
 11 * the total bitmap.
 12 *
 13 * Author : Stephen Smalley, <sds@tycho.nsa.gov>
 14 */
 15#ifndef _SS_EBITMAP_H_
 16#define _SS_EBITMAP_H_
 17
 18#include <net/netlabel.h>
 19
 20#ifdef CONFIG_64BIT
 21#define	EBITMAP_NODE_SIZE	64
 22#else
 23#define	EBITMAP_NODE_SIZE	32
 24#endif
 25
 26#define EBITMAP_UNIT_NUMS	((EBITMAP_NODE_SIZE-sizeof(void *)-sizeof(u32))\
 27					/ sizeof(unsigned long))
 28#define EBITMAP_UNIT_SIZE	BITS_PER_LONG
 29#define EBITMAP_SIZE		(EBITMAP_UNIT_NUMS * EBITMAP_UNIT_SIZE)
 30#define EBITMAP_BIT		1ULL
 31#define EBITMAP_SHIFT_UNIT_SIZE(x)					\
 32	(((x) >> EBITMAP_UNIT_SIZE / 2) >> EBITMAP_UNIT_SIZE / 2)
 33
 34struct ebitmap_node {
 35	struct ebitmap_node *next;
 36	unsigned long maps[EBITMAP_UNIT_NUMS];
 37	u32 startbit;
 38};
 39
 40struct ebitmap {
 41	struct ebitmap_node *node;	/* first node in the bitmap */
 42	u32 highbit;	/* highest position in the total bitmap */
 43};
 44
 45#define ebitmap_length(e) ((e)->highbit)
 46
 47static inline unsigned int ebitmap_start_positive(const struct ebitmap *e,
 48						  struct ebitmap_node **n)
 49{
 50	unsigned int ofs;
 51
 52	for (*n = e->node; *n; *n = (*n)->next) {
 53		ofs = find_first_bit((*n)->maps, EBITMAP_SIZE);
 54		if (ofs < EBITMAP_SIZE)
 55			return (*n)->startbit + ofs;
 56	}
 57	return ebitmap_length(e);
 58}
 59
 60static inline void ebitmap_init(struct ebitmap *e)
 61{
 62	memset(e, 0, sizeof(*e));
 63}
 64
 65static inline unsigned int ebitmap_next_positive(const struct ebitmap *e,
 66						 struct ebitmap_node **n,
 67						 unsigned int bit)
 68{
 69	unsigned int ofs;
 70
 71	ofs = find_next_bit((*n)->maps, EBITMAP_SIZE, bit - (*n)->startbit + 1);
 72	if (ofs < EBITMAP_SIZE)
 73		return ofs + (*n)->startbit;
 74
 75	for (*n = (*n)->next; *n; *n = (*n)->next) {
 76		ofs = find_first_bit((*n)->maps, EBITMAP_SIZE);
 77		if (ofs < EBITMAP_SIZE)
 78			return ofs + (*n)->startbit;
 79	}
 80	return ebitmap_length(e);
 81}
 82
 83#define EBITMAP_NODE_INDEX(node, bit)	\
 84	(((bit) - (node)->startbit) / EBITMAP_UNIT_SIZE)
 85#define EBITMAP_NODE_OFFSET(node, bit)	\
 86	(((bit) - (node)->startbit) % EBITMAP_UNIT_SIZE)
 87
 88static inline int ebitmap_node_get_bit(const struct ebitmap_node *n,
 89				       unsigned int bit)
 90{
 91	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
 92	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
 93
 94	BUG_ON(index >= EBITMAP_UNIT_NUMS);
 95	if ((n->maps[index] & (EBITMAP_BIT << ofs)))
 96		return 1;
 97	return 0;
 98}
 99
100static inline void ebitmap_node_set_bit(struct ebitmap_node *n,
101					unsigned int bit)
102{
103	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
104	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
105
106	BUG_ON(index >= EBITMAP_UNIT_NUMS);
107	n->maps[index] |= (EBITMAP_BIT << ofs);
108}
109
110static inline void ebitmap_node_clr_bit(struct ebitmap_node *n,
111					unsigned int bit)
112{
113	unsigned int index = EBITMAP_NODE_INDEX(n, bit);
114	unsigned int ofs = EBITMAP_NODE_OFFSET(n, bit);
115
116	BUG_ON(index >= EBITMAP_UNIT_NUMS);
117	n->maps[index] &= ~(EBITMAP_BIT << ofs);
118}
119
120#define ebitmap_for_each_positive_bit(e, n, bit)	\
121	for ((bit) = ebitmap_start_positive(e, &(n));	\
122	     (bit) < ebitmap_length(e);			\
123	     (bit) = ebitmap_next_positive(e, &(n), bit))	\
124
125int ebitmap_cmp(const struct ebitmap *e1, const struct ebitmap *e2);
126int ebitmap_cpy(struct ebitmap *dst, const struct ebitmap *src);
127int ebitmap_and(struct ebitmap *dst, const struct ebitmap *e1, const struct ebitmap *e2);
128int ebitmap_contains(const struct ebitmap *e1, const struct ebitmap *e2, u32 last_e2bit);
129int ebitmap_get_bit(const struct ebitmap *e, unsigned long bit);
130int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
131void ebitmap_destroy(struct ebitmap *e);
132int ebitmap_read(struct ebitmap *e, void *fp);
133int ebitmap_write(const struct ebitmap *e, void *fp);
134u32 ebitmap_hash(const struct ebitmap *e, u32 hash);
135
136#ifdef CONFIG_NETLABEL
137int ebitmap_netlbl_export(struct ebitmap *ebmap,
138			  struct netlbl_lsm_catmap **catmap);
139int ebitmap_netlbl_import(struct ebitmap *ebmap,
140			  struct netlbl_lsm_catmap *catmap);
141#else
142static inline int ebitmap_netlbl_export(struct ebitmap *ebmap,
143					struct netlbl_lsm_catmap **catmap)
144{
145	return -ENOMEM;
146}
147static inline int ebitmap_netlbl_import(struct ebitmap *ebmap,
148					struct netlbl_lsm_catmap *catmap)
149{
150	return -ENOMEM;
151}
152#endif
153
154#endif	/* _SS_EBITMAP_H_ */