Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers icmpv6.h Source File

icmpv6.h

00001 /*
00002  * Copyright (c) 2013-2018, Arm Limited and affiliates.
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 #ifndef _ICMPV6_H
00018 #define _ICMPV6_H
00019 #include "Common_Protocols/icmpv6_prefix.h"
00020 
00021 #define ICMPV6_TYPE_ERROR_DESTINATION_UNREACH       1
00022 #define ICMPV6_TYPE_ERROR_PACKET_TOO_BIG            2
00023 #define ICMPV6_TYPE_ERROR_TIME_EXCEEDED             3
00024 #define ICMPV6_TYPE_ERROR_PARAMETER_PROBLEM         4
00025 
00026 #define ICMPV6_TYPE_INFO_ECHO_REQUEST               128
00027 #define ICMPV6_TYPE_INFO_ECHO_REPLY                 129
00028 #define ICMPV6_TYPE_INFO_MCAST_LIST_QUERY           130
00029 #define ICMPV6_TYPE_INFO_MCAST_LIST_REPORT          131
00030 #define ICMPV6_TYPE_INFO_MCAST_LIST_DONE            132
00031 #define ICMPV6_TYPE_INFO_RS                         133
00032 #define ICMPV6_TYPE_INFO_RA                         134
00033 #define ICMPV6_TYPE_INFO_NS                         135
00034 #define ICMPV6_TYPE_INFO_NA                         136
00035 #define ICMPV6_TYPE_INFO_REDIRECT                   137
00036 #define ICMPV6_TYPE_INFO_MCAST_LIST_REPORT_V2       143
00037 #define ICMPV6_TYPE_INFO_RPL_CONTROL                155
00038 #define ICMPV6_TYPE_INFO_DAR                        157
00039 #define ICMPV6_TYPE_INFO_DAC                        158
00040 #define ICMPV6_TYPE_INFO_MPL_CONTROL                159
00041 
00042 #define ICMPV6_CODE_DST_UNREACH_NO_ROUTE            0
00043 #define ICMPV6_CODE_DST_UNREACH_ADM_PROHIB          1
00044 #define ICMPV6_CODE_DST_UNREACH_BEYOND_SCOPE        2
00045 #define ICMPV6_CODE_DST_UNREACH_ADDR_UNREACH        3
00046 #define ICMPV6_CODE_DST_UNREACH_PORT_UNREACH        4
00047 #define ICMPV6_CODE_DST_UNREACH_SRC_FAILED_POLICY   5
00048 #define ICMPV6_CODE_DST_UNREACH_ROUTE_REJECTED      6
00049 #define ICMPV6_CODE_DST_UNREACH_SRC_RTE_HDR_ERR     7
00050 
00051 #define ICMPV6_CODE_TME_EXCD_HOP_LIM_EXCD           0
00052 #define ICMPV6_CODE_TME_EXCD_FRG_REASS_TME_EXCD     1
00053 
00054 #define ICMPV6_CODE_PARAM_PRB_HDR_ERR               0
00055 #define ICMPV6_CODE_PARAM_PRB_UNREC_NEXT_HDR        1
00056 #define ICMPV6_CODE_PARAM_PRB_UNREC_IPV6_OPT        2
00057 #define ICMPV6_CODE_PARAM_PRB_FIRST_FRAG_IPV6_HDR   3
00058 
00059 #define ICMPV6_CODE_RPL_DIS                         0x00
00060 #define ICMPV6_CODE_RPL_DIO                         0x01
00061 #define ICMPV6_CODE_RPL_DAO                         0x02
00062 #define ICMPV6_CODE_RPL_DAO_ACK                     0x03
00063 #define ICMPV6_CODE_RPL_P2P_DRO                     0x04
00064 #define ICMPV6_CODE_RPL_P2P_DRO_ACK                 0x05
00065 #define ICMPV6_CODE_RPL_SECURE_DIS                  0x80
00066 #define ICMPV6_CODE_RPL_SECURE_DIO                  0x81
00067 #define ICMPV6_CODE_RPL_SECURE_DAO                  0x82
00068 #define ICMPV6_CODE_RPL_SECURE_DAO_ACK              0x83
00069 #define ICMPV6_CODE_RPL_SECURE_P2P_DRO              0x84
00070 #define ICMPV6_CODE_RPL_SECURE_P2P_DRO_ACK          0x85
00071 #define ICMPV6_CODE_RPL_CC                          0x8A
00072 
00073 /* Options in ICMPv6 Neighbor Discovery Protocol (RPL has totally different options...) */
00074 #define ICMPV6_OPT_SRC_LL_ADDR                      1
00075 #define ICMPV6_OPT_TGT_LL_ADDR                      2
00076 #define ICMPV6_OPT_PREFIX_INFO                      3
00077 #define ICMPV6_OPT_REDIRECTED_HDR                   4
00078 #define ICMPV6_OPT_MTU                              5
00079 #define ICMPV6_OPT_ROUTE_INFO                       24
00080 #define ICMPV6_OPT_ADDR_REGISTRATION                33
00081 #define ICMPV6_OPT_6LOWPAN_CONTEXT                  34
00082 #define ICMPV6_OPT_AUTHORITATIVE_BORDER_RTR         35
00083 
00084 /* Neighbour Advertisement flags */
00085 #define NA_R    0x80
00086 #define NA_S    0x40
00087 #define NA_O    0x20
00088 
00089 /* Router Advertisement flags */
00090 #define RA_M            0x80    // Managed
00091 #define RA_O            0x40    // Other Configuration
00092 #define RA_H            0x20    // Home Agent (RFC 6275)
00093 #define RA_PRF_MASK     0x18    // Router Preference (RFC 4191)
00094 #define RA_PRF_LOW      0x18    // (RA_PRF_xxx also occurs in Route Info Options)
00095 #define RA_PRF_MEDIUM   0x00
00096 #define RA_PRF_HIGH     0x08
00097 #define RA_PRF_INVALID  0x10
00098 
00099 struct buffer;
00100 struct protocol_interface_info_entry;
00101 
00102 typedef struct aro {
00103     uint16_t lifetime;
00104     uint8_t status;
00105     uint8_t eui64[8];
00106     bool present;
00107 } aro_t;
00108 
00109 typedef enum slaac_src {
00110     SLAAC_IID_DEFAULT,      // OPAQUE if key available and enabled on interface, else FIXED
00111     SLAAC_IID_EUI64,        // use fixed IID based on EUI-64/MAC-64 (iid_eui64)
00112     SLAAC_IID_FIXED,        // use fixed IID (iid_slaac)
00113     SLAAC_IID_OPAQUE,       // RFC 7217 opaque
00114     SLAAC_IID_6LOWPAN_SHORT // use IID based on 6LoWPAN short address
00115 } slaac_src_e;
00116 
00117 #define ARO_SUCCESS     0
00118 #define ARO_DUPLICATE   1
00119 #define ARO_FULL        2
00120 
00121 extern void icmpv6_init(void);
00122 extern struct buffer *icmpv6_down(struct buffer *buf );
00123 extern struct buffer *icmpv6_up(struct buffer *buf );
00124 extern struct buffer *icmpv6_error(struct buffer *buf , struct protocol_interface_info_entry *cur, uint8_t type, uint8_t code, uint32_t aux);
00125 
00126 extern bool icmpv6_options_well_formed(const uint8_t *dptr, uint_fast16_t dlen);
00127 extern bool icmpv6_options_well_formed_in_buffer(const struct buffer *buf , uint16_t offset );
00128 extern const uint8_t *icmpv6_find_option(const uint8_t *dptr, uint_fast16_t dlen, uint8_t option, uint8_t optlen);
00129 extern const uint8_t *icmpv6_find_option_in_buffer(const struct buffer *buf , uint_fast16_t offset , uint8_t option, uint8_t optlen);
00130 
00131 struct protocol_interface_info_entry;
00132 
00133 extern struct buffer *icmpv6_build_rs(struct protocol_interface_info_entry *cur, const uint8_t *dest_addr);
00134 extern struct buffer *icmpv6_build_ns(struct protocol_interface_info_entry *cur, const uint8_t target_addr[static 16], const uint8_t *prompting_src_addr, bool unicast, bool unspecified_source, const struct aro *aro);
00135 extern struct buffer *icmpv6_build_na(struct protocol_interface_info_entry *cur, bool solicited, bool override, bool tllao_required, const uint8_t target[static 16], const aro_t *aro, const uint8_t src_addr[static 16]);
00136 extern struct buffer *icmpv6_build_dad(struct protocol_interface_info_entry *cur, struct buffer *buf , uint8_t type, const uint8_t dest_addr[16], const uint8_t eui64[8], const uint8_t reg_addr[16], uint8_t status, uint16_t lifetime);
00137 extern void icmpv6_build_echo_req(struct protocol_interface_info_entry *cur, const uint8_t target_addr[16]);
00138 
00139 extern void icmpv6_recv_ra_routes(struct protocol_interface_info_entry *cur, bool enable);
00140 extern void icmpv6_recv_ra_prefixes(struct protocol_interface_info_entry *cur, bool enable);
00141 
00142 extern void icmpv6_slaac_prefix_register_trig(struct protocol_interface_info_entry *cur, uint8_t *prefix_ptr, uint8_t prefix_len);
00143 extern int icmpv6_slaac_prefix_update(struct protocol_interface_info_entry *cur, const uint8_t *prefix_ptr, uint8_t prefix_len, uint32_t valid_lifetime, uint32_t preferred_lifetime);
00144 extern struct if_address_entry *icmpv6_slaac_address_add(struct protocol_interface_info_entry *cur, const uint8_t *prefix_ptr, uint8_t prefix_len, uint32_t valid_lifetime, uint32_t preferred_lifetime, bool skip_dad, slaac_src_e slaac_src);
00145 
00146 
00147 /*
00148  * Write either an ICMPv6 Prefix Information Option for a Router Advertisement
00149  * (RFC4861+6275), or an RPL Prefix Information Option (RFC6550).
00150  * Same payload, different type/len.
00151  */
00152 uint8_t *icmpv6_write_prefix_option(const prefix_list_t *prefixes,  uint8_t *dptr, uint8_t rpl_prefix, struct protocol_interface_info_entry *cur);
00153 uint8_t *icmpv6_write_mtu_option(uint32_t mtu, uint8_t *dptr);
00154 uint8_t *icmpv6_write_icmp_lla(struct protocol_interface_info_entry *cur, uint8_t *dptr, uint8_t icmp_opt, bool must, const uint8_t *ip_addr);
00155 
00156 #endif /* _ICMPV6_H */