xref: /csrg-svn/sys/kern/uipc_domain.c (revision 44447)
123416Smckusick /*
229123Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
333187Sbostic  * All rights reserved.
423416Smckusick  *
5*44447Sbostic  * %sccs.include.redist.c%
633187Sbostic  *
7*44447Sbostic  *	@(#)uipc_domain.c	7.7 (Berkeley) 06/28/90
823416Smckusick  */
97425Sroot 
1017102Sbloom #include "param.h"
1117102Sbloom #include "socket.h"
1217102Sbloom #include "protosw.h"
1317102Sbloom #include "domain.h"
1437330Skarels #include "mbuf.h"
1517102Sbloom #include "time.h"
1617102Sbloom #include "kernel.h"
177425Sroot 
189008Sroot #define	ADDDOMAIN(x)	{ \
199008Sroot 	extern struct domain x/**/domain; \
209008Sroot 	x/**/domain.dom_next = domains; \
219008Sroot 	domains = &x/**/domain; \
229008Sroot }
239008Sroot 
249008Sroot domaininit()
257500Sroot {
269161Ssam 	register struct domain *dp;
279161Ssam 	register struct protosw *pr;
287500Sroot 
299161Ssam #ifndef lint
309008Sroot 	ADDDOMAIN(unix);
3137330Skarels 	ADDDOMAIN(route);
3225765Skarels #ifdef INET
339008Sroot 	ADDDOMAIN(inet);
349008Sroot #endif
3518816Ssklower #ifdef NS
3618816Ssklower 	ADDDOMAIN(ns);
3718816Ssklower #endif
3837330Skarels #ifdef ISO
3937330Skarels 	ADDDOMAIN(iso);
4037330Skarels #endif
4141997Smckusick #ifdef RMP
4241997Smckusick 	ADDDOMAIN(rmp);
4341997Smckusick #endif
4410025Ssam #include "imp.h"
4510025Ssam #if NIMP > 0
469008Sroot 	ADDDOMAIN(imp);
479008Sroot #endif
489161Ssam #endif
499008Sroot 
5016993Skarels 	for (dp = domains; dp; dp = dp->dom_next) {
5116993Skarels 		if (dp->dom_init)
5216993Skarels 			(*dp->dom_init)();
539008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
549008Sroot 			if (pr->pr_init)
559008Sroot 				(*pr->pr_init)();
5616993Skarels 	}
5737330Skarels 
5837330Skarels if (max_linkhdr < 16)		/* XXX */
5937330Skarels max_linkhdr = 16;
6037330Skarels 	max_hdr = max_linkhdr + max_protohdr;
6137330Skarels 	max_datalen = MHLEN - max_hdr;
629161Ssam 	pffasttimo();
639161Ssam 	pfslowtimo();
649008Sroot }
659008Sroot 
669008Sroot struct protosw *
679008Sroot pffindtype(family, type)
689008Sroot 	int family, type;
699008Sroot {
709008Sroot 	register struct domain *dp;
719008Sroot 	register struct protosw *pr;
729008Sroot 
739008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
749008Sroot 		if (dp->dom_family == family)
759008Sroot 			goto found;
769008Sroot 	return (0);
779008Sroot found:
789008Sroot 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
7911569Ssam 		if (pr->pr_type && pr->pr_type == type)
809008Sroot 			return (pr);
819008Sroot 	return (0);
829008Sroot }
839008Sroot 
849008Sroot struct protosw *
8521766Skarels pffindproto(family, protocol, type)
8621766Skarels 	int family, protocol, type;
879008Sroot {
889008Sroot 	register struct domain *dp;
899008Sroot 	register struct protosw *pr;
9021766Skarels 	struct protosw *maybe = 0;
919008Sroot 
929008Sroot 	if (family == 0)
939008Sroot 		return (0);
949008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
959008Sroot 		if (dp->dom_family == family)
969008Sroot 			goto found;
979008Sroot 	return (0);
989008Sroot found:
9921766Skarels 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
10024519Skarels 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
1019008Sroot 			return (pr);
10224519Skarels 
10321766Skarels 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
10421766Skarels 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
10521766Skarels 			maybe = pr;
10621766Skarels 	}
10721766Skarels 	return (maybe);
1089008Sroot }
1099008Sroot 
11024767Skarels pfctlinput(cmd, sa)
1119008Sroot 	int cmd;
11224767Skarels 	struct sockaddr *sa;
1139008Sroot {
1149008Sroot 	register struct domain *dp;
1159008Sroot 	register struct protosw *pr;
1169008Sroot 
1179008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1189008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1199008Sroot 			if (pr->pr_ctlinput)
12040668Skarels 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
1219008Sroot }
1229008Sroot 
1239008Sroot pfslowtimo()
1249008Sroot {
1259008Sroot 	register struct domain *dp;
1269008Sroot 	register struct protosw *pr;
1279008Sroot 
1289008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1299008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1309008Sroot 			if (pr->pr_slowtimo)
1319008Sroot 				(*pr->pr_slowtimo)();
1329161Ssam 	timeout(pfslowtimo, (caddr_t)0, hz/2);
1339008Sroot }
1349008Sroot 
1359008Sroot pffasttimo()
1369008Sroot {
1379008Sroot 	register struct domain *dp;
1389008Sroot 	register struct protosw *pr;
1399008Sroot 
1409008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1419008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1429008Sroot 			if (pr->pr_fasttimo)
1439008Sroot 				(*pr->pr_fasttimo)();
1449161Ssam 	timeout(pffasttimo, (caddr_t)0, hz/5);
1459008Sroot }
146