/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007-2009 Strasbourg University
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
* Mehdi Benamor <benamor.mehdi@ensi.rnu.tn>
* David Gross <gdavid.devel@gmail.com>
*/
#ifndef ICMPV6_HEADER_H
#define ICMPV6_HEADER_H
#include "ns3/header.h"
#include "ns3/ipv6-address.h"
#include "ns3/packet.h"
namespace ns3
{
/**
* \class Icmpv6Header
* \brief ICMPv6 header.
*/
class Icmpv6Header : public Header
{
public:
/**
* \enum Type_e
* \brief ICMPv6 type code.
*/
enum Type_e
{
ICMPV6_ERROR_DESTINATION_UNREACHABLE = 1,
ICMPV6_ERROR_PACKET_TOO_BIG,
ICMPV6_ERROR_TIME_EXCEEDED,
ICMPV6_ERROR_PARAMETER_ERROR,
ICMPV6_ECHO_REQUEST = 128,
ICMPV6_ECHO_REPLY,
ICMPV6_SUBSCRIBE_REQUEST,
ICMPV6_SUBSCRIBE_REPORT,
ICMPV6_SUBSCRIVE_END,
ICMPV6_ND_ROUTER_SOLICITATION,
ICMPV6_ND_ROUTER_ADVERTISEMENT,
ICMPV6_ND_NEIGHBOR_SOLICITATION,
ICMPV6_ND_NEIGHBOR_ADVERTISEMENT,
ICMPV6_ND_REDIRECTION,
ICMPV6_ROUTER_RENUMBER,
ICMPV6_INFORMATION_REQUEST,
ICMPV6_INFORMATION_RESPONSE,
ICMPV6_INVERSE_ND_SOLICITATION,
ICMPV6_INVERSE_ND_ADVERSTISEMENT,
ICMPV6_MLDV2_SUBSCRIBE_REPORT,
ICMPV6_MOBILITY_HA_DISCOVER_REQUEST,
ICMPV6_MOBILITY_HA_DISCOVER_RESPONSE,
ICMPV6_MOBILITY_MOBILE_PREFIX_SOLICITATION,
ICMPV6_SECURE_ND_CERTIFICATE_PATH_SOLICITATION,
ICMPV6_SECURE_ND_CERTIFICATE_PATH_ADVERTISEMENT,
ICMPV6_EXPERIMENTAL_MOBILITY
};
/**
* \enum OptionType_e
* \brief ICMPv6 Option type code.
*/
enum OptionType_e
{
ICMPV6_OPT_LINK_LAYER_SOURCE = 1,
ICMPV6_OPT_LINK_LAYER_TARGET,
ICMPV6_OPT_PREFIX,
ICMPV6_OPT_REDIRECTED,
ICMPV6_OPT_MTU
};
/**
* \enum ErrorDestinationUnreachable_e
* \brief ICMPv6 error code : Destination Unreachable
*/
enum ErrorDestinationUnreachable_e
{
ICMPV6_NO_ROUTE = 0,
ICMPV6_ADM_PROHIBITED,
ICMPV6_NOT_NEIGHBOUR,
ICMPV6_ADDR_UNREACHABLE,
ICMPV6_PORT_UNREACHABLE
};
/**
* \enum ErrorTimeExceeded_e
* \brief ICMPv6 error code : Time Exceeded
*/
enum ErrorTimeExceeded_e
{
ICMPV6_HOPLIMIT = 0,
ICMPV6_FRAGTIME
};
/**
* \enum ErrorParameterError_e
* \brief ICMPv6 error code : Parameter Error
*/
enum ErrorParameterError_e
{
ICMPV6_MALFORMED_HEADER = 0,
ICMPV6_UNKNOWN_NEXT_HEADER,
ICMPV6_UNKNOWN_OPTION
};
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Constructor.
*/
Icmpv6Header ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6Header ();
/**
* \brief Get the type field.
* \return type of ICMPv6 message
*/
uint8_t GetType () const;
/**
* \brief Set the type.
* \param type type to set
*/
void SetType (uint8_t type);
/**
* \brief Get the code field.
* \return code of ICMPv6 message
*/
uint8_t GetCode () const;
/**
* \brief Set the code field.
* \param code code to set
*/
void SetCode (uint8_t code);
/**
* \brief Get the checksum.
* \return checksum
*/
uint16_t GetChecksum () const;
/**
* \brief Set the checksum.
* \param checksum to set
*/
void SetChecksum (uint16_t checksum);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
/**
* \brief Calculate pseudo header checksum for IPv6.
* \param src source address
* \param dst destination address
* \param length length
* \param protocol the protocol number to use in the
* underlying IPv6 packet.
*/
void CalculatePseudoHeaderChecksum (Ipv6Address src, Ipv6Address dst, uint16_t length, uint8_t protocol);
protected:
/**
* \brief Checksum enable or not.
*/
bool m_calcChecksum;
/**
* \brief The checksum.
*/
uint16_t m_checksum;
private:
/**
* \brief The type.
*/
uint8_t m_type;
/**
* \brief The code.
*/
uint8_t m_code;
};
/**
* \class Icmpv6OptionHeader
* \brief ICMPv6 option header.
*/
class Icmpv6OptionHeader : public Header
{
public:
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Constructor.
*/
Icmpv6OptionHeader ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6OptionHeader ();
/**
* \brief Get the type of the option.
* \return type
*/
uint8_t GetType () const;
/**
* \brief Set the type of the option.
* \param type the type to set
*/
void SetType (uint8_t type);
/**
* \brief Get the length of the option in 8 bytes unit.
* \return length of the option
*/
uint8_t GetLength () const;
/**
* \brief Set the length of the option.
* \param len length value to set
*/
void SetLength (uint8_t len);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The type.
*/
uint8_t m_type;
/**
* \brief The length.
*/
uint8_t m_len;
};
/**
* \class Icmpv6NS
* \brief ICMPv6 Neighbor Solicitation header.
*/
class Icmpv6NS : public Icmpv6Header
{
public:
/**
* \brief Constructor.
* \param target target IPv6 address
*/
Icmpv6NS (Ipv6Address target);
/**
* \brief Constructor.
*/
Icmpv6NS ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6NS ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the reserved field.
* \return reserved value
*/
uint32_t GetReserved () const;
/**
* \brief Set the reserved field.
* \param reserved the reserved value
*/
void SetReserved (uint32_t reserved);
/**
* \brief Get the IPv6 target field.
* \return IPv6 address
*/
Ipv6Address GetIpv6Target () const;
/**
* \brief Set the IPv6 target field.
* \param target IPv6 address
*/
void SetIpv6Target (Ipv6Address target);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The reserved value.
*/
uint32_t m_reserved;
/**
* \brief The IPv6 target address.
*/
Ipv6Address m_target;
};
/**
* \class Icmpv6NA
* \brief ICMPv6 Neighbor Advertisement header.
*/
class Icmpv6NA : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6NA ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6NA ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the reserved field.
* \return reserved value
*/
uint32_t GetReserved () const;
/**
* \brief Set the reserved field.
* \param reserved the reserved value
*/
void SetReserved (uint32_t reserved);
/**
* \brief Get the IPv6 target field.
* \return IPv6 address
*/
Ipv6Address GetIpv6Target () const;
/**
* \brief Set the IPv6 target field.
* \param target IPv6 address
*/
void SetIpv6Target (Ipv6Address target);
/**
* \brief Get the R flag.
* \return R flag
*/
bool GetFlagR () const;
/**
* \brief Set the R flag.
* \param r value
*/
void SetFlagR (bool r);
/**
* \brief Get the S flag.
* \return S flag
*/
bool GetFlagS () const;
/**
* \brief Set the S flag.
* \param s value
*/
void SetFlagS (bool s);
/**
* \brief Get the O flag.
* \return O flag
*/
bool GetFlagO () const;
/**
* \brief Set the O flag.
* \param o value
*/
void SetFlagO (bool o);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The R flag.
*/
bool m_flagR;
/**
* \brief The O flag.
*/
bool m_flagS;
/**
* \brief The M flag.
*/
bool m_flagO;
/**
* \brief The reserved value.
*/
uint32_t m_reserved;
/**
* \brief The IPv6 target address.
*/
Ipv6Address m_target;
};
/**
* \class Icmpv6RA
* \brief ICMPv6 Router Advertisement header.
*/
class Icmpv6RA : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6RA ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6RA ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Set the IPv6 maximum number of jumps.
* \param m maximum jumps
*/
void SetCurHopLimit (uint8_t m);
/**
* \brief Get the IPv6 maximum number of jumps.
* \return maximum jumps
*/
uint8_t GetCurHopLimit () const;
/**
* \brief Set the node Life time (Neighbor Discovery).
* \param l life time
*/
void SetLifeTime (uint16_t l);
/**
* \brief Get the node Life time (Neighbor Discovery).
* \return life time
*/
uint16_t GetLifeTime () const;
/**
* \brief Set the node Reachable time (Neighbor Discovery).
* \param r Reachable time
*/
void SetReachableTime (uint32_t r);
/**
* \brief Get the node Reachable time (Neighbor Discovery).
* \return reachable time
*/
uint32_t GetReachableTime () const;
/**
* \brief Set the node Retransmission time (Neighbor Discovery).
* \param r Retransmission time
*/
void SetRetransmissionTime (uint32_t r);
/**
* \brief Get the node Retransmission time (Neighbor Discovery).
* \return retransmission time
*/
uint32_t GetRetransmissionTime () const;
/**
* \brief Get the M flag.
* \return M flag
*/
bool GetFlagM () const;
/**
* \brief Set the M flag.
* \param m value
*/
void SetFlagM (bool m);
/**
* \brief Get the O flag.
* \return O flag
*/
bool GetFlagO () const;
/**
* \brief Set the O flag.
* \param o value
*/
void SetFlagO (bool o);
/**
* \brief Get the H flag.
* \return H flag
*/
bool GetFlagH () const;
/**
* \brief Set the H flag.
* \param h value
*/
void SetFlagH (bool h);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Getflags.
* \return the flags value
*/
uint8_t GetFlags () const;
/**
* \brief Setflags.
* \param f the flags value
*/
void SetFlags (uint8_t f);
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The M flag.
*/
bool m_flagM;
/**
* \brief The O flag.
*/
bool m_flagO;
/**
* \brief The H flag.
*/
bool m_flagH;
/**
* \brief The flags field value.
*/
uint8_t m_flags;
/**
* \brief The lifetime value.
*/
uint16_t m_LifeTime;
/**
* \brief The reachable time value.
*/
uint32_t m_ReachableTime;
/**
* \brief The retransmission timer.
*/
uint32_t m_RetransmissionTimer;
/**
* \brief The max jumps.
*/
uint8_t m_curHopLimit;
};
/**
* \class Icmpv6RS
* \brief ICMPv6 Router Solicitation header.
*/
class Icmpv6RS : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6RS ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6RS ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the reserved field.
* \return reserved value
*/
uint32_t GetReserved () const;
/**
* \brief Set the reserved field.
* \param reserved the reserved value
*/
void SetReserved (uint32_t reserved);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The reserved value.
*/
uint32_t m_reserved;
};
/**
* \class Icmpv6Redirection
* \brief ICMPv6 Redirection header.
*/
class Icmpv6Redirection : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6Redirection ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6Redirection ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the IPv6 target address.
* \return the IPv6 target address
*/
Ipv6Address GetTarget () const;
/**
* \brief Set the IPv6 target address.
* \param target IPv6 target address
*/
void SetTarget (Ipv6Address target);
/**
* \brief Get the IPv6 destination address.
* \return the IPv6 destination address
*/
Ipv6Address GetDestination () const;
/**
* \brief Set the IPv6 destination address.
* \param destination IPv6 destination address
*/
void SetDestination (Ipv6Address destination);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
/**
* \brief Get the reserved field.
* \return reserved value
*/
uint32_t GetReserved () const;
/**
* \brief Set the reserved field.
* \param reserved the reserved value
*/
void SetReserved (uint32_t reserved);
private:
/**
* \brief IPv6 target address.
*/
Ipv6Address m_target;
/**
* \brief IPv6 destination address.
*/
Ipv6Address m_destination;
/**
* \brief Reserved value.
*/
uint32_t m_reserved;
};
/**
* \class Icmpv6Echo
* \brief ICMPv6 Echo message.
*/
class Icmpv6Echo : public Icmpv6Header
{
public:
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Default constructor.
*/
Icmpv6Echo ();
/**
* \brief Constructor.
* \param request request or reply message
*/
Icmpv6Echo (bool request);
/**
* \brief Destructor.
*/
virtual ~Icmpv6Echo ();
/**
* \brief Get the ID of the packet.
* \return id
*/
uint16_t GetId () const;
/**
* \brief Set the ID of the packet.
* \param id id to set
*/
void SetId (uint16_t id);
/**
* \brief Get the sequence number.
* \return sequence number
*/
uint16_t GetSeq () const;
/**
* \brief Set the sequence number.
* \param seq sequence to set
*/
void SetSeq (uint16_t seq);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief ID of the packet (to distinguish response between many ping program).
*/
uint16_t m_id;
/**
* \brief Sequence number (to distinguish response).
*/
uint16_t m_seq;
};
/**
* \class Icmpv6DestinationUnreachable
* \brief ICMPv6 Error Destination Unreachable header.
*/
class Icmpv6DestinationUnreachable : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6DestinationUnreachable ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6DestinationUnreachable ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the incorrect packet.
* \return the incorrect packet
*/
Ptr<Packet> GetPacket () const;
/**
* \brief Set the incorrect packet.
* \param p the incorrect packet
*/
void SetPacket (Ptr<Packet> p);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The incorrect Packet.
*/
Ptr<Packet> m_packet;
};
/**
* \class Icmpv6TooBig
* \brief ICMPv6 Error Too Big header.
*/
class Icmpv6TooBig : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6TooBig ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6TooBig ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the incorrect packet.
* \return the incorrect packet
*/
Ptr<Packet> GetPacket () const;
/**
* \brief Set the incorrect packet.
* \param p the incorrect packet
*/
void SetPacket (Ptr<Packet> p);
/**
* \brief Get the MTU field.
* \return MTU value
*/
uint32_t GetMtu () const;
/**
* \brief Set the MTU.
* \param mtu the MTU
*/
void SetMtu (uint32_t mtu);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief the incorrect packet.
*/
Ptr<Packet> m_packet;
/**
* \brief The MTU value.
*/
uint32_t m_mtu;
};
/**
* \class Icmpv6TimeExceeded
* \brief ICMPv6 Error Time Exceeded header.
*/
class Icmpv6TimeExceeded : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6TimeExceeded ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6TimeExceeded ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the incorrect packet.
* \return the incorrect packet
*/
Ptr<Packet> GetPacket () const;
/**
* \brief Set the incorrect packet.
* \param p the incorrect packet
*/
void SetPacket (Ptr<Packet> p);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The incorrect packet.
*/
Ptr<Packet> m_packet;
};
/**
* \class Icmpv6ParameterError
* \brief ICMPv6 Error Parameter Error header.
*/
class Icmpv6ParameterError : public Icmpv6Header
{
public:
/**
* \brief Constructor.
*/
Icmpv6ParameterError ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6ParameterError ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the incorrect packet.
* \return the incorrect packet
*/
Ptr<Packet> GetPacket () const;
/**
* \brief Set the incorrect packet.
* \param p the incorrect packet
*/
void SetPacket (Ptr<Packet> p);
/**
* \brief Get the pointer field.
* \return pointer value
*/
uint32_t GetPtr () const;
/**
* \brief Set the pointer field.
* \param ptr byte where the error is located in the incorrect packet
*/
void SetPtr (uint32_t ptr);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The incorrect packet.
*/
Ptr<Packet> m_packet;
/**
* \brief The pointer field.
*/
uint32_t m_ptr;
};
/**
* \class Icmpv6OptionMtu
* \brief ICMPv6 MTU option.
*/
class Icmpv6OptionMtu : public Icmpv6OptionHeader
{
public:
/**
* \brief Constructor.
*/
Icmpv6OptionMtu ();
/**
* \brief Constructor.
* \param mtu MTU used.
*/
Icmpv6OptionMtu (uint32_t mtu);
/**
* \brief Destructor.
*/
virtual ~Icmpv6OptionMtu ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the reserved field.
* \return the reserved value
*/
uint16_t GetReserved () const;
/**
* \brief Set the reserved field.
* \param reserved the reserved value
*/
void SetReserved (uint16_t reserved);
/**
* \brief Get the MTU.
* \return the MTU value
*/
uint32_t GetMtu () const;
/**
* \brief Set the MTU.
* \param mtu the MTU to set
*/
void SetMtu (uint32_t mtu);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The reserved value
*/
uint16_t m_reserved;
/**
* \brief The MTU value.
*/
uint32_t m_mtu;
};
/**
* \class Icmpv6OptionPrefixInformation
* \brief ICMPv6 Option Prefix Information.
*/
class Icmpv6OptionPrefixInformation : public Icmpv6OptionHeader
{
public:
/**
* \brief Constructor.
*/
Icmpv6OptionPrefixInformation ();
/**
* \brief Constructor.
* \param network prefix
* \param prefixlen prefix length
*/
Icmpv6OptionPrefixInformation (Ipv6Address network, uint8_t prefixlen);
/**
* \brief Destructor.
*/
virtual ~Icmpv6OptionPrefixInformation ();
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Get the prefix length.
* \return prefix length
*/
uint8_t GetPrefixLength () const;
/**
* \brief Set the prefix length.
* \param prefixLength the prefix length
*/
void SetPrefixLength (uint8_t prefixLength);
/**
* \brief Get the flags.
* \return the flags.
*/
uint8_t GetFlags () const;
/**
* \brief Set the flags.
* \param flags the flags to set
*/
void SetFlags (uint8_t flags);
/**
* \brief Get the valid time of the information.
* \return valid time
*/
uint32_t GetValidTime () const;
/**
* \brief Set the valid time of the information.
* \param validTime valid time
*/
void SetValidTime (uint32_t validTime);
/**
* \brief Get the preferred time of the information.
* \return preferred time
*/
uint32_t GetPreferredTime () const;
/**
* \brief Set the preferred time of the information.
* \param preferredTime preferred time
*/
void SetPreferredTime (uint32_t preferredTime);
/**
* \brief Get the reserved field.
* \return the reserved field (should be 0x00000000)
*/
uint32_t GetReserved () const;
/**
* \brief Set the reserved field (normally it will be 0x00000000).
* \param reserved reserved value
*/
void SetReserved (uint32_t reserved);
/**
* \brief Get the IPv6 prefix.
* \return IPv6 prefix
*/
Ipv6Address GetPrefix () const;
/**
* \brief Set the IPv6 prefix.
* \param prefix the IPv6 prefix
*/
void SetPrefix (Ipv6Address prefix);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The prefix value.
*/
Ipv6Address m_prefix;
/**
* \brief The length of the prefix.
*/
uint8_t m_prefixLength;
/**
* \brief The flags.
*/
uint8_t m_flags;
/**
* \brief The valid time.
*/
uint32_t m_validTime;
/**
* \brief The preferred time.
*/
uint32_t m_preferredTime;
/**
* \brief The reserved field.
*/
uint32_t m_reserved;
};
/**
* \class Icmpv6OptionLinkLayerAddress
* \brief ICMPv6 link-layer address option.
*/
class Icmpv6OptionLinkLayerAddress : public Icmpv6OptionHeader
{
public:
/**
* \brief Constructor.
* \param source source hardware address or target hardware address for the option
*/
Icmpv6OptionLinkLayerAddress (bool source);
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId (void) const;
/**
* \brief Constructor.
* \param source source hardware address or target hardware address for the option
* \param addr hardware address
*/
Icmpv6OptionLinkLayerAddress (bool source, Address addr);
/**
* \brief Constructor.
*/
Icmpv6OptionLinkLayerAddress ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6OptionLinkLayerAddress ();
/**
* \brief Get the hardware address.
* \return the hardware address
*/
Address GetAddress () const;
/**
* \brief Set the hardware address.
* \param addr the address to set
*/
void SetAddress (Address addr);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The hardware address.
*/
Address m_addr;
};
/**
* \class Icmpv6OptionRedirected
* \brief ICMPv6 redirected option.
*/
class Icmpv6OptionRedirected : public Icmpv6OptionHeader
{
public:
/**
* \brief Get the UID of this class.
* \return UID
*/
static TypeId GetTypeId ();
/**
* \brief Get the instance type ID.
* \return instance type ID
*/
virtual TypeId GetInstanceTypeId () const;
/**
* \brief Constructor.
*/
Icmpv6OptionRedirected ();
/**
* \brief Destructor.
*/
virtual ~Icmpv6OptionRedirected ();
/**
* \brief Get the redirected packet.
* \return the redirected packet
*/
Ptr<Packet> GetPacket () const;
/**
* \brief Set the redirected packet.
* \param packet the redirected packet
*/
void SetPacket (Ptr<Packet> packet);
/**
* \brief Print informations.
* \param os output stream
*/
virtual void Print (std::ostream& os) const;
/**
* \brief Get the serialized size.
* \return serialized size
*/
virtual uint32_t GetSerializedSize () const;
/**
* \brief Serialize the packet.
* \param start start offset
*/
virtual void Serialize (Buffer::Iterator start) const;
/**
* \brief Deserialize the packet.
* \param start start offset
* \return length of packet
*/
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
/**
* \brief The redirected packet.
*/
Ptr<Packet> m_packet;
};
} /* namespace ns3 */
#endif /* ICMPV6_HEADER_H */