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