summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/hook.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys/hook.h')
-rw-r--r--usr/src/uts/common/sys/hook.h59
1 files changed, 46 insertions, 13 deletions
diff --git a/usr/src/uts/common/sys/hook.h b/usr/src/uts/common/sys/hook.h
index 00b0048093..464f2b8b50 100644
--- a/usr/src/uts/common/sys/hook.h
+++ b/usr/src/uts/common/sys/hook.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,8 +30,6 @@
#ifndef _SYS_HOOK_H
#define _SYS_HOOK_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/queue.h>
#include <sys/netstack.h>
@@ -49,33 +47,62 @@ typedef uintptr_t hook_data_t;
struct hook_event_int;
typedef struct hook_event_int *hook_event_token_t;
+struct hook_int;
+typedef struct hook_int *hook_token_t;
+
+typedef int (* hook_func_t)(hook_event_token_t, hook_data_t, void *);
+
+/*
+ * A hook_notify_cmd_t is given as an argument to functions called as part of
+ * the notify callbacks that have been registered firing.
+ */
+typedef enum hook_notify_cmd_e {
+ HN_NONE = 0,
+ HN_REGISTER = 1,
+ HN_UNREGISTER = 2
+} hook_notify_cmd_t;
-typedef int (* hook_func_t)(hook_event_token_t, hook_data_t, netstack_t *);
+/*
+ *
+ */
+typedef enum hook_hint_e {
+ HH_NONE = 0,
+ HH_FIRST,
+ HH_LAST,
+ HH_BEFORE,
+ HH_AFTER
+} hook_hint_t;
/*
* Hook
*/
-typedef struct hook {
- int32_t h_version; /* version number */
+typedef struct hook_s {
+ int h_version;
hook_func_t h_func; /* callback func */
char *h_name; /* name of this hook */
- int h_flags; /* extra hook properties */
+ uint_t h_flags; /* extra hook properties */
+ hook_hint_t h_hint; /* What type of hint is hintvalue */
+ uintptr_t h_hintvalue;
+ void *h_arg; /* value to pass back into the hook */
} hook_t;
-#define HOOK_INIT(x, fn, r) \
+#define HOOK_INIT(x, fn, r, a) \
do { \
- (x)->h_version = HOOK_VERSION; \
+ (x) = hook_alloc(HOOK_VERSION); \
(x)->h_func = (fn); \
(x)->h_name = (r); \
(x)->h_flags = 0; \
+ (x)->h_hint = HH_NONE; \
+ (x)->h_hintvalue = 0; \
+ (x)->h_arg = (a); \
_NOTE(CONSTCOND) \
} while (0)
/*
* Family
*/
-typedef struct hook_family {
- int32_t hf_version; /* version number */
+typedef struct hook_family_s {
+ int hf_version; /* version number */
char *hf_name; /* family name */
} hook_family_t;
@@ -89,8 +116,8 @@ typedef struct hook_family {
/*
* Event
*/
-typedef struct hook_event {
- int32_t he_version; /* version number */
+typedef struct hook_event_s {
+ int he_version;
char *he_name; /* name of this hook list */
int he_flags; /* 1 = multiple entries allowed */
boolean_t he_interested; /* true if callback exist */
@@ -108,6 +135,12 @@ typedef struct hook_event {
_NOTE(CONSTCOND) \
} while (0)
+typedef int (* hook_notify_fn_t)(hook_notify_cmd_t, void *, const char *,
+ const char *, const char *);
+
+extern hook_t *hook_alloc(const int version);
+extern void hook_free(hook_t *);
+
#ifdef __cplusplus
}
#endif