1 /* 2 * Copyright (c) 1982 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)uipc_domain.c 6.10 (Berkeley) 05/29/86 7 */ 8 9 #include "param.h" 10 #include "socket.h" 11 #include "protosw.h" 12 #include "domain.h" 13 #include "time.h" 14 #include "kernel.h" 15 16 #define ADDDOMAIN(x) { \ 17 extern struct domain x/**/domain; \ 18 x/**/domain.dom_next = domains; \ 19 domains = &x/**/domain; \ 20 } 21 22 domaininit() 23 { 24 register struct domain *dp; 25 register struct protosw *pr; 26 27 #ifndef lint 28 ADDDOMAIN(unix); 29 #ifdef INET 30 ADDDOMAIN(inet); 31 #endif 32 #ifdef NS 33 ADDDOMAIN(ns); 34 #endif 35 #include "imp.h" 36 #if NIMP > 0 37 ADDDOMAIN(imp); 38 #endif 39 #endif 40 41 for (dp = domains; dp; dp = dp->dom_next) { 42 if (dp->dom_init) 43 (*dp->dom_init)(); 44 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 45 if (pr->pr_init) 46 (*pr->pr_init)(); 47 } 48 null_init(); 49 pffasttimo(); 50 pfslowtimo(); 51 } 52 53 struct protosw * 54 pffindtype(family, type) 55 int family, type; 56 { 57 register struct domain *dp; 58 register struct protosw *pr; 59 60 for (dp = domains; dp; dp = dp->dom_next) 61 if (dp->dom_family == family) 62 goto found; 63 return (0); 64 found: 65 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 66 if (pr->pr_type && pr->pr_type == type) 67 return (pr); 68 return (0); 69 } 70 71 struct protosw * 72 pffindproto(family, protocol, type) 73 int family, protocol, type; 74 { 75 register struct domain *dp; 76 register struct protosw *pr; 77 struct protosw *maybe = 0; 78 79 if (family == 0) 80 return (0); 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_protocol == protocol) && (pr->pr_type == type)) 88 return (pr); 89 90 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 91 pr->pr_protocol == 0 && maybe == (struct protosw *)0) 92 maybe = pr; 93 } 94 return (maybe); 95 } 96 97 pfctlinput(cmd, sa) 98 int cmd; 99 struct sockaddr *sa; 100 { 101 register struct domain *dp; 102 register struct protosw *pr; 103 104 for (dp = domains; dp; dp = dp->dom_next) 105 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 106 if (pr->pr_ctlinput) 107 (*pr->pr_ctlinput)(cmd, sa); 108 } 109 110 pfslowtimo() 111 { 112 register struct domain *dp; 113 register struct protosw *pr; 114 115 for (dp = domains; dp; dp = dp->dom_next) 116 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 117 if (pr->pr_slowtimo) 118 (*pr->pr_slowtimo)(); 119 timeout(pfslowtimo, (caddr_t)0, hz/2); 120 } 121 122 pffasttimo() 123 { 124 register struct domain *dp; 125 register struct protosw *pr; 126 127 for (dp = domains; dp; dp = dp->dom_next) 128 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 129 if (pr->pr_fasttimo) 130 (*pr->pr_fasttimo)(); 131 timeout(pffasttimo, (caddr_t)0, hz/5); 132 } 133