/* * Copyright (c) 2009 Lukas Mejdrech * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup icmp * @{ */ /** @file * ICMP header definition. * Based on the RFC~792. */ #ifndef __NET_ICMP_HEADER_H__ #define __NET_ICMP_HEADER_H__ #include #include "../../include/in.h" #include "../../include/icmp_codes.h" /** ICMP header size in bytes. */ #define ICMP_HEADER_SIZE sizeof( icmp_header_t ) /** Type definition of the echo specific data. * @see icmp_echo */ typedef struct icmp_echo icmp_echo_t; /** Type definition of the echo specific data pointer. * @see icmp_echo */ typedef icmp_echo_t * icmp_echo_ref; /** Echo specific data. */ struct icmp_echo{ /** Message idintifier. */ icmp_param_t identifier; /** Message sequence number. */ icmp_param_t sequence_number; } __attribute__ ((packed)); /** Type definition of the internet control message header. * @see icmp_header */ typedef struct icmp_header icmp_header_t; /** Type definition of the internet control message header pointer. * @see icmp_header */ typedef icmp_header_t * icmp_header_ref; /** Internet control message header. */ struct icmp_header{ /** The type of the message. */ uint8_t type; /** The error code for the datagram reported by the ICMP message. * The interpretation is dependent on the message type. */ uint8_t code; /** The checksum is the 16-bit ones's complement of the one's complement sum of the ICMP message starting with the ICMP Type. * For computing the checksum, the checksum field should be zero. * If the checksum does not match the contents, the datagram is discarded. */ uint16_t checksum; /** Message specific data. */ union{ /** Echo specific data. */ icmp_echo_t echo; /** Proposed gateway value. */ in_addr_t gateway; /** Fragmentation needed specific data. */ struct{ /** Reserved field. * Must be zero. */ icmp_param_t reserved; /** Proposed MTU. */ icmp_param_t mtu; } frag; /** Parameter problem specific data. */ struct{ /** Problem pointer. */ icmp_param_t pointer; /** Reserved field. * Must be zero. */ icmp_param_t reserved; } param; } un; } __attribute__ ((packed)); #endif /** @} */