📄 tcp.lst
字号:
250 1 /* SeqMine increasment */
251 1 if((TCPFlag & TCP_SYN) || (TCPFlag & TCP_FIN))
252 1 {
253 2 SeqInc = MemHead->pEnd - MemHead->pStart + 1;
254 2 }
255 1 else
256 1 {
257 2 SeqInc = MemHead->pEnd - MemHead->pStart;
258 2 }
259 1
260 1 pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart - sizeof(struct STCPHead));
261 1
262 1 /* fill tcp header */
263 1 pTCPHead->PortDest = pTCB->PortDest;
264 1 pTCPHead->PortScr = pTCB->PortScr;
265 1 pTCPHead->Seq = htonl(pTCB->SeqMine);
266 1 pTCPHead->AckSeq = htonl(pTCB->SeqHis);
267 1 pTCPHead->TCPHeadLen = (BYTE)(((BYTE)sizeof(struct STCPHead)/4)<<4);
268 1 pTCPHead->flag = TCPFlag;
269 1 pTCPHead->WndSize = htons(pTCB->WndMine = MemFreeSize());
270 1 pTCPHead->CheckSum = 0;
271 1 pTCPHead->UrgentPoint = 0;
272 1
273 1 /* fill some of IPHead. it will be used to calculate TCPChecksum
274 1 and as augument passed to IPlayer */
275 1 pIPHead = (struct SIPHead DT_XDATA *)((BYTE DT_XDATA *)pTCPHead - IP_HEAD_MIN_LEN);
276 1 pIPHead->IPDest = pTCB->IPDest;
277 1 pIPHead->IPScr = pTCB->IPScr;
278 1 pIPHead->Protocol = IP_PROTOCOL_TCP;
279 1 pIPHead->TotalLen = htons(MemHead->pEnd -
280 1 MemHead->pStart + TCP_HEAD_MIN_LEN + IP_HEAD_MIN_LEN); /* pStart point to TCP data */
281 1 pTCPHead->CheckSum = htons(TCPCheckSum(pIPHead,MemHead->pEnd - MemHead->pStart + TCP_HEAD_MIN_LEN));
282 1
283 1 /* send packet */
284 1 MemHead->pStart = (BYTE DT_XDATA *)pIPHead; /* dec pStart */
285 1 IPOutput(MemHead);
286 1
287 1 /*
288 1 * renew tcb
289 1 */
290 1 /* no ack need. because this packet will give a ack to him */
291 1 pTCB->bNeedAck = FALSE;
292 1
293 1 pTCB->SeqMine += SeqInc;
294 1
295 1 /* if this packet contant data or is a FIN or SYN packet
296 1 we write it to unacked queue */
297 1 if(SeqInc != 0)
298 1 {
299 2 /* if the unacked queue is empty, start timer for this packet */
300 2 if(pTCB->QUnacked == NULL)
301 2 {
302 3 pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
303 3 pTCB->RetranTimes = 0;
C51 COMPILER V7.06 TCP 11/06/2008 08:54:10 PAGE 6
304 3 }
305 2
306 2 TCPInsertQ(&(pTCB->QUnacked),MemHead,htonl(pTCPHead->Seq));
307 2 }
308 1 else
309 1 {
310 2 MemFree(MemHead);
311 2 }
312 1 return TRUE;
313 1 }
314
315 /* judge his wnd if he can receive this packet. send call TCPSendSeg.
316 only send this seg completely return TRUE*/
317 BOOL TCPSendSegJudgeWnd(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL
318 {
319 1 struct SMemHead DT_XDATA *NewMemHead;
320 1
321 1 /* if WndHis is large enough to receive this packet send it.
322 1 otherwise create a new packet and send part of Data. the remain
323 1 going to transmit when WndHis refresh at TCPInput */
324 1 if(MemHead->pEnd - MemHead->pStart > pTCB->WndHis)
325 1 {
326 2 /* part of Data need send */
327 2 if(pTCB->WndHis > 0)
328 2 {
329 3 /* create a new MemHead */
330 3 if((NewMemHead = TCPAllocate(pTCB->WndHis)) == NULL)
331 3 return FALSE;
332 3
333 3 /* copy part of data to new MemHead */
334 3 MemCopy(NewMemHead->pStart,MemHead->pStart,pTCB->WndHis);
335 3
336 3 /* delete this part from old MemHead */
337 3 MemHead->pStart += pTCB->WndHis;
338 3
339 3 /* send the NewMemHead */
340 3 TCPSendSeg(pTCB,NewMemHead,TCP_ACK);
341 3
342 3 return FALSE;
343 3 }
344 2 else
345 2 {
346 3 /* can't send any data now */
347 3 return FALSE;
348 3 }
349 2 }
350 1 else
351 1 {
352 2 TCPSendSeg(pTCB,MemHead,TCP_ACK);
353 2 return TRUE;
354 2 }
355 1 }
356
357 /* send seg in unsend queue untill can't send any more. if send all
358 seg in queue return true */
359 BOOL TCPSendUnsendQ(struct STCB DT_XDATA *pTCB) REENTRANT_MUL
360 {
361 1 /* send every packet in unsend queue if can */
362 1 for(;pTCB->QUnSend != NULL;)
363 1 {
364 2 /* send it completely? */
365 2 if(TCPSendSegJudgeWnd(pTCB,pTCB->QUnSend->MemHead) == TRUE)
C51 COMPILER V7.06 TCP 11/06/2008 08:54:10 PAGE 7
366 2 {
367 3 /* delete it from unsend queue */
368 3 TCPOutQ(&(pTCB->QUnSend));
369 3 }
370 2 else
371 2 {
372 3 /* only part of the seg is send */
373 3 return FALSE;
374 3 }
375 2 }
376 1 return TRUE;
377 1 }
378
379 /* call by TCPInput after judge this packet can be received.NOTE:MemHead-pStart point
380 to TCP head. TCPHead byte order is change in TCPInput */
381 void TCPRecvSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG
382 {
383 1 WORD TCPDataSize;
384 1 struct STCB DT_XDATA *pNewTCB;
385 1 struct SIPHead DT_XDATA *pIPHead;
386 1 struct STCPHead DT_XDATA *pTCPHead;
387 1
388 1 pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart );
389 1 pIPHead = (struct SIPHead DT_XDATA *)(MemHead->pStart - IP_HEAD_MIN_LEN);
390 1
391 1 /*
392 1 * begain renew tcb values
393 1 */
394 1
395 1 /* dest windows size renew.*/
396 1 pTCB->WndHis = pTCPHead->WndSize;
397 1
398 1 /* after dest windows renew is it possible to send a packet in unsend queue now ?*/
399 1 TCPSendUnsendQ(pTCB);
400 1
401 1 /* His Sequence renew */
402 1 TCPDataSize = ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN
403 1 - TCP_HEAD_LEN(pTCPHead);
404 1 if((pTCPHead->flag & TCP_SYN) || (pTCPHead->flag & TCP_FIN))
405 1 {
406 2 pTCB->SeqHis += TCPDataSize + 1;
407 2 }
408 1 else
409 1 {
410 2 pTCB->SeqHis += TCPDataSize;
411 2 }
412 1
413 1 /* NeedAck? */
414 1 if(TCPDataSize != 0)
415 1 {
416 2 pTCB->bNeedAck = TRUE;
417 2 pTCB->DelayAckTimer = TCP_DELAY_ACK_TIME_OUT;
418 2 }
419 1
420 1 /* if This packet acked packet in unacked queue */
421 1 if((pTCPHead->flag & TCP_ACK) != 0)
422 1 {
423 2 while(pTCB->QUnacked != NULL &&
424 2 TCP_SEQ_COMPARE(pTCB->QUnacked->Seq,pTCPHead->AckSeq) < 0)
425 2 {
426 3 MemFree(pTCB->QUnacked->MemHead);
427 3 TCPOutQ(&(pTCB->QUnacked));
C51 COMPILER V7.06 TCP 11/06/2008 08:54:10 PAGE 8
428 3
429 3 /* timer for retran restore */
430 3 pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
431 3 pTCB->RetranTimes = 0;
432 3 }
433 2 }
434 1
435 1 /*
436 1 * deal refer to tcb.state and tcp flag
437 1 */
438 1 switch(pTCB->TCPState)
439 1 {
440 2 case TCP_STATE_CLOSED:
441 2 break;
442 2 case TCP_STATE_LISTEN:
443 2 /* syn: to TCP_STATE_SYNSENT, send syn+ack */
444 2 if(pTCPHead->flag == TCP_SYN)
445 2 {
446 3 /* create a new tcb and it is going to deal with
447 3 this connection. */
448 3 if((pNewTCB = TCPSocket(htonl(pTCB->IPScr))) == NULL)
449 3 {
450 4 MemFree(MemHead);
451 4 return;
452 4 }
453 3
454 3 /* insert this tcb to tcb list isn't need. because
455 3 this tcb is already insert at TCPSocket()*/
456 3
457 3 /* initial new tcb value*/
458 3 pNewTCB->TCPState = TCP_STATE_SYNRECVD;
459 3 pNewTCB->IPDest = pIPHead->IPScr;
460 3 pNewTCB->PortDest = pTCPHead->PortScr;
461 3 pNewTCB->PortScr = pTCPHead->PortDest;
462 3
463 3 pNewTCB->SeqHis = pTCPHead->Seq + 1; /* syn is use 1
464 3 sequence */
465 3 pNewTCB->WndHis = pTCPHead->WndSize;
466 3
467 3 /* set accept function. when pNewTCB accept this
468 3 connection call pTCB->accetp */
469 3 pNewTCB->accept = pTCB->accept;
470 3
471 3 /* send syn+ack */
472 3 TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
473 3 }
474 2 break;
475 2 case TCP_STATE_SYNRECVD:
476 2
477 2 /* ack: to TCP_STATE_ESTABLISHED */
478 2 if((pTCPHead->flag & TCP_ACK) != 0)
479 2 pTCB->TCPState = TCP_STATE_ESTABLISHED;
480 2
481 2 /* call accept. Let user to know and deal more */
482 2 pTCB->accept(pTCB);
483 2
484 2 break;
485 2 case TCP_STATE_SYNSENT:
486 2 switch(pTCPHead->flag)
487 2 {
488 3 case TCP_SYN:
489 3 /* syn: to TCP_STATE_SYNRECVD send syn+ack */
C51 COMPILER V7.06 TCP 11/06/2008 08:54:10 PAGE 9
490 3
491 3 pTCB->TCPState = TCP_STATE_SYNRECVD;
492 3
493 3 /* ackseq initial */
494 3 pTCB->SeqHis = pTCPHead->Seq + 1; /* syn use 1 sequence */
495 3
496 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_SYN | TCP_ACK);
497 3 break;
498 3 case TCP_SYN | TCP_ACK:
499 3 /* syn+ack: to TCP_STATE_ESTABLISHED send ack */
500 3
501 3 pTCB->TCPState = TCP_STATE_ESTABLISHED;
502 3
503 3 /* ackseq initial */
504 3 pTCB->SeqHis = pTCPHead->Seq + 1; /* syn use 1 sequence */
505 3
506 3 TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
507 3 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -