X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2FNetTest_Runner%2Ftcp.c;h=db2519d5ff29e15886a7992e0f6852cf5778d590;hb=d7dcea0e5a8df0f479e99f168a10b9a9535c7ad6;hp=0bf0a67f9b515617bd6f495d37ee52d6828bebf3;hpb=d2f1a4c62225533351551870cbe44d94a4ec4fab;p=tpg%2Facess2.git diff --git a/Tools/NetTest_Runner/tcp.c b/Tools/NetTest_Runner/tcp.c index 0bf0a67f..db2519d5 100644 --- a/Tools/NetTest_Runner/tcp.c +++ b/Tools/NetTest_Runner/tcp.c @@ -28,6 +28,9 @@ uint16_t TCP_int_GetPseudoHeader(int AF, const void *SrcAddr, const void *DstAdd phdr[8] = 0; phdr[9] = pctl; *(uint16_t*)(phdr+10) = htons(Len); + + //test_trace_hexdump("TCP IPv4 PHdr", phdr, sizeof(phdr)); + return IP_Checksum(IP_CHECKSUM_START, 12, phdr); } else { @@ -36,7 +39,12 @@ uint16_t TCP_int_GetPseudoHeader(int AF, const void *SrcAddr, const void *DstAdd } } -void TCP_Send(int IF, int AF, const void *IP, short sport, short dport, +void TCP_SendC(const tTCPConn *Conn, uint8_t flags, size_t data_len, const void *data) +{ + TCP_Send(Conn->IFNum, Conn->AF, Conn->RAddr, Conn->LPort, Conn->RPort, + Conn->LSeq, Conn->RSeq, flags, Conn->Window, data_len, data); +} +void TCP_Send(int IF, int AF, const void *IP, uint16_t sport, uint16_t dport, uint32_t seq, uint32_t ack, uint8_t flags, uint16_t window, size_t data_len, const void *data ) @@ -73,43 +81,53 @@ void TCP_SkipCheck_Seq(bool Skip) { gTCP_Skips.Seq = Skip; } -bool TCP_Pkt_Check(size_t len, const void *data, size_t *out_ofs, - int AF, const void *IP, short sport, short dport, + +bool TCP_Pkt_CheckC(size_t len, const void *data, size_t *out_ofs, size_t *len_out, + const tTCPConn *conn, uint8_t flags) +{ + return TCP_Pkt_Check(len, data, out_ofs, len_out, + conn->AF, conn->RAddr, conn->RPort, conn->LPort, conn->RSeq, conn->LSeq, flags + ); +} + +bool TCP_Pkt_Check(size_t len, const void *data, size_t *out_ofs, size_t *len_out, + int AF, const void *IP, uint16_t sport, uint16_t dport, uint32_t seq, uint32_t ack, uint8_t flags) { - size_t ofs; - if( !IP_Pkt_Check(len, data, &ofs, AF, IP, BLOB(HOST_IP), IPPROTO_TCP) ) + size_t ofs, rlen; + if( !IP_Pkt_Check(len, data, &ofs, &rlen, AF, IP, BLOB(HOST_IP), IPPROTO_TCP) ) return false; - // TODO: IP has its own length field, use that? tTCPHeader hdr; - TEST_ASSERT_REL(len - ofs, >=, sizeof(hdr)); + TEST_ASSERT_REL(rlen, >=, sizeof(hdr)); memcpy(&hdr, (char*)data + ofs, sizeof(hdr)); TEST_ASSERT_REL( hdr.DataOfs >> 4, >=, sizeof(hdr)/4 ); if( !gTCP_Skips.SPort ) TEST_ASSERT_REL( ntohs(hdr.SPort), ==, sport ); TEST_ASSERT_REL( ntohs(hdr.DPort), ==, dport ); - if( !gTCP_Skips.Seq ) TEST_ASSERT_REL( ntohl(hdr.Seq), ==, seq ); - if( !gTCP_Skips.Ack ) TEST_ASSERT_REL( ntohl(hdr.Ack), ==, ack ); TEST_ASSERT_REL( hdr.Flags, ==, flags); + if( !gTCP_Skips.Seq ) TEST_ASSERT_REL( ntohl(hdr.Seq), ==, seq ); + if( flags & TCP_ACK ) TEST_ASSERT_REL( ntohl(hdr.Ack), ==, ack ); uint16_t real_cksum = htons(hdr.Checksum); hdr.Checksum = 0; uint16_t calc_cksum; - calc_cksum = TCP_int_GetPseudoHeader(AF, IP, BLOB(HOST_IP), IPPROTO_TCP, len-ofs); + calc_cksum = TCP_int_GetPseudoHeader(AF, IP, BLOB(HOST_IP), IPPROTO_TCP, rlen); calc_cksum = IP_Checksum(calc_cksum, sizeof(hdr), &hdr); - calc_cksum = IP_Checksum(calc_cksum, len - ofs - sizeof(hdr), (char*)data+ofs+sizeof(hdr)); + calc_cksum = IP_Checksum(calc_cksum, rlen - sizeof(hdr), (char*)data+ofs+sizeof(hdr)); TEST_ASSERT_REL( real_cksum, ==, calc_cksum ); memset(&gTCP_Skips, 0, sizeof(gTCP_Skips)); *out_ofs = ofs + sizeof(hdr); + *len_out = rlen - sizeof(hdr); return true; } -uint32_t TCP_Pkt_GetSeq(size_t len, const void *data, int AF) { - size_t ofs; - IP_Pkt_Check(len, data, &ofs, AF, NULL, NULL, IPPROTO_TCP); +uint32_t TCP_Pkt_GetSeq(size_t len, const void *data, int AF) +{ + size_t ofs, rlen; + IP_Pkt_Check(len, data, &ofs, &rlen, AF, NULL, NULL, IPPROTO_TCP); tTCPHeader hdr; memcpy(&hdr, (char*)data + ofs, sizeof(hdr));