libicmp/tests/recv/test_parse_packet.c
2026-01-26 20:14:24 +01:00

74 lines
1.7 KiB
C

#include <criterion/criterion.h>
#include "icmp.h"
#include "internal/icmp_recv.h"
#include "internal/icmp_packet.h"
#include <arpa/inet.h>
#include <string.h>
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);
}