home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / PPPBCKP / SRC15B44.ZIP / WATTCP.H < prev    next >
Text File  |  1997-03-08  |  15KB  |  457 lines

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