/* -*- 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 */ #ifndef IPV6_INTERFACE_H #define IPV6_INTERFACE_H #include #include "ns3/ipv6-address.h" #include "ns3/ipv6-interface-address.h" #include "ns3/ptr.h" #include "ns3/object.h" #include "ns3/timer.h" namespace ns3 { class NetDevice; class Packet; class Node; class NdiscCache; /** * \class Ipv6Interface * \brief The IPv6 representation of a network interface * * By default IPv6 interfaces are created in the "down" state * with IP "fe80::1" and a /64 prefix. Before becoming useable, * the user must invoke SetUp on them once the final IPv6 address * and mask has been set. */ class Ipv6Interface : public Object { public: /** * \brief Get the type ID * \return type ID */ static TypeId GetTypeId (); /** * \brief Constructs an Ipv6Interface. */ Ipv6Interface (); /** * \brief Destructor. */ virtual ~Ipv6Interface (); /** * \brief Set node associated with interface. * \param node node */ void SetNode (Ptr node); /** * \brief Set the NetDevice. * \param device NetDevice */ void SetDevice (Ptr device); /** * \brief Get the NetDevice. * \return the NetDevice associated with this interface */ virtual Ptr GetDevice () const; /** * \brief Set the metric. * \param metric configured routing metric (cost) of this interface */ void SetMetric (uint16_t metric); /** * \brief Get the metric * \return the metric */ uint16_t GetMetric () const; /** * \brief Is the interface UP ? * \return true if interface is enabled, false otherwise. */ bool IsUp () const; /** * \brief Is the interface DOWN ? * \return true if interface is disabled, false otherwise. */ bool IsDown () const; /** * \brief Enable this interface. */ void SetUp (); /** * \brief Disable this interface. */ void SetDown (); /** * \brief If the interface allows forwarding packets. * \return true if forwarding is enabled, false otherwise */ bool IsForwarding () const; /** * \brief Set forwarding enabled or not. * \param forward forwarding state */ void SetForwarding (bool forward); /** * \brief Set the current hop limit. * \param curHopLimit the value to set */ void SetCurHopLimit (uint8_t curHopLimit); /** * \brief Get the current hop limit value. * \return current hop limit */ uint8_t GetCurHopLimit () const; /** * \brief Set the base reachable time. * \param baseReachableTime the value to set */ void SetBaseReachableTime (uint16_t baseReachableTime); /** * \brief Get the base reachable time. * \return base reachable time */ uint16_t GetBaseReachableTime () const; /** * \brief Set the reachable time. * \param reachableTime value to set */ void SetReachableTime (uint16_t reachableTime); /** * \brief Get the reachable time. * \return reachable time */ uint16_t GetReachableTime () const; /** * \brief Set the retransmission timer. * \param retransTimer value to set */ void SetRetransTimer (uint16_t retransTimer); /** * \brief Get the retransmission timer. * \return retransmission timer */ uint16_t GetRetransTimer () const; /** * \brief Send a packet through this interface. * \param p packet to send * \param dest next hop address of packet. * * \note This method will eventually call the private SendTo * method which must be implemented by subclasses. */ void Send (Ptr p, Ipv6Address dest); /** * \brief Add an IPv6 address. * \param iface address to add * \return true if address was added, false otherwise */ bool AddAddress (Ipv6InterfaceAddress iface); /** * \brief Get link-local address from IPv6 interface. * \return link-local Ipv6InterfaceAddress, assert if not found */ Ipv6InterfaceAddress GetLinkLocalAddress () const; /** * \brief Get an address from IPv6 interface. * \param index index * \return Ipv6InterfaceAddress address whose index is i */ Ipv6InterfaceAddress GetAddress (uint32_t index) const; /** * \brief Get an address which is in the same network prefix as destination. * \param dst destination address * \return Corresponding Ipv6InterfaceAddress or assert if not found */ Ipv6InterfaceAddress GetAddressMatchingDestination (Ipv6Address dst); /** * \brief Get number of addresses on this IPv6 interface. * \return number of address */ uint32_t GetNAddresses (void) const; /** * \brief Remove an address from interface. * \param index index to remove * \return Ipv6InterfaceAddress address whose index is index */ Ipv6InterfaceAddress RemoveAddress (uint32_t index); /** * \brief Update state of an interface address. * \param address IPv6 address * \param state new state */ void SetState (Ipv6Address address, Ipv6InterfaceAddress::State_e state); /** * \brief Update NS DAD packet UID of an interface address. * \param address IPv6 address * \param uid packet UID */ void SetNsDadUid (Ipv6Address address, uint32_t uid); protected: /** * \brief Dispose this object. */ virtual void DoDispose (); private: typedef std::list Ipv6InterfaceAddressList; typedef std::list::iterator Ipv6InterfaceAddressListI; typedef std::list::const_iterator Ipv6InterfaceAddressListCI; /** * \brief Initialize interface. */ void DoSetup (); /** * \brief The addresses assigned to this interface. */ Ipv6InterfaceAddressList m_addresses; /** * \brief The state of this interface. */ bool m_ifup; /** * \brief Forwarding state. */ bool m_forwarding; /** * \brief The metric. */ uint16_t m_metric; /** * \brief Node associated with this interface. */ Ptr m_node; /** * \brief NetDevice associated with this interface. */ Ptr m_device; /** * \brief Neighbor cache. */ Ptr m_ndCache; /** * \brief Current hop limit. */ uint8_t m_curHopLimit; /** * \brief Base value used for computing the random reachable time value (in millisecond). */ uint16_t m_baseReachableTime; /** * \brief Reachable time (in millisecond). * The time a neighbor is considered reachable after receiving a reachability confirmation. */ uint16_t m_reachableTime; /** * \brief Retransmission timer (in millisecond). * Time between retransmission of NS. */ uint16_t m_retransTimer; }; } /* namespace ns3 */ #endif /* IPV6_INTERFACE_H */