xref: /freebsd/share/man/man9/khelp.9 (revision 89937323bddd41fd8b92430c3ece48d3e32c2c23)
129f269dcSLawrence Stewart.\"
229f269dcSLawrence Stewart.\" Copyright (c) 2010-2011 The FreeBSD Foundation
329f269dcSLawrence Stewart.\"
429f269dcSLawrence Stewart.\" This documentation was written at the Centre for Advanced Internet
5891b8ed4SLawrence Stewart.\" Architectures, Swinburne University of Technology, Melbourne, Australia by
6891b8ed4SLawrence Stewart.\" David Hayes and Lawrence Stewart under sponsorship from the FreeBSD
7891b8ed4SLawrence Stewart.\" Foundation.
829f269dcSLawrence Stewart.\"
929f269dcSLawrence Stewart.\" Redistribution and use in source and binary forms, with or without
1029f269dcSLawrence Stewart.\" modification, are permitted provided that the following conditions
1129f269dcSLawrence Stewart.\" are met:
1229f269dcSLawrence Stewart.\" 1. Redistributions of source code must retain the above copyright
1329f269dcSLawrence Stewart.\"    notice, this list of conditions and the following disclaimer.
1429f269dcSLawrence Stewart.\" 2. Redistributions in binary form must reproduce the above copyright
1529f269dcSLawrence Stewart.\"    notice, this list of conditions and the following disclaimer in the
1629f269dcSLawrence Stewart.\"    documentation and/or other materials provided with the distribution.
1729f269dcSLawrence Stewart.\"
1829f269dcSLawrence Stewart.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1929f269dcSLawrence Stewart.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2029f269dcSLawrence Stewart.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2129f269dcSLawrence Stewart.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2229f269dcSLawrence Stewart.\" ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2329f269dcSLawrence Stewart.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2429f269dcSLawrence Stewart.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2529f269dcSLawrence Stewart.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2629f269dcSLawrence Stewart.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2729f269dcSLawrence Stewart.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2829f269dcSLawrence Stewart.\" SUCH DAMAGE.
2929f269dcSLawrence Stewart.\"
30*89937323SZhenlei Huang.Dd October 1, 2024
31a6d11f71SRuslan Ermilov.Dt KHELP 9
3229f269dcSLawrence Stewart.Os
3329f269dcSLawrence Stewart.Sh NAME
3429f269dcSLawrence Stewart.Nm khelp ,
3529f269dcSLawrence Stewart.Nm khelp_init_osd ,
3629f269dcSLawrence Stewart.Nm khelp_destroy_osd ,
3729f269dcSLawrence Stewart.Nm khelp_get_id ,
3829f269dcSLawrence Stewart.Nm khelp_get_osd ,
3929f269dcSLawrence Stewart.Nm khelp_add_hhook ,
4029f269dcSLawrence Stewart.Nm khelp_remove_hhook ,
4129f269dcSLawrence Stewart.Nm KHELP_DECLARE_MOD ,
4229f269dcSLawrence Stewart.Nm KHELP_DECLARE_MOD_UMA
4329f269dcSLawrence Stewart.Nd Kernel Helper Framework
4429f269dcSLawrence Stewart.Sh SYNOPSIS
4529f269dcSLawrence Stewart.In sys/khelp.h
4629f269dcSLawrence Stewart.In sys/module_khelp.h
4729f269dcSLawrence Stewart.Fn "int khelp_init_osd" "uint32_t classes" "struct osd *hosd"
4829f269dcSLawrence Stewart.Fn "int khelp_destroy_osd" "struct osd *hosd"
4929f269dcSLawrence Stewart.Fn "int32_t khelp_get_id" "char *hname"
5029f269dcSLawrence Stewart.Fn "void * khelp_get_osd" "struct osd *hosd" "int32_t id"
51*89937323SZhenlei Huang.Fn "int khelp_add_hhook" "const struct hookinfo *hki" "uint32_t flags"
52*89937323SZhenlei Huang.Fn "int khelp_remove_hhook" "const struct hookinfo *hki"
5329f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD "hname" "hdata" "hhooks" "version"
5429f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD_UMA "hname" "hdata" "hhooks" "version" "ctor" "dtor"
5529f269dcSLawrence Stewart.Sh DESCRIPTION
5629f269dcSLawrence Stewart.Nm
5729f269dcSLawrence Stewartprovides a framework for managing
5829f269dcSLawrence Stewart.Nm
5929f269dcSLawrence Stewartmodules, which indirectly use the
6029f269dcSLawrence Stewart.Xr hhook 9
6129f269dcSLawrence StewartKPI to register their hook functions with hook points of interest within the
6229f269dcSLawrence Stewartkernel.
6329f269dcSLawrence StewartKhelp modules aim to provide a structured way to dynamically extend the kernel
6429f269dcSLawrence Stewartat runtime in an ABI preserving manner.
6529f269dcSLawrence StewartDepending on the subsystem providing hook points, a
6629f269dcSLawrence Stewart.Nm
6729f269dcSLawrence Stewartmodule may be able to associate per-object data for maintaining relevant state
6829f269dcSLawrence Stewartbetween hook calls.
6929f269dcSLawrence StewartThe
7029f269dcSLawrence Stewart.Xr hhook 9
7129f269dcSLawrence Stewartand
7229f269dcSLawrence Stewart.Nm
7329f269dcSLawrence Stewartframeworks are tightly integrated and anyone interested in
7429f269dcSLawrence Stewart.Nm
7529f269dcSLawrence Stewartshould also read the
7629f269dcSLawrence Stewart.Xr hhook 9
7729f269dcSLawrence Stewartmanual page thoroughly.
7829f269dcSLawrence Stewart.Ss Information for Khelp Module Implementors
7929f269dcSLawrence Stewart.Nm
8029f269dcSLawrence Stewartmodules are represented within the
8129f269dcSLawrence Stewart.Nm
8229f269dcSLawrence Stewartframework by a
8329f269dcSLawrence Stewart.Vt struct helper
8429f269dcSLawrence Stewartwhich has the following members:
8529f269dcSLawrence Stewart.Bd -literal -offset indent
8629f269dcSLawrence Stewartstruct helper {
8729f269dcSLawrence Stewart	int (*mod_init) (void);
8829f269dcSLawrence Stewart	int (*mod_destroy) (void);
8929f269dcSLawrence Stewart#define	HELPER_NAME_MAXLEN 16
9029f269dcSLawrence Stewart	char			h_name[HELPER_NAME_MAXLEN];
9129f269dcSLawrence Stewart	uma_zone_t		h_zone;
9229f269dcSLawrence Stewart	struct hookinfo		*h_hooks;
9329f269dcSLawrence Stewart	uint32_t		h_nhooks;
9429f269dcSLawrence Stewart	uint32_t		h_classes;
9529f269dcSLawrence Stewart	int32_t			h_id;
9629f269dcSLawrence Stewart	volatile uint32_t	h_refcount;
9729f269dcSLawrence Stewart	uint16_t		h_flags;
9829f269dcSLawrence Stewart	TAILQ_ENTRY(helper)	h_next;
9929f269dcSLawrence Stewart};
10029f269dcSLawrence Stewart.Ed
10129f269dcSLawrence Stewart.Pp
10229f269dcSLawrence StewartModules must instantiate a
10329f269dcSLawrence Stewart.Vt struct helper ,
10429f269dcSLawrence Stewartbut are only required to set the
10529f269dcSLawrence Stewart.Va h_classes
10629f269dcSLawrence Stewartfield, and may optionally set the
10729f269dcSLawrence Stewart.Va h_flags ,
10829f269dcSLawrence Stewart.Va mod_init
10929f269dcSLawrence Stewartand
11029f269dcSLawrence Stewart.Va mod_destroy
11129f269dcSLawrence Stewartfields where required.
11229f269dcSLawrence StewartThe framework takes care of all other fields and modules should refrain from
11329f269dcSLawrence Stewartmanipulating them.
11429f269dcSLawrence StewartUsing the C99 designated initialiser feature to set fields is encouraged.
11529f269dcSLawrence Stewart.Pp
11629f269dcSLawrence StewartIf specified, the
11729f269dcSLawrence Stewart.Va mod_init
11829f269dcSLawrence Stewartfunction will be run by the
11929f269dcSLawrence Stewart.Nm
12029f269dcSLawrence Stewartframework prior to completing the registration process.
12129f269dcSLawrence StewartReturning a non-zero value from the
12229f269dcSLawrence Stewart.Va mod_init
12329f269dcSLawrence Stewartfunction will abort the registration process and fail to load the module.
12429f269dcSLawrence StewartIf specified, the
12529f269dcSLawrence Stewart.Va mod_destroy
12629f269dcSLawrence Stewartfunction will be run by the
12729f269dcSLawrence Stewart.Nm
12829f269dcSLawrence Stewartframework during the deregistration process, after the module has been
12929f269dcSLawrence Stewartderegistered by the
13029f269dcSLawrence Stewart.Nm
13129f269dcSLawrence Stewartframework.
13229f269dcSLawrence StewartThe return value is currently ignored.
13329f269dcSLawrence StewartValid
13429f269dcSLawrence Stewart.Nm
13529f269dcSLawrence Stewartclasses are defined in
13629f269dcSLawrence Stewart.In sys/khelp.h .
13729f269dcSLawrence StewartValid flags are defined in
13829f269dcSLawrence Stewart.In sys/module_khelp.h .
13929f269dcSLawrence StewartThe HELPER_NEEDS_OSD flag should be set in the
14029f269dcSLawrence Stewart.Va h_flags
14129f269dcSLawrence Stewartfield if the
14229f269dcSLawrence Stewart.Nm
14329f269dcSLawrence Stewartmodule requires persistent per-object data storage.
14429f269dcSLawrence StewartThere is no programmatic way (yet) to check if a
14529f269dcSLawrence Stewart.Nm
14629f269dcSLawrence Stewartclass provides the ability for
14729f269dcSLawrence Stewart.Nm
14829f269dcSLawrence Stewartmodules to associate persistent per-object data, so a manual check is required.
14929f269dcSLawrence Stewart.Pp
15029f269dcSLawrence StewartThe
15129f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD
15229f269dcSLawrence Stewartand
15329f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD_UMA
15429f269dcSLawrence Stewartmacros provide convenient wrappers around the
15529f269dcSLawrence Stewart.Xr DECLARE_MODULE 9
15629f269dcSLawrence Stewartmacro, and are used to register a
15729f269dcSLawrence Stewart.Nm
15829f269dcSLawrence Stewartmodule with the
15929f269dcSLawrence Stewart.Nm
16029f269dcSLawrence Stewartframework.
16129f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD_UMA
16229f269dcSLawrence Stewartshould only be used by modules which require the use of persistent per-object
16329f269dcSLawrence Stewartstorage i.e. modules which set the HELPER_NEEDS_OSD flag in their
16429f269dcSLawrence Stewart.Vt struct helper Ns 's
16529f269dcSLawrence Stewart.Va h_flags
16629f269dcSLawrence Stewartfield.
16729f269dcSLawrence Stewart.Pp
16829f269dcSLawrence StewartThe first four arguments common to both macros are as follows.
16929f269dcSLawrence StewartThe
17029f269dcSLawrence Stewart.Fa hname
17129f269dcSLawrence Stewartargument specifies the unique
17229f269dcSLawrence Stewart.Xr ascii 7
17329f269dcSLawrence Stewartname for the
17429f269dcSLawrence Stewart.Nm
17529f269dcSLawrence Stewartmodule.
17629f269dcSLawrence StewartIt should be no longer than HELPER_NAME_MAXLEN-1 characters in length.
17729f269dcSLawrence StewartThe
17829f269dcSLawrence Stewart.Fa hdata
17929f269dcSLawrence Stewartargument is a pointer to the module's
18029f269dcSLawrence Stewart.Vt struct helper .
18129f269dcSLawrence StewartThe
18229f269dcSLawrence Stewart.Fa hhooks
18329f269dcSLawrence Stewartargument points to a static array of
18429f269dcSLawrence Stewart.Vt struct hookinfo
18529f269dcSLawrence Stewartstructures.
18629f269dcSLawrence StewartThe array should contain a
18729f269dcSLawrence Stewart.Vt struct hookinfo
18829f269dcSLawrence Stewartfor each
18929f269dcSLawrence Stewart.Xr hhook 9
19029f269dcSLawrence Stewartpoint the module wishes to hook, even when using the same hook function multiple
19129f269dcSLawrence Stewarttimes for different
19229f269dcSLawrence Stewart.Xr hhook 9
19329f269dcSLawrence Stewartpoints.
19429f269dcSLawrence StewartThe
19529f269dcSLawrence Stewart.Fa version
19629f269dcSLawrence Stewartargument specifies a version number for the module which will be passed to
19729f269dcSLawrence Stewart.Xr MODULE_VERSION 9 .
19829f269dcSLawrence StewartThe
19929f269dcSLawrence Stewart.Fn KHELP_DECLARE_MOD_UMA
20029f269dcSLawrence Stewartmacro takes the additional
20129f269dcSLawrence Stewart.Fa ctor
20229f269dcSLawrence Stewartand
20329f269dcSLawrence Stewart.Fa dtor
20429f269dcSLawrence Stewartarguments, which specify optional
20529f269dcSLawrence Stewart.Xr uma 9
20629f269dcSLawrence Stewartconstructor and destructor functions.
20729f269dcSLawrence StewartNULL should be passed where the functionality is not required.
20829f269dcSLawrence Stewart.Pp
20929f269dcSLawrence StewartThe
21029f269dcSLawrence Stewart.Fn khelp_get_id
21129f269dcSLawrence Stewartfunction returns the numeric identifier for the
21229f269dcSLawrence Stewart.Nm
21329f269dcSLawrence Stewartmodule with name
21429f269dcSLawrence Stewart.Fa hname .
21529f269dcSLawrence Stewart.Pp
21629f269dcSLawrence StewartThe
21729f269dcSLawrence Stewart.Fn khelp_get_osd
21829f269dcSLawrence Stewartfunction is used to obtain the per-object data pointer for a specified
21929f269dcSLawrence Stewart.Nm
22029f269dcSLawrence Stewartmodule.
22129f269dcSLawrence StewartThe
22229f269dcSLawrence Stewart.Fa hosd
22329f269dcSLawrence Stewartargument is a pointer to the underlying subsystem object's
22429f269dcSLawrence Stewart.Vt struct osd .
22529f269dcSLawrence StewartThis is provided by the
22629f269dcSLawrence Stewart.Xr hhook 9
22729f269dcSLawrence Stewartframework when calling into a
22829f269dcSLawrence Stewart.Nm
22929f269dcSLawrence Stewartmodule's hook function.
23029f269dcSLawrence StewartThe
23129f269dcSLawrence Stewart.Fa id
23229f269dcSLawrence Stewartargument specifies the numeric identifier for the
23329f269dcSLawrence Stewart.Nm
23429f269dcSLawrence Stewartmodule to extract the data pointer from
23529f269dcSLawrence Stewart.Fa hosd
23629f269dcSLawrence Stewartfor.
23729f269dcSLawrence StewartThe
23829f269dcSLawrence Stewart.Fa id
23929f269dcSLawrence Stewartis obtained using the
24029f269dcSLawrence Stewart.Fn khelp_get_id
24129f269dcSLawrence Stewartfunction.
24229f269dcSLawrence Stewart.Pp
24329f269dcSLawrence StewartThe
24429f269dcSLawrence Stewart.Fn khelp_add_hhook
24529f269dcSLawrence Stewartand
24629f269dcSLawrence Stewart.Fn khelp_remove_hhook
24729f269dcSLawrence Stewartfunctions allow a
24829f269dcSLawrence Stewart.Nm
24929f269dcSLawrence Stewartmodule to dynamically hook/unhook
25029f269dcSLawrence Stewart.Xr hhook 9
25129f269dcSLawrence Stewartpoints at run time.
25229f269dcSLawrence StewartThe
25329f269dcSLawrence Stewart.Fa hki
25429f269dcSLawrence Stewartargument specifies a pointer to a
25529f269dcSLawrence Stewart.Vt struct hookinfo
25629f269dcSLawrence Stewartwhich encapsulates the required information about the
25729f269dcSLawrence Stewart.Xr hhook 9
25829f269dcSLawrence Stewartpoint and hook function being manipulated.
25929f269dcSLawrence StewartThe HHOOK_WAITOK flag may be passed in via the
26029f269dcSLawrence Stewart.Fa flags
26129f269dcSLawrence Stewartargument of
26229f269dcSLawrence Stewart.Fn khelp_add_hhook
26329f269dcSLawrence Stewartif
26429f269dcSLawrence Stewart.Xr malloc 9
26529f269dcSLawrence Stewartis allowed to sleep waiting for memory to become available.
26629f269dcSLawrence Stewart.Ss Integrating Khelp Into a Kernel Subsystem
26729f269dcSLawrence StewartMost of the work required to allow
26829f269dcSLawrence Stewart.Nm
26929f269dcSLawrence Stewartmodules to do useful things relates to defining and instantiating suitable
27029f269dcSLawrence Stewart.Xr hhook 9
27129f269dcSLawrence Stewartpoints for
27229f269dcSLawrence Stewart.Nm
27329f269dcSLawrence Stewartmodules to hook into.
27429f269dcSLawrence StewartThe only additional decision a subsystem needs to make is whether it wants to
27529f269dcSLawrence Stewartallow
27629f269dcSLawrence Stewart.Nm
27729f269dcSLawrence Stewartmodules to associate persistent per-object data.
27829f269dcSLawrence StewartProviding support for persistent data storage can allow
27929f269dcSLawrence Stewart.Nm
28029f269dcSLawrence Stewartmodules to perform more complex functionality which may be desirable.
28129f269dcSLawrence StewartSubsystems which want to allow Khelp modules to associate
28229f269dcSLawrence Stewartpersistent per-object data with one of the subsystem's data structures need to
28329f269dcSLawrence Stewartmake the following two key changes:
28429f269dcSLawrence Stewart.Bl -bullet
28529f269dcSLawrence Stewart.It
28629f269dcSLawrence StewartEmbed a
28729f269dcSLawrence Stewart.Vt struct osd
28829f269dcSLawrence Stewartpointer in the structure definition for the object.
28929f269dcSLawrence Stewart.It
29029f269dcSLawrence StewartAdd calls to
29129f269dcSLawrence Stewart.Fn khelp_init_osd
29229f269dcSLawrence Stewartand
29329f269dcSLawrence Stewart.Fn khelp_destroy_osd
29429f269dcSLawrence Stewartto the subsystem code paths which are responsible for respectively initialising
29529f269dcSLawrence Stewartand destroying the object.
29629f269dcSLawrence Stewart.El
29729f269dcSLawrence Stewart.Pp
29829f269dcSLawrence StewartThe
29929f269dcSLawrence Stewart.Fn khelp_init_osd
30029f269dcSLawrence Stewartfunction initialises the per-object data storage for all currently loaded
30129f269dcSLawrence Stewart.Nm
30229f269dcSLawrence Stewartmodules of appropriate classes which have set the HELPER_NEEDS_OSD flag in their
30329f269dcSLawrence Stewart.Va h_flags
30429f269dcSLawrence Stewartfield.
30529f269dcSLawrence StewartThe
30629f269dcSLawrence Stewart.Fa classes
30729f269dcSLawrence Stewartargument specifies a bitmask of
30829f269dcSLawrence Stewart.Nm
30929f269dcSLawrence Stewartclasses which this subsystem associates with.
31029f269dcSLawrence StewartIf a
31129f269dcSLawrence Stewart.Nm
31229f269dcSLawrence Stewartmodule matches any of the classes in the bitmask, that module will be associated
31329f269dcSLawrence Stewartwith the object.
31429f269dcSLawrence StewartThe
31529f269dcSLawrence Stewart.Fa hosd
31629f269dcSLawrence Stewartargument specifies the pointer to the object's
31729f269dcSLawrence Stewart.Vt struct osd
31829f269dcSLawrence Stewartwhich will be used to provide the persistent storage for use by
31929f269dcSLawrence Stewart.Nm
32029f269dcSLawrence Stewartmodules.
32129f269dcSLawrence Stewart.Pp
32229f269dcSLawrence StewartThe
32329f269dcSLawrence Stewart.Fn khelp_destroy_osd
32429f269dcSLawrence Stewartfunction frees all memory that was associated with an object's
32529f269dcSLawrence Stewart.Vt struct osd
32629f269dcSLawrence Stewartby a previous call to
32729f269dcSLawrence Stewart.Fn khelp_init_osd .
32829f269dcSLawrence StewartThe
32929f269dcSLawrence Stewart.Fa hosd
33029f269dcSLawrence Stewartargument specifies the pointer to the object's
33129f269dcSLawrence Stewart.Vt struct osd
33229f269dcSLawrence Stewartwhich will be purged in preparation for destruction.
33329f269dcSLawrence Stewart.Sh IMPLEMENTATION NOTES
33429f269dcSLawrence Stewart.Nm
33529f269dcSLawrence Stewartmodules are protected from being prematurely unloaded by a reference count.
33629f269dcSLawrence StewartThe count is incremented each time a subsystem calls
33729f269dcSLawrence Stewart.Fn khelp_init_osd
33829f269dcSLawrence Stewartcausing persistent storage to be allocated for the module, and decremented for
33929f269dcSLawrence Stewarteach corresponding call to
34029f269dcSLawrence Stewart.Fn khelp_destroy_osd .
34129f269dcSLawrence StewartOnly when a module's reference count has dropped to zero can the module be
34229f269dcSLawrence Stewartunloaded.
34329f269dcSLawrence Stewart.Sh RETURN VALUES
34429f269dcSLawrence StewartThe
34529f269dcSLawrence Stewart.Fn khelp_init_osd
34629f269dcSLawrence Stewartfunction returns zero if no errors occurred.
34729f269dcSLawrence StewartIt returns ENOMEM if a
34829f269dcSLawrence Stewart.Nm
34929f269dcSLawrence Stewartmodule which requires per-object storage fails to allocate the necessary memory.
35029f269dcSLawrence Stewart.Pp
35129f269dcSLawrence StewartThe
35229f269dcSLawrence Stewart.Fn khelp_destroy_osd
35329f269dcSLawrence Stewartfunction only returns zero to indicate that no errors occurred.
35429f269dcSLawrence Stewart.Pp
35529f269dcSLawrence StewartThe
35629f269dcSLawrence Stewart.Fn khelp_get_id
35729f269dcSLawrence Stewartfunction returns the unique numeric identifier for the registered
35829f269dcSLawrence Stewart.Nm
35929f269dcSLawrence Stewartmodule with name
36029f269dcSLawrence Stewart.Fa hname .
36129f269dcSLawrence StewartIt return -1 if no module with the specified name is currently registered.
36229f269dcSLawrence Stewart.Pp
36329f269dcSLawrence StewartThe
36429f269dcSLawrence Stewart.Fn khelp_get_osd
36529f269dcSLawrence Stewartfunction returns the pointer to the
36629f269dcSLawrence Stewart.Nm
36729f269dcSLawrence Stewartmodule's persistent object storage memory.
36829f269dcSLawrence StewartIf the module identified by
36929f269dcSLawrence Stewart.Fa id
37029f269dcSLawrence Stewartdoes not have persistent object storage registered with the object's
37129f269dcSLawrence Stewart.Fa hosd
37229f269dcSLawrence Stewart.Vt struct osd ,
37329f269dcSLawrence StewartNULL is returned.
37429f269dcSLawrence Stewart.Pp
37529f269dcSLawrence StewartThe
37629f269dcSLawrence Stewart.Fn khelp_add_hhook
37729f269dcSLawrence Stewartfunction returns zero if no errors occurred.
37829f269dcSLawrence StewartIt returns ENOENT if it could not find the requested
37929f269dcSLawrence Stewart.Xr hhook 9
38029f269dcSLawrence Stewartpoint.
38129f269dcSLawrence StewartIt returns ENOMEM if
38229f269dcSLawrence Stewart.Xr malloc 9
38329f269dcSLawrence Stewartfailed to allocate memory.
38429f269dcSLawrence StewartIt returns EEXIST if attempting to register the same hook function more than
38529f269dcSLawrence Stewartonce for the same
38629f269dcSLawrence Stewart.Xr hhook 9
38729f269dcSLawrence Stewartpoint.
38829f269dcSLawrence Stewart.Pp
38929f269dcSLawrence StewartThe
39029f269dcSLawrence Stewart.Fn khelp_remove_hhook
39129f269dcSLawrence Stewartfunction returns zero if no errors occurred.
39229f269dcSLawrence StewartIt returns ENOENT if it could not find the requested
39329f269dcSLawrence Stewart.Xr hhook 9
39429f269dcSLawrence Stewartpoint.
39529f269dcSLawrence Stewart.Sh EXAMPLES
39629f269dcSLawrence StewartA well commented example Khelp module can be found at:
39729f269dcSLawrence Stewart.Pa /usr/share/examples/kld/khelp/h_example.c
39829f269dcSLawrence Stewart.Pp
39929f269dcSLawrence StewartThe Enhanced Round Trip Time (ERTT)
40029f269dcSLawrence Stewart.Xr h_ertt 4
40129f269dcSLawrence Stewart.Nm
40229f269dcSLawrence Stewartmodule provides a more complex example of what is possible.
40329f269dcSLawrence Stewart.Sh SEE ALSO
40429f269dcSLawrence Stewart.Xr h_ertt 4 ,
40529f269dcSLawrence Stewart.Xr hhook 9 ,
40629f269dcSLawrence Stewart.Xr osd 9
40729f269dcSLawrence Stewart.Sh ACKNOWLEDGEMENTS
40829f269dcSLawrence StewartDevelopment and testing of this software were made possible in part by grants
40929f269dcSLawrence Stewartfrom the FreeBSD Foundation and Cisco University Research Program Fund at
41029f269dcSLawrence StewartCommunity Foundation Silicon Valley.
41129f269dcSLawrence Stewart.Sh HISTORY
41229f269dcSLawrence StewartThe
41329f269dcSLawrence Stewart.Nm
41429f269dcSLawrence Stewartkernel helper framework first appeared in
41529f269dcSLawrence Stewart.Fx 9.0 .
41629f269dcSLawrence Stewart.Pp
41729f269dcSLawrence StewartThe
41829f269dcSLawrence Stewart.Nm
41929f269dcSLawrence Stewartframework was first released in 2010 by Lawrence Stewart whilst studying at
420891b8ed4SLawrence StewartSwinburne University of Technology's Centre for Advanced Internet Architectures,
421891b8ed4SLawrence StewartMelbourne, Australia.
42229f269dcSLawrence StewartMore details are available at:
42329f269dcSLawrence Stewart.Pp
42429f269dcSLawrence Stewarthttp://caia.swin.edu.au/urp/newtcp/
42529f269dcSLawrence Stewart.Sh AUTHORS
42629f269dcSLawrence Stewart.An -nosplit
42729f269dcSLawrence StewartThe
42829f269dcSLawrence Stewart.Nm
42929f269dcSLawrence Stewartframework was written by
4308a7314fcSBaptiste Daroussin.An Lawrence Stewart Aq Mt lstewart@FreeBSD.org .
43129f269dcSLawrence Stewart.Pp
43229f269dcSLawrence StewartThis manual page was written by
4338a7314fcSBaptiste Daroussin.An David Hayes Aq Mt david.hayes@ieee.org
43429f269dcSLawrence Stewartand
4358a7314fcSBaptiste Daroussin.An Lawrence Stewart Aq Mt lstewart@FreeBSD.org .
436