X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=osf1%2Fppp_init.c;h=f40f8c5e3391a99561d4b9b5dab599b0b5827f9f;hp=71d996e1f710f8ef4a232e968c81afd1d93f991c;hb=10ae3ff470541d4de8cfb802ae5ba0b6b952a92a;hpb=a7190159a848217af92e3aa11ce8c083e878fa06 diff --git a/osf1/ppp_init.c b/osf1/ppp_init.c index 71d996e..f40f8c5 100644 --- a/osf1/ppp_init.c +++ b/osf1/ppp_init.c @@ -1,140 +1,162 @@ /* - * ***************************************************************** - * * * - * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * - * * * - * * All Rights Reserved. Unpublished rights reserved under * - * * the copyright laws of the United States. * - * * * - * * The software contained on this media is proprietary to * - * * and embodies the confidential technology of Digital * - * * Equipment Corporation. Possession, use, duplication or * - * * dissemination of the software and media is authorized only * - * * pursuant to a valid written license from Digital Equipment * - * * Corporation. * - * * * - * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * - * * by the U.S. Government is subject to restrictions as set * - * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * - * * or in FAR 52.227-19, as applicable. * - * * * - * ***************************************************************** - */ -/* - * HISTORY - */ -/* - * static char *rcsid = "@(#)$RCSfile: ppp_init.c,v $ $Revision: 1.1 $ (DEC) $Date: 1995/05/22 02:30:55 $"; - */ -/* - * (c) Copyright 1990, 1991, 1992 OPEN SOFTWARE FOUNDATION, INC. - * ALL RIGHTS RESERVED - */ -/* - * OSF/1 Release 1.2 - */ - -/* - * template for the initialization routine for a module/driver + * ppp_init.c --- PPP initialization/configuration for OSF/1. * - * - #define STRNAME to driver/module name (with quotes) - * (maximum length FMNAMESZ, which is fixed at 8 + trailing 0). + * Get rid of svr4-style interface flag since the driver bits use + * use the old calling conventions. * - * - #define STRCONFIG to the configure entry point's name + * Configure should return ENOTSUP instead of EINVAL * - * - #define STRINFO to the driver/module's info structure name. + * Use sysconfigtab framework * - * - #define STRFLAGS to STR_IS_DEVICE or STR_IS_MODULE with others - * as appropriate (e.g. STR_SYSV4_OPEN). + * Defer initialization callback until later in boot, to avoid panic. * - * - #define STRSYNCL, STRSYNCI, STRTTYS to appropriate values if - * not the defaults below. See the manual. - * - * - Include this file into module's source file, - * preferably after the streamtab definition - * - * - The input buffer, indata, should be of the form "variable=value\n". - * It should always begin with "subsys=subsystem-name\n" and it should - * end with a '\0'. An example would be a subsystem, foo, - * which wants to use a specific device number. The input buffer, - * indata, should be "subsys=foo\ndevno=123\n\0". - * - * - If your driver should take a specific character device number, - * be sure to pass it within indata (e.g devno=123), else look at - * outdata for assigned value. - * - * - Apart from this change, you'll have to update - * - * - kernel/streams/str_config.c - * (insert a call to this routine) - * - kernel/conf/files - * (insert module's source file) + * 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 #include -#ifndef PPP_VD -#include "ppp.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 -static struct streamadm tmpl_sa; +/* 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; + } -extern struct streamtab ppp_asyncinfo; -extern struct streamtab ppp_ifinfo; -extern struct streamtab ppp_compinfo; + 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, indatalen, outdata, outdatalen) - sysconfig_op_t op; - char * indata; - size_t indatalen; - char * outdata; - size_t outdatalen; +ppp_configure(op, indata, indata_size, outdata, outdata_size) +cfg_op_t op; +char *indata, *outdata; +ulong indata_size, outdata_size; { - static dev_t devno; - int configured; - int size; - int ret = 0; - int x; - - switch (op) { - - case SYSCONFIG_CONFIGURE: - - tmpl_sa.sa_version = OSF_STREAMS_11; - tmpl_sa.sa_flags = STR_IS_MODULE|STR_SYSV4_OPEN; - tmpl_sa.sa_ttys = NULL; - tmpl_sa.sa_sync_level = SQLVL_QUEUE; - tmpl_sa.sa_sync_info = 0; - - strcpy(tmpl_sa.sa_name, "pppif"); - - if ((devno= strmod_add(NODEV, &ppp_ifinfo, &tmpl_sa)) == NODEV) - ret = ENODEV; - else { - strcpy(tmpl_sa.sa_name, "pppasync"); - if ((devno = strmod_add(NODEV, &ppp_asyncinfo, &tmpl_sa)) == NODEV) - ret = ENODEV; - else { - strcpy(tmpl_sa.sa_name, "pppcomp"); - if ((devno = strmod_add(NODEV, &ppp_compinfo, &tmpl_sa)) == NODEV) - ret = ENODEV; - } - } - - for(x = 0; x < NPPP; x ++) - ppp_attach(x); - - if (outdata && outdatalen>=0) - bcopy(indata,outdata,outdatalen); - - break; - - default: - ret = EINVAL; - break; - } + 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); + return(ret); }