Process the received TCP segments. @param[in] Nbuf Buffer that contains received a TCP segment without an IP header. @param[in] Src Source address of the segment, or the peer's IP address. @param[in] Dst Destination address of the segment, or the local end's IP address. @param[in] Version IP_VERSION_4 indicates IP4 stack. IP_VERSION_6 indica
| 742 | |
| 743 | **/ |
| 744 | INTN |
| 745 | TcpInput ( |
| 746 | IN NET_BUF *Nbuf, |
| 747 | IN EFI_IP_ADDRESS *Src, |
| 748 | IN EFI_IP_ADDRESS *Dst, |
| 749 | IN UINT8 Version |
| 750 | ) |
| 751 | { |
| 752 | TCP_CB *Tcb; |
| 753 | TCP_CB *Parent; |
| 754 | TCP_OPTION Option; |
| 755 | TCP_HEAD *Head; |
| 756 | INT32 Len; |
| 757 | TCP_SEG *Seg; |
| 758 | TCP_SEQNO Right; |
| 759 | TCP_SEQNO Urg; |
| 760 | UINT16 Checksum; |
| 761 | INT32 Usable; |
| 762 | |
| 763 | ASSERT ((Version == IP_VERSION_4) || (Version == IP_VERSION_6)); |
| 764 | |
| 765 | NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); |
| 766 | |
| 767 | Parent = NULL; |
| 768 | Tcb = NULL; |
| 769 | |
| 770 | Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); |
| 771 | ASSERT (Head != NULL); |
| 772 | |
| 773 | if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { |
| 774 | DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); |
| 775 | goto DISCARD; |
| 776 | } |
| 777 | |
| 778 | Len = Nbuf->TotalSize - (Head->HeadLen << 2); |
| 779 | |
| 780 | if ((Head->HeadLen < 5) || (Len < 0)) { |
| 781 | |
| 782 | DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); |
| 783 | |
| 784 | goto DISCARD; |
| 785 | } |
| 786 | |
| 787 | if (Version == IP_VERSION_4) { |
| 788 | Checksum = NetPseudoHeadChecksum (Src->Addr[0], Dst->Addr[0], 6, 0); |
| 789 | } else { |
| 790 | Checksum = NetIp6PseudoHeadChecksum (&Src->v6, &Dst->v6, 6, 0); |
| 791 | } |
| 792 | |
| 793 | Checksum = TcpChecksum (Nbuf, Checksum); |
| 794 | |
| 795 | if (Checksum != 0) { |
| 796 | DEBUG ((EFI_D_ERROR, "TcpInput: received a checksum error packet\n")); |
| 797 | goto DISCARD; |
| 798 | } |
| 799 | |
| 800 | if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) { |
| 801 | Len++; |
no test coverage detected