1*4825Swnj /* uipc_proto.c 4.2 81/11/08 */ 2*4825Swnj 34787Swnj #include "../h/param.h" 4*4825Swnj #include "../h/socket.h" 5*4825Swnj #include "../h/protocol.h" 6*4825Swnj #include "../h/protosw.h" 7*4825Swnj #include "../h/mbuf.h" 8*4825Swnj #include "../net/inet.h" 9*4825Swnj 104787Swnj /* should include a header file giving desired protocols */ 114787Swnj #define NTCP 1 124787Swnj 134787Swnj /* 144787Swnj * Protocol configuration table and routines to search it. 154787Swnj */ 164787Swnj 174787Swnj /* 184787Swnj * Generic (local or not yet specified) protocol. 194787Swnj */ 204787Swnj int gen_usrreq(); 214787Swnj 224787Swnj #if NTCP > 0 234787Swnj /* 244787Swnj * TCP/IP protocol family: IP, ICMP, UDP, TCP. 254787Swnj */ 26*4825Swnj int ip_init(),ip_input(),ip_output(),ip_advise(),ip_slowtimo(),ip_drain(); 27*4825Swnj int icmp_input(),icmp_drain(); 284787Swnj int udp_input(),udp_advise(),udp_usrreq(),udp_sense(); 29*4825Swnj int tcp_init(),tcp_input(),tcp_advise(),tcp_fasttimo(),tcp_slowtimo(), 30*4825Swnj tcp_usrreq(),tcp_drain(),tcp_sense(); 31*4825Swnj int ri_input(),ri_advise(),ri_usrreq(),ri_sense(); 324787Swnj #endif 334787Swnj 344787Swnj #if NPUP > 0 354787Swnj /* 364787Swnj * Pup protocols: PUP, BSP. 374787Swnj */ 384787Swnj int pup1_input(),pup1_output(),pup1_advise(),pup1_slowtimo(), 394787Swnj pup1_drain(),pup1_usrreq(),pup1_sense(); 404787Swnj int bsp_input(),bsp_advise(),bsp_fasttimo(),bsp_slowtimo(), 414787Swnj bsp_drain(),bsp_usrreq(),bsp_sense(); 424787Swnj int rawpup_input(),rawpup_usrreq(),rawpup_sense(); 434787Swnj #endif 444787Swnj 454787Swnj #if NCHAOS > 0 464787Swnj /* 474787Swnj * Chaosnet protocols. 484787Swnj */ 494787Swnj /* ... */ 504787Swnj #endif 514787Swnj 524787Swnj #if NOISCP > 0 534787Swnj /* 544787Swnj * Office information system communcation protocols. 554787Swnj */ 564787Swnj /* ... */ 574787Swnj #endif 584787Swnj 594787Swnj #if NNBS > 0 604787Swnj /* 614787Swnj * NBS protocols. 624787Swnj */ 634787Swnj /* ... */ 644787Swnj #endif 654787Swnj 664787Swnj #if NECMA > 0 674787Swnj /* 684787Swnj * ECMA protocols. 694787Swnj */ 704787Swnj /* ... */ 714787Swnj #endif 724787Swnj 734787Swnj #if NDATAKIT > 0 744787Swnj /* 754787Swnj * Datakit protocols. 764787Swnj */ 774787Swnj /* ... */ 784787Swnj #endif 794787Swnj 804787Swnj struct protosw protosw[] = { 814787Swnj { SOCK_STREAM, PF_GENERIC, 0, 0, 82*4825Swnj 0, 0, 0, 0, 834787Swnj 0, 0, 0, gen_usrreq, 0, 844787Swnj 0 }, 85*4825Swnj { SOCK_DGRAM, PF_GENERIC, 0, PR_ATOMIC|PR_ADDR, 86*4825Swnj 0, 0, 0, 0, 874787Swnj 0, 0, 0, gen_usrreq, 0, 884787Swnj 0 }, 89*4825Swnj { SOCK_RDM, PF_GENERIC, 0, PR_ATOMIC|PR_ADDR, 90*4825Swnj 0, 0, 0, 0, 914787Swnj 0, 0, 0, gen_usrreq, 0, 924787Swnj 0 }, 93*4825Swnj { SOCK_RAW, PF_GENERIC, 0, PR_ATOMIC|PR_ADDR, 94*4825Swnj 0, 0, 0, 0, 954787Swnj 0, 0, 0, gen_usrreq, 0, 96*4825Swnj 0 }, 974787Swnj #if NTCP > 0 984787Swnj { 0, 0, 0, 0, 99*4825Swnj ip_init, ip_input, ip_output, 0, 1004787Swnj 0, ip_slowtimo, ip_drain, 0, 0, 1014787Swnj 0 }, 1024787Swnj { 0, 0, IPPROTO_ICMP, 0, 103*4825Swnj 0, icmp_input, 0, 0, 1044787Swnj 0, 0, icmp_drain, 0, 0, 1054787Swnj 0 }, 106*4825Swnj { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, 107*4825Swnj 0, udp_input, 0, udp_advise, 1084787Swnj 0, 0, 0, udp_usrreq, udp_sense, 1094787Swnj MLEN }, 1104787Swnj { SOCK_STREAM, PF_INET, IPPROTO_TCP, 0, 111*4825Swnj tcp_init, tcp_input, 0, tcp_advise, 1124787Swnj tcp_fasttimo, tcp_slowtimo, tcp_drain, tcp_usrreq, tcp_sense, 1134787Swnj MLEN }, 114*4825Swnj { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, 115*4825Swnj 0, ri_input, 0, ri_advise, 116*4825Swnj 0, 0, 0, ri_usrreq, ri_sense, 1174787Swnj MLEN }, 1184787Swnj #endif 1194787Swnj #if NPUP > 0 120*4825Swnj { SOCK_DGRAM, PF_PUP, 0, PR_ATOMIC|PR_ADDR, 121*4825Swnj pup_init, pup_input, pup_output, pup_advise, 1224787Swnj 0, pup_slowtimo, pup_drain, pup_usrreq, pup_sense, 1234787Swnj MLEN }, 1244787Swnj { SOCK_STREAM, PF_PUP1, PUPPROTO_BSP, 0, 125*4825Swnj bsp_init, bsp_input, 0, bsp_advise, 1264787Swnj bsp_fasttimo, bsp_slowtimo, bsp_drain, bsp_usrreq, bsp_sense, 1274787Swnj MLEN }, 128*4825Swnj { SOCK_RAW, PF_PUP1, PUPPROTO_RAW, PR_ATOMIC|PR_ADDR, 129*4825Swnj rp_init, rp_input, 0, rp_advise, 1304787Swnj rp_fasttimo, rp_slowtimo, rp_drain, rp_usrreq, rp_sense, 1314787Swnj MLEN }, 1324787Swnj #endif 1334787Swnj #if NCHAOS > 0 1344787Swnj /* ... */ 1354787Swnj #endif 1364787Swnj #if NOISCP > 0 1374787Swnj /* ... */ 1384787Swnj #endif 1394787Swnj #if NNBS > 0 1404787Swnj /* ... */ 1414787Swnj #endif 1424787Swnj #if NECMA > 0 1434787Swnj /* ... */ 1444787Swnj #endif 1454787Swnj #if NDATAKIT > 0 1464787Swnj /* ... */ 1474787Swnj #endif 1484787Swnj }; 1494787Swnj #define protoswEND &protosw[sizeof (protosw)/sizeof (protosw[0])] 1504787Swnj 1514787Swnj /* 1524787Swnj * Operations on protocol table and protocol families. 1534787Swnj */ 1544787Swnj 1554787Swnj /* 1564787Swnj * Find a standard protocol in a protocol family 1574787Swnj * of a specific type. 1584787Swnj */ 159*4825Swnj struct protosw * 160*4825Swnj pf_findtype(family, type) 1614787Swnj int family, type; 1624787Swnj { 1634787Swnj register struct protosw *pr; 1644787Swnj 1654787Swnj if (family == 0) 1664787Swnj return (0); 1674787Swnj for (pr = protosw; pr < protoswEND; pr++) 1684787Swnj if (pr->pr_family == family && pr->pr_type == type) 1694787Swnj return (pr); 1704787Swnj return (0); 1714787Swnj } 1724787Swnj 1734787Swnj /* 1744787Swnj * Find a specified protocol in a specified protocol family. 1754787Swnj */ 176*4825Swnj struct protosw * 177*4825Swnj pf_findproto(family, protocol) 178*4825Swnj int family, protocol; 1794787Swnj { 1804787Swnj register struct protosw *pr; 1814787Swnj 1824787Swnj if (family == 0) 1834787Swnj return (0); 1844787Swnj for (pr = protosw; pr < protoswEND; pr++) 185*4825Swnj if (pr->pr_family == family && pr->pr_protocol == protocol) 1864787Swnj return (pr); 1874787Swnj return (0); 1884787Swnj } 189*4825Swnj 190*4825Swnj prinit() 191*4825Swnj { 192*4825Swnj 193*4825Swnj } 194