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

📄 tcp.c

📁 opentcp_mcf5282原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
							return(0);
						}

					}

				 /* It is maybe SYN again so it haven't get our SYN + ACK	*/
				 /* Let our retransmission handle it						*/

				 return(0);


				}

			}

			/* Do we have unacked data?		*/

			if( soc->send_unacked != soc->send_next )
			{
				/* Yep, is the ACK valid?	*/

				if( (ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK) == 0)
				{
					DEBUGOUT("Packet without ACK and unacked data. Packet not processed\r\n");
					return(0);
				}

				if( ReceivedTCPPacket.ackno == soc->send_next )
				{

					/* We don't have unacked data now	*/

					soc->send_unacked = soc->send_next;

					/* Inform application	*/

					soc->event_listener(sochandle, TCP_EVENT_ACK, soc->rem_ip, soc->remport);

				}


			}

			/* Is the sequence OK	*/

			if(soc->receive_next != ReceivedTCPPacket.seqno)
			{
				/* Out of range, inform what we except	*/

				DEBUGOUT("Too big sequence number received\r\n");

				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);
				return(0);
			}

			/* Generate data event to application	*/

			soc->event_listener(sochandle, TCP_EVENT_DATA, dlen, 0);

			soc->receive_next += dlen;



#if 0

			diff = soc->receive_next - ReceivedTCPPacket.seqno;

			if( diff > TCP_HALF_SEQ_SPACE )
			{
				/* Out of range, inform what we except	*/

				DEBUGOUT("Too big sequence number received\r\n");

				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);
				return(0);
			}

			/* Does the packet contain data that we don't have already	*/

			if( dlen > diff )
			{
				/* Consume old data	*/

				for(i=0; i<diff; i++)
					RECEIVE_NETWORK_B();

				/* Generate data event to application	*/

				soc->event_listener(sochandle, TCP_EVENT_DATA, dlen - diff, 0);

				soc->receive_next += dlen - diff;

			}

#endif
			/* Is the FIN flag set?	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_FIN )
			{
				DEBUGOUT("Other end want's to close\r\n");

				/* Inform application if we don't have unacked data	*/

				if( soc->send_unacked == soc->send_next)
				{
					soc->event_listener(sochandle, TCP_EVENT_CLOSE, soc->rem_ip, soc->remport);

					/* ACK FIN and set our own FIN	*/

					soc->receive_next++;
					soc->send_next++;
					soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;

					tcp_newstate(soc, TCP_STATE_LAST_ACK);
					tcp_sendcontrol(sochandle);

					return(0);
				}
			}

			/* ACK the data if there was it	*/

			if(dlen)
			{
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);
			}

			/* Keep our socket from timeout	*/

			tcp_newstate(soc, TCP_STATE_CONNECTED);

			//init_timer(soc->persist_timerh, soc->tout);

			return(0);


			break;

		case TCP_STATE_FREE:

			/* Reset connection	*/
			tcp_sendreset(&ReceivedTCPPacket, frame->sip);
			return(-1);

			break;

		case TCP_STATE_CLOSED:

			/* Reset connection	*/
			tcp_sendreset(&ReceivedTCPPacket, frame->sip);
			return(-1);

			break;

		case TCP_STATE_LISTENING:

			DEBUGOUT("LISTENING State...\r\n");

			/* Check Flags	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");
				tcp_newstate(soc, TCP_STATE_LISTENING);
				return(-1);
			}

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK)
			{
				DEBUGOUT("ERROR:Ack received\r\n");
				tcp_newstate(soc, TCP_STATE_LISTENING);
				/* Reset connection	*/
				tcp_sendreset(&ReceivedTCPPacket, frame->sip);
				return(-1);
			}

			if((ReceivedTCPPacket.hlen_flags & TCP_FLAG_SYN) == 0)
			{
				DEBUGOUT("ERROR:No SYN set on packet\r\n");
				tcp_newstate(soc, TCP_STATE_LISTENING);
				/* Reset connection	*/
				tcp_sendreset(&ReceivedTCPPacket, frame->sip);
				return(-1);
			}

			/* OK, SYN received	*/

			/* Inform application and see if accepted	*/

			temp = (INT16)soc->event_listener(sochandle, TCP_EVENT_CONREQ, soc->rem_ip, soc->remport);

			if( temp == -1)
			{
				DEBUGOUT("Application disregarded connection request\r\n");
				tcp_sendreset(&ReceivedTCPPacket, frame->sip);
				return(-1);
			}

			if( temp == -2 )
			{
				DEBUGOUT("Application wants to think about accepting conreq\r\n");
				return(1);
			}

			/* The connection request was accepted	*/

			DEBUGOUT("Next state SYN_RECEIVED\r\n");
			if(soc->flags & TCP_INTFLAGS_CLOSEPENDING)
				soc->flags ^= TCP_INTFLAGS_CLOSEPENDING;
			tcp_newstate(soc, TCP_STATE_SYN_RECEIVED);
			soc->receive_next = ReceivedTCPPacket.seqno + 1;	/* Ack SYN		*/
			soc->send_unacked = tcp_initseq();

			soc->myflags = TCP_FLAG_SYN | TCP_FLAG_ACK;
			tcp_sendcontrol(sochandle);
			soc->send_next = soc->send_unacked + 1;

			return(1);

			break;

		case TCP_STATE_SYN_RECEIVED:

			DEBUGOUT("SYN_RECEIVED State...\r\n");

			/* Check Flags	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Is it SYN+ACK (if we are the because of simultaneous open)	*/

			if( (ReceivedTCPPacket.hlen_flags & TCP_FLAG_SYN) &&
				(ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK)	)
			{

				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("SYN+ACK received but wrong Ack\n\r");
					return(-1);
				}

				DEBUGOUT("SYN+ACK received, this side established\n\r");

				/* Get peer's seq number	*/

				soc->receive_next =  ReceivedTCPPacket.seqno;
				soc->receive_next++;							/* ACK SYN	*/

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_CONNECTED);
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_CONNECTED, soc->rem_ip, soc->remport);

				return(0);

			}

			/* Is it ACK?		*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK )
			{
				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("ACK received but wrong Ack\n\r");
					return(-1);
				}

				if( ReceivedTCPPacket.seqno != soc->receive_next )
				{
					DEBUGOUT("ACK received but Wrong SEQ number\n\r");
					return(-1);
				}

				DEBUGOUT("ACK received, this side CONNECTED\r\n");

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_CONNECTED);

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_CONNECTED, soc->rem_ip, soc->remport);

				return(0);

			}

			/* Is it SYN?		*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_SYN )
			{
				DEBUGOUT("Repeated SYN\r\n");
				return(0);
			}

			/* We didn't understood this one, keep on trying but info with RESET	*/

			DEBUGOUT("Unrecognized packet\n\r");

			tcp_sendreset(&ReceivedTCPPacket, frame->sip);

			return(-1);

			break;

		case TCP_STATE_SYN_SENT:

			DEBUGOUT("SYN_SENT State\r\n");

			/* Check for RESET	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Is it SYN+ACK?	*/

			if( (ReceivedTCPPacket.hlen_flags & TCP_FLAG_SYN) &&
				(ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK)	)
			{
				/* Rigth ACK?	*/

				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("SYN+ACK received but wrong Ack\n\r");
					return(-1);
				}

				DEBUGOUT("SYN+ACK received, this side established\n\r");

				/* Get peer's seq number	*/

				soc->receive_next =  ReceivedTCPPacket.seqno;
				soc->receive_next++;							/* ACK SYN	*/

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_CONNECTED);
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_CONNECTED, soc->rem_ip, soc->remport);

				return(0);

			}

			/* Is it SYN (simultaneous open)	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_SYN)
			{
				DEBUGOUT("Simultaneous open, next SYN_RECEIVED\r\n");

				/* Get peer's seq number	*/

				soc->receive_next =  ReceivedTCPPacket.seqno;
				soc->receive_next++;							/* ACK SYN	*/

				tcp_newstate(soc, TCP_STATE_SYN_RECEIVED);
				soc->myflags = TCP_FLAG_SYN | TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);

				return(0);

			}

			/* This is something we didn't understood, maybe the other peer has	*/
			/* still old connection on or something								*/

			tcp_sendreset(&ReceivedTCPPacket, frame->sip);

			return(-1);

			break;

		case TCP_STATE_FINW1:

			DEBUGOUT("FINW1 State\r\n");

			/* Check for RESET	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Is it FIN+ACK?			*/

			if( (ReceivedTCPPacket.hlen_flags & TCP_FLAG_FIN) &&
				(ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK)	)
			{
				/* Rigth ACK?	*/

				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("FIN+ACK received but wrong Ack\n\r");
					return(-1);
				}

				DEBUGOUT("FIN+ACK received, next TIMED_WAIT\n\r");

				/* ACK FIN and all data	*/

				soc->receive_next = ReceivedTCPPacket.seqno;
				soc->receive_next++;
				soc->receive_next += dlen;

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_TIMED_WAIT);
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);

				return(0);

			}

			/* Is it just FIN	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_FIN	)
			{

				DEBUGOUT("Simultaneous close, next CLOSING\n\r");

				/* ACK FIN and all data	*/

				soc->receive_next = ReceivedTCPPacket.seqno;
				soc->receive_next++;
				soc->receive_next += dlen;

				tcp_newstate(soc, TCP_STATE_CLOSING);
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);
				return(0);

			}

			/* Is it just ACK?	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK	)
			{
				/* Rigth ACK?	*/

				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("ACK received but wrong Ack\n\r");
					return(-1);
				}

				DEBUGOUT("Our FIN is ACKed but peer don't agree to disconnect yet\r\n");
				DEBUGOUT("Next FINW2\r\n");

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_FINW2);

				return(0);

			}

			tcp_sendreset(&ReceivedTCPPacket, frame->sip);

			return(-1);

			break;

		case TCP_STATE_FINW2:

			DEBUGOUT("FINW2 State\r\n");

			/* Check for RESET	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Do we finally get FIN?	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_FIN	)
			{

				DEBUGOUT("FIN received, next TIMED_WAIT\n\r");

				/* ACK FIN and all data	*/

				soc->receive_next = ReceivedTCPPacket.seqno;
				soc->receive_next++;
				soc->receive_next += dlen;

				tcp_newstate(soc, TCP_STATE_TIMED_WAIT);
				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);
				return(0);

			}

			tcp_sendreset(&ReceivedTCPPacket, frame->sip);

			return(-1);

			break;

		case TCP_STATE_CLOSING:

			DEBUGOUT("CLOSING State...\r\n");

			/* Check for RESET	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Is it ACK?			*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK	)
			{
				/* Rigth ACK?	*/

				if( ReceivedTCPPacket.ackno != soc->send_next )
				{
					DEBUGOUT("ACK received but wrong Ack\n\r");
					return(-1);
				}

				DEBUGOUT("Our FIN is ACKed and peer wants to close too\r\n");
				DEBUGOUT("Next TIMED_WAIT\r\n");

				/* We have no unacked data	*/

				soc->send_unacked = soc->send_next;

				tcp_newstate(soc, TCP_STATE_TIMED_WAIT);

				return(0);

			}

			/* Is it repeated FIN?	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_FIN	)
			{

				DEBUGOUT("Repeated FIN, repeat ACK\n\r");

				/* ACK FIN and all data	*/

				soc->receive_next = ReceivedTCPPacket.seqno;
				soc->receive_next++;
				soc->receive_next += dlen;

				soc->myflags = TCP_FLAG_ACK;
				tcp_sendcontrol(sochandle);

				return(0);

			}

			tcp_sendreset(&ReceivedTCPPacket, frame->sip);

			return(-1);

			break;

		case TCP_STATE_LAST_ACK:

			DEBUGOUT("LAST_ACK State...\r\n");

			/* Check for RESET	*/

			if(ReceivedTCPPacket.hlen_flags & TCP_FLAG_RESET)
			{
				DEBUGOUT("ERROR:Reset received\r\n");

				/* Inform application	*/

				soc->event_listener(sochandle, TCP_EVENT_ABORT, soc->rem_ip, soc->remport);

				if(soc->type & TCP_TYPE_SERVER)
					tcp_newstate(soc, TCP_STATE_LISTENING);
				else
					tcp_newstate(soc, TCP_STATE_CLOSED);

				return(-1);
			}

			/* Is it ACK?	*/

			if( ReceivedTCPPacket.hlen_flags & TCP_FLAG_ACK	)
			{
				/* Rigth ACK?	*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -