📄 tcp.lst.svn-base
字号:
455 4 }
456 3
457 3 /* insert this tcb to tcb list isn't need. because
458 3 this tcb is already insert at TCPSocket()*/
459 3
460 3 /* initial new tcb value*/
461 3 pNewTCB->TCPState = TCP_STATE_SYNRECVD;
462 3 pNewTCB->IPDest = pIPHead->IPScr;
463 3 pNewTCB->PortDest = pTCPHead->PortScr;
464 3 pNewTCB->PortScr = pTCPHead->PortDest;
465 3
466 3 pNewTCB->SeqHis = pTCPHead->Seq + 1; /* syn is use 1
467 3 sequence */
468 3 pNewTCB->WndHis = pTCPHead->WndSize;
469 3
470 3 /* set accept function. when pNewTCB accept this
471 3 connection call pTCB->accetp */
472 3 pNewTCB->accept = pTCB->accept;
473 3
474 3 /* send syn+ack */
475 3 TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
476 3 }
477 2 break;
478 2 case TCP_STATE_SYNRECVD:
479 2
480 2 /* ack: to TCP_STATE_ESTABLISHED */
481 2 if((pTCPHead->flag & TCP_ACK) != 0)
482 2 pTCB->TCPState = TCP_STATE_ESTABLISHED;
483 2
484 2 /* call accept. Let user to know and deal more */
485 2 pTCB->accept(pTCB);
486 2
487 2 break;
488 2 case TCP_STATE_SYNSENT:
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 9
489 2 switch(pTCPHead->flag)
490 2 {
491 3 case TCP_SYN:
492 3 /* syn: to TCP_STATE_SYNRECVD send syn+ack */
493 3
494 3 pTCB->TCPState = TCP_STATE_SYNRECVD;
495 3
496 3 /* ackseq initial */
497 3 pTCB->SeqHis = pTCPHead->Seq + 1; /* syn use 1 sequence */
498 3
499 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_SYN | TCP_ACK);
500 3 break;
501 3 case TCP_SYN | TCP_ACK:
502 3 /* syn+ack: to TCP_STATE_ESTABLISHED send ack */
503 3
504 3 pTCB->TCPState = TCP_STATE_ESTABLISHED;
505 3
506 3 /* ackseq initial */
507 3 pTCB->SeqHis = pTCPHead->Seq + 1; /* syn use 1 sequence */
508 3
509 3 TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
510 3 break;
511 3 case TCP_RST | TCP_ACK:
512 3 /* rst: to closed */
513 3 pTCB->TCPState = TCP_STATE_CLOSED;
514 3 TCPRelease(pTCB);
515 3 break;
516 3 }
517 2 break;
518 2 case TCP_STATE_ESTABLISHED:
519 2 /* fin:to closewait send ack */
520 2 if((pTCPHead->flag & TCP_FIN) != 0)
521 2 {
522 3 pTCB->TCPState = TCP_STATE_CLOSEWAIT;
523 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
524 3
525 3 /* call ->close() let user to know he want to close connection
526 3 user should call TCPClose() to close the connection in ->close */
527 3 pTCB->close(pTCB);
528 3 }
529 2 break;
530 2 case TCP_STATE_CLOSEWAIT:
531 2 /* he want to close, send a fin to close */
532 2 pTCB->TCPState = TCP_STATE_LASTACK;
533 2 pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
534 2 TCPSendSeg(pTCB,TCPAllocate(0), TCP_FIN | TCP_ACK);
535 2 break;
536 2 case TCP_STATE_FINWAIT1:
537 2 switch(pTCPHead->flag)
538 2 {
539 3 case TCP_FIN:
540 3 /* fin: to TCP_STATE_CLOSING send ack */
541 3 pTCB->TCPState = TCP_STATE_CLOSING;
542 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
543 3 break;
544 3 case TCP_FIN | TCP_ACK:
545 3 pTCB->TCPState = TCP_STATE_TIMEWAIT;
546 3 pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; /* start timer */
547 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
548 3 break;
549 3 case TCP_ACK:
550 3 pTCB->TCPState = TCP_STATE_FINWAIT2;
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 10
551 3 break;
552 3 }
553 2 break;
554 2 case TCP_STATE_CLOSING:
555 2 /* ack:to TCP_STATE_CLOSED */
556 2 if(pTCPHead->flag & TCP_ACK)
557 2 {
558 3 pTCB->TCPState = TCP_STATE_TIMEWAIT;
559 3 pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; /* start timer */
560 3 }
561 2 break;
562 2 case TCP_STATE_FINWAIT2:
563 2 if(pTCPHead->flag & TCP_FIN)
564 2 {
565 3 pTCB->TCPState = TCP_STATE_TIMEWAIT;
566 3 pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; /* start timer */
567 3 TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
568 3 }
569 2 break;
570 2 }
571 1
572 1 /*
573 1 * put tcp data to uper layer
574 1 */
575 1 if(TCPDataSize != 0)
576 1 {
577 2 pTCB->recv(MemHead->pStart + TCP_HEAD_LEN(pTCPHead),TCPDataSize);
578 2 }
579 1
580 1 /*
581 1 * free this packet
582 1 */
583 1 MemFree(MemHead);
584 1 }
585
586 /* tcp packet in.*/
587 void TCPInput(struct SMemHead xdata *MemHead) reentrant
588 {
589 1 struct SIPHead xdata *pIPHead;
590 1 struct STCPHead xdata *pTCPHead;
591 1 struct STCB xdata *pNewTCB;
592 1 struct STCB xdata *pTCB;
593 1
594 1 pTCPHead = (struct STCPHead xdata *)(MemHead->pStart);
595 1 pIPHead = (struct SIPHead xdata *)(MemHead->pStart - sizeof(struct SIPHead));
596 1
597 1 /*
598 1 * is check sum ok?
599 1 */
600 1 if(TCPCheckSum(pIPHead,ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN) != 0)
601 1 {
602 2 MemFree(MemHead);
603 2 return;
604 2 }
605 1
606 1 /*
607 1 * is there a connection can accept this tcp packet?
608 1 */
609 1
610 1 /* if is syn packet. a tcb in listen can accept it. */
611 1 if(pTCPHead->flag == TCP_SYN)
612 1 {
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 11
613 2 for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
614 2 {
615 3 if(pTCB->TCPState == TCP_STATE_LISTEN &&
616 3 pTCB->PortScr == pTCPHead->PortDest)
617 3 {
618 4 break;
619 4 }
620 3 }
621 2 }
622 1 else
623 1 {
624 2 /* search active connections. TCBState must not the
625 2 closed and listen state */
626 2 for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
627 2 {
628 3 /* and the source ip, dest ip, source port, dest port
629 3 must equal */
630 3 if(pTCB->PortScr == pTCPHead->PortDest &&
631 3 pTCB->PortDest == pTCPHead->PortScr &&
632 3 pTCB->TCPState != TCP_STATE_LISTEN &&
633 3 pTCB->TCPState != TCP_STATE_CLOSED &&
634 3 pTCB->IPScr == pIPHead->IPDest &&
635 3 pTCB->IPDest == pIPHead->IPScr)
636 3 break;
637 3
638 3 }
639 2 }
640 1
641 1 /* can't find, and send a rst */
642 1 if(pTCB == NULL)
643 1 {
644 2 /* allocate a temp tcb for use */
645 2 pNewTCB = TCPSocket(ntohl(pIPHead->IPDest));
646 2 pNewTCB->IPDest = pIPHead->IPScr;
647 2 pNewTCB->PortDest = pTCPHead->PortScr;
648 2 pNewTCB->PortScr = pTCPHead->PortDest;
649 2
650 2 /* set MemFree DataSize to 0 */
651 2 MemHead->pStart = MemHead->pEnd;
652 2
653 2 TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_ACK | TCP_RST);
654 2
655 2 MemFree(MemHead);
656 2 TCPAbort(pNewTCB);
657 2 return;
658 2 }
659 1
660 1 /*
661 1 * is it a expected packet?
662 1 */
663 1 /* first change all necessary part to host order */
664 1 #ifndef HOST_ORDER_AS_NET
pTCPHead->AckSeq = ntohl(pTCPHead->AckSeq);
pTCPHead->Seq = ntohl(pTCPHead->Seq);
pTCPHead->WndSize = ntohs(pTCPHead->WndSize);
#endif
669 1
670 1 /* if it is the first packet from him, don't check sequence.
671 1 in connection case: a syn or syn+ack packet. in listen case
672 1 : a syn packet. so pass all packet contain syn flag */
673 1 if((pTCPHead->flag & TCP_SYN) == 0)
674 1 {
C51 COMPILER V7.06 TCP 07/24/2007 16:32:43 PAGE 12
675 2 /* sequence ok? */
676 2 if(pTCB->SeqHis != pTCPHead->Seq)
677 2 {
678 3 /* if this a packet fall within rev window */
679 3 if(TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) > 0
680 3 && TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) < pTCB->WndMine)
681 3 {
682 4 /* write it to QExceedSeq for late receive */
683 4 TCPInsertQ(&(pTCB->QExceedSeq),MemHead,pTCPHead->Seq);
684 4 return;
685 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -