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