/*************************************************************************************** File: tcp_ip.h Date: 1.2.2002 Version: 0.1 Author: Jari Lahti (jari@violasystems.com) Description: General TCP/IP stack related definitions Version Info: 1.7.2002 - Started (Jari Lahti) ***************************************************************************************/ #ifndef __OPENTCP_INCLUDE_TCP_IP_H__ #define __OPENTCP_INCLUDE_TCP_IP_H__ #include "datatypes.h" /* User define */ #define NO_OF_TCPSOCKETS 12 #define NO_OF_UDPSOCKETS 4 #define TCP_PORTS_END 1023 #define UDP_PORTS_END 1023 /* Buffer sizes */ #define TCP_WIN_SIZE 2900 #define NETWORK_TX_BUFFER_SIZE TCP_WIN_SIZE*2+1 /* Always keep odd */ /* Protocol Constants */ #define ETH_HEADER_LEN 14 #define ETH_CHIP_HEADER_LEN 4 #define ETH_MTU 1500 #define PHY_ADR_LEN ETH_ADDRESS_LEN #define PROTOCOL_IP 0x0800 /* IP over Ethernet */ #define PROTOCOL_ARP 0x0806 #define IP_ICMP 0x01 #define IP_UDP 17 #define IP_TCP 6 #define IP_HLEN 20 /* IP Header Length in bytes */ #define IP_MIN_HLEN 20 #define IP_DEF_VIHL 0x45 #define IP_DEF_TTL 100 #define MAX_IP_OPTLEN 40 /* Max IP Header option field length */ #define IP_MAX_HLEN IP_MIN_HLEN + MAX_IP_OPTLEN #define IP_DONT_FRAGMENT 0x4000 /* Don't Fragment Flag */ #define IP_FRAGOFF 0x1FFF /* Fragment offset mask */ #define IP_MOREFRAGS 0x2000 /* More fragments bit */ #define IP_GOOD_CS 0 /* IP Option control commands */ #define IPO_COPY 0x80 /* Copy on fragment mask */ #define IPO_NOP 0x01 /* No operation */ #define IPO_EOOP 0x00 /* End of options */ /* UDP Control options */ #define UDP_OPT_SEND_CS 1 #define UDP_OPT_CHECK_CS 2 #define UDP_SEND_MTU ETH_MTU - ETH_HEADER_LEN - UDP_HLEN - IP_MAX_HLEN #define UDP_HLEN 8 /* UDP Header Length */ #define MIN_TCP_HLEN 20 #define MAX_TCP_OPTLEN 40 #define TCP_DEF_MTU NETWORK_TX_BUFFER_SIZE - MIN_TCP_HLEN /* Default MTU for TCP */ //Seems like a stupid way of setting MTU --IAS #define TCP_MAX_MSS 1440 /* Maximum Segment Size --IAS */ #define TCP_MIN_MSS 536 /* 576-20-20 --IAS */ #define TCP_DEF_RETRIES 6 /* How many times we retry */ #define TCP_CON_ATTEMPTS 7 /* How many times we try connect*/ #define TCP_DEF_KEEPALIVE 100000 /* Keepalive time in 10 msecs */ #define TCP_DEF_RETRY_TOUT 500 /* Retransmission in 10 msecs */ #define TCP_INIT_RETRY_TOUT 100 /* Initial retr. in 10 msecs */ #define TCP_SYN_RETRY_TOUT 200 /* SYN retr. timeout in 10 msecs*/ #define TCP_HALF_SEQ_SPACE 0x0000FFFF /* For detecting sequence space */ #define TCP_DEF_TOUT 120 /* Default idle timeout in secs */ #define TCP_TOS_NORMAL 0 #define ICMP_TYPE_DEST_UNREACHABLE 3 #define ICMP_ECHO_REQUEST 8 #define ICMP_ECHO_REPLY 0 #define ICMP_CODE_FRAGMENTATION_NEEDED_DF_SET 4 #define ICMP_MTUMSG_LEN 16 #define ICMP_ECHOREQ_HLEN 8 #define ICMP_TEMPIPSET_DATALEN 102 /* UDP States */ #define UDP_STATE_FREE 1 #define UDP_STATE_CLOSED 2 #define UDP_STATE_OPENED 3 /* UDP Events */ #define UDP_EVENT_DATA 64 /* UDP buffer handling */ #define UDP_APP_OFFSET UDP_HLEN + 1 /* Application buffers must have */ /* this much free on start of buf */ /* TCP FLAGS */ #define TCP_FLAG_ACK 0x10 #define TCP_FLAG_RESET 0x04 #define TCP_FLAG_PUSH 0x08 #define TCP_FLAG_SYN 0x02 #define TCP_FLAG_FIN 0x01 /* TCP Internal flags */ #define TCP_INTFLAGS_CLOSEPENDING 0x01 /* TCP socket types */ #define TCP_TYPE_NONE 0x00 #define TCP_TYPE_SERVER 0x01 #define TCP_TYPE_CLIENT 0x02 #define TCP_TYPE_CLIENT_SERVER 0x03 /* TCP States */ #define TCP_STATE_FREE 1 #define TCP_STATE_RESERVED 2 #define TCP_STATE_CLOSED 3 #define TCP_STATE_LISTENING 4 #define TCP_STATE_SYN_RECEIVED 5 #define TCP_STATE_SYN_SENT 6 #define TCP_STATE_FINW1 7 #define TCP_STATE_FINW2 8 #define TCP_STATE_CLOSING 9 #define TCP_STATE_LAST_ACK 10 #define TCP_STATE_TIMED_WAIT 11 #define TCP_STATE_CONNECTED 12 /* TCP callback events */ #define TCP_EVENT_CONREQ 1 #define TCP_EVENT_CONNECTED 2 #define TCP_EVENT_CLOSE 4 #define TCP_EVENT_ABORT 8 #define TCP_EVENT_ACK 16 #define TCP_EVENT_REGENERATE 32 #define TCP_EVENT_DATA 64 /* TCP buffer handling */ #define TCP_APP_OFFSET MIN_TCP_HLEN + 4 + 1 /* Application buffers must have */ /* this much free on start of buf */ /* Reserved addresses */ #define IP_BROADCAST_ADDRESS 0xFFFFFFFF /* 255.255.255.255 */ /* Network Interface */ struct netif{ LWORD localip; BYTE localHW[PHY_ADR_LEN]; LWORD defgw; LWORD netmask; UINT8 tos; }; /* IP Structures */ struct IPFrame { UINT8 vihl; /* Version & Header Length */ UINT8 tos; /* Type Of Service */ UINT16 tlen; /* Total Length */ UINT16 id; /* IP Identification number */ UINT16 frags; /* Flags & Fragment offsett */ UINT8 ttl; /* Time to live */ UINT8 protocol; /* Protocol over IP */ UINT16 checksum; /* Header Checksum */ UINT32 sip; /* Source IP address */ UINT32 dip; /* Destination IP address */ UINT8 opt[MAX_IP_OPTLEN + 1]; /* Option field */ UINT16 BufIndex; /* Next offset from the start of*/ /* network buffer */ }; /* UDP Structures */ struct UDPFrame { UINT16 sport; /* Source port */ UINT16 dport; /* Destination port */ UINT16 tlen; /* total len (UDP part) */ UINT16 checksum; UINT16 BufIndex; /* Data offsett from the start */ /* of network buffer */ }; struct ucb { UINT8 state; /* State of socket entry */ UINT8 tos; /* Type of service */ UINT16 locport; /* Local UDP port of Socket */ UINT8 opts; /* Socket options. E.g. checksm */ INT32 (*event_listener)(INT8, UINT8, UINT32, UINT16, UINT16, UINT16 ); /* Listening application */ }; /* TCP Structures */ struct TCPFrame { UINT16 sport; /* Source port */ UINT16 dport; /* Destination port */ UINT32 seqno; /* Sequence number */ UINT32 ackno; /* Acknowledgement number */ UINT16 hlen_flags; /* Header length and flags */ UINT16 window; /* Size of window */ UINT16 checksum; /* TCP packet checksum */ UINT16 urgent; /* Urgent pointer */ UINT8 opt[MAX_TCP_OPTLEN + 1]; /* Option field */ UINT16 BufIndex; /* Next offset from the start of*/ /* network buffer */ }; /* TCP transmission control block */ struct tcb { UINT8 state; /* State of TCP socket */ UINT8 type; /* TCP type (SERVER,CLIENT) */ UINT8 flags; /* State machine flags */ UINT32 rem_ip; /* Remote IP address */ UINT16 remport; /* Remote TCP port */ UINT16 locport; /* Local TCP port */ UINT32 send_unacked; UINT8 myflags; /* My flags to be Txed */ UINT16 mss; /* Maximum Segment Size */ UINT32 send_next; UINT16 send_mtu; UINT32 tout; /* Socket idle timeout (secs/TIMERTIC) */ UINT8 tos; UINT32 receive_next; UINT16 persist_timerh; UINT16 retransmit_timerh; UINT8 retries_left; INT32 (*event_listener)(INT8, UINT8, UINT32, UINT32); /* Listening application */ }; /* IP function prototypes */ INT16 ProcessIPIn(struct otcp_ethframe*); INT16 ProcessIPOut(UINT32, UINT8, UINT8, UINT8, UINT8*, UINT16); UINT8 IP_CheckCS(struct IPFrame*); UINT16 IpCheckSum(UINT16, UINT8, UINT8); UINT32 IpCheckSumBuf(UINT16, UINT8*, UINT16); UINT32 IP_ConstructCS(struct IPFrame*); /* ICMP function prototypes */ INT16 ProcessICMPIn(struct IPFrame*, UINT16); /* UDP function prototypes */ INT8 udp_init(void); UINT16 udp_getfreeport(void); INT8 udp_getsocket(UINT8, INT32 (*)(INT8, UINT8, UINT32, UINT16, UINT16, UINT16), UINT8); INT8 udp_releasesocket(INT8); INT8 udp_open(INT8, UINT16); INT8 udp_close(INT8); INT16 udp_send(INT8, UINT32, UINT16, UINT8*, UINT16, UINT16); INT16 ProcessUDPIn(struct IPFrame*, UINT16); /* TCP Function prototypes */ INT16 ProcessTCPIn(struct IPFrame*, UINT16); INT16 ProcessTCPOut(INT8, UINT8*, UINT16, UINT16); INT8 tcp_init(void); INT8 tcp_listen(INT8, UINT16); INT8 tcp_mapsocket(struct IPFrame*, struct TCPFrame*); UINT8 TCP_CheckCS(struct IPFrame*, UINT16); void tcp_sendcontrol(INT8); UINT32 tcp_initseq(void); void tcp_poll(void); void tcp_newstate(struct tcb*, UINT8); INT8 tcp_getsocket(UINT8, UINT8, UINT16, INT32 (*)(INT8, UINT8, UINT32, UINT32) ); INT8 tcp_releasesocket(INT8); INT8 tcp_connect(INT8, UINT32, UINT16, UINT16); INT16 tcp_send(INT8, UINT8*, UINT16, UINT16); INT8 tcp_close(INT8); void tcp_sendreset(struct TCPFrame*, UINT32); INT8 tcp_getstate(INT8); UINT16 tcp_getfreeport(void); INT16 tcp_checksend(UINT8); INT8 tcp_abort(INT8); #endif //guard /* EOF */