⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcp_ip.h

📁 opentcp_mcf5282原代码
💻 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 + -