home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / wattcp.zip / WATTCP.H < prev    next >
C/C++ Source or Header  |  1992-07-10  |  13KB  |  425 lines

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