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