Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

SRC/WATTCP.H

Go to the documentation of this file.
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 * This must come before "target.h". 00015 * Prevent including <winsock*.h>. 00016 */ 00017 #ifndef WIN32_LEAN_AND_MEAN 00018 #define WIN32_LEAN_AND_MEAN 00019 #endif 00020 00021 /* 00022 * Required for bsdname.c + winpkt.c 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 * Wattcp basic types. 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 /* Link/network-layer address types 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 /* !!fix-me: breaks AX25 drivers */ 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 /* On Win32/VC9+: typedef __w64 LONG DWORD_PTR; 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__ /* Lcc-win32 is a bit peculiar */ 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 /* Avoid MSVC-9 <malloc.h>/<crtdbg.h> name-clash */ 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 /* could be much larger */ 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 /* really is 4470 */ 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 /* Long frame or Exception frame */ 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 /* Virtual LAN */ 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 /* 260 from <windef.h> */ 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; /* Watcom _requires_ BYTE here */ 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; /* Watcom _requires_ BYTE here */ 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 /* ECN-Echo */ 00454 #define tcp_FlagCWR 0x80 /* congestion window reduced */ 00455 #define tcp_FlagMASK 0x3F /* ignore ECN/CWR for now */ 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 /* listening for connection */ 00543 #define tcp_StateRESOLVE 1 /* resolving IP, waiting on ARP reply */ 00544 #define tcp_StateSYNSENT 2 /* SYN sent, active open */ 00545 #define tcp_StateSYNREC 3 /* SYN received, ACK+SYN sent. */ 00546 #define tcp_StateESTAB 4 /* established */ 00547 #define tcp_StateESTCL 5 /* established, but will FIN */ 00548 #define tcp_StateFINWT1 6 /* sent FIN */ 00549 #define tcp_StateFINWT2 7 /* sent FIN, received FINACK */ 00550 #define tcp_StateCLOSWT 8 /* received FIN waiting for close */ 00551 #define tcp_StateCLOSING 9 /* sent FIN, received FIN (waiting for FINACK) */ 00552 #define tcp_StateLASTACK 10 /* FIN received, FINACK+FIN sent */ 00553 #define tcp_StateTIMEWT 11 /* dally after sending final FINACK */ 00554 #define tcp_StateCLOSED 12 /* FIN+ACK received */ 00555 00556 #define tcp_MaxBufSize 2048 /* maximum bytes to buffer on input */ 00557 #define udp_MaxBufSize 1520 00558 #define tcp_MaxTxBufSize tcp_MaxBufSize /* and on tcp output */ 00559 00567 #define UDP_TCP_COMMON \ 00568 WORD ip_type; /* UDP_PROTO,TCP_PROTO or IPx_TYPE */ \ 00569 BYTE ttl; /* Time To Live */ \ 00570 BYTE fill_1; \ 00571 const char *err_msg; /* NULL when all is okay */ \ 00572 char err_buf[100]; /* room for error message */ \ 00573 void (*usr_yield)(void); /* yield while waiting */ \ 00574 icmp_upcall icmp_callb; /* socket-layer callback (icmp) */ \ 00575 BYTE rigid; \ 00576 BYTE stress; \ 00577 WORD sockmode; /* a logical OR of bits */ \ 00578 WORD fill_2; \ 00579 DWORD usertimer; /* ip_timer_set, ip_timer_timeout */ \ 00580 ProtoHandler protoHandler; /* called with incoming data */ \ 00581 eth_address his_ethaddr; /* peer's ethernet address */ \ 00582 \ 00583 DWORD myaddr; /* my IPv4-address */ \ 00584 DWORD hisaddr; /* peer's IPv4 address */ \ 00585 WORD hisport; /* peer's source port */ \ 00586 WORD myport; /* my source port */ \ 00587 DWORD locflags; /* local option flags */ \ 00588 BOOL is_ip6; /* TRUE if IPv6 socket */ \ 00589 int rx_datalen; /* Rx length, must be signed */ \ 00590 UINT max_rx_data; /* Last index for rx_data[] */ \ 00591 BYTE *rx_data /* Rx data buffer (default rx_buf[]) */ 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 /* void *reasm_buf; */ 00670 #if defined(USE_TCP_MD5) 00671 char *secret; 00672 #endif 00673 DWORD inactive_to; 00674 DWORD datatimer; 00675 /* int sock_delay; ?? */ 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 /* _w32_WATTCP_H */ 00740

Generated on Wed Aug 4 08:55:54 2010 for Watt-32 tcp/ip by doxygen 1.3.8