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