#include "internal/icmp_packet_internal.h" #include "internal/icmp_packet.h" #include "internal/icmp_utils.h" #include #include #include /* Forward declarations */ static void write_icmp_header(struct icmp_header *hdr, uint8_t type, uint8_t code, uint32_t header_rest); /* -------------------- */ int icmp_build_packet(void *buffer, size_t buffer_len, uint8_t type, uint8_t code, uint32_t header_rest, const void *payload, size_t payload_len) { const size_t required_len = sizeof(struct icmp_header) + payload_len; if (buffer_len < required_len) return -1; struct icmp_header *h = (struct icmp_header *)buffer; write_icmp_header(h, type, code, header_rest); if (payload_len > 0) memcpy((uint8_t *)buffer + sizeof(struct icmp_header), payload, payload_len); h->checksum = htons(icmp_checksum(h, required_len)); return (int)required_len; } static void write_icmp_header(struct icmp_header *hdr, uint8_t type, uint8_t code, uint32_t header_rest) { hdr->type = type; hdr->code = code; hdr->checksum = 0; // will be computed later hdr->un.gateway = header_rest; }