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.14 (Berkeley) 03/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, p) 113 int *name; 114 u_int namelen; 115 void *oldp; 116 size_t *oldlenp; 117 void *newp; 118 size_t newlen; 119 struct proc *p; 120 { 121 register struct domain *dp; 122 register struct protosw *pr; 123 int family, protocol; 124 125 /* 126 * All sysctl names at this level are nonterminal; 127 * next two components are protocol family and protocol number, 128 * then at least one addition component. 129 */ 130 if (namelen <= 3) 131 return (EISDIR); /* overloaded */ 132 family = name[0]; 133 protocol = name[1]; 134 135 if (family == 0) 136 return (0); 137 for (dp = domains; dp; dp = dp->dom_next) 138 if (dp->dom_family == family) 139 goto found; 140 return (ENOPROTOOPT); 141 found: 142 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 143 if (pr->pr_protocol == protocol && pr->pr_sysctl) 144 return ((*pr->pr_sysctl)(name + 2, namelen - 2, 145 oldp, oldlenp, newp, newlen)); 146 return (ENOPROTOOPT); 147 } 148 149 pfctlinput(cmd, sa) 150 int cmd; 151 struct sockaddr *sa; 152 { 153 register struct domain *dp; 154 register struct protosw *pr; 155 156 for (dp = domains; dp; dp = dp->dom_next) 157 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 158 if (pr->pr_ctlinput) 159 (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 160 } 161 162 pfslowtimo() 163 { 164 register struct domain *dp; 165 register struct protosw *pr; 166 167 for (dp = domains; dp; dp = dp->dom_next) 168 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 169 if (pr->pr_slowtimo) 170 (*pr->pr_slowtimo)(); 171 timeout(pfslowtimo, (caddr_t)0, hz/2); 172 } 173 174 pffasttimo() 175 { 176 register struct domain *dp; 177 register struct protosw *pr; 178 179 for (dp = domains; dp; dp = dp->dom_next) 180 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 181 if (pr->pr_fasttimo) 182 (*pr->pr_fasttimo)(); 183 timeout(pffasttimo, (caddr_t)0, hz/5); 184 } 185