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.9 (Berkeley) 03/04/91 8 */ 9 10 #include <sys/cdefs.h> 11 #include "param.h" 12 #include "socket.h" 13 #include "protosw.h" 14 #include "domain.h" 15 #include "mbuf.h" 16 #include "time.h" 17 #include "kernel.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 RMP 44 ADDDOMAIN(rmp); 45 #endif 46 #ifdef CCITT 47 ADDDOMAIN(ccitt); 48 #endif 49 #include "imp.h" 50 #if NIMP > 0 51 ADDDOMAIN(imp); 52 #endif 53 #endif 54 55 for (dp = domains; dp; dp = dp->dom_next) { 56 if (dp->dom_init) 57 (*dp->dom_init)(); 58 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 59 if (pr->pr_init) 60 (*pr->pr_init)(); 61 } 62 63 if (max_linkhdr < 16) /* XXX */ 64 max_linkhdr = 16; 65 max_hdr = max_linkhdr + max_protohdr; 66 max_datalen = MHLEN - max_hdr; 67 pffasttimo(); 68 pfslowtimo(); 69 } 70 71 struct protosw * 72 pffindtype(family, type) 73 int family, type; 74 { 75 register struct domain *dp; 76 register struct protosw *pr; 77 78 for (dp = domains; dp; dp = dp->dom_next) 79 if (dp->dom_family == family) 80 goto found; 81 return (0); 82 found: 83 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 84 if (pr->pr_type && pr->pr_type == type) 85 return (pr); 86 return (0); 87 } 88 89 struct protosw * 90 pffindproto(family, protocol, type) 91 int family, protocol, type; 92 { 93 register struct domain *dp; 94 register struct protosw *pr; 95 struct protosw *maybe = 0; 96 97 if (family == 0) 98 return (0); 99 for (dp = domains; dp; dp = dp->dom_next) 100 if (dp->dom_family == family) 101 goto found; 102 return (0); 103 found: 104 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { 105 if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) 106 return (pr); 107 108 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 109 pr->pr_protocol == 0 && maybe == (struct protosw *)0) 110 maybe = pr; 111 } 112 return (maybe); 113 } 114 115 pfctlinput(cmd, sa) 116 int cmd; 117 struct sockaddr *sa; 118 { 119 register struct domain *dp; 120 register struct protosw *pr; 121 122 for (dp = domains; dp; dp = dp->dom_next) 123 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 124 if (pr->pr_ctlinput) 125 (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 126 } 127 128 pfslowtimo() 129 { 130 register struct domain *dp; 131 register struct protosw *pr; 132 133 for (dp = domains; dp; dp = dp->dom_next) 134 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 135 if (pr->pr_slowtimo) 136 (*pr->pr_slowtimo)(); 137 timeout(pfslowtimo, (caddr_t)0, hz/2); 138 } 139 140 pffasttimo() 141 { 142 register struct domain *dp; 143 register struct protosw *pr; 144 145 for (dp = domains; dp; dp = dp->dom_next) 146 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 147 if (pr->pr_fasttimo) 148 (*pr->pr_fasttimo)(); 149 timeout(pffasttimo, (caddr_t)0, hz/5); 150 } 151