MAC_INIT_OPS(9F)        Kernel Functions for Drivers        MAC_INIT_OPS(9F)
NAME
     mac_init_ops, 
mac_fini_ops - initialize and finalize driver support for
     the MAC framework
SYNOPSIS
     #include <sys/mac_provider.h>     void     mac_init_ops(
struct dev_ops *ops, 
const char *name);     
void     mac_fini_ops(
struct dev_ops *ops);
INTERFACE LEVEL
     illumos DDI specific
PARAMETERS
     ops     A pointer to the driver's 
dev_ops(9S) structure.     
name    A pointer to a null-terminated string of ASCII characters that
             contains the name of the driver.
DESCRIPTION
     The 
mac_init_ops() and 
mac_fini_ops() functions are used to initialize
     and finalize support for a device driver that implements the 
mac(9E)     networking device framework.
     The 
mac_init_ops() function should be called during the driver's
     _
init(9E) entry point.  As described in more detail in the 
Initializing     MAC Support section of 
mac(9E), this must be called before the driver
     calls 
mod_install(9F).  If this is not done, then the call to     
mac_register(9F) will fail.
     When in the driver's _
fini(9E) entry point, after the call to     
mod_remove(9F) has succeeded, then the driver must call the     
mac_fini_ops() function to finalize support and finish releasing any
     resources.  If the call to 
mod_remove(9F) fails, then the device driver
     should not call 
mac_fini_ops() and should fail the call to _
fini(9E).
     In addition, if the call to 
mod_install(9F) in the driver's _
init(9E)     entry point fails, then the driver should also call 
mac_fini_ops().
     See the example below for how this should be structured.
CONTEXT
     The 
mac_init_ops() function should only ever be called from the context
     of a driver's _
init(9E) entry point.
     The 
mac_fini_ops() function should only ever be called from the context
     of a driver's _
init(9E) or _
fini(9E) entry point.
RETURN VALUES
     The 
mac_init_ops() and 
mac_fini_ops() functions will always succeed.
     They do not have any kind of return value.
EXAMPLES
     The following example shows how a driver would call 
mac_init_ops() and     
mac_fini_ops() correctly in the _
init(9E) and _
fini(9E) entry points of
     a driver.
     #include <sys/modctl.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>
     #include <sys/mac_provider.h>
     /*
      * When using this, replace mydrv with the name of the actual device
      * driver. In addition, the mydrv_ prefix that is used should be
      * replaced with the name of the device driver
      */
     #define MYDRV_NAME      "mydrv"
     /*
      * The following dev_ops structure would need to be filled in by a
      * proper device driver.
      */
     static struct dev_ops   mydrv_dev_ops;
     static struct modldrv mydrv_modldrv = {
             &mod_driverops,
             MYDRV_NAME,
             &mydrv_dev_ops
     };
     static struct modlinkage mydrv_modlinkage = {
             MODREV_1,
             &mydrv_modldrv,
             NULL
     };
     int
     _init(void)
     {
             int ret;
             /* Perform other needed initialization */
             mac_init_ops(&mydrv_devops, MYDRV_NAME);
             ret = mod_install(&mydrv_modlinkage);
             if (ret != DDI_SUCCESS) {
                     mac_fini_ops(&mydrv_devops);
                     /* Perform other needed finalization */
             }
             return (ret);
     }
     int
     _info(struct modinfo *modinfop)
     {
             return (mod_info(&mydrv_modlinkage, modinfo));
     }
     int
     _fini(void)
     {
             int ret;
             ret = mod_remove(&mydrv_modlinkage);
             if (ret == DDI_SUCCESS) {
                     mac_fini_ops(&mydrv_devops);
                     /* Perform other needed finalization */
             }
             return (ret);
     }
SEE ALSO
     _
fini(9E), _
init(9E), 
mac(9E), 
mod_install(9F), 
mod_remove(9F),     
dev_ops(9S)illumos                         May 31, 2016                         illumos