home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / mskermit / msntcp.h < prev    next >
C/C++ Source or Header  |  2020-01-01  |  11KB  |  340 lines

  1. /* File MSNTCP.H
  2.  * Main include file for TCP/IP, as revised and modified for MS-DOS Kermit.
  3.  *
  4.  * Copyright (C) 1991, University of Waterloo.
  5.  *    Copyright (C) 1982, 1997, Trustees of Columbia University in the 
  6.  *    City of New York.  The MS-DOS Kermit software may not be, in whole 
  7.  *    or in part, licensed or sold for profit as a software product itself,
  8.  *    nor may it be included in or distributed with commercial products
  9.  *    or otherwise distributed by commercial concerns to their clients 
  10.  *    or customers without written permission of the Office of Kermit 
  11.  *    Development and Distribution, Columbia University.  This copyright 
  12.  *    notice must not be removed, altered, or obscured.
  13.  *
  14.  * Original version created by Erick Engelke of the University of
  15.  *  Waterloo, Waterloo, Ontario, Canada.
  16.  *       Erick Engelke                Erick@development.watstar.uwaterloo.ca
  17.  *       Faculty of Engineering
  18.  *       University of Waterloo       (519) 885-1211 Ext. 2965
  19.  *       200 University Ave.,
  20.  *       Waterloo, Ont., Canada
  21.  *       N2L 3G1
  22.  * Adapted and modified for MS-DOS Kermit by Joe R. Doupnik, 
  23.  *  Utah State University, jrd@cc.usu.edu, jrd@usu.Bitnet,
  24.  *  and by Frank da Cruz, Columbia University, fdc@watsun.cc.columbia.edu.
  25.  *
  26.  * Name resolution services were adapted from sources made available by
  27.  * the National Centre for Supercomputer Applications (NCSA) and Clarkson
  28.  * University.
  29.  *
  30.  * The C code is designed for the small memory model of Microsoft C versions
  31.  * 5.1 and later, with structures packed on one byte boundaries. No other
  32.  * options are expected.
  33.  *
  34.  * Last edit:
  35.  * 12 Jan 1995 version 3.14
  36.  */
  37.  
  38. #define KERMIT
  39.  
  40. /*
  41.  * Typedefs and constants
  42.  */
  43.  
  44. #ifndef byte
  45. typedef unsigned char byte;
  46. #endif  /* byte */
  47. #ifndef word
  48. typedef unsigned int word;
  49. #endif  /* word */
  50. #ifndef longword
  51. typedef unsigned long longword;
  52. #endif /* longword */
  53.  
  54. typedef int (*procref)(void *, void *, int);
  55. typedef byte eth_address[6];
  56.  
  57.  
  58. /* MSC v6.0 & v7.0 &v8.0 definition of Far as _far */
  59. #define FAR _far
  60.  
  61. /*
  62. #define DEBUG
  63. */
  64.  
  65. #ifndef NULL
  66. #define NULL 0
  67. #endif
  68.  
  69. #define TRUE        1
  70. #define FALSE       0
  71.  
  72. #define ETH_MSS 1460             /* MSS for Ethernet >= 536 */
  73. #define MAX_GATE_DATA 3
  74. #define MAX_NAMESERVERS 3
  75. #define MAX_COOKIES 0
  76. #define MAX_STRING 64    
  77. #define TICKS_SEC 18
  78. #define PD_ETHER 1
  79. #define PD_SLIP  6
  80.  
  81. #define    BOOT_FIXED    0    /* methods of obtaining our IP address */
  82. #define    BOOT_BOOTP    1
  83. #define    BOOT_RARP    2
  84. #define BOOT_DHCP    3
  85.  
  86. /* Ethernet frame TYPE's in network order, reverse for host order */
  87. #define TYPE_IP        0x0008
  88. #define TYPE_ARP    0x0608
  89. #define TYPE_RARP    0x3580
  90.  
  91. /* Ethernet protocol identifications */
  92. #define ICMP_PROTO 0x01
  93. #define TCP_PROTO  0x06
  94. #define UDP_PROTO  0x11
  95.  
  96.                 /* sock_mode byte bit-field */
  97. #define TCP_MODE_NAGLE    0x01    /* TCP Nagle algorithm */
  98. #define TCP_MODE_PASSIVE 0x02    /* TCP, opened in passive mode */
  99. #define UDP_MODE_CHKSUM    0x08    /* UDP checksums */
  100.  
  101. /* The Ethernet header */
  102. typedef struct {
  103.     eth_address     destination;
  104.     eth_address     source;
  105.     word            type;
  106. } eth_Header;
  107.  
  108. /* The Internet Header: */
  109. typedef struct {
  110.     byte        hdrlen_ver;        /* both in one byte */
  111.     byte        tos;
  112.     word            length;
  113.     word            identification;
  114.     word            frag;
  115.     byte        ttl;
  116.     byte        proto;
  117.     word            checksum;
  118.     longword        source;
  119.     longword        destination;
  120. } in_Header;
  121.  
  122. typedef struct {
  123.     word        srcPort;
  124.     word        dstPort;
  125.     word        length;
  126.     word        checksum;
  127. } udp_Header;
  128.  
  129. typedef struct {
  130.     word            srcPort;
  131.     word            dstPort;
  132.     longword        seqnum;
  133.     longword        acknum;
  134.     word            flags;
  135.     word            window;
  136.     word            checksum;
  137.     word            urgentPointer;
  138. } tcp_Header;
  139.  
  140. /* The TCP/UDP Pseudo Header */
  141. typedef struct {
  142.     longword    src;
  143.     longword    dst;
  144.     byte        mbz;
  145.     byte        protocol;
  146.     word        length;
  147.     word        checksum;
  148. } tcp_PseudoHeader;
  149.  
  150. /* TCP states */
  151. #define tcp_StateLISTEN  0x0000      /* listening for connection */
  152. #define tcp_StateSYNSENT 0x0001      /* syn sent, active open */
  153. #define tcp_StateSYNREC  0x0002      /* syn received, synack+syn sent. */
  154. #define tcp_StateESTAB   0x0004      /* established */
  155. #define tcp_StateFINWT1  0x0008      /* sent FIN */
  156. #define tcp_StateFINWT2  0x0010      /* sent FIN, received FINACK */
  157. #define tcp_StateCLOSWT  0x0020      /* received FIN waiting for close */
  158. #define tcp_StateCLOSING 0x0040      /* sent FIN, recvd FIN (waiting for FINACK) */
  159. #define tcp_StateLASTACK 0x0080      /* fin received, finack+fin sent */
  160. #define tcp_StateTIMEWT  0x0100      /* dally after sending final FINACK */
  161. #define tcp_StateCLOSEMSL 0x0200
  162. #define tcp_StateCLOSED  0x0400       /* finack received */
  163.  
  164. #define SOCKET_OPEN    1        /* if socket structure is active */
  165. #define SOCKET_CLOSED    0
  166. #define TIMED_OUT    1        /* if a timer has expired */
  167. /*
  168.  * UDP socket definition, must match start of tcp_socket.
  169.  */
  170. typedef struct udp_socket {
  171.     struct udp_socket *next;
  172.     word        ip_type;        /* always set to UDP_PROTO */
  173.     byte        sisopen;        /* non-zero if socket is open */
  174.     byte        sock_mode;            /* a logical OR of bits */
  175.     eth_address     hisethaddr;        /* peer's Ethernet address */
  176.     longword        hisaddr;        /* peer's Internet address */
  177.     word        hisport;        /* peer's UDP port */
  178.     word        myport;        /* our UDP port */
  179.     int             rdatalen;          /* signed, bytes in receive buffer */
  180.     byte        FAR * rdata;    /* Far ptr to data buffer */
  181. } udp_Socket;
  182.  
  183. /* TCP segment send queue status per segment */
  184. typedef struct sendqstat {
  185.     longword    time_sent;    /* Bios ticks when datagram was sent*/
  186.     longword    timeout;    /* Bios ticks when dgram times out */
  187.     longword    next_seq;    /* seq number of start of next dgram */
  188. };
  189. #define NSENDQ    20
  190.  
  191. /*
  192.  * TCP Socket definition
  193.  */
  194.  
  195. typedef struct tcp_socket {
  196.     struct tcp_socket *next;
  197.     word        ip_type;        /* always set to TCP_PROTO */
  198.     byte        sisopen;        /* non-zero if socket is open */
  199.     byte        sock_mode;        /* a logical OR of bits */
  200.     eth_address     hisethaddr;     /* Ethernet address of peer */
  201.     longword        hisaddr;        /* Internet address of peer */
  202.     word            hisport;        /* TCP port at peer */
  203.     word        myport;        /* our TCP port */
  204.     int             rdatalen;       /* signed, bytes in receive buffer */
  205.     byte        FAR * rdata;    /* Far ptr to receive data buffer */
  206.                     /* above must also match udp_socket */
  207.     byte            FAR * sdata;    /* Far ptr to send data buffer */
  208.     int         sdatalen;        /* signed number of bytes of data to send*/
  209.     int            sdatahwater;    /* high water mark in buffer */
  210.     word        state;          /* connection state */
  211.     longword        acknum;        /* last received byte + 1 */
  212.     longword        seqnum;         /* last sent byte + 1 */
  213.     word            flags;          /* tcp flags word for last packet sent */
  214.     word            mss;        /* active Max Segment Size */
  215.     word        window;        /* remote host's window size */
  216.     word        old_window;        /* remote host's previous window size */
  217.     word        cwindow;        /* Van Jacobson's algorithm, congest win*/
  218.     word        ssthresh;        /* VJ congestion threshold */
  219.     byte        loss_count;        /* times in row have lost pkt */
  220.     byte        last_read;        /* last byte read by tcp_read, for CR NUL*/
  221.     word        vj_sa;        /* VJ's algorithm, standard average */
  222.     word        vj_sd;        /* VJ's algorithm, standard deviation */
  223.     word        rto;        /* round trip timeout */
  224.     longword        timeout;        /* TCP state timeout, in Bios tics */
  225.     longword        notimeseq;        /* seq number below which repeats sent */
  226.     longword        idle;        /* timeout for last xmission + rto */
  227.     longword        winprobe;        /* timeout on window probes */
  228.     word        probe_wait;        /* ticks between window probes */
  229.     longword        keepalive;        /* timeout on passive open'd keepalives */
  230.     byte        send_kind;        /* flag, nosend, sendnow */
  231.     int            sendqnum;        /* number of active entries in sendq */
  232.     struct sendqstat sendq[NSENDQ]; /* send queue stats per IP datagram */
  233. } tcp_Socket;
  234.  
  235.  
  236. /* sock_type used for socket io */
  237. typedef union {
  238.     udp_Socket udp;
  239.     tcp_Socket tcp;
  240. } sock_type;
  241.  
  242. /*
  243.  * socket macros
  244.  */
  245.  
  246. /*
  247.  * sock_wait_established()
  248.  *    - waits then aborts if timeout on s connection
  249.  * sock_wait_input()
  250.  *    - waits for received input on s
  251.  *    - may not be valid input for sock_Gets... check returned length
  252.  * sock_wait_closed();
  253.  *    - discards all received data
  254.  *
  255.  * jump to sock_err with contents of *statusptr set to
  256.  *     1 on closed
  257.  *    -1 on timeout
  258.  */
  259. #define sock_wait_established(s, seconds, fn, statusptr) \
  260.     if (ip_delay0(s, seconds, fn, statusptr)) goto sock_err;
  261. #define sock_wait_input(s, seconds, fn , statusptr) \
  262.     if (ip_delay1(s, seconds, fn, statusptr)) goto sock_err;
  263. #define sock_wait_closed(s, seconds, fn, statusptr)\
  264.     if (ip_delay2(s, seconds, fn, statusptr)) goto sock_err;
  265.  
  266. /* s is a pointer to a udp or tcp socket */
  267. int    sock_read(void *, byte FAR *, int);
  268. int    sock_fastread(void *, byte FAR *, int);
  269. int    sock_write(void *, byte FAR *, int);
  270. word    sock_dataready(void *);
  271. int    sock_established(void *);
  272. int    sock_close(void *);
  273. void    sock_abort(void *);
  274. int    sock_setmode(void *, word, word);
  275.  
  276. /*
  277.  * TCP or UDP specific material, must be used for open's and listens, but
  278.  * sock calls are used for everything else.
  279.  */
  280. int    udp_open(void *, word, longword, word);
  281. int    tcp_open(void *, word, longword, word);
  282. int    tcp_listen(void *, word, longword, word, word);
  283. int    tcp_established(void *);
  284.  
  285. /* timers */
  286. int    ip_delay0(void *, int, procref, int *);
  287. int    ip_delay1(void *, int, procref, int *);
  288. int    ip_delay2(void *, int, procref, int *);
  289.  
  290. /* tcp_init/tcp_shutdown, init/kill all tcp and lower services.
  291.    Call if sock_init is not used, else not recommended.
  292. */
  293. int    tcp_init(void);
  294. void    tcp_shutdown(void);
  295. int    tcp_abort(tcp_Socket *);
  296. /* tcp_tick - called periodically by user application in sock_wait.
  297.   returns 0 when our socket closes
  298. */
  299. int    tcp_tick(void *);
  300.  
  301. int    tcp_cancel(void *);
  302. int    udp_cancel(void *);
  303.  
  304. int    eth_init();
  305. byte *    eth_formatpacket(void *, word);
  306. int    eth_send(word);
  307. void    eth_free(void *);
  308. byte *    eth_arrived(word *);
  309. void    eth_release(void);
  310. void *    eth_hardware(void *);
  311. int    do_bootp(void);
  312. int    do_rarp(void);
  313. int    do_ping(byte *, longword);
  314. longword resolve(byte *);
  315. int    add_server(int *, int, longword *, longword);
  316. void    arp_init(void);
  317. int    arp_resolve(longword, void *);
  318. void    arp_register(longword, longword);
  319. void    arp_add_gateway(byte *, longword);
  320. longword arp_rpt_gateway(int);
  321. int    pkt_rarp_init(void);
  322.  
  323. word     ntohs(word);
  324. word     htons(word);
  325. longword ntohl(longword);
  326. longword htonl(longword);
  327. void *    movmem(void *, void *, int);
  328.  
  329. extern    word pktdevclass;
  330. extern    word mss;
  331. extern    longword bootphost;
  332. extern    longword my_ip_addr;
  333. extern    eth_address eth_addr;
  334. extern    eth_address eth_brdcast;
  335. extern    longword sin_mask;
  336. extern    int last_nameserver;
  337. extern    word arp_last_gateway;
  338. extern    longword def_nameservers[];
  339. extern    word debug_on;
  340.