Configuring mTCP Applications 2009-04-26 Michael Brutman (mbbrutman@yahoo.com) Introduction mTCP is a library that implements ARP, IP, UDP, TCP, DNS resolving and a few other useful features. Applications that use the mTCP library have common configuration requirements, mostly related to setting up TCP/IP addresses and telling the mTCP library code how to talk to the packet driver for your Ethernet card. This document explains how to setup the basic parameters for applications that use mTCP. Each individual application (like IRCjr) may have some additional setup that needs to be done. General Hardware requirements: 8088 processor or better Somewhere between 96KB and 160KB available RAM Display: CGA, EGA, VGA or MDA Supported Ethernet card Software requirements: DOS 2.0 or newer (DOS 3.3 or newer recommended) Packet driver for your Ethernet card Pre-requisites: Your Ethernet hardware has to be installed and you should know what IRQ and port settings you have configured on the card. Loading the packet driver All mTCP applications interface to the Ethernet hardware through the packet driver for the Ethernet hardware. So before you run an mTCP program, you have to successfully load your packet driver. The parameters on the packet drivers will vary but one that you will always have to provide is the software interrupt number that the packet driver is going to take control of. The software interrupt number is the address of the 'service' that the packet driver is going to provide to mTCP applications, and that service is the ability to send and receive packets on the Ethernet hardware. Note that the software interrupt number has nothing to do with the configuration of the Ethernet hardware. The software interrupt number is assigned by you and you are telling the packet driver which software interrupt to use. Software interrupt numbers are usually in the range of 0x60 (hex) to 0x66 (hex). You need to pick one that is not in use already but since most DOS software does not these software interrupts 0x60 is usually available. Here is an example showing an NE2000 clone card being loaded using the default I/O ports and IRQ3. It is also being told to use software interrupt 0x60: ne2000 0x60 3 Here is another example featuring an older Western Digital 8003 card: smc_wd 0x60 0x03 0x280 0xD000 In this example the software interrupt to use is 0x60, the IRQ is 3, the I/O ports start at 0x280, and the shared memory address for the RAM on the card is going to be located at 0xD000:0000 in memory. Consult your packet driver documentation for options. The best place to find packet drivers for an Ethernet adapter is in the original drivers and software shipped with the card. A good place to find open source packet drivers is http://www.crynwr.com/ . Configuration Overview All applications built using the mTCP library need to read some parameters when they start. The parameters tell the applications some very useful things, like what the IP address of the machine is, where the gateway is, and where the DNS nameserver is. The parameters are read from a configuration file that the application looks for at startup. The path and name of the configuration file is specified by the 'MTCPCFG' environment variable which you need to set before the application starts. For example: set MTCPCFG=c:\packet\tcp.cfg What you put in the configuration file depends on how you are going to setup IP addresses for your machine. There are two possible paths: * Setup the machine using the mTCP DHCP client. When you run the mTCP DHCP client it will automatically try to setup the configuration file by talking to a DHCP server on your network. If you have a cable modem, DSL modem, or router on your network that assigns addresses to machines automatically then you can use this method. * Setup the machine by hand. You will provide a set of required IP addresses that describe your network. This is recommended for advanced users who understand their network. Configuration using DHCP Using the DHCP client to configure your machine is easier and it should work fine on modern networks where there a DHCP server. When you configure your network using the DHCP client you only need to have two parameters in the configuration file. One parameter tells the mTCP library what software interrupt the packet driver is listening on and the other parameter gives your machine a name. Here is an example of a minimum configuration file for mTCP: PACKETINT 0x60 HOSTNAME PCjr That's it! To configure your machine follow the following steps: [1] Create the configuration file. Be sure to specify the same software interrupt number that you told the packet driver to use. Use your favorite text editor. [2] Set the MTCPCFG environment variable to point at your configuration file. It is a good practice to specify a full pathname - that way the configuration file can be found no matter what your current drive and directory are. Example: set MTCPCFG=c:\packet\tcp.cfg [3] Run 'DHCP.EXE' from the mTCP programs. This is the DHCP client. It will read your configuration file to figure out how to talk to the packet driver, then try to talk to the DHCP server on your network. If all goes well it will tell you what address it was assigned by the DHCP server and it will update the mTCP configuration file with additional parameters that the other mTCP applications need. [4] Now you are setup to run any other mTCP application! Note that you only have to run DHCP.EXE once in a while. The exact timing depends on your DHCP server, but a good rule of thumb is once a day before you start using mTCP applications. If your machine is acting strange and can't connect to other machines it will not hurt you to run DHCP.EXE again - the DHCP server might have dropped your machine due to a reset or a short lease time. Configuring by Hand (Static addresses) Use this method if you understand your network topology well and do not want to use DHCP. When you configure your machine by hand you need to provide a few IP addresses and related information that the DHCP client would have automatically fetched for you. Don't worry, it's not hard. Here are the parameters that you need to include in the configuration file: PACKETINT This is the software interrupt number that the packet driver is listening on. This should match the software interrupt number that you told the packet driver to use. This is always required for Static and DHCP setups. IPADDR IP address of this machine (eg: 192.168.2.3) Required for Static setups, filled in by DHCP on dynamic setups. NETMASK Network mask setting for your local area network (eg: 255.255.255.0) Required for Static setups, filled in by DHCP on dynamic setups. GATEWAY The IP address of your router (eg: 192.168.2.1) Optional for Static setups, filled in by DHCP on dynamic setups. If you don't provide this or if you set it wrong you will not be able to communicate with machines that are not directly connected to your LAN. MTU The MTU size for your Ethernet (typically 1500). This can have a big impact on file transfer performance - see the discussion below. Optional for Static setups and dynamic setups. NAMESERVER The IP address of your nameserver (eg: 68.115.71.53) Optional for Static setups, filled in by DHCP on dynamic setups. If you don't provide this or if you set it wrong you will not be able to convert machine names to IP addresses. Here is a sample configuration file: PACKETINT 0x60 IPADDR 192.168.2.6 NETMASK 255.255.255.0 GATEWAY 192.168.2.1 NAMESERVER 68.115.71.53 MTU 1500 Note that these are sample values only, and that the last three lines were optional. You must adjust all of the parameters for your particular network. Other Configuration Parameters The mTCP configuration file can be used for more than network configuration. Other mTCP applications will read it to look for their configuration settings. In general, you can put anything you want in the configuration file. Lines that the DHCP client don't understand will be left unaltered. Here are the rules: * Blank lines are ok * Lines should never exceed 75 characters * If you use the DHCP client, it will rewrite the configuration file and write new values for IPADDR, NETMASK, GATEWAY, and NAMESERVER. The previous values will be lost, but no other lines in the file will be altered. * Other mTCP programs read but do not alter the file. They will skip lines that they do not understand. So for example, here is a more complex mTCP configuration file: DHCPVER DHCP Client version Apr 26 2009 TIMESTAMP Sun Apr 26 17:59:54 2009 # Parms for my machine # packetint 0x60 mtu 1500 hostname DOSBox # IRCjr parms # ircjr_nick Brut_DOSBox ircjr_user Brutman ircjr_name Brutman on IRCjr for DOS ircjr_connect_timeout 15 ircjr_register_timeout 60 # FTP parms # ftp_connect_timeout 15 # DHCP generated settings will appear here # IPADDR 192.168.2.102 NETMASK 255.255.255.0 GATEWAY 192.168.2.1 NAMESERVER 24.159.193.40 LEASE_TIME 86400 More on the MTU setting MTU stands for 'Maximum Transmission Unit' and it tells the TCP/IP stack how big of a packet it can send on the local network. Bigger packets generally mean less overhead. In a world where all networks are built using the same technology the MTU setting would not be needed. But that is not our world. Ethernet predominates, but there are other physical transports out there that you might not be aware that you are using. Your Ethernet traffic will be transmitted over many different things that don't look like Ethernet before it reaches its final destination. For normal TCP/IP stacks this is an issue because packets that are too big for a network will have to be broken up. This causes some performance loss as the packets have to be broken up and then later reassembled. For mTCP this is a serious issue because mTCP does not support fragmenting or reassembling packets. A packet that was broken up in flight into fragments WILL JUST BE DROPPED. This is obviously not a good thing, but I decided not to implement packet fragmenting and reassembly in mTCP because it is very memory and CPU intensive. (I may revisit this design decision.) The good news is that you have some control over the problem. Applications that use TCP sockets will tell the remote side what their MSS (Maximum Segment Size) is. MSS is based on MTU. This happens during the socket connect and once the remote side knows your MSS it will not knowingly send you a packet that needs to be fragmented. (Something in the middle might cause fragmentation though.) If you are having problem with dropped packets on a TCP socket, drop your MTU to 576. That is guaranteed to work on all networks, all gateways and all routers. UDP applications are not so lucky - UDP messages do not have the concept of MSS. If a UDP packet is too big it will be fragmented and dropped by mTCP. The good news is that mTCP applications only use UDP for DNS lookups, and DNS lookups were designed with this limitation in mind. So DNS response packets send by UDP *never* exceed 512 bytes of data. For best performance, set MTU to 1500 - that is the maximum for Ethernet. Only drop down to 576 if you are experiencing dropped packets. SLIP Users! If you are using a packet driver that does SLIP you are going to be interested in this. Prior versions of this stack didn't work with packet drivers running over serial ports even if ethernet emulation was used on the packet driver. This is because the stack would try to ARP to find the MAC address of the gateway machine (the machine on the other end of the serial cable) and the gateway machine would probably not respond or the packet driver would not pass the ARP packet. I have a new 'workaround' for this problem. If you set the "MTCPSLIP" to anything the stack will think it has an ARP entry for the gateway even though one will never actually be sent. This should allow you to use something like CSLIPPR with the ethernet emulation option. set MTCPSLIP=true Try it and let me know how it works .. Created July 31st, 2008, Last updated April 26th, 2009 (C)opyright Michael B. Brutman, mbbrutman@yahoo.com