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