/*
 * 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 types and codes according to the on-line IANA - ICMP Type Numbers - <http://http://www.iana.org/assignments/icmp-parameters>, cited September 14 2009.
 *  Names according to the linux src/include/linux/icmp.h header file.
 */

#ifndef __NET_ICMP_CODES_H__
#define __NET_ICMP_CODES_H__

/** ICMP type type definition.
 */
typedef uint8_t	icmp_type_t;

/** ICMP code type definition.
 */
typedef uint8_t	icmp_code_t;

/** ICMP parameter type definition.
 */
typedef uint16_t	icmp_param_t;

/** @name ICMP types definitions
 */
/*@{*/

/** Echo Reply.
 */
#define ICMP_ECHOREPLY		0

/** Destination Unreachable.
 */
#define ICMP_DEST_UNREACH	3

/** Source Quench.
 */
#define ICMP_SOURCE_QUENCH	4

/** Redirect.
 */
#define ICMP_REDIRECT		5

/** Alternate Host Address.
 */
#define ICMP_ALTERNATE_ADDR	6

/** Echo Request.
 */
#define ICMP_ECHO			8

/** Router Advertisement.
 */
#define ICMP_ROUTER_ADV		9

/** Router solicitation.
 */
#define ICMP_ROUTER_SOL		10

/** Time Exceeded.
 */
#define ICMP_TIME_EXCEEDED	11

/** Parameter Problem.
 */
#define ICMP_PARAMETERPROB	12

/** Timestamp Request.
 */
#define ICMP_TIMESTAMP		13

/** Timestamp Reply.
 */
#define ICMP_TIMESTAMPREPLY	14

/** Information Request.
 */
#define ICMP_INFO_REQUEST	15

/** Information Reply.
 */
#define ICMP_INFO_REPLY		16

/** Address Mask Request.
 */
#define ICMP_ADDRESS		17

/** Address Mask Reply.
 */
#define ICMP_ADDRESSREPLY	18

/** Traceroute.
 */
#define ICMP_TRACEROUTE		30

/** Datagram Conversion Error.
 */
#define ICMP_CONVERSION_ERROR	31

/** Mobile Host Redirect.
 */
#define ICMP_REDIRECT_MOBILE	32

/** IPv6 Where-Are-You.
 */
#define ICMP_IPV6_WHERE_ARE_YOU	33

/** IPv6 I-Am-Here.
 */
#define ICMP_IPV6_I_AM_HERE	34

/** Mobile Registration Request.
 */
#define ICMP_MOBILE_REQUEST	35

/** Mobile Registration Reply.
 */
#define ICMP_MOBILE_REPLY	36

/** Domain name request.
 */
#define ICMP_DN_REQUEST		37

/** Domain name reply.
 */
#define ICMP_DN_REPLY		38

/** SKIP.
 */
#define ICMP_SKIP			39

/** Photuris.
 */
#define ICMP_PHOTURIS		40

/*@}*/

/** @name ICMP_DEST_UNREACH codes definitions
 */
/*@{*/

/** Network Unreachable.
 */
#define ICMP_NET_UNREACH	0

/** Host Unreachable.
 */
#define ICMP_HOST_UNREACH	1

/** Protocol Unreachable.
 */
#define ICMP_PROT_UNREACH	2

/** Port Unreachable.
 */
#define ICMP_PORT_UNREACH	3

/** Fragmentation needed but the Do Not Fragment bit was set.
 */
#define ICMP_FRAG_NEEDED	4

/** Source Route failed.
 */
#define ICMP_SR_FAILED		5

/** Destination network unknown.
 */
#define ICMP_NET_UNKNOWN	6

/** Destination host unknown.
 */
#define ICMP_HOST_UNKNOWN	7

/** Source host isolated (obsolete).
 */
#define ICMP_HOST_ISOLATED	8

/** Destination network administratively prohibited.
 */
#define ICMP_NET_ANO		9

/** Destination host administratively prohibited.
 */
#define ICMP_HOST_ANO		10

/** Network unreachable for this type of service.
 */
#define ICMP_NET_UNR_TOS	11

/** Host unreachable for this type of service.
 */
#define ICMP_HOST_UNR_TOS	12

/** Communication administratively prohibited by filtering.
 */
#define ICMP_PKT_FILTERED	13

/** Host precedence violation.
 */
#define ICMP_PREC_VIOLATION	14

/** Precedence cutoff in effect.
 */
#define ICMP_PREC_CUTOFF	15

/*@}*/

/** @name ICMP_REDIRECT codes definitions
 */
/*@{*/

/** Network redirect (or subnet).
 */
#define ICMP_REDIR_NET		0

/** Host redirect.
 */
#define ICMP_REDIR_HOST		1

/** Network redirect for this type of service.
 */
#define ICMP_REDIR_NETTOS	2

/** Host redirect for this type of service.
 */
#define ICMP_REDIR_HOSTTOS	3

/*@}*/

/** @name ICMP_ALTERNATE_ADDRESS codes definitions
 */
/*@{*/

/** Alternate address for host.
 */
#define ICMP_ALTERNATE_HOST	0

/*@}*/

/** @name ICMP_TIME_EXCEEDED codes definitions
 */
/*@{*/

/** Transit TTL exceeded.
 */
#define ICMP_EXC_TTL		0

/** Reassembly TTL exceeded.
 */
#define ICMP_EXC_FRAGTIME	1

/*@}*/

/** @name ICMP_ROUTER_ADV codes definitions
 */
/*@{*/

/** Normal router advertisement.
 */
#define ICMP_ROUTER_NORMAL	0

/** Does not route common traffic.
 */
#define ICMP_ROUTER_NO_NORMAL_TRAFFIC	16

/*@}*/

/** @name ICMP_TIME_EXCEEDED codes definitions
 */
/*@{*/

/** Transit TTL exceeded.
 */
#define ICMP_EXC_TTL		0

/** Reassembly TTL exceeded.
 */
#define ICMP_EXC_FRAGTIME	1

/*@}*/

/** @name ICMP_PARAMETERPROB codes definitions
 */
/*@{*/

/** Pointer indicates the error.
 */
#define ICMP_PARAM_POINTER	0

/** Missing required option.
 */
#define ICMP_PARAM_MISSING	1

/** Bad length.
 */
#define ICMP_PARAM_LENGTH	2

/*@}*/

/** @name ICMP_PHOTURIS codes definitions
 */
/*@{*/

/** Bad SPI.
 */
#define ICMP_PHOTURIS_BAD_SPI	0

/** Authentication failed.
 */
#define ICMP_PHOTURIS_AUTHENTICATION	1

/** Decompression failed.
 */
#define ICMP_PHOTURIS_DECOMPRESSION		2

/** Decryption failed.
 */
#define ICMP_PHOTURIS_DECRYPTION	3

/** Need authentication.
 */
#define ICMP_PHOTURIS_NEED_AUTHENTICATION	4

/** Need authorization.
 */
#define ICMP_PHOTURIS_NEED_AUTHORIZATION	5

/*@}*/

#endif

/** @}
 */
