1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

Fix overall checksum calculation

This commit is contained in:
Matias Fontanini
2015-12-29 09:57:42 -03:00
parent afe778d03c
commit 67d31fd62c
7 changed files with 148 additions and 72 deletions

View File

@@ -51,6 +51,14 @@ TEST_F(TCPTest, ChecksumCheck) {
uint16_t checksum = tcp1.checksum();
PDU::serialization_type buffer = pkt1.serialize();
EXPECT_EQ(
TCP::serialization_type(
checksum_packet,
checksum_packet + sizeof(checksum_packet)
),
buffer
);
EthernetII pkt2(&buffer[0], (uint32_t)buffer.size());
const TCP &tcp2 = pkt2.rfind_pdu<TCP>();
EXPECT_EQ(checksum, tcp2.checksum());

View File

@@ -11,7 +11,8 @@ using namespace Tins;
class UDPTest : public testing::Test {
public:
static const uint8_t expected_packet[], checksum_packet[];
static const uint8_t expected_packet[], checksum_packet[],
checksum_packet2[];
void test_equals(const UDP& udp1, const UDP& udp2);
};
@@ -28,6 +29,20 @@ const uint8_t UDPTest::checksum_packet[] = {
98, 111, 111, 107, 3, 99, 111, 109, 0, 0, 1, 0, 1
};
const uint8_t UDPTest::checksum_packet2[] = {
0, 20, 165, 53, 119, 224, 44, 240, 238, 33, 128, 46, 8, 0, 69, 184, 0,
200, 9, 187, 0, 0, 63, 17, 107, 202, 192, 168, 6, 224, 198, 199, 118,
152, 217, 252, 192, 0, 0, 180, 250, 82, 128, 0, 0, 106, 86, 129, 110,
22, 2, 46, 39, 16, 0, 0, 7, 111, 0, 0, 34, 42, 86, 129, 110, 20, 0, 14,
255, 229, 0, 0, 8, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
};
void UDPTest::test_equals(const UDP& udp1, const UDP& udp2) {
EXPECT_EQ(udp1.dport(), udp2.dport());
@@ -49,14 +64,34 @@ TEST_F(UDPTest, ChecksumCheck) {
EthernetII pkt1(checksum_packet, sizeof(checksum_packet));
const UDP &udp1 = pkt1.rfind_pdu<UDP>();
uint16_t checksum = udp1.checksum();
PDU::serialization_type buffer = pkt1.serialize();
EXPECT_EQ(
UDP::serialization_type(
checksum_packet,
checksum_packet + sizeof(checksum_packet)
),
buffer
);
EthernetII pkt2(&buffer[0], (uint32_t)buffer.size());
const UDP &udp2 = pkt2.rfind_pdu<UDP>();
EXPECT_EQ(checksum, udp2.checksum());
EXPECT_EQ(udp1.checksum(), udp2.checksum());
}
TEST_F(UDPTest, ChecksumCheck2) {
EthernetII pkt(checksum_packet2, sizeof(checksum_packet2));
PDU::serialization_type buffer = pkt.serialize();
EXPECT_EQ(
UDP::serialization_type(
checksum_packet2,
checksum_packet2 + sizeof(checksum_packet2)
),
buffer
);
EXPECT_EQ(0xfa52, pkt.rfind_pdu<UDP>().checksum());
}
TEST_F(UDPTest, CopyConstructor) {
UDP udp1(expected_packet, sizeof(expected_packet));
UDP udp2(udp1);