1 /* uipc_proto.c 4.22 82/06/20 */ 2 3 #include "../h/param.h" 4 #include "../h/socket.h" 5 #include "../h/protosw.h" 6 #include "../h/mbuf.h" 7 #include "../net/in.h" 8 #include "../net/in_systm.h" 9 10 /* 11 * Protocol configuration table and routines to search it. 12 * 13 * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS 14 */ 15 16 /* 17 * Local protocol handler. 18 */ 19 int piusrreq(); 20 21 /* 22 * TCP/IP protocol family: IP, ICMP, UDP, TCP. 23 */ 24 int ip_output(); 25 int ip_init(),ip_slowtimo(),ip_drain(); 26 int icmp_input(); 27 int udp_input(),udp_ctlinput(); 28 int udp_usrreq(); 29 int udp_init(); 30 int tcp_input(),tcp_ctlinput(); 31 int tcp_usrreq(); 32 int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); 33 int rip_input(),rip_output(); 34 35 /* 36 * IMP protocol family: raw interface. 37 * Using the raw interface entry to get the timer routine 38 * in is a kludge. 39 */ 40 #include "imp.h" 41 #if NIMP > 0 42 int rimp_output(), hostslowtimo(); 43 #endif 44 45 /* 46 * PUP-I protocol family: raw interface 47 */ 48 #include "pup.h" 49 #if NPUP > 0 50 int rpup_output(); 51 #endif 52 53 /* 54 * Sundries. 55 */ 56 int raw_init(),raw_usrreq(),raw_input(),raw_ctlinput(); 57 58 struct protosw protosw[] = { 59 { SOCK_STREAM, PF_UNIX, 0, PR_CONNREQUIRED, 60 0, 0, 0, 0, 61 piusrreq, 62 0, 0, 0, 0, 63 }, 64 { SOCK_DGRAM, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 65 0, 0, 0, 0, 66 piusrreq, 67 0, 0, 0, 0, 68 }, 69 { SOCK_RDM, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 70 0, 0, 0, 0, 71 piusrreq, 72 0, 0, 0, 0, 73 }, 74 { SOCK_RAW, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 75 0, 0, 0, 0, 76 piusrreq, 77 0, 0, 0, 0, 78 }, 79 { 0, 0, 0, 0, 80 0, ip_output, 0, 0, 81 0, 82 ip_init, 0, ip_slowtimo, ip_drain, 83 }, 84 { 0, PF_INET, IPPROTO_ICMP, 0, 85 icmp_input, 0, 0, 0, 86 0, 87 0, 0, 0, 0, 88 }, 89 { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 90 udp_input, 0, udp_ctlinput, 0, 91 udp_usrreq, 92 udp_init, 0, 0, 0, 93 }, 94 { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD, 95 tcp_input, 0, tcp_ctlinput, 0, 96 tcp_usrreq, 97 tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, 98 }, 99 { 0, 0, 0, 0, 100 raw_input, 0, raw_ctlinput, 0, 101 raw_usrreq, 102 raw_init, 0, 0, 0, 103 }, 104 { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 105 rip_input, rip_output, 0, 0, 106 raw_usrreq, 107 0, 0, 0, 0, 108 } 109 #if NIMP > 0 110 , 111 { SOCK_RAW, PF_IMPLINK, 0, PR_ATOMIC|PR_ADDR, 112 0, rimp_output, 0, 0, 113 raw_usrreq, 114 0, 0, hostslowtimo, 0, 115 } 116 #endif 117 #if NPUP > 0 118 , 119 { SOCK_RAW, PF_PUP, 0, PR_ATOMIC|PR_ADDR, 120 0, rpup_output, 0, 0, 121 raw_usrreq, 122 0, 0, 0, 0, 123 } 124 #endif 125 }; 126 127 #define NPROTOSW (sizeof(protosw) / sizeof(protosw[0])) 128 129 struct protosw *protoswLAST = &protosw[NPROTOSW-1]; 130 131 /* 132 * Operations on protocol table and protocol families. 133 */ 134 135 /* 136 * Initialize all protocols. 137 */ 138 pfinit() 139 { 140 register struct protosw *pr; 141 142 for (pr = protoswLAST; pr >= protosw; pr--) 143 if (pr->pr_init) 144 (*pr->pr_init)(); 145 } 146 147 /* 148 * Find a standard protocol in a protocol family 149 * of a specific type. 150 */ 151 struct protosw * 152 pffindtype(family, type) 153 int family, type; 154 { 155 register struct protosw *pr; 156 157 if (family == 0) 158 return (0); 159 for (pr = protosw; pr <= protoswLAST; pr++) 160 if (pr->pr_family == family && pr->pr_type == type) 161 return (pr); 162 return (0); 163 } 164 165 /* 166 * Find a specified protocol in a specified protocol family. 167 */ 168 struct protosw * 169 pffindproto(family, protocol) 170 int family, protocol; 171 { 172 register struct protosw *pr; 173 174 if (family == 0) 175 return (0); 176 for (pr = protosw; pr <= protoswLAST; pr++) 177 if (pr->pr_family == family && pr->pr_protocol == protocol) 178 return (pr); 179 return (0); 180 } 181 182 pfctlinput(cmd, arg) 183 int cmd; 184 caddr_t arg; 185 { 186 register struct protosw *pr; 187 188 for (pr = protosw; pr <= protoswLAST; pr++) 189 if (pr->pr_ctlinput) 190 (*pr->pr_ctlinput)(cmd, arg); 191 } 192 193 /* 194 * Slow timeout on all protocols. 195 */ 196 pfslowtimo() 197 { 198 register struct protosw *pr; 199 200 for (pr = protoswLAST; pr >= protosw; pr--) 201 if (pr->pr_slowtimo) 202 (*pr->pr_slowtimo)(); 203 } 204 205 pffasttimo() 206 { 207 register struct protosw *pr; 208 209 for (pr = protoswLAST; pr >= protosw; pr--) 210 if (pr->pr_fasttimo) 211 (*pr->pr_fasttimo)(); 212 } 213