1*5621Swnj /* uipc_proto.c 4.14 82/01/25 */ 24825Swnj 34787Swnj #include "../h/param.h" 44825Swnj #include "../h/socket.h" 54825Swnj #include "../h/protosw.h" 64825Swnj #include "../h/mbuf.h" 75091Swnj #include "../net/in.h" 85091Swnj #include "../net/in_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 */ 245091Swnj int ip_output(); 254890Swnj int ip_init(),ip_slowtimo(),ip_drain(); 265170Swnj int icmp_input(),icmp_ctlinput(); 274890Swnj int icmp_drain(); 284890Swnj int udp_input(),udp_ctlinput(); 295170Swnj int udp_usrreq(); 304890Swnj int udp_init(); 314890Swnj int tcp_input(),tcp_ctlinput(); 325170Swnj int tcp_usrreq(); 334890Swnj int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); 345149Swnj int rip_input(),rip_output(),rip_ctlinput(); 355149Swnj int rip_usrreq(),rip_slowtimo(); 364787Swnj 37*5621Swnj /* 38*5621Swnj * IMP protocol family: raw interface 39*5621Swnj */ 40*5621Swnj #include "imp.h" 41*5621Swnj #if NIMP > 0 42*5621Swnj int imp_usrreq(),imp_output(),imp_ctlinput(); 43*5621Swnj #endif 44*5621Swnj 45*5621Swnj /* 46*5621Swnj * Sundries. 47*5621Swnj */ 48*5621Swnj int raw_init(),raw_usrreq(),raw_input(); 49*5621Swnj 504787Swnj struct protosw protosw[] = { 515149Swnj { SOCK_STREAM, PF_UNIX, 0, PR_CONNREQUIRED, 524825Swnj 0, 0, 0, 0, 535149Swnj piusrreq, 544825Swnj 0, 0, 0, 0, 554890Swnj }, 565149Swnj { SOCK_DGRAM, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 574825Swnj 0, 0, 0, 0, 585149Swnj piusrreq, 594825Swnj 0, 0, 0, 0, 604890Swnj }, 615149Swnj { SOCK_RDM, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 624890Swnj 0, 0, 0, 0, 635149Swnj piusrreq, 644890Swnj 0, 0, 0, 0, 654890Swnj }, 665149Swnj { SOCK_RAW, PF_UNIX, 0, PR_ATOMIC|PR_ADDR, 674890Swnj 0, 0, 0, 0, 685149Swnj piusrreq, 694890Swnj 0, 0, 0, 0, 704890Swnj }, 714787Swnj { 0, 0, 0, 0, 725091Swnj 0, ip_output, 0, 0, 735149Swnj 0, 744890Swnj ip_init, 0, ip_slowtimo, ip_drain, 754890Swnj }, 764787Swnj { 0, 0, IPPROTO_ICMP, 0, 775170Swnj icmp_input, 0, icmp_ctlinput, 0, 785149Swnj 0, 794890Swnj 0, 0, 0, icmp_drain, 804890Swnj }, 814825Swnj { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 824890Swnj udp_input, 0, udp_ctlinput, 0, 835149Swnj udp_usrreq, 844890Swnj udp_init, 0, 0, 0, 854890Swnj }, 865011Swnj { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD, 874890Swnj tcp_input, 0, tcp_ctlinput, 0, 885149Swnj tcp_usrreq, 894890Swnj tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, 904890Swnj }, 91*5621Swnj { 0, 0, 0, 0, 92*5621Swnj raw_input, 0, 0, 0, 93*5621Swnj raw_usrreq, 94*5621Swnj raw_init, 0, 0, 0, 95*5621Swnj }, 96*5621Swnj { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC, 975149Swnj rip_input, rip_output, rip_ctlinput, 0, 985149Swnj rip_usrreq, 99*5621Swnj 0, 0, 0, 0, 1004890Swnj } 101*5621Swnj #if NIMP > 0 102*5621Swnj , 103*5621Swnj { SOCK_RAW, PF_IMPLINK, 0, PR_ATOMIC|PR_ADDR, 104*5621Swnj 0, imp_output, imp_ctlinput, 0, 105*5621Swnj imp_usrreq, 106*5621Swnj 0, 0, 0, 0, 107*5621Swnj } 108*5621Swnj #endif 1094787Swnj }; 1104787Swnj 1114890Swnj #define NPROTOSW (sizeof(protosw) / sizeof(protosw[0])) 1124890Swnj 1134890Swnj struct protosw *protoswLAST = &protosw[NPROTOSW-1]; 1144890Swnj 1154787Swnj /* 1164787Swnj * Operations on protocol table and protocol families. 1174787Swnj */ 1184787Swnj 1194787Swnj /* 1204890Swnj * Initialize all protocols. 1214890Swnj */ 1224890Swnj pfinit() 1234890Swnj { 1244890Swnj register struct protosw *pr; 1254890Swnj 1264927Swnj COUNT(PFINIT); 1274890Swnj for (pr = protoswLAST; pr >= protosw; pr--) 1284890Swnj if (pr->pr_init) 1294890Swnj (*pr->pr_init)(); 1304890Swnj } 1314890Swnj 1324890Swnj /* 1334787Swnj * Find a standard protocol in a protocol family 1344787Swnj * of a specific type. 1354787Swnj */ 1364825Swnj struct protosw * 1374890Swnj pffindtype(family, type) 1384787Swnj int family, type; 1394787Swnj { 1404787Swnj register struct protosw *pr; 1414787Swnj 1424927Swnj COUNT(PFFINDTYPE); 1434787Swnj if (family == 0) 1444787Swnj return (0); 1455011Swnj for (pr = protosw; pr <= protoswLAST; pr++) 1464787Swnj if (pr->pr_family == family && pr->pr_type == type) 1474787Swnj return (pr); 1484787Swnj return (0); 1494787Swnj } 1504787Swnj 1514787Swnj /* 1524787Swnj * Find a specified protocol in a specified protocol family. 1534787Swnj */ 1544825Swnj struct protosw * 1554890Swnj pffindproto(family, protocol) 1564825Swnj int family, protocol; 1574787Swnj { 1584787Swnj register struct protosw *pr; 1594787Swnj 1604927Swnj COUNT(PFFINDPROTO); 1614787Swnj if (family == 0) 1624787Swnj return (0); 1635011Swnj for (pr = protosw; pr <= protoswLAST; pr++) 1644825Swnj if (pr->pr_family == family && pr->pr_protocol == protocol) 1654787Swnj return (pr); 1664787Swnj return (0); 1674787Swnj } 1685248Sroot 1695248Sroot /* 1705248Sroot * Slow timeout on all protocols. 1715248Sroot */ 1725248Sroot pfslowtimo() 1735248Sroot { 1745248Sroot register struct protosw *pr; 1755248Sroot 1765248Sroot COUNT(PFSLOWTIMO); 1775248Sroot for (pr = protoswLAST; pr >= protosw; pr--) 1785248Sroot if (pr->pr_slowtimo) 1795248Sroot (*pr->pr_slowtimo)(); 1805248Sroot } 1815248Sroot 1825248Sroot pffasttimo() 1835248Sroot { 1845248Sroot register struct protosw *pr; 1855248Sroot 1865248Sroot COUNT(PFSLOWTIMO); 1875248Sroot for (pr = protoswLAST; pr >= protosw; pr--) 1885272Sroot if (pr->pr_fasttimo) 1895272Sroot (*pr->pr_fasttimo)(); 1905248Sroot } 191