/* A collection of stuff heavily dependent on the configuration info * in config.h. The idea is that configuration-dependent tables should * be located here to avoid having to pepper lots of .c files with #ifdefs, * requiring them to include config.h and be recompiled each time config.h * is modified. * * Copyright 1991 Phil Karn, KA9Q */ #include #include #include "global.h" #include "config.h" #include "mbuf.h" #include "timer.h" #include "proc.h" #include "iface.h" #include "ip.h" #include "tcp.h" #include "udp.h" #ifdef ARCNET #include "arcnet.h" #endif #include "lapb.h" #include "ax25.h" #include "enet.h" #include "kiss.h" #include "nr4.h" #include "nrs.h" #include "netrom.h" #include "pktdrvr.h" #include "ppp.h" #include "slip.h" #include "arp.h" #include "icmp.h" #include "hardware.h" /***/ #include "usock.h" #include "cmdparse.h" #include "commands.h" #include "mailbox.h" #include "ax25mail.h" #include "nr4mail.h" #include "tipmail.h" #include "daemon.h" #include "bootp.h" #include "asy.h" int dotest __ARGS((int argc,char *argv[],void *p)); /**/ static int dostart __ARGS((int argc,char *argv[],void *p)); static int dostop __ARGS((int argc,char *argv[],void *p)); #ifdef AX25 static void axip __ARGS((struct iface *iface,struct ax25_cb *axp,char *src, char *dest,struct mbuf *bp,int mcast)); static void axarp __ARGS((struct iface *iface,struct ax25_cb *axp,char *src, char *dest,struct mbuf *bp,int mcast)); static void axnr __ARGS((struct iface *iface,struct ax25_cb *axp,char *src, char *dest,struct mbuf *bp,int mcast)); #endif struct mbuf *Hopper; unsigned Nsessions = NSESSIONS; int Nusock = DEFNSOCK; /* Number of socket entries */ /* Free memory threshold, below which things start to happen to conserve * memory, like garbage collection, source quenching and refusing connects */ int32 Memthresh = MTHRESH; int Nibufs = NIBUFS; /* Number of interrupt buffers */ unsigned Ibufsize = IBUFSIZE; /* Size of each interrupt buffer */ /* Socket-protocol interface table */ struct socklink Socklink[] = { /* type, * socket, bind, listen, connect, * accept, recv, send, qlen, * kick, shut, close, check, * error, state, status */ TYPE_TCP, so_tcp, NULLFP, so_tcp_listen, so_tcp_conn, TRUE, so_tcp_recv, so_tcp_send, so_tcp_qlen, so_tcp_kick, so_tcp_shut, so_tcp_close, checkipaddr, Tcpreasons, tcpstate, so_tcp_stat, TYPE_UDP, so_udp, so_udp_bind, NULLFP, so_udp_conn, FALSE, so_udp_recv, so_udp_send, so_udp_qlen, NULLFP, NULLFP, so_udp_close, checkipaddr, NULL, NULLFP, so_udp_stat, #ifdef AX25 TYPE_AX25I, so_ax_sock, NULLFP, so_ax_listen, so_ax_conn, TRUE, so_ax_recv, so_ax_send, so_ax_qlen, so_ax_kick, so_ax_shut, so_ax_close, checkaxaddr, Axreasons, axstate, so_ax_stat, TYPE_AX25UI, so_axui_sock, so_axui_bind, NULLFP, so_axui_conn, FALSE, so_axui_recv, so_axui_send, so_axui_qlen, NULLFP, NULLFP, so_axui_close, checkaxaddr, NULL, NULLFP, NULLFP, #endif TYPE_RAW, so_ip_sock, NULLFP, NULLFP, so_ip_conn, FALSE, so_ip_recv, so_ip_send, so_ip_qlen, NULLFP, NULLFP, so_ip_close, checkipaddr, NULL, NULLFP, NULLFP, #ifdef NETROM TYPE_NETROML3, so_n3_sock, NULLFP, NULLFP, so_n3_conn, FALSE, so_n3_recv, so_n3_send, so_n3_qlen, NULLFP, NULLFP, so_n3_close, checknraddr, NULL, NULLFP, NULLFP, TYPE_NETROML4, so_n4_sock, NULLFP, so_n4_listen, so_n4_conn, TRUE, so_n4_recv, so_n4_send, so_n4_qlen, so_n4_kick, so_n4_shut, so_n4_close, checknraddr, Nr4reasons, nrstate, so_n4_stat, #endif TYPE_LOCAL_STREAM, so_los, NULLFP, NULLFP, NULLFP, TRUE, so_lo_recv, so_los_send, so_los_qlen, NULLFP, so_loc_shut, so_loc_close, NULLFP, NULL, NULLFP, so_loc_stat, TYPE_LOCAL_DGRAM, so_lod, NULLFP, NULLFP, NULLFP, FALSE, so_lo_recv, so_lod_send, so_lod_qlen, NULLFP, so_loc_shut, so_loc_close, NULLFP, NULL, NULLFP, so_loc_stat, -1 }; char * (*Psock[]) () = { ippsocket, axpsocket, nrpsocket, lopsocket, }; /* Functions to handle incoming link-level frames */ struct rfunc Rfunc[] = { #ifdef ETHER CL_ETHERNET, eproc, #endif #ifdef ARCNET CL_ARCNET, aproc, #endif #ifdef KISS CL_KISS, kiss_recv, #endif #ifdef AX25 CL_AX25, ax_recv, #endif #ifdef PPP CL_PPP, ppp_proc, #endif /* These types have no link layer protocol at the point when they're * put in the hopper, so they can be handed directly to IP. The * separate types are just for user convenience when running the * "iface" command. */ CL_NONE, ip_proc, CL_SERIAL_LINE, ip_proc, CL_SLFP, ip_proc, -1, NULL, }; /* Transport protocols atop IP */ struct iplink Iplink[] = { TCP_PTCL, tcp_input, UDP_PTCL, udp_input, ICMP_PTCL, icmp_input, IP_PTCL, ipip_recv, 0, 0 }; /* Transport protocols atop ICMP */ struct icmplink Icmplink[] = { TCP_PTCL, tcp_icmp, 0, 0 }; /* ARP protocol linkages */ struct arp_type Arp_type[NHWTYPES] = { #ifdef NETROM AXALEN, 0, 0, 0, NULLCHAR, pax25, setcall, /* ARP_NETROM */ #else 0, 0, 0, 0, NULLCHAR,NULL,NULL, #endif #ifdef ETHER EADDR_LEN,IP_TYPE,ARP_TYPE,1,Ether_bdcst,pether,gether, /* ARP_ETHER */ #else 0, 0, 0, 0, NULLCHAR,NULL,NULL, #endif 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_EETHER */ #ifdef AX25 AXALEN, PID_IP, PID_ARP, 10, Ax25multi[0], pax25, setcall, #else 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_AX25 */ #endif 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_PRONET */ 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_CHAOS */ 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_IEEE802 */ #ifdef ARCNET AADDR_LEN, ARC_IP, ARC_ARP, 1, ARC_bdcst, parc, garc, /* ARP_ARCNET */ #else 0, 0, 0, 0, NULLCHAR,NULL,NULL, #endif 0, 0, 0, 0, NULLCHAR,NULL,NULL, /* ARP_APPLETALK */ }; #ifdef AX25 /* Linkage to network protocols atop ax25 */ struct axlink Axlink[] = { PID_IP, axip, PID_ARP, axarp, #ifdef NETROM PID_NETROM, axnr, #endif PID_NO_L3, axnl3, 0, NULL, }; #endif /* TCP port numbers to be considered "interactive" by the IP routing * code and given priority in queueing */ int Tcp_interact[] = { IPPORT_FTP, /* FTP control (not data!) */ IPPORT_TELNET, /* Telnet */ IPPORT_LOGIN, /* BSD rlogin */ IPPORT_MTP, /* Secondary telnet */ -1 }; #ifdef ASY struct asymode Asymode[] = { #ifdef SLIP "SLIP", FR_END, slip_init, slip_free, #endif #ifdef KISS "AX25", FR_END, kiss_init, kiss_free, #endif #ifdef NRS "NRS", ETX, nrs_init, nrs_free, #endif #ifdef PPP "PPP", HDLC_FLAG, ppp_init, ppp_free, #endif NULLCHAR }; #endif /* ASY */ #ifdef MAILBOX void (*Listusers) __ARGS((int s)) = listusers; #else void (*Listusers) __ARGS((int s)) = NULL; #endif /* MAILBOX */ #ifndef BOOTP int WantBootp = 0; int bootp_validPacket(ip,bpp) struct ip *ip; struct mbuf **bpp; { return 0; } #endif /* BOOTP */ /* daemons to be run at startup time */ struct daemon Daemons[] = { "killer", 512, killer, "gcollect", 256, gcollect, "timer", 1024, timerproc, "network", 1536, network, "keyboard", 250, keyboard, NULLCHAR, 0, NULLVFP }; struct iftype Iftypes[] = { /* This entry must be first, since Loopback refers to it */ "None", NULL, NULL, NULL, NULL, CL_NONE, 0, #ifdef AX25 "AX25", ax_send, ax_output, pax25, setcall, CL_AX25, AXALEN, #endif #ifdef SLIP "SLIP", slip_send, NULL, NULL, NULL, CL_NONE, 0, #endif #ifdef ETHER /* Note: NULL is specified for the scan function even though * gether() exists because the packet drivers don't support * address setting. */ "Ethernet", enet_send, enet_output, pether, NULL, CL_ETHERNET, EADDR_LEN, #endif #ifdef NETROM "NETROM", nr_send, NULL, pax25, setcall, CL_NETROM, AXALEN, #endif #ifdef SLFP "SLFP", pk_send, NULL, NULL, NULL, CL_NONE, 0, #endif #ifdef PPP "PPP", ppp_send, ppp_output, NULL, NULL, CL_PPP, 0, #endif NULLCHAR }; /* Command lookup and branch tables */ struct cmds Cmds[] = { /* The "go" command must be first */ "", go, 0, 0, NULLCHAR, #ifndef AMIGA "!", doshell, 0, 0, NULLCHAR, #endif "abort", doabort, 0, 0, NULLCHAR, #ifdef AMIGA "amiga", doamiga, 0, 0, NULLCHAR, #endif #if (defined(MAC) && defined(APPLETALK)) "applestat", doatstat, 0, 0, NULLCHAR, #endif #if (defined(AX25) || defined(ETHER) || defined(APPLETALK)) "arp", doarp, 0, 0, NULLCHAR, #endif #ifdef ASY "asystat", doasystat, 0, 0, NULLCHAR, #endif "attach", doattach, 0, 2, "attach ", #ifdef AX25 "ax25", doax25, 0, 0, NULLCHAR, #endif #ifdef BOOTP "bootp", dobootp, 0, 0, NULLCHAR, "bootpd", bootpdcmd, 0, 0, NULLCHAR, #endif /* This one is out of alpabetical order to allow abbreviation to "c" */ #ifdef AX25 "connect", doconnect, 1024, 3, "connect ", #endif #if !defined(UNIX) && !defined(AMIGA) "cd", docd, 0, 0, NULLCHAR, #endif "close", doclose, 0, 0, NULLCHAR, /* This one is out of alpabetical order to allow abbreviation to "d" */ "disconnect", doclose, 0, 0, NULLCHAR, "delete", dodelete, 0, 2, "delete ", "detach", dodetach, 0, 2, "detach ", #ifdef DIALER "dialer", dodialer, 0, 2, "dialer [ ]", #endif #ifndef AMIGA "dir", dodir, 512, 0, NULLCHAR, /* note sequence */ #endif "domain", dodomain, 0, 0, NULLCHAR, #ifdef DRSI "drsistat", dodrstat, 0, 0, NULLCHAR, #endif #ifdef EAGLE "eaglestat", doegstat, 0, 0, NULLCHAR, #endif "echo", doecho, 0, 0, NULLCHAR, "eol", doeol, 0, 0, NULLCHAR, #if !defined(MSDOS) "escape", doescape, 0, 0, NULLCHAR, #endif "exit", doexit, 0, 0, NULLCHAR, "finger", dofinger, 1024, 2, "finger name@host", "ftp", doftp, 2048, 2, "ftp
", #ifdef HAPN "hapnstat", dohapnstat, 0, 0, NULLCHAR, #endif "help", dohelp, 0, 0, NULLCHAR, #ifdef HOPCHECK "hop", dohop, 0, 0, NULLCHAR, #endif "hostname", dohostname, 0, 0, NULLCHAR, #ifdef HS "hs", dohs, 0, 0, NULLCHAR, #endif "icmp", doicmp, 0, 0, NULLCHAR, "ifconfig", doifconfig, 0, 0, NULLCHAR, "ip", doip, 0, 0, NULLCHAR, #ifdef MSDOS "isat", doisat, 0, 0, NULLCHAR, #endif "kick", dokick, 0, 0, NULLCHAR, "log", dolog, 0, 0, NULLCHAR, #ifdef MAILBOX "mbox", dombox, 0, 0, NULLCHAR, #endif #ifndef UNIX "memory", domem, 0, 0, NULLCHAR, #endif "mkdir", domkd, 0, 2, "mkdir ", #ifdef AX25 "mode", domode, 0, 2, "mode ", #endif "more", domore, 512, 2, "more ", #ifdef NETROM "netrom", donetrom, 0, 0, NULLCHAR, #endif /* NETROM */ #ifdef NNTP "nntp", donntp, 0, 0, NULLCHAR, #endif /* NNTP */ #ifdef NRS "nrstat", donrstat, 0, 0, NULLCHAR, #endif /* NRS */ "param", doparam, 0, 2, "param ", "ping", doping, 512, 2, "ping [ [ [incflag]]]", #ifdef PI "pistatus", dopistat, 0, 0, NULLCHAR, #endif #ifdef POP "pop", dopop, 0, 0, NULLCHAR, #endif #ifdef PPP "ppp", doppp_commands, 0, 0, NULLCHAR, #endif "ps", ps, 0, 0, NULLCHAR, #if !defined(UNIX) && !defined(AMIGA) "pwd", docd, 0, 0, NULLCHAR, #endif "record", dorecord, 0, 0, NULLCHAR, "remote", doremote, 0, 3, "remote [-p port] [-k key] [-a kickaddr]
exit|reset|kick", "rename", dorename, 0, 3, "rename ", "reset", doreset, 0, 0, NULLCHAR, #ifdef RIP "rip", dorip, 0, 0, NULLCHAR, #endif "rmdir", dormd, 0, 2, "rmdir ", "route", doroute, 0, 0, NULLCHAR, "session", dosession, 0, 0, NULLCHAR, #ifdef SCC "sccstat", dosccstat, 0, 0, NULLCHAR, #endif #if !defined(AMIGA) "shell", doshell, 0, 0, NULLCHAR, #endif "smtp", dosmtp, 0, 0, NULLCHAR, "socket", dosock, 0, 0, NULLCHAR, #ifdef SERVERS "start", dostart, 0, 2, "start ", "stop", dostop, 0, 2, "stop ", #endif "tcp", dotcp, 0, 0, NULLCHAR, "telnet", dotelnet, 1024, 2, "telnet
", "test", dotest, 1024, 0, NULLCHAR, "tip", dotip, 256, 2, "tip ", #ifdef TRACE "trace", dotrace, 0, 0, NULLCHAR, #endif "udp", doudp, 0, 0, NULLCHAR, "upload", doupload, 0, 0, NULLCHAR, #ifdef MSDOS "watch", doswatch, 0, 0, NULLCHAR, #endif "?", dohelp, 0, 0, NULLCHAR, NULLCHAR, NULLFP, 0, 0, "Unknown command; type \"?\" for list", }; /* List of supported hardware devices */ struct cmds Attab[] = { #ifdef ASY /* Ordinary PC asynchronous adaptor */ "asy", asy_attach, 0, 8, #ifndef AMIGA "attach asy
slip|ax25|nrs|ppp