1*4787Swnj #include "../h/param.h" 2*4787Swnj #include "../inet/protocol.h" 3*4787Swnj #include "../inet/protocolsw.h" 4*4787Swnj /* should include a header file giving desired protocols */ 5*4787Swnj #define NTCP 1 6*4787Swnj 7*4787Swnj /* 8*4787Swnj * Protocol configuration table and routines to search it. 9*4787Swnj */ 10*4787Swnj 11*4787Swnj /* 12*4787Swnj * Generic (local or not yet specified) protocol. 13*4787Swnj */ 14*4787Swnj int gen_usrreq(); 15*4787Swnj 16*4787Swnj #if NTCP > 0 17*4787Swnj /* 18*4787Swnj * TCP/IP protocol family: IP, ICMP, UDP, TCP. 19*4787Swnj */ 20*4787Swnj int ip_input(),ip_output(),ip_advise(),ip_slowtimo(),ip_drain(); 21*4787Swnj int icmp_input(),icmp_output(); 22*4787Swnj int udp_input(),udp_advise(),udp_usrreq(),udp_sense(); 23*4787Swnj int tcp_input(),tcp_advise(),tcp_fasttimo(),tcp_slowtimo(), 24*4787Swnj tcp_drain(),tcp_sense(); 25*4787Swnj int rawip_input(),rawip_advise(),rawip_advise(),rawip_usrreq(), 26*4787Swnj rawip_sense(); 27*4787Swnj #endif 28*4787Swnj 29*4787Swnj #if NPUP > 0 30*4787Swnj /* 31*4787Swnj * Pup protocols: PUP, BSP. 32*4787Swnj */ 33*4787Swnj int pup1_input(),pup1_output(),pup1_advise(),pup1_slowtimo(), 34*4787Swnj pup1_drain(),pup1_usrreq(),pup1_sense(); 35*4787Swnj int bsp_input(),bsp_advise(),bsp_fasttimo(),bsp_slowtimo(), 36*4787Swnj bsp_drain(),bsp_usrreq(),bsp_sense(); 37*4787Swnj int rawpup_input(),rawpup_usrreq(),rawpup_sense(); 38*4787Swnj #endif 39*4787Swnj 40*4787Swnj #if NCHAOS > 0 41*4787Swnj /* 42*4787Swnj * Chaosnet protocols. 43*4787Swnj */ 44*4787Swnj /* ... */ 45*4787Swnj #endif 46*4787Swnj 47*4787Swnj #if NOISCP > 0 48*4787Swnj /* 49*4787Swnj * Office information system communcation protocols. 50*4787Swnj */ 51*4787Swnj /* ... */ 52*4787Swnj #endif 53*4787Swnj 54*4787Swnj #if NNBS > 0 55*4787Swnj /* 56*4787Swnj * NBS protocols. 57*4787Swnj */ 58*4787Swnj /* ... */ 59*4787Swnj #endif 60*4787Swnj 61*4787Swnj #if NECMA > 0 62*4787Swnj /* 63*4787Swnj * ECMA protocols. 64*4787Swnj */ 65*4787Swnj /* ... */ 66*4787Swnj #endif 67*4787Swnj 68*4787Swnj #if NDATAKIT > 0 69*4787Swnj /* 70*4787Swnj * Datakit protocols. 71*4787Swnj */ 72*4787Swnj /* ... */ 73*4787Swnj #endif 74*4787Swnj 75*4787Swnj struct protosw protosw[] = { 76*4787Swnj { SOCK_STREAM, PF_GENERIC, 0, 0, 77*4787Swnj 0, 0, 0, 78*4787Swnj 0, 0, 0, gen_usrreq, 0, 79*4787Swnj 0 }, 80*4787Swnj { SOCK_DGRAM, PF_GENERIC, 0, PR_ATOMIC|PR_PROVIDEADDR, 81*4787Swnj 0, 0, 0, 82*4787Swnj 0, 0, 0, gen_usrreq, 0, 83*4787Swnj 0 }, 84*4787Swnj { SOCK_RDM, PF_GENERIC, 0, PR_ATOMIC|PR_PROVIDEADDR, 85*4787Swnj 0, 0, 0, 86*4787Swnj 0, 0, 0, gen_usrreq, 0, 87*4787Swnj 0 }, 88*4787Swnj { SOCK_RAW, PF_GENERIC, 0, PR_ATOMIC|PR_PROVIDEADDR, 89*4787Swnj 0, 0, 0, 90*4787Swnj 0, 0, 0, gen_usrreq, 0, 91*4787Swnj #if NTCP > 0 92*4787Swnj { 0, 0, 0, 0, 93*4787Swnj ip_input, ip_output, 0, 94*4787Swnj 0, ip_slowtimo, ip_drain, 0, 0, 95*4787Swnj 0 }, 96*4787Swnj { 0, 0, IPPROTO_ICMP, 0, 97*4787Swnj icmp_input, icmp_output, 0, 98*4787Swnj 0, 0, icmp_drain, 0, 0, 99*4787Swnj 0 }, 100*4787Swnj { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_PROVIDEADDR, 101*4787Swnj udp_input, 0, udp_advise, 102*4787Swnj 0, 0, 0, udp_usrreq, udp_sense, 103*4787Swnj MLEN }, 104*4787Swnj { SOCK_STREAM, PF_INET, IPPROTO_TCP, 0, 105*4787Swnj tcp_input, 0, tcp_advise, 106*4787Swnj tcp_fasttimo, tcp_slowtimo, tcp_drain, tcp_usrreq, tcp_sense, 107*4787Swnj MLEN }, 108*4787Swnj { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_PROVIDEADDR, 109*4787Swnj ri_input, 0, ri_advise, 110*4787Swnj ri_fasttimo, ri_slowtimo, ri_drain, ri_usrreq, ri_sense, 111*4787Swnj MLEN }, 112*4787Swnj #endif 113*4787Swnj #if NPUP > 0 114*4787Swnj { SOCK_DGRAM, PF_PUP, 0, PR_ATOMIC|PR_PROVIDEADDR, 115*4787Swnj pup_input, pup_output, pup_advise, 116*4787Swnj 0, pup_slowtimo, pup_drain, pup_usrreq, pup_sense, 117*4787Swnj MLEN }, 118*4787Swnj { SOCK_STREAM, PF_PUP1, PUPPROTO_BSP, 0, 119*4787Swnj bsp_input, 0, bsp_advise, 120*4787Swnj bsp_fasttimo, bsp_slowtimo, bsp_drain, bsp_usrreq, bsp_sense, 121*4787Swnj MLEN }, 122*4787Swnj { SOCK_RAW, PF_PUP1, PUPPROTO_RAW, PR_ATOMIC|PR_PROVIDEADDR, 123*4787Swnj rp_input, 0, rp_advise, 124*4787Swnj rp_fasttimo, rp_slowtimo, rp_drain, rp_usrreq, rp_sense, 125*4787Swnj MLEN }, 126*4787Swnj #endif 127*4787Swnj #if NCHAOS > 0 128*4787Swnj /* ... */ 129*4787Swnj #endif 130*4787Swnj #if NOISCP > 0 131*4787Swnj /* ... */ 132*4787Swnj #endif 133*4787Swnj #if NNBS > 0 134*4787Swnj /* ... */ 135*4787Swnj #endif 136*4787Swnj #if NECMA > 0 137*4787Swnj /* ... */ 138*4787Swnj #endif 139*4787Swnj #if NDATAKIT > 0 140*4787Swnj /* ... */ 141*4787Swnj #endif 142*4787Swnj }; 143*4787Swnj #define protoswEND &protosw[sizeof (protosw)/sizeof (protosw[0])] 144*4787Swnj 145*4787Swnj /* 146*4787Swnj * Operations on protocol table and protocol families. 147*4787Swnj */ 148*4787Swnj 149*4787Swnj /* 150*4787Swnj * Find a standard protocol in a protocol family 151*4787Swnj * of a specific type. 152*4787Swnj */ 153*4787Swnj pf_stdproto(family, type) 154*4787Swnj int family, type; 155*4787Swnj { 156*4787Swnj register struct protosw *pr; 157*4787Swnj 158*4787Swnj if (family == 0) 159*4787Swnj return (0); 160*4787Swnj for (pr = protosw; pr < protoswEND; pr++) 161*4787Swnj if (pr->pr_family == family && pr->pr_type == type) 162*4787Swnj return (pr); 163*4787Swnj return (0); 164*4787Swnj } 165*4787Swnj 166*4787Swnj /* 167*4787Swnj * Find a specified protocol in a specified protocol family. 168*4787Swnj */ 169*4787Swnj pf_findproto(family, proto) 170*4787Swnj int family, proto; 171*4787Swnj { 172*4787Swnj register struct protosw *pr; 173*4787Swnj 174*4787Swnj if (family == 0) 175*4787Swnj return (0); 176*4787Swnj for (pr = protosw; pr < protoswEND; pr++) 177*4787Swnj if (pr->pr_family == family && pr->pr_proto == proto) 178*4787Swnj return (pr); 179*4787Swnj return (0); 180*4787Swnj } 181