/* * ppp_mod.c - modload support for PPP pseudo-device driver. * * Copyright (c) 1994 Paul Mackerras. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The name(s) of the authors of this software must not be used to * endorse or promote products derived from this software without * prior written permission. * * 4. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by Paul Mackerras * ". * * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * $Id: ppp_mod.c,v 1.3 2004/01/17 05:47:55 carlsonj Exp $ */ /* * This file is used under Solaris 2. */ #include #include #include #include #include #include #include static int ppp_identify(dev_info_t *); static int ppp_attach(dev_info_t *, ddi_attach_cmd_t); static int ppp_detach(dev_info_t *, ddi_detach_cmd_t); static int ppp_devinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); extern struct streamtab pppinfo; extern krwlock_t ppp_lower_lock; static dev_info_t *ppp_dip; static struct cb_ops cb_ppp_ops = { nulldev, nulldev, nodev, nodev, /* cb_open, ... */ nodev, nodev, nodev, nodev, /* cb_dump, ... */ nodev, nodev, nodev, nochpoll, /* cb_devmap, ... */ ddi_prop_op, /* cb_prop_op */ &pppinfo, /* cb_stream */ D_NEW|D_MP|D_MTQPAIR|D_MTOUTPERIM|D_MTOCEXCL /* cb_flag */ }; static struct dev_ops ppp_ops = { DEVO_REV, /* devo_rev */ 0, /* devo_refcnt */ ppp_devinfo, /* devo_getinfo */ ppp_identify, /* devo_identify */ nulldev, /* devo_probe */ ppp_attach, /* devo_attach */ ppp_detach, /* devo_detach */ nodev, /* devo_reset */ &cb_ppp_ops, /* devo_cb_ops */ NULL /* devo_bus_ops */ }; /* * Module linkage information */ static struct modldrv modldrv = { &mod_driverops, /* says this is a pseudo driver */ "PPP-2.4.7 multiplexing driver", &ppp_ops /* driver ops */ }; static struct modlinkage modlinkage = { MODREV_1, (void *) &modldrv, NULL }; int _init(void) { return mod_install(&modlinkage); } int _fini(void) { return mod_remove(&modlinkage); } int _info(mip) struct modinfo *mip; { return mod_info(&modlinkage, mip); } static int ppp_identify(dip) dev_info_t *dip; { /* This entry point is not used as of Solaris 10 */ #ifdef DDI_IDENTIFIED return strcmp(ddi_get_name(dip), "ppp") == 0? DDI_IDENTIFIED: DDI_NOT_IDENTIFIED; #else return 0; #endif } static int ppp_attach(dip, cmd) dev_info_t *dip; ddi_attach_cmd_t cmd; { if (cmd != DDI_ATTACH) return DDI_FAILURE; if (ddi_create_minor_node(dip, "ppp", S_IFCHR, 0, DDI_PSEUDO, CLONE_DEV) == DDI_FAILURE) { ddi_remove_minor_node(dip, NULL); return DDI_FAILURE; } rw_init(&ppp_lower_lock, NULL, RW_DRIVER, NULL); return DDI_SUCCESS; } static int ppp_detach(dip, cmd) dev_info_t *dip; ddi_detach_cmd_t cmd; { rw_destroy(&ppp_lower_lock); ddi_remove_minor_node(dip, NULL); return DDI_SUCCESS; } static int ppp_devinfo(dip, cmd, arg, result) dev_info_t *dip; ddi_info_cmd_t cmd; void *arg; void **result; { int error; error = DDI_SUCCESS; switch (cmd) { case DDI_INFO_DEVT2DEVINFO: if (ppp_dip == NULL) error = DDI_FAILURE; else *result = (void *) ppp_dip; break; case DDI_INFO_DEVT2INSTANCE: *result = NULL; break; default: error = DDI_FAILURE; } return error; }