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