#include "checksum.h"
#include "ethernet.h"
#include "icmp.h"
#include "ip.h"
#include "macros.h"
#include "nethelp.h"
/**
* @brief send an ICMP packet
* @param[in] ptr pointer to data of packet
* @param[in] sz size of packet
*
* ptr must point to a icmp_packet
* with icmp_hdr.type, icmp_hdr.code and ip_hdr.sest already initialized
*/
static void icmp_send(void *ptr, unsigned int sz)
{
struct icmp_packet *icmp_pack;
unsigned short chk;
// packet too short
if (sz < sizeof(struct icmp_packet))
return;
icmp_pack = ptr;
// fill in header values
icmp_pack->icmp_hdr.chk = 0x0000;
// generate checksum
chk = checksum(&icmp_pack->icmp_hdr,
sz - sizeof(struct ethernet_header)
- sizeof(struct ip_header),
0x0000, 0x0000);
icmp_pack->icmp_hdr.chk = htons(chk);
// send ICMP packet
icmp_pack->ip_hdr.proto = 0x01; // ICMP
ip_send(icmp_pack, sz);
}
/**
* @brief process a received ICMP echo request packet
* @param[in] ptr pointer to data of packet
* @param[in] sz size of packet
*/
static void icmp_echo_req_recv(void *ptr, unsigned int sz)
{
struct icmp_echo_packet *icmp_echo_pack;
// packet too short