#include #include "icmp.h" #include "internal/icmp_recv.h" #include "internal/icmp_packet.h" #include #include static void build_test_packet(uint8_t *buffer, size_t *len) { struct ip_header *ip; struct icmp_header *icmp; memset(buffer, 0, 64); ip = (struct ip_header *)buffer; ip->version_ihl = 0x45; ip->ttl = 64; ip->protocol = 1; inet_pton(AF_INET, "192.168.1.1", &ip->saddr); icmp = (struct icmp_header *)(buffer + 20); icmp->type = 0; icmp->code = 0; *len = 28; } Test(parse_packet, valid_packet) { uint8_t buffer[64]; size_t buffer_len; uint8_t type, code, ttl; struct in_addr src_addr; const void *payload; size_t payload_len, ip_hdr_len; int ret; build_test_packet(buffer, &buffer_len); ret = recv_parse_packet(buffer, buffer_len, &type, &code, &ttl, &src_addr, &payload, &payload_len, &ip_hdr_len); cr_assert_eq(ret, 0); cr_assert_eq(type, 0); cr_assert_eq(code, 0); cr_assert_eq(ttl, 64); cr_assert_eq(ip_hdr_len, 20); } Test(parse_packet, buffer_too_small) { uint8_t buffer[10]; uint8_t type, code, ttl; struct in_addr src_addr; const void *payload; size_t payload_len, ip_hdr_len; int ret; ret = recv_parse_packet(buffer, sizeof(buffer), &type, &code, &ttl, &src_addr, &payload, &payload_len, &ip_hdr_len); cr_assert_eq(ret, -1); } Test(parse_packet, invalid_ip_version) { uint8_t buffer[64]; uint8_t type, code, ttl; struct in_addr src_addr; const void *payload; size_t payload_len, ip_hdr_len; int ret; memset(buffer, 0, sizeof(buffer)); buffer[0] = 0x35; ret = recv_parse_packet(buffer, 40, &type, &code, &ttl, &src_addr, &payload, &payload_len, &ip_hdr_len); cr_assert_eq(ret, -1); }