1*5011Swnj /* uipc_proto.c 4.7 81/11/21 */ 24825Swnj 34787Swnj #include "../h/param.h" 44825Swnj #include "../h/socket.h" 54825Swnj #include "../h/protosw.h" 64825Swnj #include "../h/mbuf.h" 74825Swnj #include "../net/inet.h" 84927Swnj #include "../net/inet_systm.h" 94825Swnj 104787Swnj /* 114787Swnj * Protocol configuration table and routines to search it. 124890Swnj * 134890Swnj * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS 144787Swnj */ 154787Swnj 164787Swnj /* 174890Swnj * Local protocol handler. 184787Swnj */ 194927Swnj int piusrreq(); 204787Swnj 214787Swnj /* 224787Swnj * TCP/IP protocol family: IP, ICMP, UDP, TCP. 234787Swnj */ 244916Swnj int ip_input(),ip_output(); 254890Swnj int ip_init(),ip_slowtimo(),ip_drain(); 264890Swnj int icmp_input(); 274890Swnj int icmp_drain(); 284890Swnj int udp_input(),udp_ctlinput(); 294890Swnj int udp_usrreq(),udp_sense(); 304890Swnj int udp_init(); 314890Swnj int tcp_input(),tcp_ctlinput(); 324890Swnj int tcp_usrreq(),tcp_sense(); 334890Swnj int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); 344950Swnj int rip_input(),rip_ctlinput(); 354950Swnj int rip_usrreq(),rip_sense(); 364787Swnj 374787Swnj struct protosw protosw[] = { 384890Swnj { SOCK_STREAM, PF_LOCAL, 0, PR_CONNREQUIRED, 394825Swnj 0, 0, 0, 0, 404927Swnj piusrreq, 0, 0, 414825Swnj 0, 0, 0, 0, 424890Swnj }, 434890Swnj { SOCK_DGRAM, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 444825Swnj 0, 0, 0, 0, 454927Swnj piusrreq, 0, 0, 464825Swnj 0, 0, 0, 0, 474890Swnj }, 484890Swnj { SOCK_RDM, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 494890Swnj 0, 0, 0, 0, 504927Swnj piusrreq, 0, 0, 514890Swnj 0, 0, 0, 0, 524890Swnj }, 534890Swnj { SOCK_RAW, PF_LOCAL, 0, PR_ATOMIC|PR_ADDR, 544890Swnj 0, 0, 0, 0, 554927Swnj piusrreq, 0, 0, 564890Swnj 0, 0, 0, 0, 574890Swnj }, 584787Swnj { 0, 0, 0, 0, 594890Swnj ip_input, ip_output, 0, 0, 604890Swnj 0, 0, 0, 614890Swnj ip_init, 0, ip_slowtimo, ip_drain, 624890Swnj }, 634787Swnj { 0, 0, IPPROTO_ICMP, 0, 644890Swnj icmp_input, 0, 0, 0, 654890Swnj 0, 0, 0, 664890Swnj 0, 0, 0, icmp_drain, 674890Swnj }, 684825Swnj { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 694890Swnj udp_input, 0, udp_ctlinput, 0, 704890Swnj udp_usrreq, udp_sense, MLEN, 714890Swnj udp_init, 0, 0, 0, 724890Swnj }, 73*5011Swnj { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD, 744890Swnj tcp_input, 0, tcp_ctlinput, 0, 754890Swnj tcp_usrreq, tcp_sense, MLEN, 764890Swnj tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, 774890Swnj }, 784825Swnj { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 794950Swnj rip_input, 0, rip_ctlinput, 0, 804950Swnj rip_usrreq, rip_sense, MLEN, 814890Swnj 0, 0, 0, 0, 824890Swnj } 834787Swnj }; 844787Swnj 854890Swnj #define NPROTOSW (sizeof(protosw) / sizeof(protosw[0])) 864890Swnj 874890Swnj struct protosw *protoswLAST = &protosw[NPROTOSW-1]; 884890Swnj 894787Swnj /* 904787Swnj * Operations on protocol table and protocol families. 914787Swnj */ 924787Swnj 934787Swnj /* 944890Swnj * Initialize all protocols. 954890Swnj */ 964890Swnj pfinit() 974890Swnj { 984890Swnj register struct protosw *pr; 994890Swnj 1004927Swnj COUNT(PFINIT); 1014890Swnj for (pr = protoswLAST; pr >= protosw; pr--) 1024890Swnj if (pr->pr_init) 1034890Swnj (*pr->pr_init)(); 1044890Swnj } 1054890Swnj 1064890Swnj /* 1074787Swnj * Find a standard protocol in a protocol family 1084787Swnj * of a specific type. 1094787Swnj */ 1104825Swnj struct protosw * 1114890Swnj pffindtype(family, type) 1124787Swnj int family, type; 1134787Swnj { 1144787Swnj register struct protosw *pr; 1154787Swnj 1164927Swnj COUNT(PFFINDTYPE); 1174787Swnj if (family == 0) 1184787Swnj return (0); 119*5011Swnj for (pr = protosw; pr <= protoswLAST; pr++) 1204787Swnj if (pr->pr_family == family && pr->pr_type == type) 1214787Swnj return (pr); 1224787Swnj return (0); 1234787Swnj } 1244787Swnj 1254787Swnj /* 1264787Swnj * Find a specified protocol in a specified protocol family. 1274787Swnj */ 1284825Swnj struct protosw * 1294890Swnj pffindproto(family, protocol) 1304825Swnj int family, protocol; 1314787Swnj { 1324787Swnj register struct protosw *pr; 1334787Swnj 1344927Swnj COUNT(PFFINDPROTO); 1354787Swnj if (family == 0) 1364787Swnj return (0); 137*5011Swnj for (pr = protosw; pr <= protoswLAST; pr++) 1384825Swnj if (pr->pr_family == family && pr->pr_protocol == protocol) 1394787Swnj return (pr); 1404787Swnj return (0); 1414787Swnj } 142