📄 tcp_ip.h
字号:
/***************************************************************************************
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 NETWORK_TX_BUFFER_SIZE 1600 /* 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 */
#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 + 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 */
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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -