1*4890Swnj /* uipc_proto.c 4.3 81/11/14 */ 24825Swnj 34787Swnj #include "../h/param.h" 44825Swnj #include "../h/socket.h" 54825Swnj #include "../h/protocol.h" 64825Swnj #include "../h/protosw.h" 74825Swnj #include "../h/mbuf.h" 84825Swnj #include "../net/inet.h" 94825Swnj 104787Swnj /* 114787Swnj * Protocol configuration table and routines to search it. 12*4890Swnj * 13*4890Swnj * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS 144787Swnj */ 154787Swnj 164787Swnj /* 17*4890Swnj * Local protocol handler. 184787Swnj */ 19*4890Swnj int pi_usrreq(); 204787Swnj 214787Swnj /* 224787Swnj * TCP/IP protocol family: IP, ICMP, UDP, TCP. 234787Swnj */ 24*4890Swnj int ip_input(),ip_output(),ip_ctloutput(); 25*4890Swnj int ip_init(),ip_slowtimo(),ip_drain(); 26*4890Swnj int icmp_input(); 27*4890Swnj int icmp_drain(); 28*4890Swnj int udp_input(),udp_ctlinput(); 29*4890Swnj int udp_usrreq(),udp_sense(); 30*4890Swnj int udp_init(); 31*4890Swnj int tcp_input(),tcp_ctlinput(); 32*4890Swnj int tcp_usrreq(),tcp_sense(); 33*4890Swnj int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); 34*4890Swnj int ri_input(),ri_ctlinput(); 35*4890Swnj int ri_usrreq(),ri_sense(); 364787Swnj 374787Swnj struct protosw protosw[] = { 38*4890Swnj { SOCK_STREAM, PF_LOCAL, 0, PR_CONNREQUIRED, 394825Swnj 0, 0, 0, 0, 40*4890Swnj pi_usrreq, 0, 0, 414825Swnj 0, 0, 0, 0, 42*4890Swnj }, 43*4890Swnj { SOCK_DGRAM, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 444825Swnj 0, 0, 0, 0, 45*4890Swnj pi_usrreq, 0, 0, 464825Swnj 0, 0, 0, 0, 47*4890Swnj }, 48*4890Swnj { SOCK_RDM, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 49*4890Swnj 0, 0, 0, 0, 50*4890Swnj pi_usrreq, 0, 0, 51*4890Swnj 0, 0, 0, 0, 52*4890Swnj }, 53*4890Swnj { SOCK_RAW, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 54*4890Swnj 0, 0, 0, 0, 55*4890Swnj pi_usrreq, 0, 0, 56*4890Swnj 0, 0, 0, 0, 57*4890Swnj }, 584787Swnj { 0, 0, 0, 0, 59*4890Swnj ip_input, ip_output, 0, 0, 60*4890Swnj 0, 0, 0, 61*4890Swnj ip_init, 0, ip_slowtimo, ip_drain, 62*4890Swnj }, 634787Swnj { 0, 0, IPPROTO_ICMP, 0, 64*4890Swnj icmp_input, 0, 0, 0, 65*4890Swnj 0, 0, 0, 66*4890Swnj 0, 0, 0, icmp_drain, 67*4890Swnj }, 684825Swnj { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 69*4890Swnj udp_input, 0, udp_ctlinput, 0, 70*4890Swnj udp_usrreq, udp_sense, MLEN, 71*4890Swnj udp_init, 0, 0, 0, 72*4890Swnj }, 73*4890Swnj { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED, 74*4890Swnj tcp_input, 0, tcp_ctlinput, 0, 75*4890Swnj tcp_usrreq, tcp_sense, MLEN, 76*4890Swnj tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, 77*4890Swnj }, 784825Swnj { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 79*4890Swnj ri_input, 0, ri_ctlinput, 0, 80*4890Swnj ri_usrreq, ri_sense, MLEN, 81*4890Swnj 0, 0, 0, 0, 82*4890Swnj } 834787Swnj }; 844787Swnj 85*4890Swnj #define NPROTOSW (sizeof(protosw) / sizeof(protosw[0])) 86*4890Swnj 87*4890Swnj struct protosw *protoswLAST = &protosw[NPROTOSW-1]; 88*4890Swnj 894787Swnj /* 904787Swnj * Operations on protocol table and protocol families. 914787Swnj */ 924787Swnj 934787Swnj /* 94*4890Swnj * Initialize all protocols. 95*4890Swnj */ 96*4890Swnj pfinit() 97*4890Swnj { 98*4890Swnj register struct protosw *pr; 99*4890Swnj 100*4890Swnj for (pr = protoswLAST; pr >= protosw; pr--) 101*4890Swnj if (pr->pr_init) 102*4890Swnj (*pr->pr_init)(); 103*4890Swnj } 104*4890Swnj 105*4890Swnj /* 1064787Swnj * Find a standard protocol in a protocol family 1074787Swnj * of a specific type. 1084787Swnj */ 1094825Swnj struct protosw * 110*4890Swnj pffindtype(family, type) 1114787Swnj int family, type; 1124787Swnj { 1134787Swnj register struct protosw *pr; 1144787Swnj 1154787Swnj if (family == 0) 1164787Swnj return (0); 117*4890Swnj for (pr = protosw; pr < protoswLAST; pr++) 1184787Swnj if (pr->pr_family == family && pr->pr_type == type) 1194787Swnj return (pr); 1204787Swnj return (0); 1214787Swnj } 1224787Swnj 1234787Swnj /* 1244787Swnj * Find a specified protocol in a specified protocol family. 1254787Swnj */ 1264825Swnj struct protosw * 127*4890Swnj pffindproto(family, protocol) 1284825Swnj int family, protocol; 1294787Swnj { 1304787Swnj register struct protosw *pr; 1314787Swnj 1324787Swnj if (family == 0) 1334787Swnj return (0); 134*4890Swnj for (pr = protosw; pr < protoswLAST; pr++) 1354825Swnj if (pr->pr_family == family && pr->pr_protocol == protocol) 1364787Swnj return (pr); 1374787Swnj return (0); 1384787Swnj } 139