1 /* uipc_domain.c 6.5 85/06/02 */ 2 3 #include "param.h" 4 #include "socket.h" 5 #include "protosw.h" 6 #include "domain.h" 7 #include "time.h" 8 #include "kernel.h" 9 10 #define ADDDOMAIN(x) { \ 11 extern struct domain x/**/domain; \ 12 x/**/domain.dom_next = domains; \ 13 domains = &x/**/domain; \ 14 } 15 16 domaininit() 17 { 18 register struct domain *dp; 19 register struct protosw *pr; 20 21 #ifndef lint 22 ADDDOMAIN(unix); 23 #ifdef INET 24 ADDDOMAIN(inet); 25 #endif 26 #ifdef NS 27 ADDDOMAIN(ns); 28 #endif 29 #ifdef PUP 30 ADDDOMAIN(pup); 31 #endif 32 #include "imp.h" 33 #if NIMP > 0 34 ADDDOMAIN(imp); 35 #endif 36 #endif 37 38 for (dp = domains; dp; dp = dp->dom_next) { 39 if (dp->dom_init) 40 (*dp->dom_init)(); 41 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 42 if (pr->pr_init) 43 (*pr->pr_init)(); 44 } 45 pffasttimo(); 46 pfslowtimo(); 47 } 48 49 struct protosw * 50 pffindtype(family, type) 51 int family, type; 52 { 53 register struct domain *dp; 54 register struct protosw *pr; 55 56 for (dp = domains; dp; dp = dp->dom_next) 57 if (dp->dom_family == family) 58 goto found; 59 return (0); 60 found: 61 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 62 if (pr->pr_type && pr->pr_type == type) 63 return (pr); 64 return (0); 65 } 66 67 struct protosw * 68 pffindproto(family, protocol, type) 69 int family, protocol, type; 70 { 71 register struct domain *dp; 72 register struct protosw *pr; 73 struct protosw *maybe = 0; 74 75 if (family == 0) 76 return (0); 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_protocol == protocol) 84 return (pr); 85 if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && 86 pr->pr_protocol == 0 && maybe == (struct protosw *)0) 87 maybe = pr; 88 } 89 return (maybe); 90 } 91 92 pfctlinput(cmd, arg) 93 int cmd; 94 caddr_t arg; 95 { 96 register struct domain *dp; 97 register struct protosw *pr; 98 99 for (dp = domains; dp; dp = dp->dom_next) 100 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 101 if (pr->pr_ctlinput) 102 (*pr->pr_ctlinput)(cmd, arg); 103 } 104 105 pfslowtimo() 106 { 107 register struct domain *dp; 108 register struct protosw *pr; 109 110 for (dp = domains; dp; dp = dp->dom_next) 111 for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) 112 if (pr->pr_slowtimo) 113 (*pr->pr_slowtimo)(); 114 timeout(pfslowtimo, (caddr_t)0, hz/2); 115 } 116 117 pffasttimo() 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_fasttimo) 125 (*pr->pr_fasttimo)(); 126 timeout(pffasttimo, (caddr_t)0, hz/5); 127 } 128