/*
 * tinytcp.h - header file for tinytcp.c
 *
 * Copyright (C) 1986, IMAGEN Corporation
 *  "This code may be duplicated in whole or in part provided that [1] there
 *   is no commercial gain involved in the duplication, and [2] that this
 *   copyright notice is preserved on all copies.  Any other duplication
 *   requires written notice of the author."
 */

#define true        1
#define false       0
#define NIL         0               /* The distinguished empty pointer */

/* Useful type definitions */
typedef int (*procref)();

/* TCP header */
typedef struct {
    unss	srcPort;
    unss	dstPort;
    unsl	seqnum;
    unsl	acknum;
    unss	flags;
    unss	window;
    unss	checksum;
    unss	urgentPointer;
} tcp_Header;


#ifdef BIG_ENDIAN
#define tcp_FlagFIN     0x0001
#define tcp_FlagSYN     0x0002
#define tcp_FlagRST     0x0004
#define tcp_FlagPUSH    0x0008
#define tcp_FlagACK     0x0010
#define tcp_FlagURG     0x0020
#define tcp_FlagDO      0xF000
#else
#define tcp_FlagFIN     0x0100
#define tcp_FlagSYN     0x0200
#define tcp_FlagRST     0x0400
#define tcp_FlagPUSH    0x0800
#define tcp_FlagACK     0x1000
#define tcp_FlagURG     0x2000
#define tcp_FlagDO      0x00F0
#endif
#define tcp_GetDataOffset(tp) (ip2s((tp)->flags) >> 12)

/* The TCP/UDP Pseudo Header */
typedef struct {
    inaddr	src;
    inaddr	dst;
    unsb	mbz;
    unsb	protocol;
    unss	length;
    unss	checksum;
} tcp_PseudoHeader;

/*
 * TCP states, from tcp manual.
 * Note: close-wait state is bypassed by automatically closing a connection
 *       when a FIN is received.  This is easy to undo.
 */
#define tcp_StateLISTEN  0      /* listening for connection */
#define tcp_StateSYNSENT 1      /* syn sent, active open */
#define tcp_StateSYNREC  2      /* syn received, synack+syn sent. */
#define tcp_StateESTAB   3      /* established */
#define tcp_StateFINWT1  4      /* sent FIN */
#define tcp_StateFINWT2  5      /* sent FIN, received FINACK */
/*#define tcp_StateCLOSEWT 6    /* received FIN waiting for close */
#define tcp_StateCLOSING 6      /* sent FIN, received FIN (waiting for FINACK) */
#define tcp_StateLASTACK 7      /* fin received, finack+fin sent */
#define tcp_StateTIMEWT  8      /* dally after sending final FINACK */
#define tcp_StateCLOSED  9      /* finack received */

/*
 * TCP Socket definition
 */
#define tcp_MaxData 512		/* maximum bytes to buffer on output */

typedef struct _tcp_socket {
    struct _tcp_socket *next;
    short	state;          /* connection state */
    procref	dataHandler;    /* called with incoming data */
    inaddr	myaddr;		/* my internet address for this connection */
    inaddr	hisaddr;        /* internet address of peer */
    unss	myport, hisport;/* tcp ports for this connection */
    unsl	acknum, seqnum; /* data ack'd and sequence num */
    unsl	timeout;        /* timeout, in milliseconds */
    bits	unhappy;        /* flag, indicates retransmitting segt's */
    unss	flags;          /* tcp flags word for last packet sent */
    unsl	dataSize;       /* number of bytes of data to send */
    byte	data[tcp_MaxData]; /* data to send */
} tcp_Socket;

/* Logging definitions */
#undef MSGFLG
#define MSGFLG tcpflg
ext bitf tcpflg;		/* Message flag for TCP */
#define L_DUMP 0x8000		/* Dump TCP headers */
