381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * CDDL HEADER START
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * The contents of this file are subject to the terms of the
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Common Development and Distribution License (the "License").
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * You may not use this file except in compliance with the License.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * or http://www.opensolaris.org/os/licensing.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * See the License for the specific language governing permissions
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * and limitations under the License.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * When distributing Covered Code, include this CDDL HEADER in each
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * If applicable, add the following below this CDDL HEADER, with the
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * fields enclosed by brackets "[]" replaced with your own identifying
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * information: Portions Copyright [yyyy] [name of copyright owner]
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * CDDL HEADER END
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Use is subject to license terms.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * This file includes definitions of kernel hook framework components
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#ifndef _SYS_HOOK_H
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define _SYS_HOOK_H
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <sys/queue.h>
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#include <sys/netstack.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#ifdef __cplusplus
381a2a9a387f449fab7d0c7e97c4184c26963abfdrextern "C" {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#endif
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Definition exposed to hook provider and consumer
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define HOOK_VERSION 1
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdrtypedef uintptr_t hook_data_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdrstruct hook_event_int;
381a2a9a387f449fab7d0c7e97c4184c26963abfdrtypedef struct hook_event_int *hook_event_token_t;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedstruct hook_int;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef struct hook_int *hook_token_t;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef int (* hook_func_t)(hook_event_token_t, hook_data_t, void *);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * A hook_notify_cmd_t is given as an argument to functions called as part of
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * the notify callbacks that have been registered firing.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef enum hook_notify_cmd_e {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HN_NONE = 0,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HN_REGISTER = 1,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HN_UNREGISTER = 2
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed} hook_notify_cmd_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef enum hook_hint_e {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HH_NONE = 0,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HH_FIRST,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HH_LAST,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HH_BEFORE,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed HH_AFTER
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed} hook_hint_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Hook
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef struct hook_s {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int h_version;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr hook_func_t h_func; /* callback func */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr char *h_name; /* name of this hook */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed uint_t h_flags; /* extra hook properties */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hook_hint_t h_hint; /* What type of hint is hintvalue */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed uintptr_t h_hintvalue;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed void *h_arg; /* value to pass back into the hook */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr} hook_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#define HOOK_INIT(x, fn, r, a) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr do { \
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (x) = hook_alloc(HOOK_VERSION); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->h_func = (fn); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->h_name = (r); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->h_flags = 0; \
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (x)->h_hint = HH_NONE; \
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (x)->h_hintvalue = 0; \
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (x)->h_arg = (a); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr _NOTE(CONSTCOND) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr } while (0)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Family
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef struct hook_family_s {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int hf_version; /* version number */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr char *hf_name; /* family name */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr} hook_family_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define HOOK_FAMILY_INIT(x, y) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr do { \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->hf_version = HOOK_VERSION; \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->hf_name = (y); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr _NOTE(CONSTCOND) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr } while (0)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Event
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef struct hook_event_s {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int he_version;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr char *he_name; /* name of this hook list */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr int he_flags; /* 1 = multiple entries allowed */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr boolean_t he_interested; /* true if callback exist */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr} hook_event_t;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define HOOK_RDONLY 0x1 /* Callbacks must not change data */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr /* Multiple callbacks are allowed */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define HOOK_EVENT_INIT(x, y) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr do { \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->he_version = HOOK_VERSION; \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->he_name = (y); \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->he_flags = 0; \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (x)->he_interested = B_FALSE; \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr _NOTE(CONSTCOND) \
381a2a9a387f449fab7d0c7e97c4184c26963abfdr } while (0)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedtypedef int (* hook_notify_fn_t)(hook_notify_cmd_t, void *, const char *,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed const char *, const char *);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedextern hook_t *hook_alloc(const int version);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedextern void hook_free(hook_t *);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#ifdef __cplusplus
381a2a9a387f449fab7d0c7e97c4184c26963abfdr}
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#endif
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#endif /* _SYS_HOOK_H */