00001
#ifndef _w32_WATTCP_H
00002
#define _w32_WATTCP_H
00003
00007
#if defined(WIN32) || defined(_WIN32)
00008
#undef WIN32
00009
#undef _WIN32
00010
#define WIN32 1
00011
#define _WIN32 1
00012
00013
00014
00015
00016
00017
#ifndef WIN32_LEAN_AND_MEAN
00018
#define WIN32_LEAN_AND_MEAN
00019
#endif
00020
00021
00022
00023
00024
#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
00025
#undef _WIN32_WINNT
00026
#define _WIN32_WINNT 0x0500
00027
#endif
00028
00029
#include <windows.h>
00030
#else
00031
00032
00033
00034
00035 typedef unsigned char BYTE;
00036 typedef unsigned short WORD;
00037 typedef unsigned long DWORD;
00038 typedef unsigned int UINT;
00039
#endif
00040
00041
#ifndef WATT32_BUILD
00042
#define WATT32_BUILD
00043
#endif
00044
00045
00046
00047 typedef BYTE eth_address[6];
00048 typedef BYTE tok_address[6];
00049 typedef BYTE fddi_address[6];
00050 typedef BYTE ax25_address[7];
00051 typedef BYTE arcnet_address;
00052 typedef BYTE ip6_address[16];
00054
#define mac_address eth_address
00055
00058 typedef int (*
ProtoHandler) (
void *sock,
const void *data,
unsigned len,
00059
const void *tcp_pseudo_hdr,
const void *udp_hdr);
00060
00063 typedef int (*
UserHandler) (
void *sock);
00064
00067 typedef int (*
icmp_upcall) (
void *
socket,
BYTE icmp_type,
BYTE icmp_code);
00068
00071
#if defined(__HIGHC__) || defined(__GNUC__) || defined(__CCDL__) || \
00072
defined(__LCC__) || defined(__POCC__)
00073 typedef unsigned long long uint64;
00074 typedef long long int64;
00075
#define HAVE_UINT64
00077
#elif defined(__DMC__) && (__INTSIZE == 4)
00078
typedef unsigned long long uint64;
00079
typedef long long int64;
00080
#define HAVE_UINT64
00081
00082
#elif defined(__WATCOMC__) && defined(__WATCOM_INT64__) && !(defined(__SMALL__) || defined(__LARGE__))
00083
typedef unsigned __int64
uint64;
00084
typedef __int64
int64;
00085
#define HAVE_UINT64
00086
00087
#elif defined(_MSC_VER) && (_MSC_VER >= 900)
00088
typedef unsigned __int64
uint64;
00089
typedef __int64
int64;
00090
#define HAVE_UINT64
00091
00092
#elif defined(__BORLANDC__) && defined(WIN32)
00093
typedef unsigned __int64
uint64;
00094
typedef __int64
int64;
00095
#define HAVE_UINT64
00096
#endif
00097
00098
struct ulong_long {
00099
DWORD lo;
00100
DWORD hi;
00101 };
00102
00103
00104
00105
#if !defined(WIN32)
00106
#define DWORD_PTR DWORD
00107
#endif
00108
00109
#if defined(__DMC__) && !defined(ULONG_PTR)
00110
#ifdef _WIN64
00111
#define ULONG_PTR unsigned long long
00112
#else
00113
#define ULONG_PTR unsigned long
00114
#endif
00115
#endif
00116
00117
00124
#define NAMESPACE(x) _w32_ ## x
00125
00126
#define loBYTE(w) (BYTE)(w)
00127
#define hiBYTE(w) (BYTE)((WORD)(w) >> 8)
00128
#define DIM(x) (int) (sizeof(x) / sizeof((x)[0]))
00129
#define SIZEOF(x) (int) sizeof(x)
00130
00131
#ifdef __LCC__
00132
#define ARGSUSED(foo) foo = foo
00133
#define ATOI(x) atoi ((char*)(x))
00134
#define ATOL(x) atol ((char*)(x))
00135
#else
00136
#define ARGSUSED(foo) (void)foo
00137
#define ATOI(x) atoi (x)
00138
#define ATOL(x) atol (x)
00139
#endif
00140
00144
#include "target.h"
00145
#include "config.h"
00147
#include <sys/w32api.h>
00148
#include <sys/werrno.h>
00150
#if defined(USE_CRTDBG)
00151
#define _CRTDBG_MAP_ALLOC
00152
#undef _malloca
00153
#include <crtdbg.h>
00154
00155
#elif defined(USE_FORTIFY)
00156
#include "fortify.h"
00157
#endif
00158
00159
#if defined(WATT32_DOS_DLL) && defined(__DJGPP__)
00160
#include "dxe_sym.h"
00161
#endif
00162
00163
#if defined(MAKE_TSR)
00164
#undef HAVE_UINT64
00165
#endif
00166
00167
#ifndef FALSE
00168
#define FALSE 0
00169
#endif
00170
00171
#ifndef TRUE
00172
#define TRUE (!FALSE)
00173
#endif
00174
00175
00179
#define ETH_MAX_DATA 1500
00180
#define ETH_MIN 60
00181
#define ETH_MAX (ETH_MAX_DATA + sizeof(eth_Header))
00182
00183
#define TOK_MAX_DATA ETH_MAX_DATA
00184
#define TOK_MIN sizeof(tok_Header)
00185
#define TOK_MAX (TOK_MAX_DATA + sizeof(tok_Header))
00186
00187
#define FDDI_MAX_DATA ETH_MAX_DATA
00188
#define FDDI_MIN (3 + sizeof(fddi_Header))
00189
#define FDDI_MAX (FDDI_MAX_DATA + sizeof(fddi_Header))
00190
00191
#define ARCNET_MAX_DATA 512
00192
#define ARCNET_MIN 257
00193
#define ARCNET_MAX (ARCNET_MAX_DATA + sizeof(arcnet_Header))
00194
00195
#define AX25_MAX_DATA ETH_MAX_DATA
00196
#define AX25_MIN sizeof(ax25_Header)
00197
#define AX25_MAX (AX25_MAX_DATA + sizeof(ax25_Header))
00198
00199
#define PPPOE_MAX_DATA (ETH_MAX_DATA - 8)
00200
#define PPPOE_MIN sizeof(pppoe_Header)
00201
#define PPPOE_MAX (PPPOE_MAX_DATA + sizeof(pppoe_Header))
00202
00203
#define VLAN_MAX_DATA (ETH_MAX_DATA - 4)
00204
#define VLAN_MAX (VLAN_MAX_DATA + sizeof(vlan_Header))
00205
#define VLAN_MIN sizeof(vlan_Header)
00206
00207
#define TCP_OVERHEAD (sizeof(in_Header) + sizeof(tcp_Header))
00208
#define UDP_OVERHEAD (sizeof(in_Header) + sizeof(udp_Header))
00209
00210
00214
#define IP4_TYPE 0x0008
00215
#define IP6_TYPE 0xDD86
00216
#define IEEE802_1Q_TYPE 0x0081
00217
#define ARP_TYPE 0x0608
00218
#define RARP_TYPE 0x3580
00219
#define PPPOE_DISC_TYPE 0x6388
00220
#define PPPOE_SESS_TYPE 0x6488
00221
00225
#define ARCNET_DP_BOOT 0
00226
#define ARCNET_DP_MOUNT 1
00227
#define ARCNET_PL_BEACON 8
00228
#define ARCNET_PL_BEACON2 243
00229
00230
#define ARCNET_DIAG 128
00231
#define ARCNET_IP6 196
00232
#define ARCNET_BACNET 205
00233
#define ARCNET_IP_1201 212
00234
#define ARCNET_ARP_1201 213
00235
#define ARCNET_RARP_1201 214
00236
#define ARCNET_ATALK 221
00237
#define ARCNET_ETHER 232
00238
#define ARCNET_NOVELL 236
00239
#define ARCNET_IP_1051 240
00240
#define ARCNET_ARP_1051 241
00241
#define ARCNET_BANYAN 247
00242
#define ARCNET_IPX 250
00243
#define ARCNET_LANSOFT 251
00244
00245
00246
#if (DOSX)
00247
#define MAX_FRAGMENTS 45UL
00248
#define MAX_WINDOW (64*1024U)
00249
#else
00250
#define MAX_FRAGMENTS 30UL
00251
#define MAX_WINDOW (32*1024U)
00252
#endif
00253
00256
#define MAX_IP4_DATA (ETH_MAX_DATA - sizeof(in_Header))
00257
#define MAX_IP6_DATA (ETH_MAX_DATA - sizeof(in6_Header))
00258
#define MAX_FRAG_SIZE (MAX_FRAGMENTS * MAX_IP4_DATA)
00259
00260
#define MAX_COOKIES 10
00261
#define MAX_HOSTLEN 80
00262
#define MAX_ADDRESSES 10
00264
#define MAX_NAMELEN 80
00265
#define MAX_VALUELEN 80
00267
#ifdef WIN32
00268
#define MAX_PATHLEN MAX_PATH
00269
#else
00270
#define MAX_PATHLEN 256
00271
#endif
00272
00273
#define SAFETY_TCP 0x538F25A3L
00274
#define SAFETY_UDP 0x3E45E154L
00275
00279
#define UDP_PROTO 17
00280
#define TCP_PROTO 6
00281
#define ICMP_PROTO 1
00282
#define IGMP_PROTO 2
00283
#define IPCOMP_PROTO 108
00284
#define SCTP_PROTO 132
00285
00289
#define SOCK_MODE_BINARY 0x01
00290
#define SOCK_MODE_UDPCHK 0x02
00291
#define SOCK_MODE_NAGLE 0x04
00292
#define SOCK_MODE_LOCAL 0x08
00293
#define SOCK_MODE_SAWCR 0x10
00294
#define SOCK_MODE_MASK 0x07
00301
#define LF_WINUPDATE 0x00001
00302
#define LF_NOPUSH 0x00002
00303
#define LF_NOOPT 0x00004
00304
#define LF_REUSEADDR 0x00008
00305
#define LF_KEEPALIVE 0x00010
00306
#define LF_LINGER 0x00020
00307
#define LF_NOCLOSE 0x00040
00308
#define LF_NO_IPFRAGS 0x00080
00309
#define LF_OOBINLINE 0x00100
00310
#define LF_SNDTIMEO 0x00200
00311
#define LF_RCVTIMEO 0x00400
00312
#define LF_GOT_FIN 0x00800
00313
#define LF_GOT_PUSH 0x01000
00314
#define LF_GOT_ICMP 0x02000
00315
#define LF_USE_TSTAMP 0x04000
00316
#define LF_RCVD_SCALE 0x08000
00317
#define LF_IS_SERVER 0x10000
00318
#define LF_SACK_PERMIT 0x20000
00319
00324
#define SOCKESTABLISHED 1
00325
#define SOCKDATAREADY 2
00326
#define SOCKCLOSED 4
00327
00328
00329
#include <sys/pack_on.h>
00335 typedef struct in_Header {
00336
#if defined(USE_BIGENDIAN)
00337
BYTE ver : 4;
00338
BYTE hdrlen : 4;
00339
#elif defined(OLD_TURBOC) || defined(__CCDL__)
00340
int hdrlen : 4;
00341
int ver : 4;
00342
#else
00343
BYTE hdrlen : 4;
00344
BYTE ver : 4;
00345
#endif
00346
BYTE tos;
00347
WORD length;
00348
WORD identification;
00349
WORD frag_ofs;
00350
BYTE ttl;
00351
BYTE proto;
00352
WORD checksum;
00353
DWORD source;
00354
DWORD destination;
00355 }
in_Header;
00356
00359
#define IP_CE 0x8000
00360
#define IP_DF 0x4000
00361
#define IP_MF 0x2000
00362
#define IP_OFFMASK 0x1FFF
00366
#define IP_MINCOST 0x02
00367
#define IP_RELIABILITY 0x04
00368
#define IP_THROUGHPUT 0x08
00369
#define IP_LOWDELAY 0x10
00370
#define IP_TOSMASK (IP_MINCOST|IP_RELIABILITY|IP_THROUGHPUT|IP_LOWDELAY)
00371
00372
#define in_GetHdrLen(ip) ((ip)->hdrlen << 2)
00374
#define IP_BCAST_ADDR 0xFFFFFFFFUL
00375
00380 typedef struct in6_Header {
00381
#if defined(USE_BIGENDIAN)
00382
BYTE ver : 4;
00383
BYTE pri : 4;
00384
#else
00385
BYTE pri : 4;
00386
BYTE ver : 4;
00387
#endif
00388
BYTE flow_lbl[3];
00389
WORD len;
00390
BYTE next_hdr;
00391
BYTE hop_limit;
00392
ip6_address source;
00393
ip6_address destination;
00394 }
in6_Header;
00395
00400 typedef struct ip_Packet {
00401
in_Header head;
00402
BYTE data [MAX_IP4_DATA];
00403 }
ip_Packet;
00404
00405
00410 typedef struct udp_Header {
00411
WORD srcPort;
00412
WORD dstPort;
00413
WORD length;
00414
WORD checksum;
00415 }
udp_Header;
00416
00417
00422 typedef struct tcp_Header {
00423
WORD srcPort;
00424
WORD dstPort;
00425
DWORD seqnum;
00426
DWORD acknum;
00427
00428
#if defined(USE_BIGENDIAN)
00429
BYTE offset : 4;
00430
BYTE unused : 4;
00431
#elif defined(OLD_TURBOC) || defined(__CCDL__)
00432
int unused : 4;
00433
int offset : 4;
00434
#else
00435
BYTE unused : 4;
00436
BYTE offset : 4;
00437
#endif
00438
BYTE flags;
00439
WORD window;
00440
WORD checksum;
00441
WORD urgent;
00442 }
tcp_Header;
00443
00447
#define tcp_FlagFIN 0x01
00448
#define tcp_FlagSYN 0x02
00449
#define tcp_FlagRST 0x04
00450
#define tcp_FlagPUSH 0x08
00451
#define tcp_FlagACK 0x10
00452
#define tcp_FlagURG 0x20
00453
#define tcp_FlagECN 0x40
00454
#define tcp_FlagCWR 0x80
00455
#define tcp_FlagMASK 0x3F
00456
00461 typedef struct tcp_PseudoHeader {
00462
DWORD src;
00463
DWORD dst;
00464
BYTE mbz;
00465
BYTE protocol;
00466
WORD length;
00467
WORD checksum;
00468 }
tcp_PseudoHeader;
00469
00470
00475 typedef struct tcp_PseudoHeader6 {
00476
ip6_address src;
00477
ip6_address dst;
00478
WORD length;
00479
BYTE zero[3];
00480
BYTE next_hdr;
00481 }
tcp_PseudoHeader6;
00482
00483
00488 typedef struct IGMP_packet {
00489
#if defined(USE_BIGENDIAN)
00490
int version : 4;
00491
int type : 4;
00492
#else
00493
int type : 4;
00494
int version : 4;
00495
#endif
00496
BYTE mbz;
00497
WORD checksum;
00498
DWORD address;
00499 }
IGMP_packet;
00500
00501
#define IGMP_VERSION 1
00502
#define IGMPv1_QUERY 1
00503
#define IGMPv1_REPORT 2
00504
00505
00510 typedef struct arp_Header {
00511
WORD hwType;
00512
WORD protType;
00513 BYTE hwAddrLen;
00514 BYTE protoAddrLen;
00515
WORD opcode;
00516
eth_address srcEthAddr;
00517
DWORD srcIPAddr;
00518
eth_address dstEthAddr;
00519
DWORD dstIPAddr;
00520 }
arp_Header;
00521
00522
#include <sys/pack_off.h>
00524
#define rarp_Header arp_Header
00525
00529
#define ARP_REQUEST 0x0100
00530
#define ARP_REPLY 0x0200
00531
#define RARP_REQUEST 0x0300
00532
#define RARP_REPLY 0x0400
00533
00534
00542
#define tcp_StateLISTEN 0
00543
#define tcp_StateRESOLVE 1
00544
#define tcp_StateSYNSENT 2
00545
#define tcp_StateSYNREC 3
00546
#define tcp_StateESTAB 4
00547
#define tcp_StateESTCL 5
00548
#define tcp_StateFINWT1 6
00549
#define tcp_StateFINWT2 7
00550
#define tcp_StateCLOSWT 8
00551
#define tcp_StateCLOSING 9
00552
#define tcp_StateLASTACK 10
00553
#define tcp_StateTIMEWT 11
00554
#define tcp_StateCLOSED 12
00555
00556
#define tcp_MaxBufSize 2048
00557
#define udp_MaxBufSize 1520
00558
#define tcp_MaxTxBufSize tcp_MaxBufSize
00559
00567
#define UDP_TCP_COMMON \
00568
WORD ip_type; \
00569 BYTE ttl; \
00570 BYTE fill_1; \
00571 const char *err_msg; \
00572 char err_buf[100]; \
00573 void (*usr_yield)(void); \
00574 icmp_upcall icmp_callb; \
00575 BYTE rigid; \
00576 BYTE stress; \
00577 WORD sockmode; \
00578 WORD fill_2; \
00579 DWORD usertimer; \
00580 ProtoHandler protoHandler; \
00581 eth_address his_ethaddr; \
00582 \
00583 DWORD myaddr; \
00584 DWORD hisaddr; \
00585 WORD hisport; \
00586 WORD myport; \
00587 DWORD locflags; \
00588 BOOL is_ip6; \
00589 int rx_datalen; \
00590 UINT max_rx_data; \
00591 BYTE *rx_data
00592
00597 typedef struct _udp_Socket {
00598
struct _udp_Socket *next;
00599 UDP_TCP_COMMON;
00600 BYTE rx_buf[udp_MaxBufSize+1];
00602
#if defined(USE_IPV6)
00603 ip6_address my6addr;
00604 ip6_address his6addr;
00605
#endif
00606 DWORD safetysig;
00607 }
_udp_Socket;
00608
00609
00614 typedef struct _tcp_Socket {
00615 struct _tcp_Socket *
next;
00616 UDP_TCP_COMMON;
00617
00618 BYTE rx_buf[tcp_MaxBufSize+1];
00620
#if defined(USE_IPV6)
00621 ip6_address my6addr;
00622 ip6_address his6addr;
00623
#endif
00624 UINT state;
00625 DWORD recv_next;
00626 DWORD send_next;
00627 long send_una;
00629
#if defined(USE_DEBUG)
00630 DWORD last_acknum[2];
00631 DWORD last_seqnum[2];
00632
#endif
00633 DWORD timeout;
00634 BYTE unhappy;
00635 BYTE recent;
00636 WORD flags;
00638 UINT window;
00639 UINT adv_win;
00641 BYTE cwindow;
00642 BYTE wwindow;
00643
WORD fill_4;
00644
00645 DWORD vj_sa;
00646 DWORD vj_sd;
00647 DWORD vj_last;
00648 UINT rto;
00649 BYTE karn_count;
00650 BYTE tos;
00651
WORD fill_5;
00652
00653 DWORD rtt_time;
00654 DWORD rtt_lasttran;
00656 DWORD ts_sent;
00657 DWORD ts_recent;
00658 DWORD ts_echo;
00660 UINT max_seg;
00667 DWORD missed_seq[2];
00668
00670
#if defined(USE_TCP_MD5)
00671 char *
secret;
00672
#endif
00673 DWORD inactive_to;
00674 DWORD datatimer;
00675
00676
00677 BYTE tx_wscale;
00678
BYTE rx_wscale;
00679 UINT tx_queuelen;
00680
const BYTE *tx_queue;
00681
00682 UINT tx_datalen;
00683 UINT max_tx_data;
00684 BYTE *
tx_data;
00685 BYTE tx_buf[tcp_MaxTxBufSize+1];
00686 DWORD safetysig;
00687 DWORD safetytcp;
00688 }
_tcp_Socket;
00689
00690
00695 typedef struct _raw_Socket {
00696
struct _raw_Socket *next;
00697 WORD ip_type;
00698 BOOL
used;
00699 DWORD seq_num;
00700
struct in_Header ip;
00701 BYTE rx_data [MAX_FRAG_SIZE];
00702 }
_raw_Socket;
00703
00708 typedef struct _raw6_Socket {
00709
struct _raw6_Socket *next;
00710
WORD ip_type;
00711 BOOL used;
00712
DWORD seq_num;
00713
struct in6_Header ip6;
00714
BYTE rx_data [MAX_IP6_DATA];
00715 }
_raw6_Socket;
00716
00721 typedef union sock_type {
00722
_udp_Socket udp;
00723
_tcp_Socket tcp;
00724
_raw_Socket raw;
00725
_raw6_Socket raw6;
00726 }
sock_type;
00727
00732 typedef struct watt_sockaddr {
00733
WORD s_type;
00734
WORD s_port;
00735
DWORD s_ip;
00736
BYTE s_spares[6];
00737 }
watt_sockaddr;
00738
00739
#endif
00740