📄 tcpip.i
字号:
TCPStartRetryTimer();
SocketStatus = (0x01);
}
}
void TCPClose(void)
{
switch (TCPStateMachine)
{
case LISTENING :
case SYN_SENT :
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus = 0;
break;
case SYN_RECD :
case ESTABLISHED :
TCPFlags |= (0x10);
break;
}
}
void TCPReleaseRxBuffer(void)
{
SocketStatus &= ~(0x04);
}
void TCPTransmitTxBuffer(void)
{
if ((TCPStateMachine == ESTABLISHED) || (TCPStateMachine == CLOSE_WAIT))
if (SocketStatus & (0x08))
{
SocketStatus &= ~(0x08);
TCPUNASeqNr += TCPTxDataCount;
TxFrame1Size = 14 + 20 + 20 + TCPTxDataCount;
TransmitControl |= (0x01);
LastFrameSent = TCP_DATA_FRAME;
TCPStartRetryTimer();
}
}
void DoNetworkStuff(void)
{
unsigned int ActRxEvent;
Write8900((0x000a), (0x0124));
ActRxEvent = Read8900((0x000c));
if (ActRxEvent & (0x0100))
{
if (ActRxEvent & (0x0400)) ProcessEthIAFrame();
if (ActRxEvent & (0x0800)) ProcessEthBroadcastFrame();
}
if (TCPFlags & (0x04))
if (TCPFlags & (0x08))
{
if (TCPTimer > 8)
{
TCPRestartTimer();
if (RetryCounter)
{
TCPHandleRetransmission();
RetryCounter--;
}
else
{
TCPStopTimer();
TCPHandleTimeout();
}
}
}
else if (TCPTimer > 2)
{
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus &= (0x04);
}
switch (TCPStateMachine)
{
case CLOSED :
case LISTENING :
if (TCPFlags & (0x01))
if (TCPFlags & (0x02))
if (!(TransmitControl & (0x02)))
{
TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR;
TCPUNASeqNr = TCPSeqNr;
TCPAckNr = 0;
TCPUNASeqNr++;
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002));
LastFrameSent = TCP_SYN_FRAME;
TCPStartRetryTimer();
TCPStateMachine = SYN_SENT;
}
break;
case SYN_RECD :
case ESTABLISHED :
if (TCPFlags & (0x10))
if (!(TransmitControl & ((0x02) | (0x01))))
if (TCPSeqNr == TCPUNASeqNr)
{
TCPUNASeqNr++;
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0001) | (0x0010));
LastFrameSent = TCP_FIN_FRAME;
TCPStartRetryTimer();
TCPStateMachine = FIN_WAIT_1;
}
break;
case CLOSE_WAIT :
if (!(TransmitControl & ((0x02) | (0x01))))
if (TCPSeqNr == TCPUNASeqNr)
{
TCPUNASeqNr++;
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0001) | (0x0010));
LastFrameSent = TCP_FIN_FRAME;
TCPStartRetryTimer();
TCPStateMachine = LAST_ACK;
}
break;
}
if (TransmitControl & (0x02))
{
RequestSend(TxFrame2Size);
if (Rdy4Tx())
{
CopyToFrame8900((unsigned char *)TxFrame2Mem, TxFrame2Size);
}
else
{
TCPStateMachine = CLOSED;
SocketStatus = (0x50);
TCPFlags = 0;
}
TransmitControl &= ~(0x02);
}
if (TransmitControl & (0x01))
{
PrepareTCP_DATA_FRAME();
RequestSend(TxFrame1Size);
if (Rdy4Tx())
{
CopyToFrame8900((unsigned char *)TxFrame1Mem, TxFrame1Size);
}
else
{
TCPStateMachine = CLOSED;
SocketStatus = (0x50);
TCPFlags = 0;
}
TransmitControl &= ~(0x01);
}
}
static void ProcessEthBroadcastFrame(void)
{
unsigned int TargetIP[2];
ReadHB1ST8900((0x0000));
RecdFrameLength = ReadHB1ST8900((0x0000));
DummyReadFrame8900(6);
CopyFromFrame8900(&RecdFrameMAC, 6);
if (ReadFrameBE8900() == (0x0806))
if (ReadFrameBE8900() == 1)
if (ReadFrameBE8900() == (0x0800))
if (ReadFrameBE8900() == (0x0604))
if (ReadFrameBE8900() == 1)
{
DummyReadFrame8900(6);
CopyFromFrame8900(&RecdFrameIP, 4);
DummyReadFrame8900(6);
CopyFromFrame8900(&TargetIP, 4);
if ((MyIP[0] == TargetIP[0]) && (MyIP[1] == TargetIP[1]))
PrepareARP_ANSWER();
}
}
static void ProcessEthIAFrame(void)
{
unsigned int TargetIP[2];
unsigned char ProtocolType;
ReadHB1ST8900((0x0000));
RecdFrameLength = ReadHB1ST8900((0x0000));
DummyReadFrame8900(6);
CopyFromFrame8900(&RecdFrameMAC, 6);
switch (ReadFrameBE8900())
{
case (0x0806) :
if ((TCPFlags & ((0x01) | (0x02))) == (0x01))
if (ReadFrameBE8900() == 1)
if (ReadFrameBE8900() == (0x0800))
if (ReadFrameBE8900() == (0x0604))
if (ReadFrameBE8900() == 2)
{
TCPStopTimer();
CopyFromFrame8900(&RemoteMAC, 6);
TCPFlags |= (0x02);
}
break;
case (0x0800) :
if ((ReadFrameBE8900() & 0xff00 ) == (0x4500))
{
RecdIPFrameLength = ReadFrameBE8900();
ReadFrameBE8900();
if (!(ReadFrameBE8900() & ((0x2000) | (0x1fff))))
{
ProtocolType = ReadFrameBE8900();
ReadFrameBE8900();
RecdFrameIP[0] = ReadFrame8900();
RecdFrameIP[1] = ReadFrame8900();
TargetIP[0] = ReadFrame8900();
TargetIP[1] = ReadFrame8900();
if ((MyIP[0] == TargetIP[0]) && (MyIP[1] == TargetIP[1]))
switch (ProtocolType)
{
case 1 :
ProcessICMPFrame();
break;
case 6 :
ProcessTCPFrame();
break;
case 17 :
break;
}
}
break;
}
}
}
static void ProcessICMPFrame(void)
{
unsigned int ICMPTypeAndCode;
ICMPTypeAndCode = ReadFrameBE8900();
ReadFrameBE8900();
switch (ICMPTypeAndCode >> 8)
{
case 8 :
PrepareICMP_ECHO_REPLY();
break;
}
}
static void ProcessTCPFrame(void)
{
unsigned int TCPSegSourcePort;
unsigned int TCPSegDestPort;
unsigned long TCPSegSeq;
unsigned long TCPSegAck;
unsigned int TCPCode;
unsigned char TCPHeaderSize;
unsigned int NrOfDataBytes;
TCPSegSourcePort = ReadFrameBE8900();
TCPSegDestPort = ReadFrameBE8900();
if (TCPSegDestPort != TCPLocalPort) return;
TCPSegSeq = (unsigned long)ReadFrameBE8900() << 16;
TCPSegSeq |= ReadFrameBE8900();
TCPSegAck = (unsigned long)ReadFrameBE8900() << 16;
TCPSegAck |= ReadFrameBE8900();
TCPCode = ReadFrameBE8900();
TCPHeaderSize = (TCPCode & (0xf000)) >> 10;
NrOfDataBytes = RecdIPFrameLength - 20 - TCPHeaderSize;
if (NrOfDataBytes > 536) return;
if (TCPHeaderSize > 20)
DummyReadFrame8900(TCPHeaderSize - 20);
switch (TCPStateMachine)
{
case CLOSED :
if (!(TCPCode & (0x0004)))
{
TCPRemotePort = TCPSegSourcePort;
RemoteMAC[0] = RecdFrameMAC[0];
RemoteMAC[1] = RecdFrameMAC[1];
RemoteMAC[2] = RecdFrameMAC[2];
RemoteIP[0] = RecdFrameIP[0];
RemoteIP[1] = RecdFrameIP[1];
if (TCPCode & (0x0010))
{
PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
}
else
{
TCPAckNr = TCPSegSeq + NrOfDataBytes;
if (TCPCode & ((0x0002) | (0x0001))) TCPAckNr++;
PrepareTCP_FRAME(0, TCPAckNr, (0x0004) | (0x0010));
}
}
break;
case LISTENING :
if (!(TCPCode & (0x0004)))
{
TCPRemotePort = TCPSegSourcePort;
RemoteMAC[0] = RecdFrameMAC[0];
RemoteMAC[1] = RecdFrameMAC[1];
RemoteMAC[2] = RecdFrameMAC[2];
RemoteIP[0] = RecdFrameIP[0];
RemoteIP[1] = RecdFrameIP[1];
if (TCPCode & (0x0010))
{
PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
}
else if (TCPCode & (0x0002))
{
TCPAckNr = TCPSegSeq + 1;
TCPSeqNr = ((unsigned long)ISNGenHigh << 16) | TAR;
TCPUNASeqNr = TCPSeqNr + 1;
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002) | (0x0010));
LastFrameSent = TCP_SYN_ACK_FRAME;
TCPStartRetryTimer();
TCPStateMachine = SYN_RECD;
}
}
break;
case SYN_SENT :
if ((RemoteIP[0] != RecdFrameIP[0]) || (RemoteIP[1] != RecdFrameIP[1]))
break;
if (TCPSegSourcePort != TCPRemotePort)
break;
if (TCPCode & (0x0010))
if (TCPSegAck != TCPUNASeqNr)
{
if (!(TCPCode & (0x0004)))
{
PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
}
break;
}
if (TCPCode & (0x0004))
{
if (TCPCode & (0x0010))
{
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus = (0x30);
}
break;
}
if (TCPCode & (0x0002))
{
TCPAckNr = TCPSegSeq;
TCPAckNr++;
if (TCPCode & (0x0010))
{
TCPStopTimer();
TCPSeqNr = TCPUNASeqNr;
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0010));
TCPStateMachine = ESTABLISHED;
SocketStatus |= (0x02);
SocketStatus |= (0x08);
}
else
{
TCPStopTimer();
PrepareTCP_FRAME(TCPSeqNr, TCPAckNr, (0x0002) | (0x0010));
LastFrameSent = TCP_SYN_ACK_FRAME;
TCPStartRetryTimer();
TCPStateMachine = SYN_RECD;
}
}
break;
default :
if ((RemoteIP[0] != RecdFrameIP[0]) || (RemoteIP[1] != RecdFrameIP[1]))
break;
if (TCPSegSourcePort != TCPRemotePort)
break;
if ((TCPSegSeq < TCPAckNr) || (TCPSegSeq >= TCPAckNr + 536))
break;
if (TCPCode & (0x0004))
{
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus = (0x30);
break;
}
if (TCPCode & (0x0002))
{
PrepareTCP_FRAME(TCPSegAck, 0, (0x0004));
TCPStateMachine = CLOSED;
TCPFlags = 0;
SocketStatus = (0x40);
break;
}
if (TCPSegSeq != TCPAckNr)
{
PrepareTCP_FRAME(TCPUNASeqNr, TCPAckNr, (0x0010));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -