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