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.12 (Berkeley) 02/04/93 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 #include <sys/sysctl.h> 18 19 #define ADDDOMAIN(x) { \ 20 extern struct domain __CONCAT(x,domain); \ 21 __CONCAT(x,domain.dom_next) = domains; \ 22 domains = &__CONCAT(x,domain); \ 23 } 24 25 domaininit() 26 { 27 register struct domain *dp; 28 register struct protosw *pr; 29 30 #undef unix 31 #ifndef lint 32 ADDDOMAIN(unix); 33 ADDDOMAIN(route); 34 #ifdef INET 35 ADDDOMAIN(inet); 36 #endif 37 #ifdef NS 38 ADDDOMAIN(ns); 39 #endif 40 #ifdef ISO 41 ADDDOMAIN(iso); 42 #endif 43 #ifdef CCITT 44 ADDDOMAIN(ccitt); 45 #endif 46 #include "imp.h" 47 #if NIMP > 0 48 ADDDOMAIN(imp); 49 #endif 50 #endif 51 52 for (dp = domains; dp; dp = dp->dom_next) { 53 if (dp->dom_init) 54 (*dp->dom_init)(); 55 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 56 if (pr->pr_init) 57 (*pr->pr_init)(); 58 } 59 60 if (max_linkhdr < 16) /* XXX */ 61 max_linkhdr = 16; 62 max_hdr = max_linkhdr + max_protohdr; 63 max_datalen = MHLEN - max_hdr; 64 pffasttimo(); 65 pfslowtimo(); 66 } 67 68 struct protosw * 69 pffindtype(family, type) 70 int family, type; 71 { 72 register struct domain *dp; 73 register struct protosw *pr; 74 75 for (dp = domains; dp; dp = dp->dom_next) 76 if (dp->dom_family == family) 77 goto found; 78 return (0); 79 found: 80 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 81 if (pr->pr_type && pr->pr_type == type) 82 return (pr); 83 return (0); 84 } 85 86 struct protosw * 87 pffindproto(family, protocol, type) 88 int family, protocol, type; 89 { 90 register struct domain *dp; 91 register struct protosw *pr; 92 struct protosw *maybe = 0; 93 94 if (family == 0) 95 return (0); 96 for (dp = domains; dp; dp = dp->dom_next) 97 if (dp->dom_family == family) 98 goto found; 99 return (0); 100 found: 101 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 102 if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 103 return (pr); 104 105 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 106 pr->pr_protocol == 0 && maybe == (struct protosw *)0) 107 maybe = pr; 108 } 109 return (maybe); 110 } 111 112 net_sysctl(name, namelen, oldp, oldlenp, newp, newlen) 113 int *name; 114 u_int namelen; 115 void *oldp; 116 u_int *oldlenp; 117 void *newp; 118 u_int newlen; 119 { 120 register struct domain *dp; 121 register struct protosw *pr; 122 int family, protocol; 123 124 /* 125 * All sysctl names at this level are nonterminal; 126 * next two components are protocol family and protocol number, 127 * then at least one addition component. 128 */ 129 if (namelen <= 3) 130 return (EISDIR); /* overloaded */ 131 family = name[0]; 132 protocol = name[1]; 133 134 if (family == 0) 135 return (0); 136 for (dp = domains; dp; dp = dp->dom_next) 137 if (dp->dom_family == family) 138 goto found; 139 return (ENOPROTOOPT); 140 found: 141 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 142 if (pr->pr_protocol == protocol && pr->pr_sysctl) 143 return ((*pr->pr_sysctl)(name + 2, namelen - 2, 144 oldp, oldlenp, newp, newlen)); 145 return (ENOPROTOOPT); 146 } 147 148 pfctlinput(cmd, sa) 149 int cmd; 150 struct sockaddr *sa; 151 { 152 register struct domain *dp; 153 register struct protosw *pr; 154 155 for (dp = domains; dp; dp = dp->dom_next) 156 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 157 if (pr->pr_ctlinput) 158 (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 159 } 160 161 pfslowtimo() 162 { 163 register struct domain *dp; 164 register struct protosw *pr; 165 166 for (dp = domains; dp; dp = dp->dom_next) 167 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 168 if (pr->pr_slowtimo) 169 (*pr->pr_slowtimo)(); 170 timeout(pfslowtimo, (caddr_t)0, hz/2); 171 } 172 173 pffasttimo() 174 { 175 register struct domain *dp; 176 register struct protosw *pr; 177 178 for (dp = domains; dp; dp = dp->dom_next) 179 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 180 if (pr->pr_fasttimo) 181 (*pr->pr_fasttimo)(); 182 timeout(pffasttimo, (caddr_t)0, hz/5); 183 } 184