/* * Copyright (c) 2017, Matias Fontanini * 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. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "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 COPYRIGHT * OWNER OR CONTRIBUTORS 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. * */ #ifndef TINS_ICMPV6_H #define TINS_ICMPV6_H #include #include #include #include #include #include #include #include #include #include #include #include namespace Tins { namespace Memory { class InputMemoryStream; class OutputMemoryStream; } // memory /** * \class ICMPv6 * \brief Represents an ICMPv6 PDU. */ class TINS_API ICMPv6 : public PDU { public: /** * \brief This PDU's flag. */ static const PDU::PDUType pdu_flag = PDU::ICMPv6; /** * The types of ICMPv6 messages */ enum Types { DEST_UNREACHABLE = 1, PACKET_TOOBIG = 2, TIME_EXCEEDED = 3, PARAM_PROBLEM = 4, ECHO_REQUEST = 128, ECHO_REPLY = 129, MGM_QUERY = 130, MGM_REPORT = 131, MGM_REDUCTION = 132, ROUTER_SOLICIT = 133, ROUTER_ADVERT = 134, NEIGHBOUR_SOLICIT = 135, NEIGHBOUR_ADVERT = 136, REDIRECT = 137, ROUTER_RENUMBER = 138, NI_QUERY = 139, NI_REPLY = 140, MLD2_REPORT = 143, DHAAD_REQUEST = 144, DHAAD_REPLY = 145, MOBILE_PREFIX_SOLICIT = 146, MOBILE_PREFIX_ADVERT = 147, CERT_PATH_SOLICIT = 148, CERT_PATH_ADVERT = 149, MULTICAST_ROUTER_ADVERT = 151, MULTICAST_ROUTER_SOLICIT = 152, MULTICAST_ROUTER_TERMINATE = 153, RPL_CONTROL_MSG = 155, EXTENDED_ECHO_REQUEST = 160, EXTENDED_ECHO_REPLY = 161 }; /** * The types of ICMPv6 options. */ enum OptionTypes { SOURCE_ADDRESS = 1, TARGET_ADDRESS, PREFIX_INFO, REDIRECT_HEADER, MTU, NBMA_SHORT_LIMIT, ADVERT_INTERVAL, HOME_AGENT_INFO, S_ADDRESS_LIST, T_ADDRESS_LIST, CGA, RSA_SIGN, TIMESTAMP, NONCE, TRUST_ANCHOR, CERTIFICATE, IP_PREFIX, NEW_ROUTER_PREFIX, LINK_ADDRESS, NAACK, MAP = 23, ROUTE_INFO, RECURSIVE_DNS_SERV, RA_FLAGS_EXT, HANDOVER_KEY_REQ, HANDOVER_KEY_REPLY, HANDOVER_ASSIST_INFO, MOBILE_NODE_ID, DNS_SEARCH_LIST, PROXY_SIGNATURE, ADDRESS_REG, SIXLOWPAN_CONTEXT, AUTHORITATIVE_BORDER_ROUTER, CARD_REQUEST = 138, CARD_REPLY }; /** * The type used to store addresses. */ typedef IPv6Address ipaddress_type; /** * The type used to store addresses. */ typedef HWAddress<6> hwaddress_type; /** * The type used to represent ICMPv6 options. */ typedef PDUOption option; /** * The type used to store options. */ typedef std::vector