/*
 * INET                An implementation of the TCP/IP protocol suite for the LINUX
 *                operating system.  INET is implemented using the  BSD Socket
 *                interface as the means of communication with the user level.
 *
 *                Definitions for the ICMP protocol.
 *
 * Version:        @(#)icmp.h        1.0.3        04/28/93
 *
 * Author:        Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *                This program is free software; you can redistribute it and/or
 *                modify it under the terms of the GNU General Public License
 *                as published by the Free Software Foundation; either version
 *                2 of the License, or (at your option) any later version.
 */
#ifndef _LINUX_ICMP_H
#define        _LINUX_ICMP_H

#include <linux/types.h>

#define ICMP_ECHOREPLY                0        /* Echo Reply                        */
#define ICMP_DEST_UNREACH        3        /* Destination Unreachable        */
#define ICMP_SOURCE_QUENCH        4        /* Source Quench                */
#define ICMP_REDIRECT                5        /* Redirect (change route)        */
#define ICMP_ECHO                8        /* Echo Request                        */
#define ICMP_TIME_EXCEEDED        11        /* Time Exceeded                */
#define ICMP_PARAMETERPROB        12        /* Parameter Problem                */
#define ICMP_TIMESTAMP                13        /* Timestamp Request                */
#define ICMP_TIMESTAMPREPLY        14        /* Timestamp Reply                */
#define ICMP_INFO_REQUEST        15        /* Information Request                */
#define ICMP_INFO_REPLY                16        /* Information Reply                */
#define ICMP_ADDRESS                17        /* Address Mask Request                */
#define ICMP_ADDRESSREPLY        18        /* Address Mask Reply                */
#define NR_ICMP_TYPES                18


/* Codes for UNREACH. */
#define ICMP_NET_UNREACH        0        /* Network Unreachable                */
#define ICMP_HOST_UNREACH        1        /* Host Unreachable                */
#define ICMP_PROT_UNREACH        2        /* Protocol Unreachable                */
#define ICMP_PORT_UNREACH        3        /* Port Unreachable                */
#define ICMP_FRAG_NEEDED        4        /* Fragmentation Needed/DF set        */
#define ICMP_SR_FAILED                5        /* Source Route failed                */
#define ICMP_NET_UNKNOWN        6
#define ICMP_HOST_UNKNOWN        7
#define ICMP_HOST_ISOLATED        8
#define ICMP_NET_ANO                9
#define ICMP_HOST_ANO                10
#define ICMP_NET_UNR_TOS        11
#define ICMP_HOST_UNR_TOS        12
#define ICMP_PKT_FILTERED        13        /* Packet filtered */
#define ICMP_PREC_VIOLATION        14        /* Precedence violation */
#define ICMP_PREC_CUTOFF        15        /* Precedence cut off */
#define NR_ICMP_UNREACH                15        /* instead of hardcoding immediate value */

/* Codes for REDIRECT. */
#define ICMP_REDIR_NET                0        /* Redirect Net                        */
#define ICMP_REDIR_HOST                1        /* Redirect Host                */
#define ICMP_REDIR_NETTOS        2        /* Redirect Net for TOS                */
#define ICMP_REDIR_HOSTTOS        3        /* Redirect Host for TOS        */

/* Codes for TIME_EXCEEDED. */
#define ICMP_EXC_TTL                0        /* TTL count exceeded                */
#define ICMP_EXC_FRAGTIME        1        /* Fragment Reass time exceeded        */


struct icmphdr {
  __u8                type;
  __u8                code;
  __sum16        checksum;
  union {
        struct {
                __be16        id;
                __be16        sequence;
        } echo;
        __be32        gateway;
        struct {
                __be16        __unused;
                __be16        mtu;
        } frag;
  } un;
};


/*
 *        constants for (set|get)sockopt
 */

#define ICMP_FILTER                        1

struct icmp_filter {
        __u32                data;
};


#endif        /* _LINUX_ICMP_H */