home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / INTERNET / WWW / LYNX / SOURCE / SRC0_8A.ZIP / WATTCP / INCLUDE / WATTCP.H < prev   
Encoding:
C/C++ Source or Header  |  1993-11-30  |  13.4 KB  |  432 lines

  1. #define getsockname hack_getsockname
  2. #define sockaddr hack_sockaddr
  3. #define in_addr hack_in_addr
  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.     unsigned        frags : 3;
  101.     unsigned        fo    : 13;
  102.     byte        ttl;
  103.     byte        proto;
  104.     word            checksum;
  105.     longword        source;
  106.     longword        destination;
  107. } in_Header;
  108.  
  109.  
  110. #define in_GetVersion(ip) ( (ip)->ver )
  111. #define in_GetHdrlen(ip)  ( (ip)->hdrlen )  /* 32 bit word size */
  112. #define in_GetHdrlenBytes(ip)  ( in_GetHdrlen(ip) << 2 ) /* 8 bit byte size */
  113. #define in_GetTos(ip)      ( (ip)->tos)
  114.  
  115. #define in_GetTTL(ip)      ((ip)->ttl)
  116. #define in_GetProtocol(ip) ((ip)->proto )
  117.  
  118. typedef struct {
  119.     word        srcPort;
  120.     word        dstPort;
  121.     word        length;
  122.     word        checksum;
  123. } udp_Header;
  124.  
  125. #define UDP_LENGTH ( sizeof( udp_Header ))
  126.  
  127. typedef struct {
  128.     word            srcPort;
  129.     word            dstPort;
  130.     longword        seqnum;
  131.     longword        acknum;
  132.     word            flags;
  133.     word            window;
  134.     word            checksum;
  135.     word            urgentPointer;
  136. } tcp_Header;
  137.  
  138. #define tcp_FlagFIN     0x0001
  139. #define tcp_FlagSYN     0x0002
  140. #define tcp_FlagRST     0x0004
  141. #define tcp_FlagPUSH    0x0008
  142. #define tcp_FlagACK     0x0010
  143. #define tcp_FlagURG     0x0020
  144. #define tcp_FlagDO      0xF000
  145. #define tcp_GetDataOffset(tp) (intel16((tp)->flags) >> 12)
  146.  
  147. /* The TCP/UDP Pseudo Header */
  148. typedef struct {
  149.     longword    src;
  150.     longword    dst;
  151.     byte        mbz;
  152.     byte        protocol;
  153.     word        length;
  154.     word        checksum;
  155. } tcp_PseudoHeader;
  156.  
  157. /*
  158.  * TCP states, from tcp manual.
  159.  * Note: close-wait state is bypassed by automatically closing a connection
  160.  *       when a FIN is received.  This is easy to undo.
  161.  */
  162. #define tcp_StateLISTEN  0      /* listening for connection */
  163. #define tcp_StateSYNSENT 1      /* syn sent, active open */
  164. #define tcp_StateSYNREC  2      /* syn received, synack+syn sent. */
  165. #define tcp_StateESTAB   3      /* established */
  166. #define tcp_StateESTCL   4      /* established, but will FIN */
  167. #define tcp_StateFINWT1  5      /* sent FIN */
  168. #define tcp_StateFINWT2  6      /* sent FIN, received FINACK */
  169. #define tcp_StateCLOSWT  7      /* received FIN waiting for close */
  170. #define tcp_StateCLOSING 8      /* sent FIN, received FIN (waiting for FINACK) */
  171. #define tcp_StateLASTACK 9      /* fin received, finack+fin sent */
  172. #define tcp_StateTIMEWT  10     /* dally after sending final FINACK */
  173. #define tcp_StateCLOSEMSL 11
  174. #define tcp_StateCLOSED  12     /* finack received */
  175.  
  176. #define tcp_MaxBufSize 2048         /* maximum bytes to buffer on input */
  177.  
  178.  
  179.  
  180. /*
  181.  * UDP socket definition
  182.  */
  183. typedef struct _udp_socket {
  184.     struct _udp_socket *next;
  185.     word        ip_type;        /* always set to UDP_PROTO */
  186.     char       *err_msg;        /* null when all is ok */
  187.     char           *usr_name;
  188.     void      (*usr_yield)();
  189.     word        sock_mode;            /* a logical OR of bits */
  190.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  191.     procref        dataHandler;
  192.     eth_address     hisethaddr;        /* peer's ethernet address */
  193.     longword        hisaddr;        /* peer's internet address */
  194.     word        hisport;        /* peer's UDP port */
  195.     longword        myaddr;
  196.     word        myport;
  197.     word            locflags;
  198.  
  199.     int             queuelen;
  200.     byte           *queue;
  201.  
  202.     int             rdatalen;           /* must be signed */
  203.     word            maxrdatalen;
  204.     byte           *rdata;
  205.     byte            rddata[ tcp_MaxBufSize + 1];         /* if dataHandler = 0, len == 512 */
  206.     longword        safetysig;
  207. } udp_Socket;
  208. /*
  209.  * TCP Socket definition
  210.  */
  211.  
  212.  
  213. typedef struct _tcp_socket {
  214.     struct _tcp_socket *next;
  215.     word        ip_type;        /* always set to TCP_PROTO */
  216.     char        *err_msg;
  217.     char           *usr_name;
  218.     void          (*usr_yield)();
  219.     word        sock_mode;        /* a logical OR of bits */
  220.  
  221.     longword        usertimer;        /* ip_timer_set, ip_timer_timeout */
  222.     procref         dataHandler;    /* called with incoming data */
  223.     eth_address     hisethaddr;     /* ethernet address of peer */
  224.     longword        hisaddr;        /* internet address of peer */
  225.     word            hisport;        /* tcp ports for this connection */
  226.     longword        myaddr;
  227.     word        myport;
  228.     word            locflags;
  229.  
  230.     int             queuelen;
  231.     byte           *queue;
  232.  
  233.     int             rdatalen;       /* must be signed */
  234.     word            maxrdatalen;
  235.     byte           *rdata;
  236.     byte            rddata[tcp_MaxBufSize+1];    /* received data */
  237.     longword        safetysig;
  238.     word        state;          /* connection state */
  239.  
  240.     longword        acknum;
  241.     longword        seqnum;         /* data ack'd and sequence num */
  242.     long            timeout;        /* timeout, in milliseconds */
  243.     byte            unhappy;        /* flag, indicates retransmitting segt's */
  244.     byte            recent;         /* 1 if recently transmitted */
  245.     word            flags;          /* tcp flags word for last packet sent */
  246.  
  247.     word        window;        /* other guy's window */
  248.     int         datalen;        /* number of bytes of data to send */
  249.                     /* must be signed */
  250.     int             unacked;        /* unacked data */
  251.  
  252.     byte        cwindow;        /* Van Jacobson's algorithm */
  253.     byte        wwindow;
  254.  
  255.     word        vj_sa;        /* VJ's alg, standard average */
  256.     word        vj_sd;        /* VJ's alg, standard deviation */
  257.     longword        vj_last;        /* last transmit time */
  258.     word        rto;
  259.     byte        karn_count;        /* count of packets */
  260.     byte            tos;            /* priority */
  261.     /* retransmission timeout proceedure */
  262.     /* these are in clock ticks */
  263.     longword        rtt_lasttran;       /* last transmission time */
  264.     longword        rtt_smooth;         /* smoothed round trip time */
  265.     longword        rtt_delay;          /* delay for next transmission */
  266.     longword        rtt_time;           /* time of next transmission */
  267.  
  268.     word            mss;
  269.     longword        inactive_to;           /* for the inactive flag */
  270.     int             sock_delay;
  271.  
  272.     byte            data[tcp_MaxBufSize+1]; /* data to send */
  273. } tcp_Socket;
  274.  
  275. /* sock_type used for socket io */
  276. typedef union {
  277.     udp_Socket udp;
  278.     tcp_Socket tcp;
  279. } sock_type;
  280.  
  281. /* similar to UNIX */
  282. typedef struct sockaddr {
  283.     word        s_type;
  284.     word        s_port;
  285.     longword    s_ip;
  286.     byte        s_spares[6];    /* unused in TCP realm */
  287. };
  288.  
  289. extern longword my_ip_addr;
  290. extern eth_address _eth_addr;
  291. extern eth_address _eth_brdcast;
  292. extern longword sin_mask;
  293. extern word sock_delay;
  294.  
  295. /*
  296.  * ARP definitions
  297.  */
  298. #define arp_TypeEther  0x100        /* ARP type of Ethernet address */
  299.  
  300. /* harp op codes */
  301. #define ARP_REQUEST 0x0100
  302. #define ARP_REPLY   0x0200
  303.  
  304. /*
  305.  * Arp header
  306.  */
  307. typedef struct {
  308.     word            hwType;
  309.     word            protType;
  310.     word            hwProtAddrLen;  // hw and prot addr len
  311.     word            opcode;
  312.     eth_address     srcEthAddr;
  313.     longword        srcIPAddr;
  314.     eth_address     dstEthAddr;
  315.     longword        dstIPAddr;
  316. } arp_Header;
  317.  
  318. #define ETH_MSS 1400  // MSS for Ethernet
  319.  
  320.  // Ethernet interface:
  321.  
  322. extern void  _eth_init( void );
  323. extern byte *_eth_formatpacket( void *eth_dest, word eth_type );
  324. extern int   _eth_send( word len);
  325. extern void  _eth_free( void *buf);
  326. extern byte *_eth_arrived( word *type_ptr);
  327. extern void  _eth_release( void );
  328.  
  329. extern void *_eth_hardware(byte *p);
  330.  
  331. extern void ip_timer_init(udp_Socket *s, int seconds);
  332. extern int  ip_timer_expired(udp_Socket *s);
  333.  
  334. /*
  335.  * socket macros
  336.  */
  337.  
  338. /*
  339.  * sock_wait_established()
  340.  *    - waits then aborts if timeout on s connection
  341.  * sock_wait_input()
  342.  *    - waits for received input on s
  343.  *      - may not be valid input for sock_gets... check returned length
  344.  * sock_tick()
  345.  *    - do tick and jump on abort
  346.  * sock_wait_closed();
  347.  *    - discards all received data
  348.  *
  349.  * jump to sock_err with contents of *statusptr set to
  350.  *     1 on closed
  351.  *    -1 on timeout
  352.  *
  353.  */
  354.  
  355. extern _ip_delay0( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  356. extern _ip_delay1( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  357. extern _ip_delay2( sock_type *s, int timeoutseconds, procref fn, int *statusptr );
  358.  
  359. #define sock_wait_established( s, seconds, fn, statusptr ) \
  360.     if (_ip_delay0( s, seconds, fn, statusptr )) goto sock_err;
  361. #define sock_wait_input( s, seconds, fn , statusptr ) \
  362.     if (_ip_delay1( s, seconds, fn, statusptr )) goto sock_err;
  363. #define sock_tick( s, statusptr ) \
  364.     if ( !tcp_tick(s)) { *statusptr = 1 ; goto sock_err; }
  365. #define sock_wait_closed(s, seconds, fn, statusptr )\
  366.     if (_ip_delay2( s, seconds, fn, statusptr )) goto sock_err;
  367.  
  368. // in UDP_NDS.C
  369. extern longword resolve(char *asciiname);
  370.  
  371. extern int _last_cookie;
  372. extern longword _cookie[MAX_COOKIES];
  373.  
  374. extern char *def_domain;
  375. extern longword def_nameservers[MAX_NAMESERVERS];
  376. extern int _last_nameserver;
  377. extern char *_hostname;
  378.  
  379. extern word isaddr( char *string );
  380. extern longword aton( char *string );
  381.  
  382.  
  383. extern int _ping( longword host , longword countnum );
  384. extern longword _chk_ping( longword host , longword *ptr);
  385. extern void _arp_register( longword use, longword instead_of );
  386. extern int _arp_resolve( longword ina, eth_address *ethap, int nowait);
  387.  
  388. extern void * _pkt_eth_init( void );
  389. extern void pkt_release( void );
  390. extern int pkt_send( char *buffer, int length );
  391. extern void pkt_buf_wipe( void );
  392. extern void pkt_buf_release( char *ptr );
  393. extern void * pkt_received( void );
  394.  
  395.  
  396.  
  397. extern void _add_server( int *counter, int max, longword *array, longword value );
  398. extern word debug_on;
  399. extern char *rip( char *s);
  400. extern _chk_socket( tcp_Socket *s );
  401. extern char *inet_ntoa( char *s, longword x );
  402. extern void psocket( tcp_Socket *s );
  403. extern longword inet_addr( char *s );
  404. extern char *sockerr( tcp_Socket *s );
  405. extern char *sockstate( tcp_Socket *s );
  406. extern getpeername( tcp_Socket *s, void *dest, int *len );
  407. extern getsockname(  tcp_Socket *s, void *dest, int *len );
  408. extern longword gethostid( void );
  409. extern longword sethostid( longword ip );
  410. extern char *getdomainname( char *name, int length );
  411. extern char *setdomainname( char *string );
  412. extern word ntohs( word a );
  413. extern word htons( word a );
  414. extern longword ntohl( longword x );
  415. extern longword htonl( longword x );
  416.  
  417. extern void * _tcp_lookup( longword hisip, word hisport, word myport );
  418. extern int addwattcpd( void (*p)() );
  419. extern int delwattcpd( void (*p)() );
  420. extern word sock_mode( sock_type *, word);
  421. extern void sock_abort( tcp_Socket *);
  422. extern int sock_fastwrite( sock_type *, byte *, int );
  423. extern int sock_write( sock_type *, byte *, int );
  424. extern int sock_read( sock_type *, byte *, int );
  425. extern int sock_fastread( sock_type *, byte *, int );
  426.  
  427. extern int tcp_open(tcp_Socket *s, word lport, longword ina, word port, procref datahandler);
  428. extern int udp_open(udp_Socket *s, word lport, longword ina, word port, procref datahandler);
  429. extern int tcp_listen(tcp_Socket *s, word lport, longword ina, word port, procref datahandler, word timeout);
  430. extern int sock_gets(sock_type *, byte *, int );
  431. extern int sock_close(sock_type * );
  432.