home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / c / mscwattc / include / wattcp.h < prev   
Encoding:
C/C++ Source or Header  |  1992-01-17  |  12.7 KB  |  432 lines

  1. // Modifications to this file made by Shawn LaMaster and Jonathan Kent to
  2. // convert from (Borland) BCC to (Microsoft) MSC600 compiler. 1/13/92
  3. //  - using large memory model.
  4. //  - make the WATTCPH labels after the #endif statements comments
  5. //    MSC600 was complaining about unexpected characters
  6. #define WATTCPH
  7.  
  8. /*
  9. #define DEBUG
  10. */
  11. /*
  12. #define MoveW( a , b, c ) movmem( a, b,c )
  13. #define busyouta(c) (putch(c))
  14. */
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <elib.h>
  19.  
  20. #define set_mstimeout( x ) (set_timeout(0)+ (x / 55))
  21.  
  22. #define MAX_GATE_DATA 12
  23. #define MAX_NAMESERVERS 10
  24. #define MAX_COOKIES 10
  25. #define MAX_STRING 50    /* most strings are limited */
  26.  
  27. #define MAXVJSA     1440 /* 10 s */
  28. #define MAXVJSD     360  /* 10 s */
  29. #define SAFETYTCP  0x538f25a3L
  30. #define SAFETYUDP  0x3e45e154L
  31. #define TRUE        1
  32. #define true        TRUE
  33. #define FALSE       0
  34. #define false       FALSE
  35.  
  36. /* These are Ethernet protocol numbers but I use them for other things too */
  37. #define UDP_PROTO  0x11
  38. #define TCP_PROTO  0x06
  39. #define ICMP_PROTO 0x01
  40.  
  41. #define TCP_MODE_BINARY  0       /* default mode */
  42. #define TCP_MODE_ASCII   1
  43. #define UDP_MODE_CHK     0       /* default to having checksums */
  44. #define UDP_MODE_NOCHK   2       /* turn off checksums */
  45. #define TCP_MODE_NAGLE   0       /* Nagle algorithm */
  46. #define TCP_MODE_NONAGLE 4
  47.  
  48.  
  49. typedef int (*procref)();
  50.  
  51. typedef unsigned long longword;     /* 32 bits */
  52. typedef unsigned short word;        /* 16 bits */
  53. typedef unsigned char byte;         /*  8 bits */
  54. typedef byte eth_address[6];
  55.  
  56. /* undesirable */
  57. extern longword MsecClock();
  58. #define clock_ValueRough() MsecClock()
  59.  
  60. #define TICKS_SEC 18
  61.  
  62. #define checksum( p, len) inchksum( p, len )
  63.  
  64. #define PD_ETHER 1
  65. #define PD_SLIP  6
  66.  
  67. extern word sock_inactive;      /* in pcbootp.c */
  68. extern word _pktdevclass;
  69. extern word _mss;
  70. extern word _bootptimeout;    /* in pcbootp.c */
  71. extern longword _bootphost;    /* in pcbootp.c */
  72. extern word _bootpon;
  73.  
  74. /* The Ethernet header */
  75. typedef struct {
  76.     eth_address     destination;
  77.     eth_address     source;
  78.     word            type;
  79. } eth_Header;
  80.  
  81. /* The Internet Header: */
  82. typedef struct {
  83.  //     unsigned        hdrlen  : 4;    These 3 fields are wrong for MS C
  84.  //     unsigned        ver     : 4;
  85.  //     byte        tos;
  86.     unsigned        hdrlen  : 4, ver : 4, tos : 8;
  87.     word            length;
  88.     word            identification;
  89.     word            frag;
  90.     byte        ttl;
  91.     byte        proto;
  92.     word            checksum;
  93.     longword        source;
  94.     longword        destination;
  95. } in_Header;
  96.  
  97.  
  98. #ifdef WATTCPH
  99. #define in_GetVersion(ip) ( (ip)->ver )
  100. #define in_GetHdrlen(ip)  ( (ip)->hdrlen )  /* 32 bit word size */
  101. #define in_GetHdrlenBytes(ip)  ( in_GetHdrlen(ip) << 2 ) /* 8 bit byte size */
  102. #define in_GetTos(ip)      ( (ip)->tos)
  103.  
  104. #define in_GetTTL(ip)      ((ip)->ttl)
  105. #define in_GetProtocol(ip) ((ip)->proto )
  106.  
  107. #else
  108. /*
  109. #define in_GetVersion(ip) (((ip)->vht >> 12) & 0xf)
  110. #define in_GetHdrlen(ip)  (((ip)->vht >> 8) & 0xf)
  111. #define in_GetHdrlenBytes(ip)  (((ip)->vht >> 6) & 0x3c)
  112. #define in_GetTos(ip)      ((ip)->vht & 0xff)
  113.  
  114. #define in_GetTTL(ip)      ((ip)->ttlProtocol >> 8)
  115. #define in_GetProtocol(ip) ((ip)->ttlProtocol & 0xff)
  116. */
  117. #endif //WATTCPH
  118.  
  119. typedef struct {
  120.     word        srcPort;
  121.     word        dstPort;
  122.     word        length;
  123.     word        checksum;
  124. } udp_Header;
  125.  
  126. #define UDP_LENGTH ( sizeof( udp_Header ))
  127.  
  128. typedef struct {
  129.     word            srcPort;
  130.     word            dstPort;
  131.     longword        seqnum;
  132.     longword        acknum;
  133.     word            flags;
  134.     word            window;
  135.     word            checksum;
  136.     word            urgentPointer;
  137. } tcp_Header;
  138.  
  139.  
  140. /*
  141. #ifdef WATTCPH
  142. #define tcp_FlagFIN     0x0100
  143. #define tcp_FlagSYN     0x0200
  144. #define tcp_FlagRST     0x0400
  145. #define tcp_FlagPUSH    0x0800
  146. #define tcp_FlagACK     0x1000
  147. #define tcp_FlagURG     0x2000
  148. #define tcp_FlagDO      0x00F0
  149. #define tcp_GetDataOffset(tp) ((tp)->flags >> 4)
  150. #else
  151. */
  152. #define tcp_FlagFIN     0x0001
  153. #define tcp_FlagSYN     0x0002
  154. #define tcp_FlagRST     0x0004
  155. #define tcp_FlagPUSH    0x0008
  156. #define tcp_FlagACK     0x0010
  157. #define tcp_FlagURG     0x0020
  158. #define tcp_FlagDO      0xF000
  159. #define tcp_GetDataOffset(tp) (intel16((tp)->flags) >> 12)
  160. /*
  161. #endif //WATTCPH
  162. */
  163. /* The TCP/UDP Pseudo Header */
  164. typedef struct {
  165.     longword    src;
  166.     longword    dst;
  167.     byte        mbz;
  168.     byte        protocol;
  169.     word        length;
  170.     word        checksum;
  171. } tcp_PseudoHeader;
  172.  
  173. /*
  174.  * TCP states, from tcp manual.
  175.  * Note: close-wait state is bypassed by automatically closing a connection
  176.  *       when a FIN is received.  This is easy to undo.
  177.  */
  178. #define tcp_StateLISTEN  0      /* listening for connection */
  179. #define tcp_StateSYNSENT 1      /* syn sent, active open */
  180. #define tcp_StateSYNREC  2      /* syn received, synack+syn sent. */
  181. #define tcp_StateESTAB   3      /* established */
  182. #define tcp_StateESTCL   4      /* established, but will FIN */
  183. #define tcp_StateFINWT1  5      /* sent FIN */
  184. #define tcp_StateFINWT2  6      /* sent FIN, received FINACK */
  185. #define tcp_StateCLOSWT  7      /* received FIN waiting for close */
  186. #define tcp_StateCLOSING 8      /* sent FIN, received FIN (waiting for FINACK) */
  187. #define tcp_StateLASTACK 9      /* fin received, finack+fin sent */
  188. #define tcp_StateTIMEWT  10     /* dally after sending final FINACK */
  189. #define tcp_StateCLOSEMSL 11
  190. #define tcp_StateCLOSED  12     /* finack received */
  191.  
  192. #define tcp_MaxBufSize 2048         /* maximum bytes to buffer on input */
  193.  
  194.  
  195.  
  196. /*
  197.  * UDP socket definition
  198.  */
  199. typedef struct _udp_socket {
  200.     struct _udp_socket *next;
  201.     word        ip_type;        /* always set to UDP_PROTO */
  202.     char       *err_msg;        /* null when all is ok */
  203.     void      (*usr_yield)();
  204.     word        sock_mode;            /* a logical OR of bits */
  205.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  206.     procref        dataHandler;
  207.     eth_address     hisethaddr;        /* peer's ethernet address */
  208.     longword        hisaddr;        /* peer's internet address */
  209.     word        hisport;        /* peer's UDP port */
  210.     word        myport;
  211.  
  212.     int             queuelen;
  213.     byte           *queue;
  214.  
  215.     int             rdatalen;           /* must be signed */
  216.     byte        rdata[ tcp_MaxBufSize + 1];        /* if dataHandler = 0, len == 512 */
  217.     longword        safetysig;
  218. } udp_Socket;
  219. /*
  220.  * TCP Socket definition
  221.  */
  222.  
  223.  
  224. typedef struct _tcp_socket {
  225.     struct _tcp_socket *next;
  226.     word        ip_type;        /* always set to TCP_PROTO */
  227.     char        *err_msg;
  228.     void      (*usr_yield)();
  229.     word        sock_mode;        /* a logical OR of bits */
  230.  
  231.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  232.     procref         dataHandler;    /* called with incoming data */
  233.     eth_address     hisethaddr;     /* ethernet address of peer */
  234.     longword        hisaddr;        /* internet address of peer */
  235.     word            hisport;        /* tcp ports for this connection */
  236.     word        myport;
  237.  
  238.     int             queuelen;
  239.     byte           *queue;
  240.  
  241.     int             rdatalen;       /* must be signed */
  242.     byte        rdata[tcp_MaxBufSize+1];    /* received data */
  243.     longword        safetysig;
  244.     word        rmaxdatalen;    /* normally tcp_MaxBufSize */
  245.     word        state;          /* connection state */
  246.  
  247.     longword        acknum;
  248.     longword        seqnum;         /* data ack'd and sequence num */
  249.     long            timeout;        /* timeout, in milliseconds */
  250.     byte            unhappy;        /* flag, indicates retransmitting segt's */
  251.     byte            recent;         /* 1 if recently transmitted */
  252.     word            flags;          /* tcp flags word for last packet sent */
  253.  
  254.     word        window;        /* other guy's window */
  255.     int         datalen;        /* number of bytes of data to send */
  256.                     /* must be signed */
  257.     int             unacked;        /* unacked data */
  258.  
  259.     byte        cwindow;        /* Van Jacobson's algorithm */
  260.     byte        wwindow;
  261.  
  262.     word        vj_sa;        /* VJ's alg, standard average */
  263.     word        vj_sd;        /* VJ's alg, standard deviation */
  264.     longword        vj_last;        /* last transmit time */
  265.     word        rto;
  266.     byte        karn_count;        /* count of packets */
  267.  
  268.     /* retransmission timeout proceedure */
  269.     /* these are in clock ticks */
  270.     longword        rtt_lasttran;       /* last transmission time */
  271.     longword        rtt_smooth;         /* smoothed round trip time */
  272.     longword        rtt_delay;          /* delay for next transmission */
  273.     longword        rtt_time;           /* time of next transmission */
  274.  
  275.     word            mss;
  276.     longword        inactive_to;           /* for the inactive flag */
  277.  
  278.     byte            data[tcp_MaxBufSize+1]; /* data to send */
  279. } tcp_Socket;
  280.  
  281. /* sock_type used for socket io */
  282. typedef union {
  283.     udp_Socket udp;
  284.     tcp_Socket tcp;
  285. } sock_type;
  286.  
  287. /* similar to UNIX */
  288. typedef struct sockaddr {
  289.     word        s_type;
  290.     word        s_port;
  291.     longword    s_ip;
  292.     byte        s_spares[6];    /* unused in TCP realm */
  293. };
  294.  
  295. extern longword my_ip_addr;
  296. extern eth_address _eth_addr;
  297. extern eth_address _eth_brdcast;
  298. extern longword sin_mask;
  299. extern word sock_delay;
  300.  
  301. /*
  302.  * ARP definitions
  303.  */
  304. #ifdef WATTCPH
  305. #define arp_TypeEther  0x100        /* ARP type of Ethernet address */
  306. #else
  307. #define arp_TypeEther  0x1        /* ARP type of Ethernet address */
  308. #endif //WATTCPH
  309.  
  310. /* harp op codes */
  311. #ifdef WATTCPH
  312. #define ARP_REQUEST 0x0100
  313. #define ARP_REPLY   0x0200
  314. #else
  315. #define ARP_REQUEST 1
  316. #define ARP_REPLY   2
  317. #endif //WATTCPH
  318.  
  319. /*
  320.  * Arp header
  321.  */
  322. typedef struct {
  323.     word            hwType;
  324.     word            protType;
  325.     word            hwProtAddrLen;  /* hw and prot addr len */
  326.     word            opcode;
  327.     eth_address     srcEthAddr;
  328.     longword        srcIPAddr;
  329.     eth_address     dstEthAddr;
  330.     longword        dstIPAddr;
  331. } arp_Header;
  332.  
  333. #define ETH_MSS 1400  /* MSS for Ethernet */
  334.  
  335. /*
  336.  * Ethernet interface:
  337.  */
  338.  
  339. void  _eth_init();
  340. byte *_eth_formatpacket( void *eth_dest, word eth_type );
  341. int   _eth_send( word len);
  342. void  _eth_free( void *buf);
  343. byte *_eth_arrived( word *type_ptr);
  344. void  _eth_release();
  345. void *_eth_hardware(byte *p);
  346.  
  347. void ip_timer_init();
  348. int  ip_timer_expired();
  349.  
  350. /*
  351.  * socket macros
  352.  */
  353.  
  354. /*
  355.  * sock_wait_established()
  356.  *    - waits then aborts if timeout on s connection
  357.  * sock_wait_input()
  358.  *    - waits for received input on s
  359.  *    - may not be valid input for sock_Gets... check returned length
  360.  * sock_tick()
  361.  *    - do tick and jump on abort
  362.  * sock_wait_closed();
  363.  *    - discards all received data
  364.  *
  365.  * jump to sock_err with contents of *statusptr set to
  366.  *     1 on closed
  367.  *    -1 on timeout
  368.  *
  369.  */
  370.  
  371. _ip_delay0( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  372. _ip_delay1( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  373. _ip_delay2( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  374.  
  375. #define sock_wait_established( s, seconds, fn, statusptr ) \
  376.     if (_ip_delay0( s, seconds, fn, statusptr )) goto sock_err;
  377. #define sock_wait_input( s, seconds, fn , statusptr ) \
  378.     if (_ip_delay1( s, seconds, fn, statusptr )) goto sock_err;
  379. #define sock_tick( s, statusptr ) \
  380.     if ( !tcp_tick(s)) { *statusptr = 1 ; goto sock_err; }
  381. #define sock_wait_closed(s, seconds, fn, statusptr )\
  382.     if (_ip_delay2( s, seconds, fn, statusptr )) goto sock_err;
  383.  
  384. /* in UDP_NDS.C */
  385. longword resolve();
  386.  
  387. extern int _last_cookie;
  388. extern longword _cookie[MAX_COOKIES];
  389.  
  390. extern char *def_domain;
  391. extern longword def_nameservers[MAX_NAMESERVERS];
  392. extern int _last_nameserver;
  393. extern char *_hostname;
  394.  
  395. word isaddr( char *string );
  396. longword aton( char *string );
  397.  
  398.  
  399. int _ping( longword host , longword countnum );
  400. longword _chk_ping( longword host , longword *ptr);
  401. void _arp_register( longword use, longword instead_of );
  402. _arp_resolve( longword ina, eth_address *ethap);
  403.  
  404. void * _pkt_eth_init();
  405. pkt_release();
  406. int pkt_send( char *buffer, int length );
  407. void pkt_buf_wipe();
  408. void pkt_buf_release( char *ptr );
  409. void * pkt_received();
  410.  
  411.  
  412.  
  413. void _add_server( int *counter, int max, longword *array, longword value );
  414. extern word debug_on;
  415. char *rip( char *s);
  416. _chk_socket( tcp_Socket *s );
  417. char *inet_ntoa( char *s, longword x );
  418. char *psocket( tcp_Socket *s );
  419. longword inet_addr( char *s );
  420. char *sockerr( tcp_Socket *s );
  421. char *sockstate( tcp_Socket *s );
  422. getpeername( tcp_Socket *s, void *dest, int *len );
  423. getsockname(  tcp_Socket *s, void *dest, int *len );
  424. longword gethostid();
  425. longword sethostid( longword ip );
  426. char *getdomainname( char *name, int length );
  427. char *setdomainname( char *string );
  428. word ntohs( word a );
  429. word htons( word a );
  430. longword ntohl( longword x );
  431. longword htonl( longword x );
  432.