📄 tcpip.i
字号:
break;
}
if (!(TCPCode & (0x0010))) break;
if (TCPSegAck == TCPUNASeqNr)
{
TCPStopTimer();
TCPSeqNr = TCPUNASeqNr;
switch (TCPStateMachine)
{
case SYN_RECD :
TCPStateMachine = ESTABLISHED;
SocketStatus |= (0x02);
break;
case ESTABLISHED :
SocketStatus |= (0x08);
break;
case FIN_WAIT_1 :
TCPStateMachine = FIN_WAIT_2;
TCPStartFinTimer();
break;
case CLOSING :
TCPStateMachine = TIME_WAIT;
TCPStartFinTimer();
break;
case LAST_ACK :
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus &= (0x04);
break;
case TIME_WAIT :
PrepareTCP_FRAME(TCPSegAck, TCPAckNr, (0x0010));
TCPRestartTimer();
break;
}
}
if ((TCPStateMachine == ESTABLISHED) ||
(TCPStateMachine == FIN_WAIT_1) ||
(TCPStateMachine == FIN_WAIT_2))
if (NrOfDataBytes)
if (!(SocketStatus & (0x04)))
{
DummyReadFrame8900(6);
CopyFromFrame8900(RxTCPBufferMem, NrOfDataBytes);
TCPRxDataCount = NrOfDataBytes;
SocketStatus |= (0x04);
TCPAckNr += NrOfDataBytes;
PrepareTCP_FRAME(TCPSegAck, TCPAckNr, (0x0010));
}
else
break;
if (TCPCode & (0x0001))
{
switch (TCPStateMachine)
{
case SYN_RECD :
case ESTABLISHED :
TCPStateMachine = CLOSE_WAIT;
break;
case FIN_WAIT_1 :
TCPStateMachine = CLOSING;
SocketStatus &= ~(0x02);
break;
case FIN_WAIT_2 :
TCPStateMachine = TIME_WAIT;
SocketStatus &= ~(0x02);
TCPStartFinTimer();
break;
case TIME_WAIT :
TCPRestartTimer();
break;
}
TCPAckNr++;
PrepareTCP_FRAME(TCPSegAck, TCPAckNr, (0x0010));
}
}
}
static void PrepareARP_REQUEST(void)
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0))) = 0xffff;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 2))) = 0xffff;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 4))) = 0xffff;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (12))) = ((unsigned int)(((0x0806)) << 8) | (((0x0806)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 0)))) = ((unsigned int)((1) << 8) | ((1) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 2)))) = ((unsigned int)(((0x0800)) << 8) | (((0x0800)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 4)))) = ((unsigned int)(((0x0604)) << 8) | (((0x0604)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 6)))) = ((unsigned int)((1) << 8) | ((1) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8)))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8) + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8) + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 14)))) = MyIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 14) + 2))) = MyIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18) + 2))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18) + 4))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24) + 2))) = 0;
if (((RemoteIP[0] ^ MyIP[0]) & SubnetMask[0]) ||
((RemoteIP[1] ^ MyIP[1]) & SubnetMask[1]))
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24)))) = GatewayIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24) + 2))) = GatewayIP[1];
}
else
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24)))) = RemoteIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24) + 2))) = RemoteIP[1];
}
TxFrame2Size = 14 + 28;
TransmitControl |= (0x02);
}
static void PrepareARP_ANSWER(void)
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0))) = RecdFrameMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 2))) = RecdFrameMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 4))) = RecdFrameMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (12))) = ((unsigned int)(((0x0806)) << 8) | (((0x0806)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 0)))) = ((unsigned int)((1) << 8) | ((1) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 2)))) = ((unsigned int)(((0x0800)) << 8) | (((0x0800)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 4)))) = ((unsigned int)(((0x0604)) << 8) | (((0x0604)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 6)))) = ((unsigned int)((2) << 8) | ((2) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8)))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8) + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8) + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 14)))) = MyIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 14) + 2))) = MyIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18)))) = RecdFrameMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18) + 2))) = RecdFrameMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 18) + 4))) = RecdFrameMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24)))) = RecdFrameIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 24) + 2))) = RecdFrameIP[1];
TxFrame2Size = 14 + 28;
TransmitControl |= (0x02);
}
static void PrepareICMP_ECHO_REPLY(void)
{
unsigned int ICMPDataCount;
if (RecdIPFrameLength > 60)
ICMPDataCount = 60 - 20 - 4;
else
ICMPDataCount = RecdIPFrameLength - 20 - 4;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0))) = RecdFrameMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 2))) = RecdFrameMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 4))) = RecdFrameMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (12))) = ((unsigned int)(((0x0800)) << 8) | (((0x0800)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 0)))) = ((unsigned int)(((0x4500)) << 8) | (((0x4500)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 2)))) =
__swap_bytes(20 + 4 + ICMPDataCount);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 4)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 6)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8)))) = ((unsigned int)(((64 << 8) | 1) << 8) | (((64 << 8) | 1) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 10)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 12)))) = MyIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 12) + 2))) = MyIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 16)))) = RecdFrameIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 16) + 2))) = RecdFrameIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 10)))) =
CalcChecksum((unsigned char *)TxFrame2Mem + (14 + 0), 20, 0);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 0)))) = ((unsigned int)((0 << 8) << 8) | ((0 << 8) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 2)))) = 0;
CopyFromFrame8900((unsigned char *)TxFrame2Mem + ((14 + 20) + 4), ICMPDataCount);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 2)))) =
CalcChecksum((unsigned char *)TxFrame2Mem + (14 + 20), ICMPDataCount +
4, 0);
TxFrame2Size = 14 + 20 + 4 + ICMPDataCount;
TransmitControl |= (0x02);
}
static void PrepareTCP_FRAME(unsigned long seqnr, unsigned long acknr,
unsigned int TCPCode)
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0))) = RemoteMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 2))) = RemoteMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (0 + 4))) = RemoteMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (6 + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (12))) = ((unsigned int)(((0x0800)) << 8) | (((0x0800)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 0)))) = ((unsigned int)(((0x4500)) << 8) | (((0x4500)) >> 8));
if (TCPCode & (0x0002))
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 2)))) =
((unsigned int)((20 + 20 + 4) << 8) | ((20 + 20 + 4) >> 8));
else
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 2)))) =
((unsigned int)((20 + 20) << 8) | ((20 + 20) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 4)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 6)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 8)))) = ((unsigned int)(((64 << 8) | 6) << 8) | (((64 << 8) | 6) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 10)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 12)))) = MyIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 12) + 2))) = MyIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 16)))) = RemoteIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 16) + 2))) = RemoteIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + ((14 + 10)))) =
CalcChecksum((unsigned char *)TxFrame2Mem + (14 + 0),
20, 0);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 0)))) = __swap_bytes(TCPLocalPort);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 2)))) = __swap_bytes(TCPRemotePort);
WriteDWBE((unsigned char *)TxFrame2Mem + ((14 + 20) + 4), seqnr);
WriteDWBE((unsigned char *)TxFrame2Mem + ((14 + 20) + 8), acknr);
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 14)))) = ((unsigned int)((536) << 8) | ((536) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 16)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 18)))) = 0;
if (TCPCode & (0x0002))
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 12)))) = ((unsigned int)((0x6000 | TCPCode) << 8) | ((0x6000 | TCPCode) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 20)))) = ((unsigned int)(((0x0204)) << 8) | (((0x0204)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 20) + 2))) = ((unsigned int)((536) << 8) | ((536) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 16)))) =
CalcChecksum((unsigned char *)TxFrame2Mem + ((14 + 20) + 0),
20 + 4, 1);
TxFrame2Size = 14 + 20 + 20 +
4;
}
else
{
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 12)))) = ((unsigned int)((0x5000 | TCPCode) << 8) | ((0x5000 | TCPCode) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame2Mem) + (((14 + 20) + 16)))) =
CalcChecksum((unsigned char *)TxFrame2Mem + ((14 + 20) + 0),
20, 1);
TxFrame2Size = 14 + 20 + 20;
}
TransmitControl |= (0x02);
}
static void PrepareTCP_DATA_FRAME(void)
{
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (0))) = RemoteMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (0 + 2))) = RemoteMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (0 + 4))) = RemoteMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (6))) = MyMAC[0];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (6 + 2))) = MyMAC[1];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (6 + 4))) = MyMAC[2];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (12))) = ((unsigned int)(((0x0800)) << 8) | (((0x0800)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 0)))) = ((unsigned int)(((0x4500)) << 8) | (((0x4500)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 2)))) =
__swap_bytes(20 + 20 + TCPTxDataCount);
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 4)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 6)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 8)))) = ((unsigned int)(((64 << 8) | 6) << 8) | (((64 << 8) | 6) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 10)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 12)))) = MyIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 12) + 2))) = MyIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 16)))) = RemoteIP[0];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 16) + 2))) = RemoteIP[1];
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + ((14 + 10)))) =
CalcChecksum((unsigned char *)TxFrame1Mem + (14 + 0),
20, 0);
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 0)))) = __swap_bytes(TCPLocalPort);
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 2)))) = __swap_bytes(TCPRemotePort);
WriteDWBE((unsigned char *)TxFrame1Mem + ((14 + 20) + 4), TCPSeqNr);
WriteDWBE((unsigned char *)TxFrame1Mem + ((14 + 20) + 8), TCPAckNr);
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 12)))) = ((unsigned int)((0x5000 | (0x0010)) << 8) | ((0x5000 | (0x0010)) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 14)))) = ((unsigned int)((536) << 8) | ((536) >> 8));
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 16)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 18)))) = 0;
(*(unsigned int *)((unsigned char *)&(TxFrame1Mem) + (((14 + 20) + 16)))) =
CalcChecksum((unsigned char *)TxFrame1Mem + ((14 + 20) + 0),
20 + TCPTxDataCount, 1);
}
static unsigned int CalcChecksum(void *Start, unsigned int Count,
unsigned char IsTCP)
{
unsigned long Sum = 0;
unsigned int *pStart = Start;
if (IsTCP)
{
Sum += MyIP[0];
Sum += MyIP[1];
Sum += RemoteIP[0];
Sum += RemoteIP[1];
Sum += __swap_bytes(Count);
Sum += ((unsigned int)((6) << 8) | ((6) >> 8));
}
while (Count > 1)
{
Sum += *pStart++;
Count -= 2;
}
if (Count)
Sum += *(unsigned char *)pStart;
while (Sum >> 16)
Sum = (Sum & 0xFFFF) + (Sum >> 16);
return ~Sum;
}
static void TCPStartRetryTimer(void)
{
TCPTimer = 0;
RetryCounter = 4;
TCPFlags |= (0x04);
TCPFlags |= (0x08);
}
static void TCPStartFinTimer(void)
{
TCPTimer = 0;
TCPFlags |= (0x04);
TCPFlags &= ~(0x08);
}
static void TCPRestartTimer(void)
{
TCPTimer = 0;
}
static void TCPStopTimer(void)
{
TCPFlags &= ~(0x04);
}
static void TCPHandleRetransmission(void)
{
switch (LastFrameSent)
{
case ARP_REQUEST :
PrepareARP_REQUEST();
break;
case TCP_SYN_FRAME :
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002));
break;
case TCP_SYN_ACK_FRAME :
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002) | (0x0010));
break;
case TCP_FIN_FRAME :
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0001) | (0x0010));
break;
case TCP_DATA_FRAME :
TransmitControl |= (0x01);
break;
}
}
static void TCPHandleTimeout(void)
{
TCPStateMachine = CLOSED;
if ((TCPFlags & ((0x01) | (0x02))) == (0x01))
SocketStatus = (0x10);
else
SocketStatus = (0x20);
TCPFlags = 0;
}
#pragma vector = (5 * 2u)
__interrupt void TCPClockHandler(void)
{
if (TAIV == 10)
{
ISNGenHigh++;
TCPTimer++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -