mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
236 lines
7.5 KiB
C
236 lines
7.5 KiB
C
/*
|
|
* Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup net_icmpv6 ICMPV6
|
|
* @ingroup net_ipv6
|
|
* @brief Provides types related to ICMPv6
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443">
|
|
* RFC 4443
|
|
* </a>
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief ICMPv6 type and function definitions
|
|
*
|
|
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
|
|
*/
|
|
#ifndef NET_ICMPV6_H
|
|
#define NET_ICMPV6_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "byteorder.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @{
|
|
* @name Error message types
|
|
* @see <a href="http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml#icmpv6-parameters-2">
|
|
* IANA, ICMPv6 "type" Numbers
|
|
* </a>
|
|
*/
|
|
#define ICMPV6_DST_UNR (1) /**< Destination unreachable message */
|
|
#define ICMPV6_PKT_TOO_BIG (2) /**< Packet Too Big message */
|
|
#define ICMPV6_TIME_EXC (3) /**< Time Exceeded message */
|
|
#define ICMPV6_PARAM_PROB (4) /**< Parameter Problem message */
|
|
#define ICMPV6_ERR_EXP1 (100) /**< message type for private experimentation */
|
|
#define ICMPV6_ERR_EXP2 (101) /**< message type for private experimentation */
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @{
|
|
* @name Informational message types
|
|
* @see <a href="http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml#icmpv6-parameters-2">
|
|
* IANA, ICMPv6 "type" Numbers
|
|
* </a>
|
|
*/
|
|
#define ICMPV6_ECHO_REQ (128) /**< Echo request message (ping) */
|
|
#define ICMPV6_ECHO_REP (129) /**< Echo reply message (pong) */
|
|
#define ICMPV6_RTR_SOL (133) /**< NDP router solicitation message */
|
|
#define ICMPV6_RTR_ADV (134) /**< NDP router advertisement message */
|
|
#define ICMPV6_NBR_SOL (135) /**< NDP neighbor solicitation message */
|
|
#define ICMPV6_NBR_ADV (136) /**< NDP neighbor advertisement message */
|
|
#define ICMPV6_REDIRECT (137) /**< NDP redirect message */
|
|
#define ICMPV6_RPL_CTRL (155) /**< RPL control message */
|
|
#define ICMPV6_DAR (157) /**< Duplicate address request */
|
|
#define ICMPV6_DAC (158) /**< Duplicate address confirmation */
|
|
#define ICMPV6_INF_EXP1 (200) /**< message type for private experimentation */
|
|
#define ICMPV6_INF_EXP2 (201) /**< message type for private experimentation */
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @{
|
|
* @name Codes for destination unreachable messages
|
|
*
|
|
* @anchor net_icmpv6_error_dst_unr_codes
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.1">
|
|
* RFC 4443, section 3.1
|
|
* </a>
|
|
*/
|
|
#define ICMPV6_ERROR_DST_UNR_NO_ROUTE (0) /**< no route to destination */
|
|
#define ICMPV6_ERROR_DST_UNR_PROHIB (1) /**< communication with
|
|
* destination administratively
|
|
* prohibited */
|
|
#define ICMPV6_ERROR_DST_UNR_SCOPE (2) /**< beyond scope of source address */
|
|
#define ICMPV6_ERROR_DST_UNR_ADDR (3) /**< address unreachable */
|
|
#define ICMPV6_ERROR_DST_UNR_PORT (4) /**< port unreachable */
|
|
#define ICMPV6_ERROR_DST_UNR_POLICY (5) /**< source address failed ingress/egress
|
|
* policy */
|
|
#define ICMPV6_ERROR_DST_UNR_REJECT (6) /**< reject route to destination */
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @{
|
|
* @name Codes for time exceeded messages
|
|
*
|
|
* @anchor net_icmpv6_error_time_exc_codes
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.3">
|
|
* RFC 4443, section 3.3
|
|
* </a>
|
|
*/
|
|
#define ICMPV6_ERROR_TIME_EXC_HL (0) /**< hop limit exceeded in transit */
|
|
#define ICMPV6_ERROR_TIME_EXC_FRAG (1) /**< fragment reassembly time exceeded */
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @{
|
|
* @name Codes for parameter problem messages
|
|
*
|
|
* @anchor net_icmpv6_error_param_prob_codes
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.4">
|
|
* RFC 4443, section 3.4
|
|
* </a>
|
|
*/
|
|
#define ICMPV6_ERROR_PARAM_PROB_HDR_FIELD (0) /**< erroneous header field
|
|
* encountered */
|
|
#define ICMPV6_ERROR_PARAM_PROB_NH (1) /**< unrecognized next header
|
|
* field encountered */
|
|
#define ICMPV6_ERROR_PARAM_PROB_OPT (2) /**< unrecognized IPv6 option
|
|
* field encountered */
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @brief General ICMPv6 message format.
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-2.1">
|
|
* RFC 4443, section 2.1
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
} icmpv6_hdr_t;
|
|
|
|
/**
|
|
* @brief Destination unreachable message format.
|
|
* @extends icmpv6_hdr_t
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.1">
|
|
* RFC 4443, section 3.1
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
network_uint32_t unused; /**< unused field */
|
|
} icmpv6_error_dst_unr_t;
|
|
|
|
/**
|
|
* @brief Packet too big message format.
|
|
* @extends icmpv6_hdr_t
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.2">
|
|
* RFC 4443, section 3.2
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
network_uint32_t mtu; /**< MTU */
|
|
} icmpv6_error_pkt_too_big_t;
|
|
|
|
/**
|
|
* @brief Time exceeded message format.
|
|
* @extends icmpv6_hdr_t
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.3">
|
|
* RFC 4443, section 3.3
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
network_uint32_t unused; /**< unused field */
|
|
} icmpv6_error_time_exc_t;
|
|
|
|
/**
|
|
* @brief Parameter problem message format.
|
|
* @extends icmpv6_hdr_t
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-3.4">
|
|
* RFC 4443, section 3.3
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
network_uint32_t ptr; /**< pointer */
|
|
} icmpv6_error_param_prob_t;
|
|
|
|
/**
|
|
* @brief Echo request and response message format.
|
|
* @extends icmpv6_hdr_t
|
|
*
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.1">
|
|
* RFC 4443, section 4.1
|
|
* </a>
|
|
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.2">
|
|
* RFC 4443, section 4.2
|
|
* </a>
|
|
*/
|
|
typedef struct __attribute__((packed)) {
|
|
uint8_t type; /**< message type */
|
|
uint8_t code; /**< message code */
|
|
network_uint16_t csum; /**< checksum */
|
|
network_uint16_t id; /**< identifier */
|
|
network_uint16_t seq; /**< Sequence number */
|
|
} icmpv6_echo_t;
|
|
|
|
/**
|
|
* @brief Print the given ICMPv6 header to STDOUT
|
|
*
|
|
* @param[in] hdr ICMPv6 header to print
|
|
*/
|
|
void icmpv6_hdr_print(icmpv6_hdr_t *hdr);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* NET_ICMPV6_H */
|
|
/** @} */
|