xref: /csrg-svn/sys/kern/uipc_domain.c (revision 46970)
123416Smckusick /*
229123Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
333187Sbostic  * All rights reserved.
423416Smckusick  *
544447Sbostic  * %sccs.include.redist.c%
633187Sbostic  *
7*46970Sbostic  *	@(#)uipc_domain.c	7.9 (Berkeley) 03/04/91
823416Smckusick  */
97425Sroot 
10*46970Sbostic #include <sys/cdefs.h>
1117102Sbloom #include "param.h"
1217102Sbloom #include "socket.h"
1317102Sbloom #include "protosw.h"
1417102Sbloom #include "domain.h"
1537330Skarels #include "mbuf.h"
1617102Sbloom #include "time.h"
1717102Sbloom #include "kernel.h"
187425Sroot 
199008Sroot #define	ADDDOMAIN(x)	{ \
20*46970Sbostic 	extern struct domain __CONCAT(x,domain); \
21*46970Sbostic 	__CONCAT(x,domain.dom_next) = domains; \
22*46970Sbostic 	domains = &__CONCAT(x,domain); \
239008Sroot }
249008Sroot 
259008Sroot domaininit()
267500Sroot {
279161Ssam 	register struct domain *dp;
289161Ssam 	register struct protosw *pr;
297500Sroot 
30*46970Sbostic #undef unix
319161Ssam #ifndef lint
329008Sroot 	ADDDOMAIN(unix);
3337330Skarels 	ADDDOMAIN(route);
3425765Skarels #ifdef INET
359008Sroot 	ADDDOMAIN(inet);
369008Sroot #endif
3718816Ssklower #ifdef NS
3818816Ssklower 	ADDDOMAIN(ns);
3918816Ssklower #endif
4037330Skarels #ifdef ISO
4137330Skarels 	ADDDOMAIN(iso);
4237330Skarels #endif
4341997Smckusick #ifdef RMP
4441997Smckusick 	ADDDOMAIN(rmp);
4541997Smckusick #endif
4645665Ssklower #ifdef CCITT
4745665Ssklower 	ADDDOMAIN(ccitt);
4845665Ssklower #endif
4910025Ssam #include "imp.h"
5010025Ssam #if NIMP > 0
519008Sroot 	ADDDOMAIN(imp);
529008Sroot #endif
539161Ssam #endif
549008Sroot 
5516993Skarels 	for (dp = domains; dp; dp = dp->dom_next) {
5616993Skarels 		if (dp->dom_init)
5716993Skarels 			(*dp->dom_init)();
589008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
599008Sroot 			if (pr->pr_init)
609008Sroot 				(*pr->pr_init)();
6116993Skarels 	}
6237330Skarels 
6337330Skarels if (max_linkhdr < 16)		/* XXX */
6437330Skarels max_linkhdr = 16;
6537330Skarels 	max_hdr = max_linkhdr + max_protohdr;
6637330Skarels 	max_datalen = MHLEN - max_hdr;
679161Ssam 	pffasttimo();
689161Ssam 	pfslowtimo();
699008Sroot }
709008Sroot 
719008Sroot struct protosw *
729008Sroot pffindtype(family, type)
739008Sroot 	int family, type;
749008Sroot {
759008Sroot 	register struct domain *dp;
769008Sroot 	register struct protosw *pr;
779008Sroot 
789008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
799008Sroot 		if (dp->dom_family == family)
809008Sroot 			goto found;
819008Sroot 	return (0);
829008Sroot found:
839008Sroot 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
8411569Ssam 		if (pr->pr_type && pr->pr_type == type)
859008Sroot 			return (pr);
869008Sroot 	return (0);
879008Sroot }
889008Sroot 
899008Sroot struct protosw *
9021766Skarels pffindproto(family, protocol, type)
9121766Skarels 	int family, protocol, type;
929008Sroot {
939008Sroot 	register struct domain *dp;
949008Sroot 	register struct protosw *pr;
9521766Skarels 	struct protosw *maybe = 0;
969008Sroot 
979008Sroot 	if (family == 0)
989008Sroot 		return (0);
999008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1009008Sroot 		if (dp->dom_family == family)
1019008Sroot 			goto found;
1029008Sroot 	return (0);
1039008Sroot found:
10421766Skarels 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
10524519Skarels 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
1069008Sroot 			return (pr);
10724519Skarels 
10821766Skarels 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
10921766Skarels 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
11021766Skarels 			maybe = pr;
11121766Skarels 	}
11221766Skarels 	return (maybe);
1139008Sroot }
1149008Sroot 
11524767Skarels pfctlinput(cmd, sa)
1169008Sroot 	int cmd;
11724767Skarels 	struct sockaddr *sa;
1189008Sroot {
1199008Sroot 	register struct domain *dp;
1209008Sroot 	register struct protosw *pr;
1219008Sroot 
1229008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1239008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1249008Sroot 			if (pr->pr_ctlinput)
12540668Skarels 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
1269008Sroot }
1279008Sroot 
1289008Sroot pfslowtimo()
1299008Sroot {
1309008Sroot 	register struct domain *dp;
1319008Sroot 	register struct protosw *pr;
1329008Sroot 
1339008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1349008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1359008Sroot 			if (pr->pr_slowtimo)
1369008Sroot 				(*pr->pr_slowtimo)();
1379161Ssam 	timeout(pfslowtimo, (caddr_t)0, hz/2);
1389008Sroot }
1399008Sroot 
1409008Sroot pffasttimo()
1419008Sroot {
1429008Sroot 	register struct domain *dp;
1439008Sroot 	register struct protosw *pr;
1449008Sroot 
1459008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1469008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1479008Sroot 			if (pr->pr_fasttimo)
1489008Sroot 				(*pr->pr_fasttimo)();
1499161Ssam 	timeout(pffasttimo, (caddr_t)0, hz/5);
1509008Sroot }
151