/* proto.c 4.22 82/06/20 */ #include "sys/param.h" #include "sys/config.h" #include "sys/types.h" #include "sys/mmu.h" #include "sys/sysmacros.h" #include "net/misc.h" #include "net/socket.h" #include "net/protosw.h" #include "net/in.h" #include "net/in_systm.h" /* * Protocol configuration table and routines to search it. * * SHOULD INCLUDE A HEADER FILE GIVING DESIRED PROTOCOLS */ /* * Local protocol handler. */ /* * TCP/IP protocol family: IP, ICMP, UDP, TCP. */ int ip_output(); int ip_init(),ip_slowtimo(),ip_drain(); int icmp_input(); int udp_input(),udp_ctlinput(); int udp_usrreq(); int udp_init(); int tcp_input(),tcp_ctlinput(); int tcp_usrreq(); int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); int rip_input(),rip_output(); /* * IMP protocol family: raw interface. * Using the raw interface entry to get the timer routine * in is a kludge. */ #include "net/imp.h" #if NIMP > 0 int rimp_output(), hostslowtimo(); #endif /* * PUP-I protocol family: raw interface */ #include "net/pup.h" #if NPUP > 0 int rpup_output(); #endif /* * Sundries. */ int raw_init(),raw_usrreq(),raw_input(),raw_ctlinput(); struct protosw protosw[] = { { 0, 0, 0, 0, 0, ip_output, 0, 0, 0, ip_init, 0, ip_slowtimo, ip_drain, }, { 0, PF_INET, IPPROTO_ICMP, 0, icmp_input, 0, 0, 0, 0, 0, 0, 0, 0, }, { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, udp_input, 0, udp_ctlinput, 0, udp_usrreq, udp_init, 0, 0, 0, }, { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD, tcp_input, 0, tcp_ctlinput, 0, tcp_usrreq, tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, }, { 0, 0, 0, 0, raw_input, 0, raw_ctlinput, 0, raw_usrreq, raw_init, 0, 0, 0, }, #ifdef SRI { SOCK_RAW, PF_INET, 15, PR_ATOMIC|PR_ADDR, rip_input, rip_output, 0, 0, raw_usrreq, 0, 0, 0, 0, }, #endif { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip_input, rip_output, 0, 0, raw_usrreq, 0, 0, 0, 0, } #if NIMP > 0 , { SOCK_RAW, PF_IMPLINK, 0, PR_ATOMIC|PR_ADDR, 0, rimp_output, 0, 0, raw_usrreq, 0, 0, hostslowtimo, 0, } #endif #if NPUP > 0 , { SOCK_RAW, PF_PUP, 0, PR_ATOMIC|PR_ADDR, 0, rpup_output, 0, 0, raw_usrreq, 0, 0, 0, 0, } #endif }; #define NPROTOSW (sizeof(protosw) / sizeof(protosw[0])) struct protosw *protoswLAST = &protosw[NPROTOSW-1]; /* * Operations on protocol table and protocol families. */ /* * Initialize all protocols. */ pfinit() { register struct protosw *pr; for (pr = protoswLAST; pr >= protosw; pr--) if (pr->pr_init) (*pr->pr_init)(); } /* * Find a standard protocol in a protocol family * of a specific type. */ struct protosw * pffindtype(family, type) int family, type; { register struct protosw *pr; if (family == 0) return (0); for (pr = protosw; pr <= protoswLAST; pr++) if (pr->pr_family == family && pr->pr_type == type) return (pr); return (0); } /* * Find a specified protocol in a specified protocol family. */ struct protosw * pffindproto(family, protocol) int family, protocol; { register struct protosw *pr; if (family == 0) return (0); for (pr = protosw; pr <= protoswLAST; pr++) if (pr->pr_family == family && pr->pr_protocol == protocol) return (pr); return (0); } #ifdef notdef pfctlinput(cmd, arg) int cmd; caddr_t arg; { register struct protosw *pr; for (pr = protosw; pr <= protoswLAST; pr++) if (pr->pr_ctlinput) (*pr->pr_ctlinput)(cmd, arg); } #endif /* * Slow timeout on all protocols. */ pfslowtimo() { register struct protosw *pr; for (pr = protoswLAST; pr >= protosw; pr--) if (pr->pr_slowtimo) (*pr->pr_slowtimo)(); } pffasttimo() { register struct protosw *pr; for (pr = protoswLAST; pr >= protosw; pr--) if (pr->pr_fasttimo) (*pr->pr_fasttimo)(); }