xref: /csrg-svn/sys/kern/uipc_domain.c (revision 56517)
123416Smckusick /*
229123Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
333187Sbostic  * All rights reserved.
423416Smckusick  *
544447Sbostic  * %sccs.include.redist.c%
633187Sbostic  *
7*56517Sbostic  *	@(#)uipc_domain.c	7.10 (Berkeley) 10/11/92
823416Smckusick  */
97425Sroot 
10*56517Sbostic #include <sys/param.h>
11*56517Sbostic #include <sys/socket.h>
12*56517Sbostic #include <sys/protosw.h>
13*56517Sbostic #include <sys/domain.h>
14*56517Sbostic #include <sys/mbuf.h>
15*56517Sbostic #include <sys/time.h>
16*56517Sbostic #include <sys/kernel.h>
177425Sroot 
189008Sroot #define	ADDDOMAIN(x)	{ \
1946970Sbostic 	extern struct domain __CONCAT(x,domain); \
2046970Sbostic 	__CONCAT(x,domain.dom_next) = domains; \
2146970Sbostic 	domains = &__CONCAT(x,domain); \
229008Sroot }
239008Sroot 
249008Sroot domaininit()
257500Sroot {
269161Ssam 	register struct domain *dp;
279161Ssam 	register struct protosw *pr;
287500Sroot 
2946970Sbostic #undef unix
309161Ssam #ifndef lint
319008Sroot 	ADDDOMAIN(unix);
3237330Skarels 	ADDDOMAIN(route);
3325765Skarels #ifdef INET
349008Sroot 	ADDDOMAIN(inet);
359008Sroot #endif
3618816Ssklower #ifdef NS
3718816Ssklower 	ADDDOMAIN(ns);
3818816Ssklower #endif
3937330Skarels #ifdef ISO
4037330Skarels 	ADDDOMAIN(iso);
4137330Skarels #endif
4241997Smckusick #ifdef RMP
4341997Smckusick 	ADDDOMAIN(rmp);
4441997Smckusick #endif
4545665Ssklower #ifdef CCITT
4645665Ssklower 	ADDDOMAIN(ccitt);
4745665Ssklower #endif
4810025Ssam #include "imp.h"
4910025Ssam #if NIMP > 0
509008Sroot 	ADDDOMAIN(imp);
519008Sroot #endif
529161Ssam #endif
539008Sroot 
5416993Skarels 	for (dp = domains; dp; dp = dp->dom_next) {
5516993Skarels 		if (dp->dom_init)
5616993Skarels 			(*dp->dom_init)();
579008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
589008Sroot 			if (pr->pr_init)
599008Sroot 				(*pr->pr_init)();
6016993Skarels 	}
6137330Skarels 
6237330Skarels if (max_linkhdr < 16)		/* XXX */
6337330Skarels max_linkhdr = 16;
6437330Skarels 	max_hdr = max_linkhdr + max_protohdr;
6537330Skarels 	max_datalen = MHLEN - max_hdr;
669161Ssam 	pffasttimo();
679161Ssam 	pfslowtimo();
689008Sroot }
699008Sroot 
709008Sroot struct protosw *
719008Sroot pffindtype(family, type)
729008Sroot 	int family, type;
739008Sroot {
749008Sroot 	register struct domain *dp;
759008Sroot 	register struct protosw *pr;
769008Sroot 
779008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
789008Sroot 		if (dp->dom_family == family)
799008Sroot 			goto found;
809008Sroot 	return (0);
819008Sroot found:
829008Sroot 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
8311569Ssam 		if (pr->pr_type && pr->pr_type == type)
849008Sroot 			return (pr);
859008Sroot 	return (0);
869008Sroot }
879008Sroot 
889008Sroot struct protosw *
8921766Skarels pffindproto(family, protocol, type)
9021766Skarels 	int family, protocol, type;
919008Sroot {
929008Sroot 	register struct domain *dp;
939008Sroot 	register struct protosw *pr;
9421766Skarels 	struct protosw *maybe = 0;
959008Sroot 
969008Sroot 	if (family == 0)
979008Sroot 		return (0);
989008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
999008Sroot 		if (dp->dom_family == family)
1009008Sroot 			goto found;
1019008Sroot 	return (0);
1029008Sroot found:
10321766Skarels 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
10424519Skarels 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
1059008Sroot 			return (pr);
10624519Skarels 
10721766Skarels 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
10821766Skarels 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
10921766Skarels 			maybe = pr;
11021766Skarels 	}
11121766Skarels 	return (maybe);
1129008Sroot }
1139008Sroot 
11424767Skarels pfctlinput(cmd, sa)
1159008Sroot 	int cmd;
11624767Skarels 	struct sockaddr *sa;
1179008Sroot {
1189008Sroot 	register struct domain *dp;
1199008Sroot 	register struct protosw *pr;
1209008Sroot 
1219008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1229008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1239008Sroot 			if (pr->pr_ctlinput)
12440668Skarels 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
1259008Sroot }
1269008Sroot 
1279008Sroot pfslowtimo()
1289008Sroot {
1299008Sroot 	register struct domain *dp;
1309008Sroot 	register struct protosw *pr;
1319008Sroot 
1329008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1339008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1349008Sroot 			if (pr->pr_slowtimo)
1359008Sroot 				(*pr->pr_slowtimo)();
1369161Ssam 	timeout(pfslowtimo, (caddr_t)0, hz/2);
1379008Sroot }
1389008Sroot 
1399008Sroot pffasttimo()
1409008Sroot {
1419008Sroot 	register struct domain *dp;
1429008Sroot 	register struct protosw *pr;
1439008Sroot 
1449008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1459008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1469008Sroot 			if (pr->pr_fasttimo)
1479008Sroot 				(*pr->pr_fasttimo)();
1489161Ssam 	timeout(pffasttimo, (caddr_t)0, hz/5);
1499008Sroot }
150