xref: /titanic_51/usr/src/uts/common/sys/hook.h (revision f4b3ec61df05330d25f55a36b975b4d7519fdeb1)
1381a2a9aSdr146992 /*
2381a2a9aSdr146992  * CDDL HEADER START
3381a2a9aSdr146992  *
4381a2a9aSdr146992  * The contents of this file are subject to the terms of the
5381a2a9aSdr146992  * Common Development and Distribution License (the "License").
6381a2a9aSdr146992  * You may not use this file except in compliance with the License.
7381a2a9aSdr146992  *
8381a2a9aSdr146992  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9381a2a9aSdr146992  * or http://www.opensolaris.org/os/licensing.
10381a2a9aSdr146992  * See the License for the specific language governing permissions
11381a2a9aSdr146992  * and limitations under the License.
12381a2a9aSdr146992  *
13381a2a9aSdr146992  * When distributing Covered Code, include this CDDL HEADER in each
14381a2a9aSdr146992  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15381a2a9aSdr146992  * If applicable, add the following below this CDDL HEADER, with the
16381a2a9aSdr146992  * fields enclosed by brackets "[]" replaced with your own identifying
17381a2a9aSdr146992  * information: Portions Copyright [yyyy] [name of copyright owner]
18381a2a9aSdr146992  *
19381a2a9aSdr146992  * CDDL HEADER END
20381a2a9aSdr146992  */
21381a2a9aSdr146992 /*
22*f4b3ec61Sdh155122  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23381a2a9aSdr146992  * Use is subject to license terms.
24381a2a9aSdr146992  */
25381a2a9aSdr146992 
26381a2a9aSdr146992 /*
27381a2a9aSdr146992  * This file includes definitions of kernel hook framework components
28381a2a9aSdr146992  */
29381a2a9aSdr146992 
30381a2a9aSdr146992 #ifndef _SYS_HOOK_H
31381a2a9aSdr146992 #define	_SYS_HOOK_H
32381a2a9aSdr146992 
33381a2a9aSdr146992 #pragma ident	"%Z%%M%	%I%	%E% SMI"
34381a2a9aSdr146992 
35381a2a9aSdr146992 #include <sys/queue.h>
36*f4b3ec61Sdh155122 #include <sys/netstack.h>
37381a2a9aSdr146992 
38381a2a9aSdr146992 #ifdef	__cplusplus
39381a2a9aSdr146992 extern "C" {
40381a2a9aSdr146992 #endif
41381a2a9aSdr146992 
42381a2a9aSdr146992 /*
43381a2a9aSdr146992  * Definition exposed to hook provider and consumer
44381a2a9aSdr146992  */
45381a2a9aSdr146992 
46381a2a9aSdr146992 #define	HOOK_VERSION	1
47381a2a9aSdr146992 
48381a2a9aSdr146992 typedef uintptr_t hook_data_t;
49381a2a9aSdr146992 
50381a2a9aSdr146992 struct hook_event_int;
51381a2a9aSdr146992 typedef struct hook_event_int *hook_event_token_t;
52381a2a9aSdr146992 
53*f4b3ec61Sdh155122 typedef int (* hook_func_t)(hook_event_token_t, hook_data_t, netstack_t *);
54381a2a9aSdr146992 
55381a2a9aSdr146992 /*
56381a2a9aSdr146992  * Hook
57381a2a9aSdr146992  */
58381a2a9aSdr146992 typedef struct hook {
59381a2a9aSdr146992 	int32_t		h_version;	/* version number */
60381a2a9aSdr146992 	hook_func_t	h_func;		/* callback func */
61381a2a9aSdr146992 	char		*h_name;	/* name of this hook */
62381a2a9aSdr146992 	int		h_flags;	/* extra hook properties */
63381a2a9aSdr146992 } hook_t;
64381a2a9aSdr146992 
65381a2a9aSdr146992 #define	HOOK_INIT(x, fn, r)			\
66381a2a9aSdr146992 	do {					\
67381a2a9aSdr146992 		(x)->h_version = HOOK_VERSION;	\
68381a2a9aSdr146992 		(x)->h_func = (fn);		\
69381a2a9aSdr146992 		(x)->h_name = (r);		\
70381a2a9aSdr146992 		(x)->h_flags = 0;		\
71381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
72381a2a9aSdr146992 	} while (0)
73381a2a9aSdr146992 
74381a2a9aSdr146992 /*
75381a2a9aSdr146992  * Family
76381a2a9aSdr146992  */
77381a2a9aSdr146992 typedef struct hook_family {
78381a2a9aSdr146992 	int32_t		hf_version;	/* version number */
79381a2a9aSdr146992 	char		*hf_name;	/* family name */
80381a2a9aSdr146992 } hook_family_t;
81381a2a9aSdr146992 
82381a2a9aSdr146992 #define	HOOK_FAMILY_INIT(x, y)			\
83381a2a9aSdr146992 	do {					\
84381a2a9aSdr146992 		(x)->hf_version = HOOK_VERSION;	\
85381a2a9aSdr146992 		(x)->hf_name = (y);		\
86381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
87381a2a9aSdr146992 	} while (0)
88381a2a9aSdr146992 
89381a2a9aSdr146992 /*
90381a2a9aSdr146992  * Event
91381a2a9aSdr146992  */
92381a2a9aSdr146992 typedef struct hook_event {
93381a2a9aSdr146992 	int32_t		he_version;	/* version number */
94381a2a9aSdr146992 	char		*he_name;	/* name of this hook list */
95381a2a9aSdr146992 	int		he_flags;	/* 1 = multiple entries allowed */
96381a2a9aSdr146992 	boolean_t	he_interested;	/* true if callback exist */
97381a2a9aSdr146992 } hook_event_t;
98381a2a9aSdr146992 
99381a2a9aSdr146992 #define	HOOK_RDONLY	0x1		/* Callbacks must not change data */
100381a2a9aSdr146992 					/* Multiple callbacks are allowed */
101381a2a9aSdr146992 
102381a2a9aSdr146992 #define	HOOK_EVENT_INIT(x, y)			\
103381a2a9aSdr146992 	do {					\
104381a2a9aSdr146992 		(x)->he_version = HOOK_VERSION;	\
105381a2a9aSdr146992 		(x)->he_name = (y);		\
106381a2a9aSdr146992 		(x)->he_flags = 0;		\
107381a2a9aSdr146992 		(x)->he_interested = B_FALSE;	\
108381a2a9aSdr146992 		_NOTE(CONSTCOND)		\
109381a2a9aSdr146992 	} while (0)
110381a2a9aSdr146992 
111381a2a9aSdr146992 #ifdef	__cplusplus
112381a2a9aSdr146992 }
113381a2a9aSdr146992 #endif
114381a2a9aSdr146992 
115381a2a9aSdr146992 #endif /* _SYS_HOOK_H */
116