xref: /csrg-svn/sys/kern/uipc_domain.c (revision 45665)
123416Smckusick /*
229123Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
333187Sbostic  * All rights reserved.
423416Smckusick  *
544447Sbostic  * %sccs.include.redist.c%
633187Sbostic  *
7*45665Ssklower  *	@(#)uipc_domain.c	7.8 (Berkeley) 11/29/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
44*45665Ssklower #ifdef CCITT
45*45665Ssklower 	ADDDOMAIN(ccitt);
46*45665Ssklower #endif
4710025Ssam #include "imp.h"
4810025Ssam #if NIMP > 0
499008Sroot 	ADDDOMAIN(imp);
509008Sroot #endif
519161Ssam #endif
529008Sroot 
5316993Skarels 	for (dp = domains; dp; dp = dp->dom_next) {
5416993Skarels 		if (dp->dom_init)
5516993Skarels 			(*dp->dom_init)();
569008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
579008Sroot 			if (pr->pr_init)
589008Sroot 				(*pr->pr_init)();
5916993Skarels 	}
6037330Skarels 
6137330Skarels if (max_linkhdr < 16)		/* XXX */
6237330Skarels max_linkhdr = 16;
6337330Skarels 	max_hdr = max_linkhdr + max_protohdr;
6437330Skarels 	max_datalen = MHLEN - max_hdr;
659161Ssam 	pffasttimo();
669161Ssam 	pfslowtimo();
679008Sroot }
689008Sroot 
699008Sroot struct protosw *
709008Sroot pffindtype(family, type)
719008Sroot 	int family, type;
729008Sroot {
739008Sroot 	register struct domain *dp;
749008Sroot 	register struct protosw *pr;
759008Sroot 
769008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
779008Sroot 		if (dp->dom_family == family)
789008Sroot 			goto found;
799008Sroot 	return (0);
809008Sroot found:
819008Sroot 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
8211569Ssam 		if (pr->pr_type && pr->pr_type == type)
839008Sroot 			return (pr);
849008Sroot 	return (0);
859008Sroot }
869008Sroot 
879008Sroot struct protosw *
8821766Skarels pffindproto(family, protocol, type)
8921766Skarels 	int family, protocol, type;
909008Sroot {
919008Sroot 	register struct domain *dp;
929008Sroot 	register struct protosw *pr;
9321766Skarels 	struct protosw *maybe = 0;
949008Sroot 
959008Sroot 	if (family == 0)
969008Sroot 		return (0);
979008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
989008Sroot 		if (dp->dom_family == family)
999008Sroot 			goto found;
1009008Sroot 	return (0);
1019008Sroot found:
10221766Skarels 	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
10324519Skarels 		if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
1049008Sroot 			return (pr);
10524519Skarels 
10621766Skarels 		if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
10721766Skarels 		    pr->pr_protocol == 0 && maybe == (struct protosw *)0)
10821766Skarels 			maybe = pr;
10921766Skarels 	}
11021766Skarels 	return (maybe);
1119008Sroot }
1129008Sroot 
11324767Skarels pfctlinput(cmd, sa)
1149008Sroot 	int cmd;
11524767Skarels 	struct sockaddr *sa;
1169008Sroot {
1179008Sroot 	register struct domain *dp;
1189008Sroot 	register struct protosw *pr;
1199008Sroot 
1209008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1219008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1229008Sroot 			if (pr->pr_ctlinput)
12340668Skarels 				(*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0);
1249008Sroot }
1259008Sroot 
1269008Sroot pfslowtimo()
1279008Sroot {
1289008Sroot 	register struct domain *dp;
1299008Sroot 	register struct protosw *pr;
1309008Sroot 
1319008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1329008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1339008Sroot 			if (pr->pr_slowtimo)
1349008Sroot 				(*pr->pr_slowtimo)();
1359161Ssam 	timeout(pfslowtimo, (caddr_t)0, hz/2);
1369008Sroot }
1379008Sroot 
1389008Sroot pffasttimo()
1399008Sroot {
1409008Sroot 	register struct domain *dp;
1419008Sroot 	register struct protosw *pr;
1429008Sroot 
1439008Sroot 	for (dp = domains; dp; dp = dp->dom_next)
1449008Sroot 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
1459008Sroot 			if (pr->pr_fasttimo)
1469008Sroot 				(*pr->pr_fasttimo)();
1479161Ssam 	timeout(pffasttimo, (caddr_t)0, hz/5);
1489008Sroot }
149