/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ /* * Copyright (c) 1982 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * * SCCSID: @(#)uipc_domain.c 3.0 4/21/86 * Based on: @(#)uipc_domain.c 6.6 (Berkeley) 6/8/85 */ #include <sys/param.h> #include <sys/socket.h> #include <sys/protosw.h> #include <sys/domain.h> #ifdef vax #include "time.h" #include "kernel.h" #else pdp11 extern int hz; #define ADDDOMAIN(x) { \ extern struct domain x/**/domain; \ x/**/domain.dom_next = domains; \ domains = &x/**/domain; \ } domaininit() { register struct domain *dp; register struct protosw *pr; #ifndef lint #ifdef UNIX_DOMAIN ADDDOMAIN(unix); #endif #ifdef INET ADDDOMAIN(inet); #endif #ifdef NS ADDDOMAIN(ns); #endif #ifdef PUP ADDDOMAIN(pup); #endif #if NIMP > 0 ADDDOMAIN(imp); #endif #ifdef DECNET ADDDOMAIN(decnet); #endif #ifdef LAT ADDDOMAIN(lat); #endif #ifdef DLI ADDDOMAIN(dli); #endif #endif for (dp = domains; dp; dp = dp->dom_next) { if (dp->dom_init) (*dp->dom_init)(); for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_init) (*pr->pr_init)(); } pffasttimo(); pfslowtimo(); } struct protosw * pffindtype(family, type) int family, type; { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) if (dp->dom_family == family) goto found; return (0); found: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_type && pr->pr_type == type) return (pr); return (0); } struct protosw * pffindproto(family, protocol, type) int family, protocol, type; { register struct domain *dp; register struct protosw *pr; struct protosw *maybe = 0; if (family == 0) return (0); for (dp = domains; dp; dp = dp->dom_next) if (dp->dom_family == family) goto found; return (0); found: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { if (pr->pr_protocol == protocol) return (pr); if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && pr->pr_protocol == 0 && maybe == (struct protosw *)0) maybe = pr; } return (maybe); } pfctlinput(cmd, arg) int cmd; caddr_t arg; { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_ctlinput) (*pr->pr_ctlinput)(cmd, arg); } pfslowtimo() { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_slowtimo) (*pr->pr_slowtimo)(); timeout(pfslowtimo, (caddr_t)0, hz/2); } pffasttimo() { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_fasttimo) (*pr->pr_fasttimo)(); timeout(pffasttimo, (caddr_t)0, hz/5); }