diff options
Diffstat (limited to 'icmp.h')
-rw-r--r-- | icmp.h | 44 |
1 files changed, 44 insertions, 0 deletions
@@ -0,0 +1,44 @@ +#pragma once + +#include <stdint.h> + + +#define IP_HEADER_SIZE 40 + +#define MIN_MTU 576 +#define MAX_IP_PACKET_SIZE 65535 +#define MAX_DATAGRAM_SIZE (MAX_IP_PACKET_SIZE - IP_HEADER_SIZE) + +#define ICMP_PAYLOAD_OFFSET 8 + +struct __attribute__((packed)) icmp_echo { + uint8_t type; + uint8_t code; + uint16_t checksum; + uint16_t id; + uint16_t seqnum; + uint8_t payload[MAX_DATAGRAM_SIZE - ICMP_PAYLOAD_OFFSET]; +}; + +#define ICMP_MAX_PAYLOAD_LENGTH (MAX_DATAGRAM_SIZE - ICMP_PAYLOAD_OFFSET) +#define ICMP_SAFE_PAYLOAD_LENGTH (MIN_MTU - IP_HEADER_SIZE - ICMP_PAYLOAD_OFFSET) + + +struct icmp_reply { + const uint8_t *data; // points to internal buffer + size_t length; // length of 'data' + + int seqnum; +}; + +// Returns -1 on error with errno. +int icmp_open_socket(void); + +// Only actual IPv4 addresses allowed. Sends data in 'data' with length 'length', and +// returns pointer to internal buffer with reply data. Buffer is invalidated on next +// call to the function. +// Returns {.data=NULL} on error with errno. +struct icmp_reply icmp_communicate(int sock, const char *ip_address, int seqnum, const void *data, size_t length); + +// Returns -1 on error with errno. +int icmp_send_echo_reply(const char *ip_address, int id, int seqnum, const void *data, size_t length); |