6 #include "test.h" // TEST_ASSERT
19 } __attribute__((packed)) tTCPHeader;
22 uint16_t TCP_int_GetPseudoHeader(int AF, const void *SrcAddr, const void *DstAddr, uint8_t pctl, size_t Len)
26 memcpy(phdr+0, SrcAddr, 4);
27 memcpy(phdr+4, DstAddr, 4);
30 *(uint16_t*)(phdr+10) = htons(Len);
31 return IP_Checksum(IP_CHECKSUM_START, 12, phdr);
34 TEST_WARN("TCP unknown AF %i", AF);
39 void TCP_Send(int IF, int AF, const void *IP, short sport, short dport,
40 uint32_t seq, uint32_t ack, uint8_t flags, uint16_t window,
41 size_t data_len, const void *data
45 hdr.SPort = htons(sport);
46 hdr.DPort = htons(dport);
49 hdr.DataOfs = (sizeof(hdr)/4) << 4;
51 hdr.Window = htons(window);
52 hdr.Checksum = htons(0);
53 hdr.UrgPtr = htons(0);
56 checksum = TCP_int_GetPseudoHeader(AF, BLOB(HOST_IP), IP, IPPROTO_TCP, sizeof(hdr)+data_len);
57 checksum = IP_Checksum(checksum, sizeof(hdr), &hdr);
58 checksum = IP_Checksum(checksum, data_len, data);
59 hdr.Checksum = htons( checksum );
61 size_t buflens[] = {sizeof(hdr), data_len};
62 const void *bufs[] = {&hdr, data};
63 IP_Send(IF, AF, BLOB(HOST_IP), IP, IPPROTO_TCP, 2, buflens, bufs);
72 void TCP_SkipCheck_Seq(bool Skip) {
73 gTCP_Skips.Seq = Skip;
76 bool TCP_Pkt_Check(size_t len, const void *data, size_t *out_ofs,
77 int AF, const void *IP, short sport, short dport,
78 uint32_t seq, uint32_t ack, uint8_t flags)
81 if( !IP_Pkt_Check(len, data, &ofs, AF, IP, BLOB(HOST_IP), IPPROTO_TCP) )
83 // TODO: IP has its own length field, use that?
86 TEST_ASSERT_REL(len - ofs, >=, sizeof(hdr));
87 memcpy(&hdr, (char*)data + ofs, sizeof(hdr));
89 TEST_ASSERT_REL( hdr.DataOfs >> 4, >=, sizeof(hdr)/4 );
90 if( !gTCP_Skips.SPort ) TEST_ASSERT_REL( ntohs(hdr.SPort), ==, sport );
91 TEST_ASSERT_REL( ntohs(hdr.DPort), ==, dport );
92 if( !gTCP_Skips.Seq ) TEST_ASSERT_REL( ntohl(hdr.Seq), ==, seq );
93 if( !gTCP_Skips.Ack ) TEST_ASSERT_REL( ntohl(hdr.Ack), ==, ack );
94 TEST_ASSERT_REL( hdr.Flags, ==, flags);
96 uint16_t real_cksum = htons(hdr.Checksum);
99 calc_cksum = TCP_int_GetPseudoHeader(AF, IP, BLOB(HOST_IP), IPPROTO_TCP, len-ofs);
100 calc_cksum = IP_Checksum(calc_cksum, sizeof(hdr), &hdr);
101 calc_cksum = IP_Checksum(calc_cksum, len - ofs - sizeof(hdr), (char*)data+ofs+sizeof(hdr));
102 TEST_ASSERT_REL( real_cksum, ==, calc_cksum );
104 memset(&gTCP_Skips, 0, sizeof(gTCP_Skips));
106 *out_ofs = ofs + sizeof(hdr);
110 uint32_t TCP_Pkt_GetSeq(size_t len, const void *data, int AF) {
112 IP_Pkt_Check(len, data, &ofs, AF, NULL, NULL, IPPROTO_TCP);
115 memcpy(&hdr, (char*)data + ofs, sizeof(hdr));
116 return ntohl(hdr.Seq);