74 lines
1.7 KiB
C
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);
|
|
}
|