View | Details | Raw Unified | Return to bug 760
Collapse All | Expand All

(-)a/src/internet/model/ipv4-interface.cc (+23 lines)
 Lines 346-350    Link Here 
346
  return (addr);  // quiet compiler
346
  return (addr);  // quiet compiler
347
}
347
}
348
348
349
Ipv4InterfaceAddress
350
Ipv4Interface::RemoveAddress(Ipv4Address address)
351
{
352
  NS_LOG_FUNCTION(this << address);
353
354
  if (address == address.GetLoopback())
355
    {
356
      NS_LOG_WARN ("Cannot remove loopback address.");
357
      return Ipv4InterfaceAddress();
358
    }
359
360
  for(Ipv4InterfaceAddressListI it = m_ifaddrs.begin(); it != m_ifaddrs.end(); it++)
361
    {
362
      if((*it).GetLocal() == address)
363
        {
364
          Ipv4InterfaceAddress ifAddr = *it;
365
          m_ifaddrs.erase(it);
366
          return ifAddr;
367
        }
368
    }
369
  return Ipv4InterfaceAddress();
370
}
371
349
} // namespace ns3
372
} // namespace ns3
350
373
(-)a/src/internet/model/ipv4-interface.h (+9 lines)
 Lines 152-157    Link Here 
152
   */
152
   */
153
  Ipv4InterfaceAddress RemoveAddress (uint32_t index);
153
  Ipv4InterfaceAddress RemoveAddress (uint32_t index);
154
154
155
  /**
156
   * \brief Remove the given Ipv4 address from the interface.
157
   * \param address The Ipv4 address to remove
158
   * \returns The removed Ipv4 interface address 
159
   * \returns The null interface address if the interface did not contain the 
160
   * address or if loopback address was passed as argument
161
   */
162
  Ipv4InterfaceAddress RemoveAddress (Ipv4Address address);
163
155
protected:
164
protected:
156
  virtual void DoDispose (void);
165
  virtual void DoDispose (void);
157
private:
166
private:
(-)a/src/internet/model/ipv4-l3-protocol.cc (+23 lines)
 Lines 979-984    Link Here 
979
  return false;
979
  return false;
980
}
980
}
981
981
982
bool
983
Ipv4L3Protocol::RemoveAddress (uint32_t i, Ipv4Address address)
984
{
985
  NS_LOG_FUNCTION (this << i << address);
986
987
  if (address == Ipv4Address::GetLoopback())
988
    {
989
      NS_LOG_WARN ("Cannot remove loopback address.");
990
      return false;
991
    }
992
  Ptr<Ipv4Interface> interface = GetInterface (i);
993
  Ipv4InterfaceAddress ifAddr = interface->RemoveAddress (address);
994
  if (ifAddr != Ipv4InterfaceAddress ())
995
    {
996
      if (m_routingProtocol != 0)
997
        {
998
          m_routingProtocol->NotifyRemoveAddress (i, ifAddr);
999
        }
1000
      return true;
1001
    }
1002
  return false;
1003
}
1004
982
Ipv4Address 
1005
Ipv4Address 
983
Ipv4L3Protocol::SelectSourceAddress (Ptr<const NetDevice> device,
1006
Ipv4L3Protocol::SelectSourceAddress (Ptr<const NetDevice> device,
984
                                     Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope)
1007
                                     Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope)
(-)a/src/internet/model/ipv4-l3-protocol.h (+1 lines)
 Lines 194-199    Link Here 
194
  Ipv4InterfaceAddress GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const;
194
  Ipv4InterfaceAddress GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const;
195
  uint32_t GetNAddresses (uint32_t interface) const;
195
  uint32_t GetNAddresses (uint32_t interface) const;
196
  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
196
  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
197
  bool RemoveAddress (uint32_t interface, Ipv4Address address);
197
  Ipv4Address SelectSourceAddress (Ptr<const NetDevice> device,
198
  Ipv4Address SelectSourceAddress (Ptr<const NetDevice> device,
198
                                   Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope);
199
                                   Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope);
199
200
(-)a/src/internet/model/ipv4.h (+9 lines)
 Lines 248-253    Link Here 
248
   */
248
   */
249
  virtual bool RemoveAddress (uint32_t interface, uint32_t addressIndex) = 0;
249
  virtual bool RemoveAddress (uint32_t interface, uint32_t addressIndex) = 0;
250
250
251
   /**
252
   * \brief Remove the given address on named Ipv4 interface
253
   *
254
   * \param interface Interface number of an Ipv4 interface
255
   * \param address The address to remove
256
   * \returns true if the operation succeeded
257
   */
258
  virtual bool RemoveAddress (uint32_t interface, Ipv4Address address) = 0;
259
251
  /**
260
  /**
252
   * \brief Return the first primary source address with scope less than 
261
   * \brief Return the first primary source address with scope less than 
253
   * or equal to the requested scope, to use in sending a packet to 
262
   * or equal to the requested scope, to use in sending a packet to 
(-)a/src/internet/model/ipv6-interface.cc (+23 lines)
 Lines 291-296    Link Here 
291
  return addr;  /* quiet compiler */
291
  return addr;  /* quiet compiler */
292
}
292
}
293
293
294
Ipv6InterfaceAddress 
295
Ipv6Interface::RemoveAddress(Ipv6Address address)
296
{
297
  NS_LOG_FUNCTION(this << address);
298
299
  if (address == address.GetLoopback())
300
    {
301
      NS_LOG_WARN ("Cannot remove loopback address.");
302
      return Ipv6InterfaceAddress();
303
    }
304
305
  for (Ipv6InterfaceAddressListI it = m_addresses.begin (); it != m_addresses.end (); ++it)
306
    {
307
      if((*it).GetAddress() == address)
308
        {
309
          Ipv6InterfaceAddress iface = (*it);
310
          m_addresses.erase(it);
311
          return iface;
312
        }
313
    }
314
  return Ipv6InterfaceAddress();
315
}
316
294
Ipv6InterfaceAddress Ipv6Interface::GetAddressMatchingDestination (Ipv6Address dst)
317
Ipv6InterfaceAddress Ipv6Interface::GetAddressMatchingDestination (Ipv6Address dst)
295
{
318
{
296
  NS_LOG_FUNCTION (this << dst);
319
  NS_LOG_FUNCTION (this << dst);
(-)a/src/internet/model/ipv6-interface.h (+9 lines)
 Lines 228-233    Link Here 
228
  Ipv6InterfaceAddress RemoveAddress (uint32_t index);
228
  Ipv6InterfaceAddress RemoveAddress (uint32_t index);
229
229
230
  /**
230
  /**
231
   * \brief Remove the given Ipv6 address from the interface.
232
   * \param address The Ipv6 address to remove
233
   * \returns The removed Ipv6 interface address 
234
   * \returns The null interface address if the interface did not contain the 
235
   * address or if loopback address was passed as argument
236
   */
237
  Ipv6InterfaceAddress RemoveAddress (Ipv6Address address);
238
239
  /**
231
   * \brief Update state of an interface address.
240
   * \brief Update state of an interface address.
232
   * \param address IPv6 address
241
   * \param address IPv6 address
233
   * \param state new state
242
   * \param state new state
(-)a/src/internet/model/ipv6-l3-protocol.cc (+23 lines)
 Lines 381-386    Link Here 
381
  return false;
381
  return false;
382
}
382
}
383
383
384
bool 
385
Ipv6L3Protocol::RemoveAddress (uint32_t i, Ipv6Address address)
386
{
387
  NS_LOG_FUNCTION (this << i << address);
388
389
  if (address == Ipv6Address::GetLoopback())
390
    {
391
      NS_LOG_WARN ("Cannot remove loopback address.");
392
      return false;
393
    }
394
  Ptr<Ipv6Interface> interface = GetInterface (i);
395
  Ipv6InterfaceAddress ifAddr = interface->RemoveAddress (address);
396
  if (ifAddr != Ipv6InterfaceAddress ())
397
  {
398
    if (m_routingProtocol != 0)
399
    {
400
      m_routingProtocol->NotifyRemoveAddress (i, ifAddr);
401
    }
402
    return true;
403
  }
404
  return false;
405
}
406
384
void Ipv6L3Protocol::SetMetric (uint32_t i, uint16_t metric)
407
void Ipv6L3Protocol::SetMetric (uint32_t i, uint16_t metric)
385
{
408
{
386
  NS_LOG_FUNCTION (this << i << metric);
409
  NS_LOG_FUNCTION (this << i << metric);
(-)a/src/internet/model/ipv6-l3-protocol.h (+8 lines)
 Lines 249-254    Link Here 
249
  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
249
  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
250
250
251
  /**
251
  /**
252
   * \brief Remove a specified Ipv6 address from an interface.
253
   * \param interfaceIndex interface index
254
   * \param address Ipv6Address to be removed from the interface
255
   * \returns true if the operation succeeded
256
   */
257
  bool RemoveAddress (uint32_t interface, Ipv6Address address);
258
259
  /**
252
   * \brief Set metric for an interface.
260
   * \brief Set metric for an interface.
253
   * \param i index
261
   * \param i index
254
   * \param metric
262
   * \param metric
(-)a/src/internet/model/ipv6.h (+9 lines)
 Lines 218-223    Link Here 
218
  virtual bool RemoveAddress (uint32_t interface, uint32_t addressIndex) = 0;
218
  virtual bool RemoveAddress (uint32_t interface, uint32_t addressIndex) = 0;
219
219
220
  /**
220
  /**
221
   * \brief Remove the given address on named Ipv6 interface
222
   *
223
   * \param interface Interface number of an IPv6 interface
224
   * \param address the address to remove
225
   * \returns true if the operation succeeded
226
   */
227
  virtual bool RemoveAddress (uint32_t interface, Ipv6Address address) = 0;
228
229
  /**
221
   * \brief Set metric on specified Ipv6 interface.
230
   * \brief Set metric on specified Ipv6 interface.
222
   *
231
   *
223
   * \param interface The interface number of an IPv6 interface
232
   * \param interface The interface number of an IPv6 interface
(-)a/src/internet/test/ipv4-test.cc (+44 lines)
 Lines 94-102    Link Here 
94
  Ipv4InterfaceAddress output = interface->GetAddress (2);
94
  Ipv4InterfaceAddress output = interface->GetAddress (2);
95
  NS_TEST_ASSERT_MSG_EQ (ifaceAddr4, output,
95
  NS_TEST_ASSERT_MSG_EQ (ifaceAddr4, output,
96
                         "The addresses should be identical");
96
                         "The addresses should be identical");
97
98
  /* Test Ipv4Interface()::RemoveAddress(address) */
99
  output = interface->RemoveAddress (Ipv4Address ("250.0.0.1"));
100
  NS_TEST_ASSERT_MSG_EQ (ifaceAddr4, output,
101
                         "Wrong Interface Address Removed??");
102
  num = interface->GetNAddresses ();
103
  NS_TEST_ASSERT_MSG_EQ (num, 2, "Should find 2 interfaces??");
104
  
105
  /* Remove a non-existent Address */
106
  output = interface->RemoveAddress (Ipv4Address ("253.123.9.81"));
107
  NS_TEST_ASSERT_MSG_EQ (Ipv4InterfaceAddress (), output,
108
                         "Removed non-existent address??");
109
  num = interface->GetNAddresses ();
110
  NS_TEST_ASSERT_MSG_EQ (num, 2, "Should find 2 interfaces??");
111
  
112
  /* Remove a Loopback Address */
113
  output = interface->RemoveAddress (Ipv4Address::GetLoopback ());
114
  NS_TEST_ASSERT_MSG_EQ (Ipv4InterfaceAddress (), output,
115
                         "Able to remove loopback address??");
116
  num = interface->GetNAddresses ();
117
  NS_TEST_ASSERT_MSG_EQ (num, 2, "Should find 2 interfaces??");
118
119
  /* Test Ipv4Address::RemoveAddress(i, addresss) */
120
  bool result = ipv4->RemoveAddress (index, Ipv4Address
121
("192.168.0.2"));
122
  NS_TEST_ASSERT_MSG_EQ (true, result, "Unable to remove Address??");
123
  num = interface->GetNAddresses ();
124
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Should find 1 interfaces??");
125
126
  /* Remove a non-existent Address */
127
  result = ipv4->RemoveAddress (index, Ipv4Address ("189.0.0.1"));
128
  NS_TEST_ASSERT_MSG_EQ (false, result,
129
                         "Removed non-existent address??");
130
  num = interface->GetNAddresses ();
131
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Should find 1 interfaces??");
132
133
  /* Remove a loopback Address */
134
  result = ipv4->RemoveAddress (index, Ipv4Address::GetLoopback ());
135
  NS_TEST_ASSERT_MSG_EQ (false, result,
136
                         "Able to remove loopback address??");
137
  num = interface->GetNAddresses ();
138
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Should find 1 interfaces??");
139
97
  Simulator::Destroy ();
140
  Simulator::Destroy ();
98
}
141
}
99
142
143
  
100
static class IPv4L3ProtocolTestSuite : public TestSuite
144
static class IPv4L3ProtocolTestSuite : public TestSuite
101
{
145
{
102
public:
146
public:
(-)a/src/internet/test/ipv6-test.cc (+42 lines)
 Lines 136-141    Link Here 
136
136
137
  index = ipv6->GetInterfaceForAddress ("2001:ffff:5678:9000::1"); /* address we just remove */
137
  index = ipv6->GetInterfaceForAddress ("2001:ffff:5678:9000::1"); /* address we just remove */
138
  NS_TEST_ASSERT_MSG_EQ (index, (uint32_t) -1, "Address should not be found??");
138
  NS_TEST_ASSERT_MSG_EQ (index, (uint32_t) -1, "Address should not be found??");
139
140
  /* Test Ipv6Interface()::RemoveAddress(address) */
141
  output = interface->RemoveAddress (Ipv6Address ("2001:1234:5678:9000::1"));
142
  NS_TEST_ASSERT_MSG_EQ (ifaceAddr1, output, "Wrong Interface Address Removed??");
143
  num = interface->GetNAddresses ();
144
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
145
  
146
  /* Remove a non-existent Address */
147
  output = interface->RemoveAddress (Ipv6Address ("2001:1234:5678:9000::1"));
148
  NS_TEST_ASSERT_MSG_EQ (Ipv6InterfaceAddress (), output, 
149
                         "Removed non-existent address??");
150
  num = interface->GetNAddresses ();
151
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
152
153
  /* Remove a loopback Address */
154
  output = interface->RemoveAddress (Ipv6Address::GetLoopback ());
155
  NS_TEST_ASSERT_MSG_EQ (Ipv6InterfaceAddress (), output, 
156
                         "Able to remove loopback address??");
157
  num = interface->GetNAddresses ();
158
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
159
160
  /* Test Ipv6Address::RemoveAddress(index, addresss) */
161
  index = ipv6->GetInterfaceForAddress ("2001:ffff:5678:9001::2");
162
  bool result = ipv6->RemoveAddress (index, Ipv6Address 
163
                                     ("2001:ffff:5678:9001::2"));
164
  NS_TEST_ASSERT_MSG_EQ (result, true, "Unable to remove Address??");
165
  num = interface2->GetNAddresses ();
166
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
167
168
  /* Remove a non-existent Address */
169
  result = ipv6->RemoveAddress (index, Ipv6Address  
170
                                ("2001:ffff:5678:9001::2"));
171
  NS_TEST_ASSERT_MSG_EQ (result, false, "Removed Non-existent address??");
172
  num = interface2->GetNAddresses ();
173
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
174
 
175
  /* Remove a loopback Address */
176
  result = ipv6->RemoveAddress (index, Ipv6Address::GetLoopback ());
177
  NS_TEST_ASSERT_MSG_EQ (result, false, "Able to remove loopback address??");
178
  num = interface2->GetNAddresses ();
179
  NS_TEST_ASSERT_MSG_EQ (num, 1, "Number of addresses should be 1??");
180
139
  Simulator::Destroy ();
181
  Simulator::Destroy ();
140
} //end DoRun
182
} //end DoRun
141
static class IPv6L3ProtocolTestSuite : public TestSuite
183
static class IPv6L3ProtocolTestSuite : public TestSuite

Return to bug 760