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.10 (Berkeley) 10/11/92 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 18 #define ADDDOMAIN(x) { \ 19 extern struct domain __CONCAT(x,domain); \ 20 __CONCAT(x,domain.dom_next) = domains; \ 21 domains = &__CONCAT(x,domain); \ 22 } 23 24 domaininit() 25 { 26 register struct domain *dp; 27 register struct protosw *pr; 28 29 #undef unix 30 #ifndef lint 31 ADDDOMAIN(unix); 32 ADDDOMAIN(route); 33 #ifdef INET 34 ADDDOMAIN(inet); 35 #endif 36 #ifdef NS 37 ADDDOMAIN(ns); 38 #endif 39 #ifdef ISO 40 ADDDOMAIN(iso); 41 #endif 42 #ifdef RMP 43 ADDDOMAIN(rmp); 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 pfctlinput(cmd, sa) 115 int cmd; 116 struct sockaddr *sa; 117 { 118 register struct domain *dp; 119 register struct protosw *pr; 120 121 for (dp = domains; dp; dp = dp->dom_next) 122 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 123 if (pr->pr_ctlinput) 124 (*pr->pr_ctlinput)(cmd, sa, (caddr_t) 0); 125 } 126 127 pfslowtimo() 128 { 129 register struct domain *dp; 130 register struct protosw *pr; 131 132 for (dp = domains; dp; dp = dp->dom_next) 133 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 134 if (pr->pr_slowtimo) 135 (*pr->pr_slowtimo)(); 136 timeout(pfslowtimo, (caddr_t)0, hz/2); 137 } 138 139 pffasttimo() 140 { 141 register struct domain *dp; 142 register struct protosw *pr; 143 144 for (dp = domains; dp; dp = dp->dom_next) 145 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 146 if (pr->pr_fasttimo) 147 (*pr->pr_fasttimo)(); 148 timeout(pffasttimo, (caddr_t)0, hz/5); 149 } 150