📄 tcp.c
字号:
/********************************************************************
* File: TCP.c
*
* Copyright: Peak Microtech Corporation
*
*******************************************************************/
#define TCP_GLOBALS
#include "net_cfg.h"
#if 0 // Don't support TCP
// Initialize TCP model
void TCP1024_Init()
{
TCP1024.State = 0;
TCP1024.My_Port = MY_TCP_PORT;
TCP1024.Send_Next = 0x0000;
Resend_Buff.EtherFrame.RecStatus = 0; // No data in re-RX buffer
}
// Send TCP_RST data packet and reset connect
void Send_Reset()
{
uchar i;
for (i = 0; i < 3; i++)
{
// Destination MAC address
TxdNetBuff.EtherFrame.DestMacId[i] = RxdNetBuff.EtherFrame.SourceMacId[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
TxdNetBuff.TcpFrame.SourcePort = RxdNetBuff.TcpFrame.DestPort;
TxdNetBuff.TcpFrame.DestPort = RxdNetBuff.TcpFrame.SourcePort;
TxdNetBuff.TcpFrame.offset = 0x50;
TxdNetBuff.TcpFrame.window = 0;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = RxdNetBuff.IpFrame.SourceIp[0];
TxdNetBuff.IpFrame.DestId[1] = RxdNetBuff.IpFrame.SourceIp[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6; //tcp
TxdNetBuff.IpFrame.Crc = 20;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(20, RxdNetBuff.IpFrame.SourceIp[0],
RxdNetBuff.IpFrame.SourceIp[1], 6);
}
void Tcp_Listen()
{
uchar i;
if (RxdNetBuff.TcpFrame.control &TCP_SYN)
// Request connect
{
for (i = 0; i < 2; i++)
{
TCP1024.Dest_Ip[i] = RxdNetBuff.IpFrame.SourceIp[i];
}
for (i = 0; i < 3; i++)
{
TCP1024.Dest_Mac_Id[i] = RxdNetBuff.EtherFrame.SourceMacId[i];
}
TCP1024.My_Port = MY_TCP_PORT; // My pc port
TCP1024.Dest_Port = RxdNetBuff.TcpFrame.SourcePort;
TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum;
TCP1024.Rcv_Next = RxdNetBuff.TcpFrame.SeqNum + 1;
TCP1024.ISS = TCP1024.Send_Next;
TCP1024.Sent_UnAck = TCP1024.ISS;
TCP1024.Send_Next = TCP1024.ISS + 1;
TCP1024.My_Wl1 = RxdNetBuff.TcpFrame.SeqNum; //seq
TCP1024.My_Wl2 = TCP1024.Send_Next;
TCP1024.Rcv_Window = RxdNetBuff.TcpFrame.window;
TCP1024.Snd_Window = 1024;
TCP1024.Dest_Max_Seg_Size = 560; // default:560
if (RxdNetBuff.TcpFrame.offset > 20)
if (RxdNetBuff.TcpFrame.tcpdata[0] == 0x02)
if (RxdNetBuff.TcpFrame.tcpdata[1] == 0x04)
//0204: The MAX segment
{
TCP1024.Dest_Max_Seg_Size = RxdNetBuff.TcpFrame.tcpdata[2] *256
+RxdNetBuff.TcpFrame.tcpdata[3];
}
TCP1024.My_Max_Seg_Size = 1460;
// Create reply frame
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.ISS;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x70;
TxdNetBuff.TcpFrame.control = 0x12; //syn+ack
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpPacket.IpPacket[20] = 0x0204; //tcp
TxdNetBuff.IpPacket.IpPacket[21] = TCP1024.My_Max_Seg_Size;
TxdNetBuff.IpPacket.IpPacket[22] = 0x0101;
TxdNetBuff.IpPacket.IpPacket[23] = 0x0101;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6; //tcp
TxdNetBuff.IpFrame.Crc = 28;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(28, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
TCP1024.State = TCP_STATE_SYN_RCVD; //Tcp_SYN_Rec;
}
else if (RxdNetBuff.TcpFrame.control &TCP_RST)
{
;
}
else
{
Send_Reset();
}
}
// Delete connect and clear re-RX buffer
void Delete_Socket()
{
TcpConnected = 0;
TCP1024.State = 0;
TCP1024.ISS = TCP1024.ISS + 10;
Resend_Buff.EtherFrame.RecStatus = 0; // No data in re-RX buffer
UartPrintfCh1("Disconnect!\r\n");
}
// Resend the error packet
void Resend_Packet()
{
uint ii;
uchar *txd = (U8*) &TxdNetBuff;
uchar *rt;
rt = (U8*) &Resend_Buff.bytes.bytebuf;
for (ii = 0; ii < Resend_Buff.ResendFrame.length + 4; ii++)
{
(*txd) = (*rt);
rt++;
txd++;
}
Send_Packet(&TxdNetBuff, Resend_Buff.ResendFrame.length);
Resend_Buff.ResendFrame.timeout = RtTime;
}
void Process_Resend_Buff()
{
if (Resend_Buff.ResendFrame.timeout > 0)
Resend_Buff.ResendFrame.timeout--;
if (Resend_Buff.EtherFrame.RecStatus != 0)
{
if (Resend_Buff.TcpFrame.SeqNum < TCP1024.Sent_UnAck)
{
Resend_Buff.ResendFrame.RtStatus = 0;
}
else if (Resend_Buff.ResendFrame.timeout == 0)
{
Resend_Buff.ResendFrame.RtStatus++;
if (Resend_Buff.ResendFrame.RtStatus == TCP_MAX_RETXD)
{
Delete_Socket();
}
else
Resend_Packet();
}
}
}
void Tcp_SYN_Sent()
{
unsigned char i;
if (((RxdNetBuff.TcpFrame.AckNum <= TCP1024.ISS) ||
(RxdNetBuff.TcpFrame.AckNum > TCP1024.Send_Next)) &&
(RxdNetBuff.TcpFrame.control &TCP_ACK))
{
if (!(RxdNetBuff.TcpFrame.control &TCP_RST))
{
TxdNetBuff.TcpFrame.SeqNum = RxdNetBuff.TcpFrame.AckNum;
TxdNetBuff.TcpFrame.AckNum = 0;
TxdNetBuff.TcpFrame.control = TCP_RST;
Send_Reset();
}
else
{
Delete_Socket();
}
}
else if (RxdNetBuff.TcpFrame.control &(TCP_SYN))
{
TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum;
TCP1024.Rcv_Next = RxdNetBuff.TcpFrame.SeqNum + 1;
if (RxdNetBuff.TcpFrame.control &TCP_ACK)
{
TCP1024.Sent_UnAck = RxdNetBuff.TcpFrame.AckNum;
Process_Resend_Buff();
}
if (TCP1024.Sent_UnAck >= TCP1024.ISS)
{
TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum;
TCP1024.Rcv_Window = RxdNetBuff.TcpFrame.window;
TCP1024.Dest_Max_Seg_Size = 560; // default:560
if (RxdNetBuff.TcpFrame.offset > 20)
if (RxdNetBuff.TcpFrame.tcpdata[0] == 0x02)
if (RxdNetBuff.TcpFrame.tcpdata[1] == 0x04)
//0204: The MAX segment
{
TCP1024.Dest_Max_Seg_Size = RxdNetBuff.TcpFrame.tcpdata[2] *256
+RxdNetBuff.TcpFrame.tcpdata[3];
}
// Create reply frame
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.Send_Next;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x50;
TxdNetBuff.TcpFrame.control = TCP_ACK;
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6; //tcp
TxdNetBuff.IpFrame.Crc = 20;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(20, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
TCP1024.State = TCP_STATE_ESTABLISHED;
TcpConnected = 1;
UartPrintfCh1("\r\nOK,connected.\r\nC:>");
}
else
{
TCP1024.State = TCP_STATE_SYN_RCVD;
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008; //IP protocol ID
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.Send_Next;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x70;
TxdNetBuff.TcpFrame.control = TCP_ACK + TCP_SYN; //TCP_ACK+TCP_SYN
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpPacket.IpPacket[20] = 0x0204; //
TxdNetBuff.IpPacket.IpPacket[21] = TCP1024.My_Max_Seg_Size;
TxdNetBuff.IpPacket.IpPacket[22] = 0x0101;
TxdNetBuff.IpPacket.IpPacket[23] = 0x0101;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -