Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
icmpv6.h
00001 /** 00002 * @file icmpv6.h 00003 * @brief ICMPv6 (Internet Control Message Protocol Version 6) 00004 * 00005 * @section License 00006 * 00007 * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved. 00008 * 00009 * This file is part of CycloneTCP Open. 00010 * 00011 * This program is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU General Public License 00013 * as published by the Free Software Foundation; either version 2 00014 * of the License, or (at your option) any later version. 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU General Public License 00022 * along with this program; if not, write to the Free Software Foundation, 00023 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00024 * 00025 * @author Oryx Embedded SARL (www.oryx-embedded.com) 00026 * @version 1.7.6 00027 **/ 00028 00029 #ifndef _ICMPV6_H 00030 #define _ICMPV6_H 00031 00032 //Dependencies 00033 #include "core/net.h" 00034 00035 00036 /** 00037 * @brief ICMPv6 message type 00038 * 00039 * The type field indicates the type of the message. Its 00040 * value determines the format of the remaining data 00041 * 00042 **/ 00043 00044 typedef enum 00045 { 00046 ICMPV6_TYPE_DEST_UNREACHABLE = 1, 00047 ICMPV6_TYPE_PACKET_TOO_BIG = 2, 00048 ICMPV6_TYPE_TIME_EXCEEDED = 3, 00049 ICMPV6_TYPE_PARAM_PROBLEM = 4, 00050 ICMPV6_TYPE_ECHO_REQUEST = 128, 00051 ICMPV6_TYPE_ECHO_REPLY = 129, 00052 ICMPV6_TYPE_MULTICAST_LISTENER_QUERY = 130, 00053 ICMPV6_TYPE_MULTICAST_LISTENER_REPORT_V1 = 131, 00054 ICMPV6_TYPE_MULTICAST_LISTENER_DONE_V1 = 132, 00055 ICMPV6_TYPE_ROUTER_SOL = 133, 00056 ICMPV6_TYPE_ROUTER_ADV = 134, 00057 ICMPV6_TYPE_NEIGHBOR_SOL = 135, 00058 ICMPV6_TYPE_NEIGHBOR_ADV = 136, 00059 ICMPV6_TYPE_REDIRECT = 137, 00060 ICMPV6_TYPE_MULTICAST_LISTENER_REPORT_V2 = 143 00061 } Icmpv6Type; 00062 00063 00064 /** 00065 * @brief Destination Unreachable message codes 00066 **/ 00067 00068 typedef enum 00069 { 00070 ICMPV6_CODE_NO_ROUTE_TO_DEST = 0, 00071 ICMPV6_CODE_ADMIN_PROHIBITED = 1, 00072 ICMPV6_CODE_BEYOND_SCOPE_OF_SRC_ADDR = 2, 00073 ICMPV6_CODE_ADDR_UNREACHABLE = 3, 00074 ICMPV6_CODE_PORT_UNREACHABLE = 4 00075 } Icmpv6DestUnreachableCode; 00076 00077 00078 /** 00079 * @brief Time Exceeded message codes 00080 **/ 00081 00082 typedef enum 00083 { 00084 ICMPV6_CODE_HOP_LIMIT_EXCEEDED = 0, 00085 ICMPV6_CODE_REASSEMBLY_TIME_EXCEEDED = 1 00086 } Icmpv6TimeExceededCode; 00087 00088 00089 /** 00090 * @brief Parameter Problem message codes 00091 **/ 00092 typedef enum 00093 { 00094 ICMPV6_CODE_INVALID_HEADER_FIELD = 0, 00095 ICMPV6_CODE_UNKNOWN_NEXT_HEADER = 1, 00096 ICMPV6_CODE_UNKNOWN_IPV6_OPTION = 2 00097 } Icmpv6ParamProblemCode; 00098 00099 00100 //CodeWarrior or Win32 compiler? 00101 #if defined(__CWCC__) || defined(_WIN32) 00102 #pragma pack(push, 1) 00103 #endif 00104 00105 00106 /** 00107 * @brief ICMPv6 header 00108 **/ 00109 00110 typedef __start_packed struct 00111 { 00112 uint8_t type; //0 00113 uint8_t code; //1 00114 uint16_t checksum; //2-3 00115 uint8_t data[]; //4 00116 } __end_packed Icmpv6Header; 00117 00118 00119 /** 00120 * @brief ICMPv6 Error message 00121 **/ 00122 00123 typedef __start_packed struct 00124 { 00125 uint8_t type; //0 00126 uint8_t code; //1 00127 uint16_t checksum; //2-3 00128 uint32_t parameter; //4-7 00129 uint8_t data[]; //8 00130 } __end_packed Icmpv6ErrorMessage; 00131 00132 00133 /** 00134 * @brief ICMPv6 Destination Unreachable message 00135 * 00136 * A Destination Unreachable message is generated in response to a 00137 * packet that cannot be delivered to its destination address for 00138 * reasons other than congestion 00139 * 00140 **/ 00141 00142 typedef __start_packed struct 00143 { 00144 uint8_t type; //0 00145 uint8_t code; //1 00146 uint16_t checksum; //2-3 00147 uint32_t unused; //4-7 00148 uint8_t data[]; //8 00149 } __end_packed Icmpv6DestUnreachableMessage; 00150 00151 00152 /** 00153 * @brief ICMPv6 Packet Too Big message 00154 * 00155 * A Packet Too Big message is sent by a router in response 00156 * to a packet that it cannot forward because the packet is 00157 * larger than the MTU of the outgoing link 00158 * 00159 **/ 00160 00161 typedef __start_packed struct 00162 { 00163 uint8_t type; //0 00164 uint8_t code; //1 00165 uint16_t checksum; //2-3 00166 uint32_t mtu; //4-7 00167 uint8_t data[]; //8 00168 } __end_packed Icmpv6PacketTooBigMessage; 00169 00170 00171 /** 00172 * @brief ICMPv6 Time Exceeded message 00173 * 00174 * A Time Exceeded message is sent by a router when it receives 00175 * a packet with a Hop Limit of zero 00176 * 00177 **/ 00178 00179 typedef __start_packed struct 00180 { 00181 uint8_t type; //0 00182 uint8_t code; //1 00183 uint16_t checksum; //2-3 00184 uint32_t unused; //4-7 00185 uint8_t data[]; //8 00186 } __end_packed Icmpv6TimeExceededMessage; 00187 00188 00189 /** 00190 * @brief ICMPv6 Parameter Problem message 00191 * 00192 * A Parameter Problem message is sent by an IPv6 node when it finds a 00193 * problem with a field in the IPv6 header or extension headers such 00194 * that it cannot complete processing the packet 00195 * 00196 **/ 00197 00198 typedef __start_packed struct 00199 { 00200 uint8_t type; //0 00201 uint8_t code; //1 00202 uint16_t checksum; //2-3 00203 uint32_t pointer; //4-7 00204 uint8_t data[]; //8 00205 } __end_packed Icmpv6ParamProblemMessage; 00206 00207 00208 /** 00209 * @brief ICMPv6 Echo Request and Echo Reply messages 00210 * 00211 * Every node must implement an ICMPv6 Echo responder function that 00212 * receives Echo Requests and sends corresponding Echo Replies 00213 * 00214 **/ 00215 00216 typedef __start_packed struct 00217 { 00218 uint8_t type; //0 00219 uint8_t code; //1 00220 uint16_t checksum; //2-3 00221 uint16_t identifier; //4-6 00222 uint16_t sequenceNumber; //7-8 00223 uint8_t data[]; //8 00224 } __end_packed Icmpv6EchoMessage; 00225 00226 00227 //CodeWarrior or Win32 compiler? 00228 #if defined(__CWCC__) || defined(_WIN32) 00229 #pragma pack(pop) 00230 #endif 00231 00232 00233 //ICMPv6 related functions 00234 error_t icmpv6EnableMulticastEchoRequest(NetInterface *interface, bool_t enable); 00235 00236 void icmpv6ProcessMessage(NetInterface *interface, Ipv6PseudoHeader *pseudoHeader, 00237 const NetBuffer *buffer, size_t offset, uint8_t hopLimit); 00238 00239 void icmpv6ProcessDestUnreachable(NetInterface *interface, 00240 Ipv6PseudoHeader *pseudoHeader, const NetBuffer *buffer, size_t offset); 00241 00242 void icmpv6ProcessPacketTooBig(NetInterface *interface, 00243 Ipv6PseudoHeader *pseudoHeader, const NetBuffer *buffer, size_t offset); 00244 00245 void icmpv6ProcessEchoRequest(NetInterface *interface, Ipv6PseudoHeader *requestPseudoHeader, 00246 const NetBuffer *request, size_t requestOffset); 00247 00248 error_t icmpv6SendErrorMessage(NetInterface *interface, uint8_t type, uint8_t code, 00249 uint32_t parameter, const NetBuffer *ipPacket, size_t ipPacketOffset); 00250 00251 void icmpv6DumpMessage(const Icmpv6Header *message); 00252 void icmpv6DumpDestUnreachableMessage(const Icmpv6DestUnreachableMessage *message); 00253 void icmpv6DumpPacketTooBigMessage(const Icmpv6PacketTooBigMessage *message); 00254 void icmpv6DumpEchoMessage(const Icmpv6EchoMessage *message); 00255 void icmpv6DumpErrorMessage(const Icmpv6ErrorMessage *message); 00256 00257 #endif 00258
Generated on Tue Jul 12 2022 17:10:13 by
1.7.2