6 #include "test.h" // TEST_ASSERT
19 } __attribute__((packed)) tTCPHeader;
22 void TCP_Send(int IF, int AF, const void *IP, short sport, short dport,
23 uint32_t seq, uint32_t ack, uint8_t flags, uint16_t window,
24 size_t data_len, const void *data
28 hdr.SPort = htons(sport);
29 hdr.DPort = htons(dport);
32 hdr.DataOfs = sizeof(hdr)/4;
34 hdr.Window = htons(window);
35 hdr.Checksum = htons(0);
36 hdr.UrgPtr = htons(0);
38 uint16_t checksum = IP_CHECKSUM_START;
39 checksum = IP_Checksum(checksum, sizeof(hdr), &hdr);
40 checksum = IP_Checksum(checksum, data_len, data);
41 hdr.Checksum = htons( checksum );
43 size_t buflens[] = {sizeof(hdr), data_len};
44 const void *bufs[] = {&hdr, data};
45 IP_Send(IF, AF, BLOB(HOST_IP), IP, IPPROTO_TCP, 2, buflens, bufs);
48 bool TCP_Pkt_Check(size_t len, const void *data, size_t *out_ofs, int AF, const void *IP, short sport, short dport,
52 if( !IP_Pkt_Check(len, data, &ofs, AF, IP, BLOB(HOST_IP), IPPROTO_TCP) )
56 TEST_ASSERT_REL(len - ofs, >=, sizeof(hdr));
57 memcpy(&hdr, (char*)data + ofs, sizeof(hdr));
59 TEST_ASSERT_REL( ntohs(hdr.SPort), ==, sport );
60 TEST_ASSERT_REL( ntohs(hdr.DPort), ==, dport );
61 // TODO: Checks on Seq/Ack
62 TEST_ASSERT_REL( hdr.Flags, ==, flags);
64 uint16_t real_cksum = htons(hdr.Checksum);
66 uint16_t calc_cksum = IP_CHECKSUM_START;
67 calc_cksum = IP_Checksum(calc_cksum, sizeof(hdr), &hdr);
68 calc_cksum = IP_Checksum(calc_cksum, len - ofs - sizeof(hdr), (char*)data+ofs+sizeof(hdr));
69 TEST_ASSERT_REL( real_cksum, ==, calc_cksum );
71 *out_ofs = ofs + sizeof(hdr);