📄 tcp.lst.svn-base
字号:
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TCP
OBJECT MODULE PLACED IN E:\NETBRO~1\TRUNK\NETBRO~1\VW\TCP.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\NETBRO~1\TRUNK\NETBRO~1\VW\TCP.C DB SB OE
stmt level source
1 /*
2 */
3
4 #include "GloblDef.h"
5 #include "TCPIPmem.h"
6 #include "IP.h"
7 #include "Netif.h"
8 #include "TCP.h"
9
10 struct STCB xdata TCBPool[TCP_CONNECTION_MAX_NUM];
11 struct STCB xdata * xdata TCBFreeList; /* free list */
12 struct STCB xdata * xdata TCBList; /* tcb in use */
13
14 struct SPacketQueue xdata QPool[TCP_QUEUE_MAX_NUM];
15 struct SPacketQueue xdata * xdata QFreeList;
16
17 struct STCB xdata *TCPGetTCB() reentrant
18 {
19 1 struct STCB xdata * pTCB;
20 1 if((pTCB = TCBFreeList) != NULL)
21 1 {
22 2 TCBFreeList = TCBFreeList->pNext;
23 2 }
24 1 return pTCB;
25 1 }
26
27 void TCPInsertTCB(struct STCB xdata *pTCB) reentrant
28 {
29 1 pTCB->pNext = TCBList;
30 1 TCBList = pTCB;
31 1 }
32
33 struct SPacketQueue xdata * TCPGetQ() reentrant
34 {
35 1 struct SPacketQueue xdata * pQ;
36 1 if((pQ = QFreeList) != NULL)
37 1 {
38 2 QFreeList = QFreeList->pNext;
39 2 }
40 1 return pQ;
41 1 }
42
43 /* insert to the head of *ppQ. Q is a double link chain */
44 unsigned char TCPInsertQ(struct SPacketQueue xdata * xdata * ppQ,struct SMemHead xdata *MemHead,
45 unsigned short Seq) reentrant
46 {
47 1 struct SPacketQueue xdata *pNewQ;
48 1 struct SPacketQueue xdata *pQ;
49 1
50 1 /* allocate a queue to it */
51 1 if((pNewQ = TCPGetQ()) == NULL)
52 1 return FALSE;
53 1
54 1 /* write content */
55 1 pNewQ->Seq = Seq;
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 2
56 1 pNewQ->MemHead = MemHead;
57 1
58 1 /*
59 1 * link in the queue
60 1 */
61 1
62 1 /* if is a empty queue */
63 1 if(*ppQ == NULL)
64 1 {
65 2 *ppQ = pNewQ;
66 2
67 2 /* pNext pPre point to itself when no others in queue */
68 2 pNewQ->pNext = pNewQ;
69 2 pNewQ->pPre = pNewQ;
70 2 }
71 1 else
72 1 {
73 2 pQ = *ppQ;
74 2
75 2 /* pNext link */
76 2 pNewQ->pNext = pQ->pNext;
77 2 pQ->pNext = pNewQ;
78 2
79 2 /* pPre link */
80 2 pNewQ->pNext->pPre = pNewQ;
81 2 pNewQ->pPre = pQ;
82 2 }
83 1 return TRUE;
84 1 }
85
86 /* move the last unit in queue outof queue,if the queue
87 is empty return FALSE.actrually last unit is *ppQ */
88 struct SPacketQueue xdata * TCPOutQ(struct SPacketQueue xdata * xdata * ppQ) reentrant
89 {
90 1 struct SPacketQueue xdata *pQ;
91 1
92 1 /* a empty queue? */
93 1 if((pQ = *ppQ) == NULL)
94 1 return NULL;
95 1
96 1 /* after remove it, the queue is empty? */
97 1 if(pQ->pNext == pQ)
98 1 *ppQ = NULL;
99 1 else
100 1 {
101 2 /* relink */
102 2 pQ->pPre->pNext = pQ->pNext;
103 2 pQ->pNext->pPre = pQ->pPre;
104 2
105 2 /* and the queue head *ppQ point to pQ->pPre */
106 2 *ppQ = pQ->pPre;
107 2 }
108 1
109 1 /* relaim it. link to QFreeList */
110 1 pQ->pNext = QFreeList;
111 1 QFreeList = pQ;
112 1 return pQ;
113 1 }
114
115 void TCPInit() reentrant
116 {
117 1 unsigned int i;
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 3
118 1
119 1 /* move TCBPool to TCBFreeList */
120 1 for(i = 0, TCBFreeList = NULL; i<TCP_CONNECTION_MAX_NUM; i++)
121 1 {
122 2 TCBPool[i].pNext = TCBFreeList;
123 2 TCBFreeList = &TCBPool[i];
124 2 }
125 1
126 1 /* move QPool to QFreeList */
127 1 for(i = 0, QFreeList = NULL; i<TCP_QUEUE_MAX_NUM; i++)
128 1 {
129 2 QPool[i].pNext = QFreeList;
130 2 QFreeList = &QPool[i];
131 2 }
132 1
133 1 TCBList = NULL;
134 1 }
135
136
137 /* tcp check sum. return check sum. TCPSize = TCPDataSize + TCPHeadSize*/
138 unsigned int TCPCheckSum(struct SIPHead xdata * pIPHead,unsigned int TCPSize) reentrant
139 {
140 1 unsigned short sum = 0;
141 1 unsigned int xdata * p;
142 1 unsigned char i;
143 1
144 1 /* clac pseudo-header CheckSum. pseudo-header is:
145 1 source ip, destination ip, pad 8 bits, protocol, TCP lendth */
146 1 sum = 0;
147 1
148 1 /* source ip and dest ip */
149 1 p = (unsigned int xdata *)(&(pIPHead->IPScr));
150 1 for(i=0; i < sizeof(unsigned short)/sizeof(unsigned int)*2; i++,p++)
151 1 sum += *p;
152 1
153 1 /* pad 8 and protocol */
154 1 sum += pIPHead->Protocol;
155 1
156 1 /* tcp lendth */
157 1 sum += TCPSize;
158 1
159 1 return CheckSum((unsigned int xdata *)((unsigned char xdata *)pIPHead + IP_HEAD_MIN_LEN),TCPSize,sum);
160 1 }
161
162 /* this funtion should be called periodically */
163 void TCPTimer() reentrant
164 {
165 1 struct STCB xdata *pTCB;
166 1
167 1 /* go through all tcbs to see if any time out */
168 1 for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
169 1 {
170 2 /* delayed ack need send now? */
171 2 if(pTCB->bNeedAck == TRUE)
172 2 {
173 3 if(pTCB->DelayAckTimer == 0)
174 3 {
175 4 /* send a ack. bNeedAck will set FLASE in TCPOutput*/
176 4 TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
177 4 }
178 3 else
179 3 pTCB->DelayAckTimer--;
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 4
180 3 }
181 2
182 2 /* TCP_STATE_LASTACK TCP_STATE_TIMEWAIT state time out? */
183 2 if(pTCB->TCPState == TCP_STATE_LASTACK ||
184 2 pTCB->TCPState == TCP_STATE_TIMEWAIT)
185 2 {
186 3 if(pTCB->LastAckTimer == 0)
187 3 {
188 4 pTCB->TCPState = TCP_STATE_CLOSED;
189 4
190 4 /* release buf queue and call user close */
191 4 TCPRelease(pTCB);
192 4 /* let pTCB->close(); to be call when they send a fin when we at established */
193 4 }
194 3 else
195 3 pTCB->LastAckTimer--;
196 3 }
197 2
198 2 /* if retransmit timer out? */
199 2 if(pTCB->QUnacked != NULL)
200 2 {
201 3 if(pTCB->RetranTimer == 0)
202 3 {
203 4 /* retransmit,pStart set to tcpdata */
204 4 IPOutput(pTCB->QUnacked->MemHead);
205 4
206 4 /* timer restart and retransmit times inc */
207 4 if(pTCB->RetranTimes == TCP_RETRAN_MAX_TIME)
208 4 {
209 5 pTCB->TCPState = TCP_STATE_CLOSED;
210 5
211 5 /* closed by countpart shut down */
212 5 TCPRelease(pTCB);
213 5 }
214 4 else
215 4 {
216 5 pTCB->RetranTimes++;
217 5 pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
218 5 }
219 4 }
220 3 else
221 3 pTCB->RetranTimer--;
222 3 }
223 2 }
224 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -