mirror of
https://github.com/paulusmack/ppp.git
synced 2024-12-02 16:03:31 +08:00
163 lines
3.8 KiB
C
163 lines
3.8 KiB
C
/*
|
|
* ppp_init.c --- PPP initialization/configuration for OSF/1.
|
|
*
|
|
* Get rid of svr4-style interface flag since the driver bits use
|
|
* use the old calling conventions.
|
|
*
|
|
* Configure should return ENOTSUP instead of EINVAL
|
|
*
|
|
* Use sysconfigtab framework
|
|
*
|
|
* Defer initialization callback until later in boot, to avoid panic.
|
|
*
|
|
* Note: Checks for #ifdef CFG_OP_CONFIGURE is my cheap way of telling
|
|
* whether this system is V3.0+ or V2.0. Is there a better way? srt
|
|
* Note: Checks for #ifdef CFG_PT_VM_AVAIL is my cheap way of telling
|
|
* whether this system is V4.0+ or earlier. smd
|
|
*/
|
|
|
|
#include <sys/sysconfig.h>
|
|
#include <sys/stream.h>
|
|
|
|
static int configured = 0;
|
|
static struct streamadm tmpl_sa = {
|
|
OSF_STREAMS_11,
|
|
STR_IS_MODULE,
|
|
{ NULL }, /* sa_name, filled in at boot time */
|
|
NULL, /* sa_ttys */
|
|
SQLVL_ELSEWHERE,
|
|
"ppp" /* "global" sync across all PPP modules */
|
|
};
|
|
|
|
extern struct streamtab ppp_ahdlcinfo;
|
|
extern struct streamtab if_pppinfo;
|
|
extern struct streamtab ppp_compinfo;
|
|
extern struct streamtab pppinfo;
|
|
|
|
#ifdef CFG_OP_CONFIGURE
|
|
/* the number of actual PPP interfaces is extended
|
|
* on-the-fly, as needed
|
|
*/
|
|
static int nppp = 1;
|
|
|
|
cfg_subsys_attr_t ppp_attributes[] = {
|
|
{"nppp", CFG_ATTR_INTTYPE,
|
|
CFG_OP_QUERY | CFG_OP_CONFIGURE,
|
|
(caddr_t) &nppp, 1, 1024, 0},
|
|
{"", 0, 0, 0, 0, 0, 0} /* must be the last element */
|
|
};
|
|
#else
|
|
typedef sysconfig_op_t cfg_op_t;
|
|
#endif
|
|
|
|
/* Add the PPP streams modules to the pool of available modules.
|
|
* If for some reason we can't add one of them, then remove the
|
|
* ones we did succeed in adding.
|
|
*/
|
|
static int
|
|
ppp_initialize()
|
|
{
|
|
dev_t devno = NODEV;
|
|
int ret = ESUCCESS;
|
|
|
|
if (!configured) {
|
|
strcpy(tmpl_sa.sa_name, "if_ppp");
|
|
if ((devno = strmod_add(NODEV, &if_pppinfo, &tmpl_sa)) == NODEV)
|
|
ret = ENODEV;
|
|
|
|
strcpy(tmpl_sa.sa_name, "ppp_ahdl");
|
|
if ((devno = strmod_add(NODEV, &ppp_ahdlcinfo, &tmpl_sa)) == NODEV) {
|
|
strcpy(tmpl_sa.sa_name, "if_ppp");
|
|
strmod_del(NODEV, &if_pppinfo, &tmpl_sa);
|
|
ret = ENODEV;
|
|
}
|
|
|
|
strcpy(tmpl_sa.sa_name, "pppcomp");
|
|
if ((devno = strmod_add(NODEV, &ppp_compinfo, &tmpl_sa)) == NODEV) {
|
|
strcpy(tmpl_sa.sa_name, "if_ppp");
|
|
strmod_del(NODEV, &if_pppinfo, &tmpl_sa);
|
|
strcpy(tmpl_sa.sa_name, "ppp_ahdl");
|
|
strmod_del(NODEV, &ppp_ahdlcinfo, &tmpl_sa);
|
|
ret = ENODEV;
|
|
}
|
|
|
|
strcpy(tmpl_sa.sa_name, "ppp");
|
|
tmpl_sa.sa_flags = STR_IS_DEVICE;
|
|
if ((devno = strmod_add(NODEV, &pppinfo, &tmpl_sa)) == NODEV) {
|
|
tmpl_sa.sa_flags = STR_IS_MODULE;
|
|
strcpy(tmpl_sa.sa_name, "if_ppp");
|
|
strmod_del(NODEV, &if_pppinfo, &tmpl_sa);
|
|
strcpy(tmpl_sa.sa_name, "ppp_ahdl");
|
|
strmod_del(NODEV, &ppp_ahdlcinfo, &tmpl_sa);
|
|
strcpy(tmpl_sa.sa_name, "pppcomp");
|
|
strmod_del(NODEV, &ppp_compinfo, &tmpl_sa);
|
|
ret = ENODEV;
|
|
}
|
|
configured = 1;
|
|
} else
|
|
ret = EINVAL;
|
|
|
|
return(ret);
|
|
}
|
|
|
|
#ifdef CFG_PT_VM_AVAIL
|
|
static void
|
|
ppp_callback(point, order, arg, event_arg)
|
|
int point;
|
|
int order;
|
|
ulong arg;
|
|
ulong event_arg;
|
|
{
|
|
int ret;
|
|
|
|
ret = ppp_initialize();
|
|
|
|
return; /* _callback returns void, losing info */
|
|
}
|
|
#endif /* CFG_PT_VM_AVAIL */
|
|
|
|
int
|
|
ppp_configure(op, indata, indata_size, outdata, outdata_size)
|
|
cfg_op_t op;
|
|
char *indata, *outdata;
|
|
ulong indata_size, outdata_size;
|
|
{
|
|
int ret = ESUCCESS;
|
|
|
|
switch (op) {
|
|
|
|
#ifdef CFG_OP_CONFIGURE
|
|
case CFG_OP_CONFIGURE:
|
|
#else
|
|
case SYSCONFIG_CONFIGURE:
|
|
#endif /* CFG_OP_CONFIGURE */
|
|
|
|
#ifdef CFG_PT_VM_AVAIL
|
|
ret = register_callback(ppp_callback,
|
|
CFG_PT_OLD_CONF_ALL, CFG_ORD_DONTCARE, 0L);
|
|
#else
|
|
ret = ppp_initialize();
|
|
#endif /* CFG_PT_VM_AVAIL */
|
|
|
|
break;
|
|
|
|
#ifdef CFG_OP_QUERY
|
|
case CFG_OP_QUERY:
|
|
#else
|
|
case SYSCONFIG_QUERY:
|
|
#endif
|
|
break;
|
|
|
|
#ifdef CFG_OP_RECONFIGURE
|
|
case CFG_OP_RECONFIGURE:
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
ret = ENOTSUP;
|
|
break;
|
|
}
|
|
|
|
return(ret);
|
|
}
|