📄 tinytcp.lst
字号:
525 2
526 2 if ( diff == 0 || diff == s->dataSize ) {
527 3 s->state = tcp_StateFINWT2;
528 3 s->flags = tcp_FlagACK;
529 3 s->seqnum += (diff+1);
530 3 s->dataSize -= diff;
531 3 #ifdef DEBUG
print("finack received.\r\n");
#endif
534 3 }
535 2
536 2 tcp_ProcessData(s, tp, len);
537 2 break;
538 2
539 2 case tcp_StateFINWT2:
540 2 s->flags = tcp_FlagACK;
541 2 tcp_ProcessData(s, tp, len);
542 2 break;
C51 COMPILER V7.07 TINYTCP 04/20/2004 18:04:42 PAGE 10
543 2
544 2 case tcp_StateCLOSING:
545 2 if ( tp->acknum == (s->seqnum + 1) ) {
546 3 s->state = tcp_StateTIMEWT;
547 3 s->timeout = tcp_TIMEOUT;
548 3 }
549 2 break;
550 2
551 2 case tcp_StateLASTACK:
552 2 if ( tp->acknum == (s->seqnum + 1) ) {
553 3 s->state = tcp_StateCLOSED;
554 3 s->unhappy = false;
555 3 s->dataSize = 0;
556 3 // s->dataHandler((tcp_Socket *)s,(BYTE *)0, (WORD *)0);
557 3 DATAHANDLER((tcp_Socket *)s,(BYTE *)0,0);
558 3 tcp_Unthread(s);
559 3 #ifdef DEBUG
print("Closed. \r\n");
#endif
562 3 } else {
563 3 s->flags = tcp_FlagACK | tcp_FlagFIN;
564 3 tcp_Send(s);
565 3 s->timeout = tcp_TIMEOUT;
566 3 #ifdef DEBUG
print("retransmitting FIN\r\n");
#endif
569 3 }
570 2 break;
571 2
572 2 case tcp_StateTIMEWT:
573 2 s->flags = tcp_FlagACK;
574 2 tcp_Send(s);
575 2 }
576 1 }
*** WARNING C280 IN LINE 383 OF SRC\TINYTCP.C: 'dp': unreferenced local variable
*** WARNING C280 IN LINE 384 OF SRC\TINYTCP.C: 'x': unreferenced local variable
577
578 /*
579 * Process the data in an incoming packet.
580 * Called from all states where incoming data can be received: established,
581 * fin-wait-1, fin-wait-2
582 */
583 void tcp_ProcessData(tcp_Socket *s, tcp_Header *tp, WORD len)
584 {
585 1 short diff, x;
586 1 WORD flags;
587 1 BYTE *dp;
588 1
589 1 flags = tp->flags;
590 1 diff = s->acknum - tp->seqnum;
591 1 if ( flags & tcp_FlagSYN ) diff--;
592 1 x = tcp_GetDataOffset(tp) << 2; /* x = hdrlen in bytes */
593 1 dp = (BYTE *)tp + x; /* get first pointer of data */
594 1 len -= x; /* len is data length now */
595 1 if ( diff >= 0 ) {
596 2 dp += diff;
597 2 len -= diff;
598 2 s->acknum += len;
599 2 // s->dataHandler((tcp_Socket *)s,(BYTE *)dp, (WORD *)len);
600 2 DATAHANDLER((tcp_Socket *)s,(BYTE *)dp,len);
601 2 if ( flags & tcp_FlagFIN ) {
602 3 s->acknum++;
C51 COMPILER V7.07 TINYTCP 04/20/2004 18:04:42 PAGE 11
603 3 #ifdef DEBUG
print("consumed fin.\r\n");
#endif
606 3 switch(s->state) {
607 4 case tcp_StateESTAB:
608 4 /* note: skip state CLOSEWT by automatically closing conn */
609 4 x = tcp_StateLASTACK;
610 4 s->flags |= tcp_FlagFIN;
611 4 s->unhappy = true;
612 4 #ifdef DEBUG
print("fin on estab.\r\n");
#endif
615 4 break;
616 4 case tcp_StateFINWT1:
617 4 x = tcp_StateCLOSING;
618 4 break;
619 4 case tcp_StateFINWT2:
620 4 x = tcp_StateTIMEWT;
621 4 break;
622 4 }
623 3 s->state = x;
624 3 }
625 2 }
626 1 s->timeout = tcp_TIMEOUT;
627 1 tcp_Send(s);
628 1 }
629
630 /*
631 * Format and send an outgoing segment
632 */
633 void tcp_Send(tcp_Socket *s)
634 {
635 1 tcp_PseudoHeader ph;
636 1 struct _pkt {
637 1 in_Header in;
638 1 tcp_Header tcp;
639 1 DWORD maxsegopt;
640 1 } *pkt;
641 1 BYTE *dp;
642 1
643 1 pkt = (struct _pkt *)sed_FormatPacket(&s->hisethaddr[0], 0x800);
644 1 dp = (BYTE *)&pkt->maxsegopt;
645 1
646 1 pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header) + s->dataSize;
647 1
648 1 /* tcp header */
649 1 pkt->tcp.srcPort = s->myport;
650 1 pkt->tcp.dstPort = s->hisport;
651 1 pkt->tcp.seqnum = s->seqnum;
652 1 pkt->tcp.acknum = s->acknum;
653 1 pkt->tcp.window = 1024;
654 1 pkt->tcp.flags = s->flags | 0x5000; /* Header length = 20bytes ;; no option */
655 1 pkt->tcp.checksum = 0;
656 1 pkt->tcp.urgentPointer = 0;
657 1 if ( s->flags & tcp_FlagSYN ) {
658 2 pkt->tcp.flags += 0x1000;
659 2 pkt->in.length += 4;
660 2 pkt->maxsegopt = 0x02040578; /* 1400 bytes */
661 2 dp += 4;
662 2 }
663 1 Move(s->datas, dp, s->dataSize); /* copy data to pointer which is next to tcp header */
664 1
C51 COMPILER V7.07 TINYTCP 04/20/2004 18:04:42 PAGE 12
665 1 /* internet header */
666 1 pkt->in.vht = 0x4500; /* version 4, hdrlen 5, tos 0 */
667 1 pkt->in.identification = tcp_id++;
668 1 pkt->in.frag = 0;
669 1 pkt->in.ttlProtocol = (250<<8) + 6;
670 1 pkt->in.checksum = 0;
671 1 pkt->in.source = sin_lclINAddr;
672 1 pkt->in.destination = s->hisaddr;
673 1 pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header)));
674 1
675 1 /* compute tcp checksum */
676 1 ph.src = pkt->in.source;
677 1 ph.dst = pkt->in.destination;
678 1 ph.mbz = 0;
679 1 ph.protocol = 6;
680 1 ph.length = pkt->in.length - sizeof(in_Header);
681 1 ph.checksum = checksum((WORD *)&pkt->tcp, ph.length);
682 1 pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph);
683 1
684 1 sed_Send(pkt->in.length);
685 1 }
686
687 /*
688 * Format and send an outgoing reset segment
689 */
690 void tcp_Reset( in_Header *ip, tcp_Header *tp )
691 {
692 1 tcp_PseudoHeader ph;
693 1 struct _pkt {
694 1 in_Header in;
695 1 tcp_Header tcp;
696 1 DWORD maxsegopt;
697 1 } *pkt;
698 1
699 1 pkt = (struct _pkt *)sed_FormatPacket(&(((eth_Header *)ip)-1)->source[0], 0x800);
700 1 pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header);
701 1
702 1 /* tcp header */
703 1 pkt->tcp.srcPort = tp->dstPort;
704 1 pkt->tcp.dstPort = tp->srcPort;
705 1 pkt->tcp.seqnum = tp->seqnum;
706 1 pkt->tcp.acknum = tp->acknum;
707 1 pkt->tcp.window = 1024;
708 1 pkt->tcp.flags = tcp_FlagRST | 0x5000; /* Header length = 20bytes ;; no option */
709 1 pkt->tcp.checksum = 0;
710 1 pkt->tcp.urgentPointer = 0;
711 1
712 1 /* internet header */
713 1 pkt->in.vht = 0x4500; /* version 4, hdrlen 5, tos 0 */
714 1 pkt->in.identification = tcp_id++;
715 1 pkt->in.frag = 0;
716 1 pkt->in.ttlProtocol = (250<<8) + 6;
717 1 pkt->in.checksum = 0;
718 1 pkt->in.source = sin_lclINAddr;
719 1 pkt->in.destination = ip->source;
720 1 pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header)));
721 1
722 1 /* compute tcp checksum */
723 1 ph.src = pkt->in.source;
724 1 ph.dst = pkt->in.destination;
725 1 ph.mbz = 0;
726 1 ph.protocol = 6;
C51 COMPILER V7.07 TINYTCP 04/20/2004 18:04:42 PAGE 13
727 1 ph.length = pkt->in.length - sizeof(in_Header);
728 1 ph.checksum = checksum((WORD *)&pkt->tcp, ph.length);
729 1 pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph);
730 1
731 1 sed_Send(pkt->in.length);
732 1 }
733
734 /*
735 * Do a one's complement checksum
736 */
737 int checksum(WORD *dp, WORD length)
738 {
739 1 WORD len;
740 1 DWORD sum;
741 1
742 1 len = length >> 1;
743 1 sum = 0;
744 1 while ( len-- > 0 ) sum += *dp++;
745 1 if ( length & 1 ) sum += (*dp & 0xFF00);
746 1 sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);
747 1 sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);
748 1
749 1 return ( sum );
750 1 }
751
752
753 /* Dump the tcp protocol header of a packet */
754 #ifdef DEBUG
void tcp_DumpHeader( in_Header *ip, tcp_Header *tp, BYTE *mesg )
{
return;
/*
tcp_Header *tp = (tcp_Header *)((BYTE *)ip + in_GetHdrlenBytes(ip));
static char *flags[] = { "FIN", "SYN", "RST", "PUSH", "ACK", "URG" };
int len;
WORD f;
len = ip->length - ((tcp_GetDataOffset(tp) + in_GetHdrlen(ip)) << 2);
printf("TCP: %s packet:\r\nS: %x; D: %x; SN=%x ACK=%x W=%d DLen=%d\r\n",
mesg, tp->srcPort, tp->dstPort, tp->seqnum, tp->acknum,
tp->window, len);
printf("DO=%d, C=%x U=%d",
tcp_GetDataOffset(tp), tp->checksum, tp->urgentPointer);
f = tp->flags;
for ( len = 0; len < 6; len++ )
if ( f & (1 << len) ) printf(" %s", flags[len]);
printf("\r\n");
*/
}
#endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4363 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 141
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 8 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -