summaryrefslogtreecommitdiff
path: root/minix/kernel/ipc_filter.h
blob: a8b290da5b7e1966498978ef5be7bae501219949 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef IPC_FILTER_H
#define IPC_FILTER_H

/* Declaration of the ipc filter structure. It provides a framework to
 * selectively allow/disallow ipc messages a process agrees to receive. To this
 * end, a single ipc filter can be specified at a given time for any recipient
 * to blacklist/whitelist a set of ipc messages identified by sender or message
 * type.
 */
#include <minix/ipc_filter.h>

/* IPC filter types. */
#define IPCF_NONE        0	/* no ipc filter */
#define IPCF_BLACKLIST   1	/* blacklist filter type */
#define IPCF_WHITELIST   2	/* whitelist filter type */

/* IPC filter element macros. */
EXTERN int _ipcf_nr;
#define IPCF_EL_CHECK(E) \
	((((E)->flags & IPCF_MATCH_M_TYPE) || \
	((E)->flags & IPCF_MATCH_M_SOURCE)) && \
	(!((E)->flags & IPCF_MATCH_M_SOURCE) || \
	IPCF_IS_ANY_EP((E)->m_source) || isokendpt((E)->m_source, &_ipcf_nr)))
#define IPCF_IS_USR_EP(EP) \
	(!(priv(proc_addr(_ENDPOINT_P((EP))))->s_flags & SYS_PROC))
#define IPCF_IS_TSK_EP(EP) (iskerneln(_ENDPOINT_P((EP))))
#define IPCF_IS_SYS_EP(EP) (!IPCF_IS_USR_EP(EP) && !IPCF_IS_TSK_EP(EP))
#define IPCF_IS_ANY_EP(EP) \
	((EP) == ANY_USR || (EP) == ANY_SYS || (EP) == ANY_TSK)
#define IPCF_EL_MATCH_M_TYPE(E,M) \
	(!((E)->flags & IPCF_MATCH_M_TYPE) || (E)->m_type == (M)->m_type)
#define IPCF_EL_MATCH_M_SOURCE(E,M) \
	(!((E)->flags & IPCF_MATCH_M_SOURCE) || \
	(E)->m_source == (M)->m_source || \
	IPCF_EL_MATCH_M_SOURCE_ANY_EP((E)->m_source,(M)->m_source))
#define IPCF_EL_MATCH_M_SOURCE_ANY_EP(ES,MS) \
	(((ES) == ANY_USR && IPCF_IS_USR_EP(MS)) || \
	((ES) == ANY_SYS && IPCF_IS_SYS_EP(MS)) || \
	((ES) == ANY_TSK && IPCF_IS_TSK_EP(MS)))
#define IPCF_EL_MATCH(E,M) \
	(IPCF_EL_MATCH_M_TYPE(E,M) && IPCF_EL_MATCH_M_SOURCE(E,M))

struct ipc_filter_s {
  int type;
  int num_elements;
  int flags;
  struct ipc_filter_s *next;
  ipc_filter_el_t elements[IPCF_MAX_ELEMENTS];
};
typedef struct ipc_filter_s ipc_filter_t;

/* IPC filter pool. */
#define IPCF_POOL_SIZE          (2*NR_SYS_PROCS)
EXTERN ipc_filter_t ipc_filter_pool[IPCF_POOL_SIZE];

/* IPC filter pool macros. */
#define IPCF_POOL_FREE_SLOT(S) ((S)->type = IPCF_NONE)
#define IPCF_POOL_IS_FREE_SLOT(S) ((S)->type == IPCF_NONE)
#define IPCF_POOL_ALLOCATE_SLOT(T,S) \
	do { \
		int i; \
		*(S) = NULL; \
		for (i = 0; i < IPCF_POOL_SIZE; i++) { \
			if (IPCF_POOL_IS_FREE_SLOT(&ipc_filter_pool[i])) { \
				*(S) = &ipc_filter_pool[i]; \
				(*(S))->type = T; \
				break; \
			} \
		} \
	} while(0)
#define IPCF_POOL_INIT(S) memset(&ipc_filter_pool,0,sizeof(ipc_filter_pool))

#endif /* !IPC_FILTER_H */