1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)uipc_domain.c 7.11 (Berkeley) 11/18/92 8 */ 9 10 #include <sys/param.h> 11 #include <sys/socket.h> 12 #include <sys/protosw.h> 13 #include <sys/domain.h> 14 #include <sys/mbuf.h> 15 #include <sys/time.h> 16 #include <sys/kernel.h> 17 18 #define ADDDOMAIN(x) { \ 19 extern struct domain __CONCAT(x,domain); \ 20 __CONCAT(x,domain.dom_next) = domains; \ 21 domains = &__CONCAT(x,domain); \ 22 } 23 24 domaininit() 25 { 26 register struct domain *dp; 27 register struct protosw *pr; 28 29 #undef unix 30 #ifndef lint 31 ADDDOMAIN(unix); 32 ADDDOMAIN(route); 33 #ifdef INET 34 ADDDOMAIN(inet); 35 #endif 36 #ifdef NS 37 ADDDOMAIN(ns); 38 #endif 39 #ifdef ISO 40 ADDDOMAIN(iso); 41 #endif 42 #ifdef CCITT 43 ADDDOMAIN(ccitt); 44 #endif 45 #include "imp.h" 46 #if NIMP > 0 47 ADDDOMAIN(imp); 48 #endif 49 #endif 50 51 for (dp = domains; dp; dp = dp->dom_next) { 52 if (dp->dom_init) 53 (*dp->dom_init)(); 54 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 55 if (pr->pr_init) 56 (*pr->pr_init)(); 57 } 58 59 if (max_linkhdr < 16) /* XXX */ 60 max_linkhdr = 16; 61 max_hdr = max_linkhdr + max_protohdr; 62 max_datalen = MHLEN - max_hdr; 63 pffasttimo(); 64 pfslowtimo(); 65 } 66 67 struct protosw * 68 pffindtype(family, type) 69 int family, type; 70 { 71 register struct domain *dp; 72 register struct protosw *pr; 73 74 for (dp = domains; dp; dp = dp->dom_next) 75 if (dp->dom_family == family) 76 goto found; 77 return (0); 78 found: 79 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 80 if (pr->pr_type && pr->pr_type == type) 81 return (pr); 82 return (0); 83 } 84 85 struct protosw * 86 pffindproto(family, protocol, type) 87 int family, protocol, type; 88 { 89 register struct domain *dp; 90 register struct protosw *pr; 91 struct protosw *maybe = 0; 92 93 if (family == 0) 94 return (0); 95 for (dp = domains; dp; dp = dp->dom_next) 96 if (dp->dom_family == family) 97 goto found; 98 return (0); 99 found: 100 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 101 if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 102 return (pr); 103 104 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 105 pr->pr_protocol == 0 && maybe == (struct protosw *)0) 106 maybe = pr; 107 } 108 return (maybe); 109 } 110 111 pfctlinput(cmd, sa) 112 int cmd; 113 struct sockaddr *sa; 114 { 115 register struct domain *dp; 116 register struct protosw *pr; 117 118 for (dp = domains; dp; dp = dp->dom_next) 119 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 120 if (pr->pr_ctlinput) 121 (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 122 } 123 124 pfslowtimo() 125 { 126 register struct domain *dp; 127 register struct protosw *pr; 128 129 for (dp = domains; dp; dp = dp->dom_next) 130 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 131 if (pr->pr_slowtimo) 132 (*pr->pr_slowtimo)(); 133 timeout(pfslowtimo, (caddr_t)0, hz/2); 134 } 135 136 pffasttimo() 137 { 138 register struct domain *dp; 139 register struct protosw *pr; 140 141 for (dp = domains; dp; dp = dp->dom_next) 142 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 143 if (pr->pr_fasttimo) 144 (*pr->pr_fasttimo)(); 145 timeout(pffasttimo, (caddr_t)0, hz/5); 146 } 147