1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ 2 /* 3 * Copyright (c) 2007-2009 Strasbourg University 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation; 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * 18 * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr> 19 */ 20 21 #ifndef IPV6_INTERFACE_ADDRESS_H 22 #define IPV6_INTERFACE_ADDRESS_H 23 24 #include <stdint.h> 25 26 #include "ns3/ipv6-address.h" 27 28 namespace ns3 29 { 30 31 /** 32 * \ingroup address 33 * \ingroup ipv6 34 * 35 * \brief IPv6 address associated with an interface. 36 */ 37 class Ipv6InterfaceAddress 38 { 39 public: 40 /** 41 * \enum State_e 42 * \brief State of an address associated with an interface. 43 */ 44 enum State_e 45 { 46 TENTATIVE, /**< Address is tentative, no packet can be sent unless DAD finished */ 47 DEPRECATED, /**< Address is deprecated and should not be used */ 48 PREFERRED, /**< Preferred address */ 49 PERMANENT, /**< Permanent address */ 50 HOMEADDRESS, /**< Address is a HomeAddress */ 51 TENTATIVE_OPTIMISTIC, /**< Address is tentative but we are optimistic so we can send packet even if DAD is not yet finished */ 52 INVALID, /**< Invalid state (after a DAD failed) */ 53 }; 54 55 /** 56 * \enum Scope_e 57 * \brief Address scope. 58 */ 59 enum Scope_e 60 { 61 HOST, /**< Localhost (::1/128) */ 62 LINKLOCAL, /**< Link-local address (fe80::/64) */ 63 GLOBAL, /**< Global address (2000::/3) */ 64 }; 65 66 /** 67 * \brief Default constructor. 68 */ 69 Ipv6InterfaceAddress (); 70 71 /** 72 * \brief Constructor. Prefix is 64 by default. 73 * \param address the IPv6 address to set 74 */ 75 Ipv6InterfaceAddress (Ipv6Address address); 76 77 /** 78 * \brief Constructor. 79 * \param address IPv6 address to set 80 * \param prefix IPv6 prefix 81 */ 82 Ipv6InterfaceAddress (Ipv6Address address, Ipv6Prefix prefix); 83 84 /** 85 * \brief Constructor. 86 * \param address IPv6 address to set 87 * \param prefix IPv6 prefix 88 * \param onLink on-link property 89 */ 90 Ipv6InterfaceAddress (Ipv6Address address, Ipv6Prefix prefix, bool onLink); 91 92 /** 93 * \brief Copy constructor. 94 * \param o object to copy 95 */ 96 Ipv6InterfaceAddress (const Ipv6InterfaceAddress& o); 97 98 /** 99 * \brief Destructor. 100 */ 101 ~Ipv6InterfaceAddress (); 102 103 /** 104 * \brief Set IPv6 address (and scope). 105 * \param address IPv6 address to set 106 */ 107 void SetAddress (Ipv6Address address); 108 109 /** 110 * \brief Get the IPv6 address. 111 * \return IPv6 address 112 */ 113 Ipv6Address GetAddress () const; 114 115 /** 116 * \brief Get the IPv6 prefix. 117 * \return IPv6 prefix 118 */ 119 Ipv6Prefix GetPrefix () const; 120 121 /** 122 * \brief Set the state. 123 * \param state the state 124 */ 125 void SetState (Ipv6InterfaceAddress::State_e state); 126 127 /** 128 * \brief Get the address state. 129 * \return address state 130 */ 131 Ipv6InterfaceAddress::State_e GetState () const; 132 133 /** 134 * \brief Set the scope. 135 * \param scope the scope of address 136 */ 137 void SetScope (Ipv6InterfaceAddress::Scope_e scope); 138 139 /** 140 * \brief Get address scope. 141 * \return scope 142 */ 143 Ipv6InterfaceAddress::Scope_e GetScope () const; 144 145 /** 146 * \brief Checks if the address is in the same subnet. 147 * \param b the address to check 148 * \return true if the address is in the same subnet. 149 */ 150 bool IsInSameSubnet (Ipv6Address b) const; 151 152 /** 153 * \brief Set the latest DAD probe packet UID. 154 * \param uid packet uid 155 */ 156 void SetNsDadUid (uint32_t uid); 157 158 /** 159 * \brief Get the latest DAD probe packet UID. 160 * \return uid 161 */ 162 uint32_t GetNsDadUid () const; 163 164 /** 165 * \brief Get the on-link property. 166 * \param onLink the on-link property 167 */ 168 void SetOnLink (bool onLink); 169 170 /** 171 * \brief Get the on-link property. 172 * \return on-link flag 173 */ 174 bool GetOnLink () const; 175 176 #if 0 177 /** 178 * \brief Start the DAD timer. 179 * \param interface interface 180 */ 181 void StartDadTimer (Ptr<Ipv6Interface> interface); 182 183 /** 184 * \brief Stop the DAD timer. 185 */ 186 void StopDadTimer (); 187 #endif 188 189 private: 190 /** 191 * \brief The IPv6 address. 192 */ 193 Ipv6Address m_address; 194 195 /** 196 * \brief The IPv6 prefix. 197 */ 198 Ipv6Prefix m_prefix; 199 200 /** 201 * \brief State of the address. 202 */ 203 State_e m_state; 204 205 /** 206 * \brief Scope of the address. 207 */ 208 Scope_e m_scope; 209 210 /** 211 * \brief The address belongs to an on-link network. 212 */ 213 bool m_onLink; 214 215 /** 216 * \brief Equal to operator. 217 * 218 * \param a the first operand 219 * \param b the first operand 220 * \returns true if the operands are equal 221 */ 222 friend bool operator == (Ipv6InterfaceAddress const& a, Ipv6InterfaceAddress const& b); 223 224 /** 225 * \brief Not equal to operator. 226 * 227 * \param a the first operand 228 * \param b the first operand 229 * \returns true if the operands are not equal 230 */ 231 friend bool operator != (Ipv6InterfaceAddress const& a, Ipv6InterfaceAddress const& b); 232 233 /** 234 * \brief Last DAD probe packet UID. 235 */ 236 uint32_t m_nsDadUid; 237 }; 238 239 /** 240 * \brief Stream insertion operator. 241 * 242 * \param os the reference to the output stream 243 * \param addr the Ipv6InterfaceAddress 244 * \returns the reference to the output stream 245 */ 246 std::ostream& operator<< (std::ostream& os, const Ipv6InterfaceAddress &addr); 247 248 /* follow Ipv4InterfaceAddress way, maybe not inline them */ 249 inline bool operator == (const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b) 250 { 251 return (a.m_address == b.m_address && a.m_prefix == b.m_prefix && 252 a.m_state == b.m_state && a.m_scope == b.m_scope); 253 } 254 255 inline bool operator != (const Ipv6InterfaceAddress& a, const Ipv6InterfaceAddress& b) 256 { 257 return (a.m_address != b.m_address || a.m_prefix != b.m_prefix || 258 a.m_state != b.m_state || a.m_scope != b.m_scope); 259 } 260 261 } /* namespace ns3 */ 262 263 #endif /* IPV6_INTERFACE_ADDRESS_H */ 264 265