author Josh Pelkey <>
Wed, 11 Aug 2010 11:37:37 -0400
changeset 6553 fb5ad9c7755a
parent 6529 dd982eaf6026
child 6557 970e1627b308
permissions -rw-r--r--
update release notes and fix doxygen warnings
     1 <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
     2 <html>
     3 <head>
     4    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
     5    <title>ns-3 Change Log</title>
     6 </head>
     7 <body>
     9 <h1>
    10 ns-3: API and model change history</h1>
    11 <!--
    12 This ChangeLog is updated in the reverse order 
    13 with the most recent changes coming first.  Date format:  DD-MM-YYYY
    14 -->
    15 <p>
    16 ns-3 is an evolving system and there will be API or behavioral changes
    17 from time to time.   Users who try to use scripts or models across
    18 versions of ns-3 may encounter problems at compile time, run time, or
    19 may see the simulation output change.  </p>
    20 <p>
    21 We have adopted the development policy that we are going to try to ease
    22 the impact of these changes on users by documenting these changes in a
    23 single place (this file), and not by providing a temporary or permanent
    24 backward-compatibility software layer.  </p>
    25 <p>
    26 The goal is that users who encounter a problem when trying to use older
    27 code with newer code should be able to consult this file to find
    28 guidance as to how to fix the problem.  For instance, if a method name
    29 or signature has changed, it should be stated what the new replacement
    30 name is. </p>
    31 <p>
    32 Note that users who upgrade the simulator across versions, or who work
    33 directly out of the development tree, may find that simulation output
    34 changes even when the compilation doesn't break, such as when a
    35 simulator default value is changed.  Therefore, it is good practice for
    36 _anyone_ using code across multiple ns-3 releases to consult this file,
    37 as well as the RELEASE_NOTES, to understand what has changed over time.
    38 </p>
    39 <p>
    40 This file is a best-effort approach to solving this issue; we will do
    41 our best but can guarantee that there will be things that fall through
    42 the cracks, unfortunately.  If you, as a user, can suggest improvements
    43 to this file based on your experience, please contribute a patch or drop
    44 us a note on ns-developers mailing list.  </p>
    46 <hr>
    47 <h1>Changes from ns-3.8 to ns-3.9</h1>
    49 <h2>Changes to build system:</h2>
    51 <h2>New API:</h2>
    52 <ul>
    53 <li><b>Wifi set block ack threshold:</b> Two methods for setting block ack
    54 parameters for a specific access class: 
    55 <pre>
    56 void QosWifiMacHelper::SetBlockAckThresholdForAc (enum AccessClass accessClass, uint8_t threshold);
    57 void QosWifiMacHelper::SetBlockAckInactivityTimeoutForAc (enum AccessClass accessClass, uint16_t timeout);
    58 </pre>
    59 </li>
    60 <li><b>Receive List Error Model:</b>  Another basic error model that allows
    61 the user to specify a list of received packets that should be errored.  The
    62 list corresponds not to the packet UID but to the sequence of received
    63 packets as observed by the error model.   See src/common/error-model.h
    64 </li>
    65 <li><b>Respond to interface events:</b> New attribute for Ipv4GlobalRouting,
    66 "RespondToInterfaceEvents", which when enabled, will cause global routes
    67 to be recomputed upon any interface or address notification event from IPv4.
    68 </li>
    69 <li><b>Generic sequence number:</b> New generic sequence number class to 
    70 easily handle comparison, subtraction, etc. for sequence numbers.  
    71 To use it you need to supply two fundamental types as template parameters: 
    72 NUMERIC_TYPE and SIGNED_TYPE.  For instance, <tt>SequenceNumber&lt;uint32_t, int32_t&gt;</tt> 
    73 gives you a 32-bit sequence number, while <tt>SequenceNumber&lt;uint16_t, int16_t&gt;</tt> 
    74 is a 16-bit one.  For your convenience, these are typedef'ed as 
    75 <tt>SequenceNumber32</tt> and <tt>SequenceNumber16</tt>, respectively.
    76 </li>
    78 <li><b>Broadcast socket option:</b> New Socket
    79 methods <tt>SetAllowBroadcast</tt> and <tt>GetAllowBroadcast</tt> add
    80 to NS-3 <tt>Socket</tt>'s the equivalent to the POSIX SO_BROADCAST
    81 socket option (setsockopt/getsockopt).  Starting from this NS-3
    82 version, IPv4 sockets do not allow us to send packets to broadcast
    83 destinations by default; SetAllowBroadcast must be called beforehand
    84 if we wish to send broadcast packets.
    85 </li>
    87 </ul>
    89 <h2>Changes to existing API:</h2>
    91 <ul>
    92 <li><b>Changes to construction and naming of Wi-Fi transmit rates:</b>
    93 A reorganisation of the construction of Wi-Fi transmit rates has been
    94 undertaken with the aim of simplifying the task of supporting further
    95 IEEE 802.11 PHYs. This work has been completed under the auspices of
    96 Bug 871.
    98 From the viewpoint of simulation scripts not part of the ns-3
    99 distribution, the key change is that WifiMode names of the form
   100 wifi<em>x</em>-<em>n</em>mbs are now invalid. Names now take the
   101 form <em>Cccc</em>Rate<em>n</em>Mbps[BW<em>b</em>MHz],
   102 where <em>n</em> is the root bitrate in megabits-per-second as before
   103 (with only significant figures included, and an underscore replacing
   104 any decimal point), and <em>Cccc</em> is a representation of the
   105 Modulation Class as defined in Table 9-2 of IEEE
   106 Std. 802.11-2007. Currently-supported options for <em>Cccc</em>
   107 are <em>Ofdm</em> and <em>Dsss</em>. For modulation classes where
   108 optional reduced-bandwidth transmission is possible, this is captured
   109 in the final part of the form above, with <em>b</em> specifying the
   110 nominal signal bandwidth in megahertz. </li>
   112 <li><b>Consolidation of classes support Wi-Fi Information Elements:</b>
   113 When the <em>mesh</em> module was introduced it added a class
   114 hierarchy for modelling of the various Information Elements that were
   115 required. In this release, this class hierarchy has extended by moving
   116 the base classes (WifiInformationElement and
   117 WifiInformationElementVector) into the <em>wifi</em> module. This
   118 change is intended to ease the addition of support for modelling of
   119 further Wi-Fi functionality. </li>
   120 </ul>
   122 <h2>Changed behavior:</h2>
   123 <ul>
   124 <li><b>Queue trace behavior during Enqueue changed:</b> The behavior of the
   125 Enqueue trace source has been changed to be more intuitive and to agree with
   126 documentation.  Enqueue and Drop events in src/node/ are now mutually
   127 exclusive.  In the past, the meaning of an Enqueue event was that the Queue
   128 Enqueue operation was being attempted; and this could be followed by a Drop
   129 event if the Queue was full.  The new behavior is such that a packet is either
   130 Enqueue'd successfully or Drop'ped.
   132 <li><b>Drop trace logged for Ipv4/6 forwarding failure:</b> Fixed bug 861; this 
   133 will add ascii traces (drops) in Ipv4 and Ipv6 traces for forwarding failures
   135 <li><b>Changed default WiFi error rate model for OFDM modulation types:</b> 
   136 Adopted more conservative ErrorRateModel for OFDM modulation types (a/g).
   137 This will require 4 to 5 more dB of received power to get similar results
   138 as before, so users may observe a reduced WiFi range when using the defaults.
   139 See tracker issue 944 for more details.
   140 </ul>
   142 <hr>
   143 <h1>Changes from ns-3.7 to ns-3.8</h1>
   145 <h2>Changes to build system:</h2>
   147 <h2>New API:</h2>
   149 <ul>
   150 <li><b>Matrix propagation loss model:</b> This radio propagation model uses a two-dimensional matrix
   151 of path loss indexed by source and destination nodes.
   153 <li><b>WiMAX net device</b>: The developed WiMAX model attempts to provide an accurate MAC and
   154 PHY level implementation of the 802.16 specification with the Point-to-Multipoint (PMP) mode and the WirelessMAN-OFDM 
   155 PHY layer. By adding WimaxNetDevice objects to ns-3 nodes, one can create models of
   156 802.16-based networks. The source code for the WiMAX models lives in the directory src/devices/wimax.
   157 The model is mainly composed of three layers:
   158 <ul>
   159 <li>The convergence sublayer (CS)
   160 <li>The MAC Common Part Sublayer (MAC-CPS)
   161 <li>The Physical layer
   162 </ul>
   163 The main way that users who write simulation scripts will typically
   164 interact with the Wimax models is through the helper API and through
   165 the publicly visible attributes of the model.
   166 The helper API is defined in src/helper/wimax-helper.{cc,h}.
   167 Three examples containing some code that shows how to setup a 802.16 network are located under examples/wimax/ 
   169 <li><b>MPI Interface for distributed simulation:</b> Enables access
   170 to necessary MPI information such as MPI rank and size.
   172 <li><b>Point-to-point remote channel:</b> Enables point-to-point 
   173 connection between net-devices on different simulators, for use 
   174 with distributed simulation.
   176 <li><b>GetSystemId in simulator:</b> For use with distributed 
   177 simulation, GetSystemId returns zero by non-distributed 
   178 simulators.  For the distributed simulator, it returns the 
   179 MPI rank.
   181 <li><b>Enhancements to src/core/</b> New Zeta random variable generator. The Zeta random 
   182 distribution is tightly related to the Zipf distribution (already in ns-3.7). See the documentation, 
   183 especially because sometimes the Zeta distribution is called Zipf and viceversa. Here we conform to the 
   184 Wikipedia naming convention, i.e., Zipf is bounded while Zeta isn't. 
   186 <li><b>Two-ray ground propagation loss model:</b> Calculates the crossover distance under which Friis is used. The antenna 
   187 height is set to the nodes z coordinate, but can be added to using the model parameter SetHeightAboveZ, which 
   188 will affect ALL stations
   190 <li><b>Pareto random variable</b> has two new constructors to specify scale and shape:
   191 <pre>
   192 ParetoVariable (std::pair<double, double> params);
   193 ParetoVariable (std::pair<double, double> params, double b);
   194 </pre>
   195 </ul>
   197 <h2>Changes to existing API:</h2>
   198 <ul>
   199 <li><b>Tracing Helpers</b>: The organization of helpers for both pcap and ascii
   200 tracing, in devices and protocols, has been reworked.  Instead of each device 
   201 and protocol helper re-implementing trace enable methods, classes have been 
   202 developed to implement user-level tracing in a consistent way; and device and 
   203 protocol helpers use those classes to provide tracing functionality.<br>
   204 In addition to consistent operation across all helpers, the object name service
   205 has been integrated into the trace file naming scheme.<br>
   206 The internet stack helper has been extensively massaged to make it easier to 
   207 manage traces originating from protocols.  It used to be the case that there 
   208 was essentially no opportunity to filter tracing on interfaces, and resulting
   209 trace file names collided with those created by devices.  File names are now
   210 disambiguated and one can enable traces on a protocol/interface basis analogously
   211 to the node/device granularity of device-based helpers.<br>
   212 The primary user-visible results of this change are that trace-related functions
   213 have been changed from static functions to method calls; and a new object has
   214 been developed to hold streams for ascii traces.<br>
   215 New functionality is present for ascii traces.  It is now possible to create
   216 multiple ascii trace files automatically just as was possible for pcap trace 
   217 files.<br>
   218 The implementation of the helper code has been designed also to provide 
   219 functionality to make it easier for sophisticated users to hook traces of 
   220 various kinds and write results to (file) streams.
   221 Before:
   222 <pre>
   223   CsmaHelper::EnablePcapAll ();
   225   std::ofstream ascii;
   226 ("", std::ios_base::binary | std::ios_base::out);
   227   CsmaHelper::EnableAsciiAll (ascii);
   229   InternetStackHelper::EnableAsciiAll (ascii);
   230 </pre>
   231 After:
   232 <pre>
   233   CsmaHelper csmaHelper;
   234   InternetStackHelper stack;
   235   csmaHelper.EnablePcapAll ();
   237   AsciiTraceHelper ascii;
   238   csma.EnableAsciiAll (ascii.CreateFileStream (""));
   240   stack.EnableAsciiIpv4All (stream);
   241 </pre>
   244 <li><b>Serialization and Deserialization</b> in buffer, nix-vector, 
   245 packet-metadata, and packet has been modified to use raw character 
   246 buffers, rather than the Buffer class
   247 <pre>
   248 + uint32_t Buffer::GetSerializedSize (void) const;
   249 + uint32_t Buffer::Serialize (uint8_t* buffer, uint32_t maxSize) const;
   250 + uint32_t Buffer::Deserialize (uint8_t* buffer, uint32_t size); 
   252 - void NixVector::Serialize (Buffer::Iterator i, uint32_t size) const;
   253 + uint32_t NixVector::Serialize (uint32_t* buffer, uint32_t maxSize) const;
   254 - uint32_t NixVector::Deserialize (Buffer::Iterator i);
   255 + uint32_t NixVector::Deserialize (uint32_t* buffer, uint32_t size);
   257 - void PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const;
   258 + uint32_t PacketMetadata::Serialize (uint8_t* buffer, uint32_t maxSize) const;
   259 - uint32_t PacketMetadata::Deserialize (Buffer::Iterator i);
   260 + uint32_t PacketMetadata::Deserialize (uint8_t* buffer, uint32_t size);
   262 + uint32_t Packet::GetSerializedSize (void) const;
   263 - Buffer Packet::Serialize (void) const;
   264 + uint32_t Packet::Serialize (uint8_t* buffer, uint32_t maxSize) const;
   265 - void Packet::Deserialize (Buffer buffer);
   266 + Packet::Packet (uint8_t const*buffer, uint32_t size, bool magic);
   267 </pre>
   268 <li><b>PacketMetadata uid</b> has been changed to a 64-bit value. The 
   269 lower 32 bits give the uid, while the upper 32-bits give the MPI rank 
   270 for distributed simulations. For non-distributed simulations, the 
   271 upper 32 bits are simply zero.
   272 <pre>
   273 - inline PacketMetadata (uint32_t uid, uint32_t size);
   274 + inline PacketMetadata (uint64_t uid, uint32_t size);
   275 - uint32_t GetUid (void) const;
   276 + uint64_t GetUid (void) const;
   277 - PacketMetadata::PacketMetadata (uint32_t uid, uint32_t size);
   278 + PacketMetadata::PacketMetadata (uint64_t uid, uint32_t size); 
   280 - uint32_t Packet::GetUid (void) const;
   281 + uint64_t Packet::GetUid (void) const;
   282 </pre>
   284 <li><b>Moved propagation models</b> from src/devices/wifi to src/common
   286 <li><b>Moved Mtu attribute from base class NetDevice</b> This attribute is
   287 now found in all NetDevice subclasses.  
   288 </ul>
   290 <h2>Changed behavior:</h2>
   291 <ul>
   293 </ul>
   295 <hr>
   296 <h1>Changes from ns-3.6 to ns-3.7</h1>
   299 <h2>Changes to build system:</h2>
   301 <h2>New API:</h2>
   303 <ul>
   304 <li><b>Equal-cost multipath for global routing:</b> Enables quagga's
   305 equal cost multipath for Ipv4GlobalRouting, and adds an attribute that
   306 can enable it with random packet distribution policy across equal cost routes.
   307 <li><b>Binding sockets to devices:</b> A method analogous to a SO_BINDTODEVICE
   308 socket option has been introduced to class Socket:  <pre>virtual void Socket::BindToNetDevice (Ptr&lt;NetDevice&gt; netdevice);</pre>
   309 <li><b>Simulator event contexts</b>: The Simulator API now keeps track of a per-event
   310 'context' (a 32bit integer which, by convention identifies a node by its id). Simulator::GetContext
   311 returns the context of the currently-executing event while Simulator::ScheduleWithContext creates an
   312 event with a context different from the execution context of the caller. This API is used
   313 by the ns-3 logging system to report the execution context of each log line.
   314 <li><b>Object::DoStart</b>: Users who need to complete their object setup at the start of a simulation
   315 can override this virtual method, perform their adhoc setup, and then, must chain up to their parent.
   316 <li><b>Ad hoc On-Demand Distance Vector (AODV)</b> routing model, 
   317 <a href=>RFC 3561</a> </li>
   318 <li><b>Ipv4::IsDestinationAddress (Ipv4Address address, uint32_t iif)</b> Method added to support checks of whether a destination address should be accepted 
   319 as one of the host's own addresses.  RFC 1122 Strong/Weak end system behavior can be changed with a new attribute (WeakEsModel) in class Ipv4.  </li>
   321 <li><b>Net-anim interface</b>: Provides an interface to net-anim, a network animator for point-to-point 
   322 links in ns-3.  The interface generates a custom trace file for use with the NetAnim program.</li>
   324 <li><b>Topology Helpers</b>: New topology helpers have been introduced including PointToPointStarHelper, 
   325 PointToPointDumbbellHelper, PointToPointGridHelper, and CsmaStarHelper.</li>
   327 <li><b>IPv6 extensions support</b>: Provides API to add IPv6 extensions and options. Two examples (fragmentation
   328 and loose routing) are available.</li>
   329 </ul>
   331 <h2>Changes to existing API:</h2>
   332 <ul>
   333 <li><b>Ipv4RoutingProtocol::RouteOutput</b> no longer takes an outgoing 
   334 interface index but instead takes an outgoing device pointer; this affects all
   335 subclasses of Ipv4RoutingProtocol.
   336 <pre>
   337 -  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
   338 +  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &header, Ptr&lt;NetDevice&gt; oif, Socket::SocketErrno &sockerr) = 0;
   339 </pre>
   340 <li><b>Ipv6RoutingProtocol::RouteOutput</b> no longer takes an outgoing 
   341 interface index but instead takes an outgoing device pointer; this affects all
   342 subclasses of Ipv6RoutingProtocol.
   343 <pre>
   344 -  virtual Ptr&lt;Ipv6Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv6Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
   345 +  virtual Ptr&lt;Ipv6Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv6Header &header, Ptr&lt;NetDevice&gt; oif, Socket::SocketErrno &sockerr) = 0;
   346 </pre>
   347 <li><b>Application::Start</b> and <b>Application::Stop</b> have been renamed to
   348 <b>Application::SetStartTime</b> and <b>Application::SetStopTime</b>.
   349 <li><b>Channel::Send</b>: this method does not really exist but each subclass of the Channel
   350 base class must implement a similar method which sends a packet from a node to another node.
   351 Users must now use Simulator::ScheduleWithContext instead of Simulator::Schedule to schedule
   352 the reception event on a remote node.<br>
   353 For example, before:
   354 <pre>
   355 void
   356 SimpleChannel::Send (Ptr&lt;Packet&gt; p, uint16_t protocol, 
   357 		     Mac48Address to, Mac48Address from,
   358 		     Ptr&lt;SimpleNetDevice&gt; sender)
   359 {
   360   for (std::vector&lt;Ptr&lt;SimpleNetDevice&gt; &gt;::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
   361     {
   362       Ptr&lt;SimpleNetDevice&gt; tmp = *i;
   363       if (tmp == sender)
   364 	{
   365 	  continue;
   366 	}
   367       Simulator::ScheduleNow (&SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
   368     }
   369 }
   370 </pre>
   371 After:
   372 <pre>
   373 void
   374 SimpleChannel::Send (Ptr&lt;Packet&gt; p, uint16_t protocol, 
   375 		     Mac48Address to, Mac48Address from,
   376 		     Ptr&lt;SimpleNetDevice&gt; sender)
   377 {
   378   for (std::vector&lt;Ptr&lt;SimpleNetDevice&gt; &gt;::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
   379     {
   380       Ptr&lt;SimpleNetDevice&gt; tmp = *i;
   381       if (tmp == sender)
   382 	{
   383 	  continue;
   384 	}
   385       Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
   386                                       &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
   387     }
   388 }
   389 </pre>
   391 <li><b>Simulator::SetScheduler</b>: this method now takes an ObjectFactory
   392 instead of an object pointer directly. Existing callers can trivially be
   393 updated to use this new method.<br>
   394 Before:
   395 <pre>
   396 Ptr&lt;Scheduler&gt; sched = CreateObject&lt;ListScheduler&gt; ();
   397 Simulator::SetScheduler (sched);
   398 </pre>
   399 After:
   400 <pre>
   401 ObjectFactory sched;
   402 sched.SetTypeId ("ns3::ListScheduler");
   403 Simulator::SetScheduler (sched);
   404 </pre>
   406 <li> Extensions to IPv4 <b>Ping</b> application: verbose output and the ability to configure different ping 
   407 sizes and time intervals (via new attributes)
   409 <li><b>Topology Helpers</b>: Previously, topology helpers such as a point-to-point star existed in the 
   410 PointToPointHelper class in the form of a method (ex: PointToPointHelper::InstallStar).  These topology 
   411 helpers have been pulled out of the specific helper classes and created as separate classes.  Several 
   412 different topology helper classes now exist including PointToPointStarHelper, PointToPointGridHelper, 
   413 PointToPointDumbbellHelper, and CsmaStarHelper.  For example, a user wishes to create a 
   414 point-to-point star network:<br>
   415 Before:
   416 <pre>
   417 NodeContainer hubNode;
   418 NodeContainer spokeNodes;
   419 hubNode.Create (1);
   420 Ptr&lt;Node&gt; hub = hubNode.Get (0);
   421 spokeNodes.Create (nNodes - 1);
   423 PointToPointHelper pointToPoint;
   424 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
   425 pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
   426 NetDeviceContainer hubDevices, spokeDevices;
   427 pointToPoint.InstallStar (hubNode.Get (0), spokeNodes, hubDevices, spokeDevices);
   428 </pre>
   429 After:
   430 <pre>
   431 PointToPointHelper pointToPoint;
   432 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
   433 pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
   434 PointToPointStarHelper star (nSpokes, pointToPoint);
   435 </pre>
   437 </li>
   439 </ul>
   441 <h2>Changed behavior:</h2>
   442 <ul>
   443 <li> Changed default value of YansWifiPhy::EnergyDetectionThreshold from
   444 -140.0 dBm to -96.0 dBm.  Changed default value of 
   445 YansWifiPhy::CcaModelThreshold from -140.0 dBm to -99.0 dBm.  Rationale
   446 can be found <a href=""> 
   447 here</a>.
   448 </li>
   449 <li> Default TTL of IPv4 broadcast datagrams changed from 1 to 64.</li>
   450 <li> Changed DcfManager::UpdateBackoff (): using flooring instead of rounding in calculation of remaining slots. <a href="">
   451   See bug 695.</a></li>
   452 </ul>
   455 <hr>
   456 <h1>Changes from ns-3.5 to ns-3.6</h1>
   458 <h2>Changes to build system:</h2>
   459 <ul>
   460 <li><b>A new test framework is provided with ns-3.6 that primarilay runs outside waf</b>
   461 <p>"./waf check" now runs the new unit tests of the core part of ns-3.6.  
   462 In order to run the complete test package, use "./" which is 
   463 documented in a new manual -- find it in ./doc/testing.  "./waf check"
   464 no longer generates the introspected Doxygen.  Now use "./waf doxygen"
   465 to do this and generate the Doxygen documentation in one step.
   466 </p>
   467 </ul>
   469 <h2>New API:</h2>
   470 <ul>
   471 <li><b>Longest prefix match, support for metrics, for Ipv4StaticRouting and Ipv6StaticRouting</b>
   472 <p>When performing route lookup, first match for longest prefix, and then
   473 based on metrics (default metric = 0).  If metrics are equal, most recent
   474 addition is picked.  Extends API for support of metrics but preserves
   475 backward compatibility.  One small change is that the default route
   476 is no longer stored as index 0 route in the host route table so 
   477 GetDefaultRoute () must be used.
   478 </p>
   479 </li>
   480 <li><b>Route injection for global routing</b>
   481 <p>Add ability to inject and withdraw routes to Ipv4GlobalRouting.  This
   482 allows a user to insert a route and have it redistributed like an OSPF
   483 external LSA to the rest of the topology.
   484 </p>
   485 </li>
   487 <li><b>Athstats</b>
   488 <p>New classes AthstatsWifiTraceSink and AthstatsHelper.
   489 </p>
   490 </li>
   491 <li><b>WifiRemoteStationManager </b>
   492 <p>New trace sources exported by WifiRemoteStationManager: MacTxRtsFailed, MacTxDataFailed, MacTxFinalRtsFailed and MacTxFinalDataFailed.
   493 </p>
   494 </li>
   496 <li><b> IPv6 additions</b>
   497 <p> Add an IPv6 protocol and ICMPv6 capability.
   498 <ul>
   499 <li> new classes Ipv6, Ipv6Interface, Ipv6L3Protocol, Ipv6L4Protocol
   500 <li> Ipv6RawSocket (no UDP or TCP capability yet)
   501 <li> a set of classes to implement Icmpv6, including neighbor discovery,
   502 router solicitation, DAD
   503 <li> new applications Ping6 and Radvd
   504 <li> routing objects Ipv6Route and Ipv6MulticastRoute
   505 <li> routing protocols Ipv6ListRouting and Ipv6StaticRouting
   506 <li> examples:,,,,
   507 </ul>
   508 </p>
   509 </li> 
   511 <li><b>Wireless Mesh Networking models</b>
   512 <ul>
   513 <p>
   514 <li> General multi-interface mesh stack infrastructure (devices/mesh module).
   515 <li> IEEE 802.11s (Draft 3.0) model including Peering Management Protocol and HWMP.
   516 <li> Forwarding Layer for Meshing (FLAME) protocol.
   517 </ul>
   518 </p>
   519 </li>
   521 <li><b>802.11 enhancements</b>
   522 <p>
   523 <ul>
   524 <li> 10MHz and 5MHz channel width supported by 802.11a model (Ramon Bauza and Kirill Andreev).
   525 </ul>
   526 <ul>
   527 <li> Channel switching support. YansWifiPhy can now switch among different channels (Ramon Bauza and Pavel Boyko).
   528 </ul>
   529 </p>
   530 </li>
   532 <li><b> Nix-vector Routing</b>
   533 <p> Add nix-vector routing protocol
   534 <ul>
   535 <li> new helper class Ipv4NixVectorHelper
   536 </ul>
   537 <ul>
   538 <li> examples:,
   539 </ul> 
   540 </p>
   541 </li>
   543 <li><b>New Test Framework</b>
   544 <p> Add TestCase, TestSuite classes
   545 <ul>
   546 <li> examples: src/core/, src/core/, src/test/ns3tcp/
   547 </ul> 
   548 </p>
   549 </li>
   551 </ul>
   553 <h2>Changes to existing API:</h2>
   554 <ul>
   555 <li><b>InterferenceHelper</b>
   556 <p>The method InterferenceHelper::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble) has been made static, so that the frame duration depends only on the characteristics of the frame (i.e., the function parameters) and not on the particular standard which is used by the receiving PHY. This makes it now possible to correctly calculate the duration of incoming frames in scenarios in which devices using different PHY configurations coexist in the same channel (e.g., a BSS using short preamble and another BSS using long preamble). </p>
   557 <p> The following member methods have been added to InterferenceHelper:</p>
   558 <pre>
   559   static WifiMode GetPlcpHeaderMode (WifiMode, WifiPreamble);
   560   static uint32_t GetPlcpHeaderDurationMicroSeconds (WifiMode, WifiPreamble);
   561   static uint32_t GetPlcpPreambleDurationMicroSeconds (WifiMode, WifiPreamble);
   562   static uint32_t GetPayloadDurationMicroSeconds (size, WifiMode); </pre>
   563 <p> The following member methods have been removed from InterferenceHelper:</p>
   564 <pre>
   565   void Configure80211aParameters (void);
   566   void Configure80211bParameters (void);
   567   void Configure80211_10MhzParameters (void);
   568   void Configure80211_5MhzParameters (void);</pre>
   569 </li>
   570 <li><b>WifiMode</b>
   571 <p>WifiMode now has a WifiPhyStandard attribute which identifies the standard the WifiMode belongs to. To properly set this attribute when creating a new WifiMode, it is now required to explicitly pass a WifiPhyStandard parameter to all WifiModeFactory::CreateXXXX() methods. The WifiPhyStandard value of an existing WifiMode can be retrieved using the new method WifiMode::GetStandard().</p>
   572 </li>
   573 <li><b>NetDevice</b>
   574 <p>In order to have multiple link change callback in NetDevice (i.e. to flush ARP and IPv6 neighbor discovery caches), the following member method has been renamed:</p>
   575 <pre>
   576 - virtual void SetLinkChangeCallback (Callback&lt;void&gt; callback);
   577 + virtual void AddLinkChangeCallback (Callback&lt;void&gt; callback);</pre>
   578 Now each NetDevice subclasses have a TracedCallback&lt;&gt; object (list of callbacks) instead of Callback&lt;void&gt; ones.
   579 </li>
   580 </ul>
   582 <hr>
   583 <h1>Changes from ns-3.4 to ns-3.5</h1>
   585 <h2>Changes to build system:</h2>
   586 <ul>
   587 </ul>
   589 <h2>New API:</h2>
   591 <ul>
   592 <li><b>YansWifiPhyHelper supporting radiotap and prism PCAP output</b>
   593 <p>The newly supported pcap formats can be adopted by calling the following new method of YansWifiPhyHelper:</p>
   594 <pre>
   595  +  void SetPcapFormat (enum PcapFormat format);
   596 </pre>
   597 where format is one of PCAP_FORMAT_80211_RADIOTAP, PCAP_FORMAT_80211_PRISM or  PCAP_FORMAT_80211. By default, PCAP_FORMAT_80211 is used, so the default PCAP format is the same as before.</p>
   598 </li>
   600 <li> <b>attributes for class Ipv4</b>
   601 <p> class Ipv4 now contains attributes in; the first one
   602 is called "IpForward" that will enable/disable Ipv4 forwarding.  
   603 </li>
   605 <li> <b>packet tags</b>
   606 <p>class Packet now contains AddPacketTag, RemovePacketTag and PeekPacketTag 
   607 which can be used to attach a tag to a packet, as opposed to the old 
   608 AddTag method which attached a tag to a set of bytes. The main 
   609 semantic difference is in how these tags behave in the presence of 
   610 fragmentation and reassembly.
   611 </li>
   613 </ul>
   615 <h2>Changes to existing API:</h2>
   616 <ul>
   618 <li><b>Ipv4Interface::GetMtu () deleted</b>
   619   <p>The Ipv4Interface API is private to internet-stack module; this method
   620 was just a pass-through to GetDevice ()-&gt;GetMtu ().
   621   </p>
   622 </li>
   624 <li><b>GlobalRouteManager::PopulateRoutingTables () and RecomputeRoutingTables () are deprecated </b>
   625   <p>This API has been moved to the helper API and the above functions will
   626 be removed in ns-3.6.  The new API is:
   627 <pre>
   628 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
   629 Ipv4GlobalRoutingHelper::RecomputeRoutingTables ();
   630 </pre>
   631 Additionally, these low-level functions in GlobalRouteManager are now public,
   632 allowing more API flexibility at the low level ns-3 API:
   633 <pre>
   634 GlobalRouteManager::DeleteGlobalRoutes ();
   635 GlobalRouteManager::BuildGlobalRoutingDatabase ();
   636 GlobalRouteManager::InitializeRoutes ();
   637 </pre>
   638   </p>
   639 </li>
   641 <li><b>CalcChecksum attribute changes</b>
   642   <p>Four IPv4 CalcChecksum attributes (which enable the computation of 
   643 checksums that are disabled by default) have been collapsed into one global 
   644 value in class Node.  These four calls: 
   645 <pre>
   646 Config::SetDefault ("ns3::Ipv4L3Protocol::CalcChecksum", BooleanValue (true)); 
   647 Config::SetDefault ("ns3::Icmpv4L4Protocol::CalcChecksum", BooleanValue (true));
   648 Config::SetDefault ("ns3::TcpL4Protocol::CalcChecksum", BooleanValue (true));
   649 Config::SetDefault ("ns3::UdpL4Protocol::CalcChecksum", BooleanValue (true));
   650 </pre>
   651 are replaced by one call to:
   652 <pre>
   653 GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
   654 </pre>
   655   </p>
   656 </li>
   658 <li><b>CreateObject changes</b>
   659   <p>CreateObject is now able to construct objects with a non-default constructor.
   660    If you used to pass attribute lists to CreateObject, you must now use CreateObjectWithAttributes.
   661   </p>
   662 </li>
   664 <li> <b>packet byte tags renaming</b>
   665   <ul>
   666   <li>Packet::AddTag to Packet::AddByteTag</li>
   667   <li>Packet::FindFirstMatchingTag to Packet::FindFirstMatchingByteTag</li>
   668   <li>Packet::RemoveAllTags to Packet::RemoveAllByteTags</li>
   669   <li>Packet::PrintTags to Packet::PrintByteTags</li>
   670   <li>Packet::GetTagIterator to Packet::GetByteTagIterator</li>
   671   </ul>
   672 </li>
   674 <li><b>YansWifiPhyHelper::EnablePcap* methods not static any more</b>
   675 <p>To accommodate the possibility of configuring the PCAP format used for wifi promiscuous mode traces, several methods of YansWifiPhyHelper had to be made non-static:
   676 <pre>
   677 -  static void EnablePcap (std::string filename, uint32_t nodeid, uint32_t deviceid);
   678 +         void EnablePcap (std::string filename, uint32_t nodeid, uint32_t deviceid);
   679 -  static void EnablePcap (std::string filename, Ptr&lt;NetDevice&gt; nd);
   680 +         void EnablePcap (std::string filename, Ptr&lt;NetDevice&gt; nd);
   681 -  static void EnablePcap (std::string filename, std::string ndName);
   682 +         void EnablePcap (std::string filename, std::string ndName);
   683 -  static void EnablePcap (std::string filename, NetDeviceContainer d);
   684 +         void EnablePcap (std::string filename, NetDeviceContainer d);
   685 -  static void EnablePcap (std::string filename, NodeContainer n);
   686 +         void EnablePcap (std::string filename, NodeContainer n);
   687 -  static void EnablePcapAll (std::string filename);
   688 +         void EnablePcapAll (std::string filename);
   689 </pre>
   690 </p>
   691 </li>
   693 <li><b>Wifi Promisc Sniff interface modified </b>
   694 <p> 
   695 To accommodate support for the radiotap and prism headers in PCAP traces, the interface for promiscuos mode sniff in the wifi device was changed. The new implementation was heavily inspired by the way the madwifi driver handles monitor mode. A distinction between TX and RX events is introduced, to account for the fact that different information is to be put in the radiotap/prism header (e.g., RSSI and noise make sense only for RX packets). The following are the relevant modifications to the WifiPhy class:
   696 <pre>
   697 -  void NotifyPromiscSniff (Ptr&lt;const Packet&gt; packet);
   698 +  void NotifyPromiscSniffRx (Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm);
   699 +  void NotifyPromiscSniffTx (Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble);
   700 -  TracedCallback&lt;Ptr&lt;const Packet&gt; &gt; m_phyPromiscSnifferTrace;
   701 +  TracedCallback&lt;Ptr&lt;const Packet&gt;, uint16_t, uint32_t, bool, double, double&gt; m_phyPromiscSniffRxTrace;
   702 +  TracedCallback&lt;Ptr&lt;const Packet&gt;, uint16_t, uint32_t, bool&gt; m_phyPromiscSniffTxTrace;
   703 </pre>
   704 The above mentioned callbacks are expected to be used to call the following method to write Wifi PCAP traces in promiscuous mode:
   705 <pre>
   706 +  void WriteWifiMonitorPacket(Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble, bool isTx, double signalDbm, double noiseDbm);
   707 </pre>
   708 In the above method, the isTx parameter is to be used to differentiate between TX and RX packets. For an example of how to implement these callbacks, see the implementation of PcapSniffTxEvent and PcapSniffRxEvent in src/helper/
   709 </p>
   710 </li>
   712 <li><b> Routing decoupled from class Ipv4</b>
   713 <p> All calls of the form "Ipv4::AddHostRouteTo ()" etc. (i.e. to 
   714 add static routes, both unicast and multicast) have been moved to a new 
   715 class Ipv4StaticRouting.  In addition, class Ipv4 now holds only
   716 one possible routing protocol; the previous way to add routing protocols
   717 (by ordered list of priority) has been moved to a new class Ipv4ListRouting.
   718 Class Ipv4 has a new minimal routing API (just to set and get the routing
   719 protocol):
   720 <pre>
   721 -  virtual void AddRoutingProtocol (Ptr&lt;Ipv4RoutingProtocol&gt; routingProtocol, int16_t priority) = 0;
   722 +  virtual void SetRoutingProtocol (Ptr&lt;Ipv4RoutingProtocol&gt; routingProtocol) = 0;
   723 +  virtual Ptr&lt;Ipv4RoutingProtocol&gt; GetRoutingProtocol (void) const = 0;
   724 </pre>
   725 </li>
   727 <li><b> class Ipv4RoutingProtocol is refactored</b>
   728 <p> The abstract base class Ipv4RoutingProtocol has been refactored to
   729 align with corresponding Linux Ipv4 routing architecture, and has been
   730 moved from ipv4.h to a new file ipv4-routing-protocol.h.  The new
   731 methods (RouteOutput () and RouteInput ()) are aligned with Linux 
   732 ip_route_output() and ip_route_input().  However,
   733 the general nature of these calls (synchronous routing lookup for
   734 locally originated packets, and an asynchronous, callback-based lookup
   735 for forwarded packets) is still the same.
   736 <pre>
   737 -  typedef Callback&lt;void, bool, const Ipv4Route&amp;, Ptr&lt;Packet&gt;, const Ipv4Header&amp;&gt; RouteReplyCallback;
   738 +  typedef Callback&lt;void, Ptr&lt;Ipv4Route&gt;, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; UnicastForwardCallback;
   739 +  typedef Callback&lt;void, Ptr&lt;Ipv4MulticastRoute&gt;, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; MulticastForwardCallback;
   740 +  typedef Callback&lt;void, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;, uint32_t &gt; LocalDeliverCallback;
   741 +  typedef Callback&lt;void, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; ErrorCallback;
   742 -  virtual bool RequestInterface (Ipv4Address destination, uint32_t&amp; interface) = 0;
   743 +  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &amp;header, uint32_t oif, Socket::SocketErrno &amp;errno) = 0;
   744 -  virtual bool RequestRoute (uint32_t interface,
   745 -                            const Ipv4Header &amp;ipHeader,
   746 -                            Ptr&lt;Packet&gt; packet,
   747 -                            RouteReplyCallback routeReply) = 0;
   748 +  virtual bool RouteInput  (Ptr&lt;const Packet&gt; p, const Ipv4Header &amp;header, Ptr&lt;const NetDevice&gt; idev,
   749 +                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
   750 +                             LocalDeliverCallback lcb, ErrorCallback ecb) = 0;
   751 </pre>
   753 </li>
   754 <li><b> previous class Ipv4Route, Ipv4MulticastRoute renamed; new classes with
   755 those same names added</b>
   756 <p> The previous class Ipv4Route and Ipv4MulticastRoute are used by 
   757 Ipv4StaticRouting and Ipv4GlobalRouting to record internal routing table
   758 entries, so they were renamed to class Ipv4RoutingTableEntry and
   759 Ipv4MulticastRoutingTableEntry, respectively.  In their place, new
   760 class Ipv4Route and class Ipv4MulticastRoute have been added.  These
   761 are reference-counted objects that are analogous to Linux struct
   762 rtable and struct mfc_cache, respectively, to achieve better compatibility
   763 with Linux routing architecture in the future.  
   765 <li><b> class Ipv4 address-to-interface mapping functions changed</b>
   766 <p>  There was some general cleanup of functions that involve mappings
   767 from Ipv4Address to either NetDevice or Ipv4 interface index.  
   768 <pre>
   769 -  virtual uint32_t FindInterfaceForAddr (Ipv4Address addr) const = 0;
   770 -  virtual uint32_t FindInterfaceForAddr (Ipv4Address addr, Ipv4Mask mask) const = 0;
   771 +  virtual int32_t GetInterfaceForAddress (Ipv4Address address) const = 0;
   772 +  virtual int32_t GetInterfaceForPrefix (Ipv4Address address, Ipv4Mask mask) const = 0;
   773 -  virtual int32_t FindInterfaceForDevice(Ptr&lt;NetDevice&gt; nd) const = 0;
   774 +  virtual int32_t GetInterfaceForDevice (Ptr&lt;const NetDevice&gt; device) const = 0;
   775 -  virtual Ipv4Address GetSourceAddress (Ipv4Address destination) const = 0;
   776 -  virtual bool GetInterfaceForDestination (Ipv4Address dest,
   777 -  virtual uint32_t GetInterfaceByAddress (Ipv4Address addr, Ipv4Mask mask = Ipv4Mask(""));
   778 </pre>
   780 <li><b> class Ipv4 multicast join API deleted</b>
   781 <p> The following methods are not really used in present form since IGMP
   782 is not being generated, so they have been removed (planned to be replaced
   783 by multicast socket-based calls in the future):
   785 <pre>
   786 - virtual void JoinMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
   787 - virtual void LeaveMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
   788 </pre>
   791 <li><b>Deconflict NetDevice::ifIndex and Ipv4::ifIndex (bug 85).</b>
   792 <p>All function parameters named "ifIndex" that refer 
   793 to an Ipv4 interface are instead named "interface".
   794 <pre>
   795 - static const uint32_t Ipv4RoutingProtocol::IF_INDEX_ANY = 0xffffffff;
   796 + static const uint32_t Ipv4RoutingProtocol::INTERFACE_ANY = 0xffffffff;
   798 - bool Ipv4RoutingProtocol::RequestIfIndex (Ipv4Address destination, uint32_t&amp; ifIndex);
   799 + bool Ipv4RoutingProtocol::RequestInterface (Ipv4Address destination, uint32_t&amp; interface);
   800 (N.B. this particular function is planned to be renamed to RouteOutput() in the
   801 proposed IPv4 routing refactoring)
   803 - uint32_t Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask);
   804 + int_32t Ipv4::GetInterfaceForAddress (Ipv4Address address, Ipv4Mask mask) const;
   806 - bool Ipv4::GetIfIndexForDestination (Ipv4Address dest, uint32_t &amp;ifIndex) const;
   807 + bool Ipv4::GetInterfaceForDestination (Ipv4Address dest, uint32_t &amp;interface) const;
   808 (N.B. this function is not needed in the proposed Ipv4 routing refactoring)
   809 </pre>
   812 <li><b>Allow multiple IPv4 addresses to be assigned to an interface (bug 188)</b>
   813   <ul>
   814   <li> Add class Ipv4InterfaceAddress:  
   815   This is a new class to resemble Linux's struct in_ifaddr.  It holds IP addressing information, including mask,
   816   broadcast address, scope, whether primary or secondary, etc.
   817   <pre>
   818 +  virtual uint32_t AddAddress (uint32_t interface, Ipv4InterfaceAddress address) = 0;
   819 +  virtual Ipv4InterfaceAddress GetAddress (uint32_t interface, uint32_t addressIndex) const = 0;
   820 +  virtual uint32_t GetNAddresses (uint32_t interface) const = 0;
   821   </pre>
   822   <li>Regarding legacy API usage, typically where you once did the following,
   823   using the public Ipv4 class interface (e.g.):
   824   <pre>
   825   ipv4A-&gt;SetAddress (ifIndexA, Ipv4Address (""));
   826   ipv4A-&gt;SetNetworkMask (ifIndexA, Ipv4Mask (""));
   827   </pre>
   828   you now do:
   829   <pre>
   830   Ipv4InterfaceAddress ipv4IfAddrA = Ipv4InterfaceAddress (Ipv4Address (""), Ipv4Mask (""));
   831   ipv4A-&gt;AddAddress (ifIndexA, ipv4IfAddrA);
   832   </pre>
   833   <li> At the helper API level, one often gets an address from an interface
   834   container.  We preserve the legacy GetAddress (uint32_t i) but it
   835   is documented that this will return only the first (address index 0)
   836   address on the interface, if there are multiple such addresses. 
   837   We provide also an overloaded variant for the multi-address case: 
   839   <pre>
   840 Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32_t i)
   841 + Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32_t i, uint32_t j)
   842   </pre>
   844   </ul>
   846 <li><b>New WifiMacHelper objects</b>
   847 <p>The type of wifi MAC is now set by two new specific helpers, NqosWifiMacHelper for non QoS MACs and QosWifiMacHelper for Qos MACs. They are passed as argument to WifiHelper::Install methods.</li>
   848   <pre>
   849 - void WifiHelper::SetMac (std::string type, std::string n0 = "", const AttributeValue &amp;v0 = EmptyAttributeValue (),...)
   851 - NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phyHelper, NodeContainer c) const
   852 + NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phyHelper, const WifiMacHelper &amp;macHelper, NodeContainer c) const
   854 - NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, Ptr&lt;Node&gt; node) const
   855 + NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, const WifiMacHelper &amp;mac, Ptr&lt;Node&gt; node) const
   857 - NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, std::string nodeName) const
   858 + NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, const WifiMacHelper &amp;mac, std::string nodeName) const
   859   </pre>
   860   See src/helper/nqos-wifi-mac-helper.h and src/helper/qos-wifi-mac-helper.h for more details.
   861   </p>
   863 <li><b>Remove Mac48Address::IsMulticast</b>
   864   <p>This method was considered buggy and unsafe to call. Its replacement is Mac48Address::IsGroup.
   865   </li>
   867 </ul>
   869 <h2>Changed behavior:</h2>
   870 <ul>
   871 </ul>
   873 <hr>
   874 <h1>Changes from ns-3.3 to ns-3.4</h1>
   876 <h2>Changes to build system:</h2>
   877 <ul>
   878 <li>A major option regarding the downloading and building of ns-3 has been
   879 added for ns-3.4 -- the ns-3-allinone feature.  This allows a user to
   880 get the most common options for ns-3 downloaded and built with a minimum
   881 amount of trouble.  See the ns-3 tutorial for a detailed explanation of
   882 how to use this new feature.</li>
   884 <li>The build system now runs build items in parallel by default.  This includes
   885 the regression tests.</li>
   886 </ul>
   888 <h2>New API:</h2>
   889 <ul>
   890 <li>XML support has been added to the ConfigStore in src/contrib/</li>
   892 <li>The ns-2 calendar queue scheduler option has been ported to src/simulator</li>
   894 <li>A ThreeLogDistancePropagationLossModel has been added to src/devices/wifi</li>
   896 <li>ConstantAccelerationMobilityModel in src/mobility/constant-acceleration-mobility-model.h</li>
   898 <li>A new emulation mode is supported with the TapBridge net device (see
   899 src/devices/tap-bridge)</li>
   901 <li>A new facility for naming ns-3 Objects is included (see
   902 src/core/names.{cc,h})</li>
   904 <li>Wifi multicast support has been added in src/devices/wifi</li>
   905 </ul>
   907 <h2>Changes to existing API:</h2>
   909 <ul>
   910 <li>Some fairly significant changes have been made to the API of the
   911 random variable code.  Please see the ns-3 manual and src/core/
   912 for details.</li>
   914 <li>The trace sources in the various NetDevice classes has been completely
   915 reworked to allow for a consistent set of trace sources across the
   916 devices.  The names of the trace sources have been changed to provide
   917 some context with respect to the level at which the trace occurred.
   918 A new set of trace sources has been added which emulates the behavior
   919 of packet sniffers.  These sources have been used to implement tcpdump-
   920 like functionality and are plumbed up into the helper classes.  The 
   921 user-visible changes are the trace source name changes and the ability
   922 to do promiscuous-mode pcap tracing via helpers.  For further information
   923 regarding these changes, please see the ns-3 manual</li>
   925 <li>StaticMobilityModel has been renamed ConstantPositionMobilityModel
   926 StaticSpeedMobilityModel has been renamed ConstantVelocityMobilityModel</li>
   928 <li>The Callback templates have been extended to support more parameters.
   929 See src/core/callback.h</li>
   931 <li>Many helper API have been changed to allow passing Object-based parameters
   932 as string names to ease working with the object name service.</li>
   934 <li>The Config APIs now accept path segments that are names defined by the
   935 object name service.</li>
   937 <li>Minor changes were made to make the system build under the Intel C++ compiler.</li>
   939 <li>Trace hooks for association and deassociation to/from an access point were
   940 added to src/devices/wifi/</li>
   941 </ul>
   943 <h2>Changed behavior:</h2>
   945 <ul>
   946 <li>The tracing system rework has introduced some significant changes in the
   947 behavior of some trace sources, specifically in the positioning of trace sources
   948 in the device code.  For example, there were cases where the packet transmit 
   949 trace source was hit before the packet was enqueued on the device transmit quueue.
   950 This now happens just before the packet is transmitted over the channel medium.
   951 The scope of the changes is too large to be included here.  If you have concerns
   952 regarding trace semantics, please consult the net device documentation for details.
   953 As is usual, the ultimate source for documentation is the net device source code.</li>
   954 </ul>
   956 <hr>
   957 <h1>Changes from ns-3.2 to ns-3.3</h1>
   959 <h2>New API:</h2>
   960 <ul>
   961 <li>
   962 ns-3 ABORT macros in src/core/abort.h
   963 Config::MatchContainer
   964 ConstCast and DynamicCast helper functions for Ptr casting
   965 StarTopology added to several topology helpers
   966 NetDevice::IsBridge () 
   967 </li>
   969 <li>17-11-2008; changeset 
   970 <a href="">4c1c3f6bcd03</a></li>
   971 <ul>
   972 <li>
   973 The PppHeader previously defined in the point-to-point-net-device code has been 
   974 made public.
   975 </li>
   976 </ul>
   978 <li>17-11-2008; changeset 
   979 <a href="">16c2970a0344</a></li>
   980 <ul>
   981 <li>
   982 An emulated net device has been added as enabling technology for ns-3 emulation
   983 scenarios.  See src/devices/emu and examples/ for details.
   984 </li>
   985 </ul>
   987 <li>17-11-2008; changeset 
   988 <a href="">4222173d1e6d</a></li>
   989 <ul>
   990 <li>
   991 Added method InternetStackHelper::EnableAsciiChange to allow allow a user to 
   992 hook ascii trace to the drop trace events in Ipv4L3Protocol and ArpL3Protocol.
   993 </li>
   994 </ul>
   996 </ul>
   997 <h2>Changes to existing API:</h2>
   998 <ul>
  1000 <li> NetDevice::MakeMulticastAddress() was renamed to NetDevice::GetMulticast()
  1001 and the original GetMulticast() removed </li>
  1003 <li> Socket API changes:
  1004 <ul>
  1005 <li> return type of SetDataSentCallback () changed from bool to void </li>
  1006 <li> Socket::Listen() no longer takes a queueLimit argument</li>
  1007 </ul>
  1009 <li> As part of the Wifi Phy rework, there have been several API changes
  1010 at the low level and helper API level.  </li>
  1011 <ul>
  1012 <li>  At the helper API level, the WifiHelper was split to three classes: 
  1013 a WifiHelper, a YansWifiChannel helper, and a YansWifiPhy helper.  Some
  1014 functions like Ascii and Pcap tracing functions were moved from class
  1015 WifiHelper to class YansWifiPhyHelper. 
  1016 <li>  At the low-level API, there have been a number of changes to
  1017 make the Phy more modular:</li>
  1018 <ul>
  1019 <li> composite-propagation-loss-model.h is removed</li>
  1020 <li> DcfManager::NotifyCcaBusyStartNow() has changed name</li>
  1021 <li> fragmentation related functions (e.g. DcaTxop::GetNFragments()) have
  1022 changed API to account for some implementation changes</li>
  1023 <li> Interference helper and error rate model added </li>
  1024 <li> JakesPropagationLossModel::GetLoss() moved to PropagationLoss() class</li>
  1025 <li> base class WifiChannel made abstract </li>
  1026 <li> WifiNetDevice::SetChannel() removed </li>
  1027 <li> a WifiPhyState helper class added </li>
  1028 <li> addition of the YansWifiChannel and YansWifiPhy classes </li>
  1029 </ul>
  1030 </ul>
  1032 <li>17-11-2008; changeset 
  1033 <a href="">dacfd1f07538</a></li>
  1034 <ul>
  1035 <li>
  1036 Change attribute "RxErrorModel" to "ReceiveErrorModel" in CsmaNetDevice for 
  1037 consistency between devices.
  1038 </li>
  1039 </ul>
  1041 </ul>
  1042 <h2>changed behavior:</h2>
  1043 <ul>
  1045 <li>17-11-2008; changeset 
  1046 <a href="">ed0dfce40459</a></li>
  1047 <ul>
  1048 <li>
  1049 Relax reasonableness testing in Ipv4AddressHelper::SetBase to allow the 
  1050 assignment of /32 addresses.
  1051 </li>
  1052 </ul>
  1054 <li>17-11-2008; changeset 
  1055 <a href="">756887a9bbea</a></li>
  1056 <ul>
  1057 <li>
  1058 Global routing supports bridge devices.
  1059 </li>
  1060 </ul>
  1061 </ul>
  1063 <hr>
  1064 <h1>Changes from ns-3.1 to ns-3.2</h1>
  1066 <h2>New API:</h2>
  1067 <ul>
  1069 <li>26-08-2008; changeset 
  1070 <a href="">5aa65b1ea001</a></li>
  1071 <ul>
  1072 <li>
  1073 Add multithreaded and real-time simulator implementation.  Allows for emulated
  1074 net devices running in threads other than the main simulation thread to schedule
  1075 events.  Allows for pacing the simulation clock at 1x real-time.
  1076 </li>
  1077 </ul>
  1080 <li>26-08-2008; changeset 
  1081 <a href="">c69779f5e51e</a></li>
  1082 <ul>
  1083 <li>
  1084 Add threading and synchronization primitives.  Enabling technology for 
  1085 multithreaded simulator implementation.
  1086 </li>
  1087 </ul>
  1089 </ul>
  1090 <h2>New API in existing classes:</h2>
  1091 <ul>
  1093 <li>01-08-2008; changeset 
  1094 <a href="">a18520551cdf</a></li>
  1095 <ul>
  1096 <li>class ArpCache has two new attributes:  MaxRetries 
  1097 and a Drop trace.  It also has some new public methods but these are 
  1098 mostly for internal use.
  1099 </ul>
  1100 </li>
  1102 </ul>
  1103 <h2>Changes to existing API:</h2>
  1104 <ul>
  1106 <li>05-09-2008; changeset 
  1107 <a href="">aa1fb0f43571</a></li>
  1108 <ul>
  1109 <li>
  1110 Change naming of MTU and packet size attributes in CSMA and Point-to-Point devices<br>
  1111 After much discussion it was decided that the preferred way to think about 
  1112 the different senses of transmission units and encapsulations was to call the 
  1113 MAC MTU simply MTU and to use the overall packet size as the PHY-level attribute
  1114 of interest.  See the Doxygen of CsmaNetDevice::SetFrameSize and 
  1115 PointToPointNetDevice::SetFrameSize for a detailed description.
  1116 </li>
  1117 </ul>
  1119 <li>25-08-2008; changeset 
  1120 <a href="">e5ab96db540e</a></li>
  1121 <ul>
  1122 <li>
  1123 bug 273: constify packet pointers.<br>
  1124 The normal and the promiscuous receive callbacks of the NetDevice API
  1125 have been changed from:
  1126 <pre>
  1127 Callback&lt;bool,Ptr&lt;NetDevice&gt;,Ptr&lt;Packet&gt;,uint16_t,const Address &amp;&gt;
  1128 Callback&lt;bool,Ptr&lt;NetDevice&gt;, Ptr&lt;Packet&gt;, uint16_t,
  1129          const Address &amp;, const Address &amp;, enum PacketType &gt;
  1130 </pre>
  1131 to:
  1132 <pre>
  1133 Callback&lt;bool,Ptr&lt;NetDevice&gt;,Ptr&lt;const Packet&gt;,uint16_t,const Address &amp;&gt;
  1134 Callback&lt;bool,Ptr&lt;NetDevice&gt;, Ptr&lt;const Packet&gt;, uint16_t,
  1135          const Address &amp;, const Address &amp;, enum PacketType &gt;
  1136 </pre>
  1137 to avoid the kind of bugs reported in 
  1138 <a href="">bug 273</a>.
  1139 Users who implement a subclass of the NetDevice base class need to change the signature
  1140 of their SetReceiveCallback and SetPromiscReceiveCallback methods.
  1141 </li>
  1142 </ul>
  1145 <li>04-08-2008; changeset 
  1146 <a href="">cba7b2b80fe8</a></li>
  1147 <ul>
  1148 <li>
  1149 Cleanup of MTU confusion and initialization in CsmaNetDevice<br>
  1150 The MTU of the CsmaNetDevice defaulted to 65535.  This did not correspond with
  1151 the expected MTU found in Ethernet-like devices.  Also there was not clear 
  1152 documentation regarding which MTU was being set.  There are two MTU here, one
  1153 at the MAC level and one at the PHY level.  We split out the MTU setting to make
  1154 this more clear and set the default PHY level MTU to 1500 to be more like
  1155 Ethernet.  The encapsulation mode defaults to LLC/SNAP which then puts the
  1156 MAC level MTU at 1492 by default.  We allow users to now set the encapsulation
  1157 mode, MAC MTU and PHY MTU while keeping the three values consistent.  See the
  1158 Doxygen of CsmaNetDevice::SetMaxPayloadLength for a detailed description of the
  1159 issues and solution.
  1160 </li>
  1161 </ul>
  1163 <li>21-07-2008; changeset 
  1164 <a href="
  1166 <ul>
  1167 <li> class NetDevice has added a pure virtual method that
  1168 must be implemented by all subclasses:
  1169 <pre>
  1170 virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb) = 0;
  1171 </pre>
  1172 All NetDevices must support this method, and must call this callback
  1173 when processing packets in the receive direction (the appropriate place
  1174 to call this is device-dependent).  An approach to stub this out
  1175 temporarily, if you do not care about immediately enabling this
  1176 functionality, would be to add this to your device:
  1177 <pre>
  1178 void
  1179 ExampleNetDevice::SetPromiscReceiveCallback
  1180 (NetDevice::PromiscReceiveCallback cb)
  1181 { 
  1182   NS_ASSERT_MSG (false, "No implementation yet for
  1183 SetPromiscReceiveCallback");
  1184 }
  1185 </pre>
  1186 To implement this properly, consult the CsmaNetDevice for examples of
  1187 when the m_promiscRxCallback is called.
  1188 </li>
  1189 </ul>
  1191 <li>03-07-2008; changeset 
  1192 <a href="">d5f8e5fae1c6</a></li>
  1193 <ul>
  1194 <li>
  1195 Miscellaneous cleanup of Udp Helper API, to fix bug 234
  1196 <pre>
  1197 class UdpEchoServerHelper
  1198 {
  1199 public:
  1200 - UdpEchoServerHelper ();
  1201 - void SetPort (uint16_t port); 
  1202 + UdpEchoServerHelper (uint16_t port);
  1203 + 
  1204 + void SetAttribute (std::string name, const AttributeValue &amp;value);
  1205 ApplicationContainer Install (NodeContainer c);
  1207 class UdpEchoClientHelper
  1208 {
  1209 public:
  1210 - UdpEchoClientHelper ();
  1211 + UdpEchoClientHelper (Ipv4Address ip, uint16_t port);
  1212 - void SetRemote (Ipv4Address ip, uint16_t port);
  1213 - void SetAppAttribute (std::string name, const AttributeValue &amp;value);
  1214 + void SetAttribute (std::string name, const AttributeValue &amp;value);
  1215 ApplicationContainer Install (NodeContainer c);
  1216 </pre>
  1217 </li>
  1218 </ul>
  1220 <li>03-07-2008; changeset 
  1221 <a href="
  1223 <ul>
  1224 <li>
  1225 Rename all instances method names using "Set..Parameter" to "Set..Attribute"
  1226 (bug 232)
  1227 </li>
  1228 <li> How to fix your code:  Any use of helper API that was using a method
  1229 "Set...Parameter()" should be changed to read "Set...Attribute()".  e.g.
  1230 <pre>
  1231 - csma.SetChannelParameter ("DataRate", DataRateValue (5000000));
  1232 - csma.SetChannelParameter ("Delay", TimeValue (MilliSeconds (2)));
  1233 + csma.SetChannelAttribute ("DataRate", DataRateValue (5000000));
  1234 + csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
  1235 </pre>
  1236 </li>
  1237 </ul>
  1238 </li>
  1240 </ul>
  1241 <h2>Changed behavior:</h2>
  1242 <ul>
  1244 <li>07-09-2008; changeset 
  1245 <a href="">5d836ab1523b</a></li>
  1246 <ul>
  1248 <li>
  1249 Implement a finite receive buffer for TCP<br>
  1250 The native TCP model in TcpSocketImpl did not support a finite receive buffer.
  1251 This changeset adds the following functionality in this regard:
  1252 <ul>
  1253 <li>
  1254 Being able to set the receiver buffer size through the attributes system.
  1255 </li>
  1256 <li>
  1257 This receiver buffer size is now correctly exported in the TCP header as the
  1258 advertised window.  Prior to this changeset, the TCP header advertised window
  1259 was set to the maximum size of 2^16 bytes.
  1260 window
  1261 </li>
  1262 <li>
  1263 The aforementioned window size is correctly used for flow control, i.e. the
  1264 sending TCP will not send more data than available space in the receiver's
  1265 buffer.
  1266 </li>
  1267 <li>
  1268 In the case of a receiver window collapse, when a advertised zero-window
  1269 packet is received, the sender enters the persist probing state in which
  1270 it sends probe packets with one payload byte at exponentially backed-off
  1271 intervals up to 60s.  The receiver will continue to send advertised 
  1272 zero-window ACKs of the old data so long as the receiver buffer remains full.
  1273 When the receiver window clears up due to an application read, the TCP
  1274 will finally ACK the probe byte, and update its advertised window appropriately.
  1275 </li>
  1276 </ul>
  1277 See 
  1278 <a href=""> bug 239 </a> for
  1279 more.
  1280 </li>
  1281 </ul>
  1283 <li>07-09-2008; changeset 
  1284 <a href="">7afa66c2b291</a></li>
  1285 <ul>
  1286 <li>
  1287 Add correct FIN exchange behavior during TCP closedown<br>
  1288 The behavior of the native TcpSocketImpl TCP model was such that the final
  1289 FIN exchange was not correct, i.e. calling Socket::Close didn't send a FIN
  1290 packet, and even if it had, the ACK never came back, and even if it had, the
  1291 ACK would have incorrect sequence number.  All these various problems have been
  1292 addressed by this changeset.  See 
  1293 <a href=""> bug 242 </a> for
  1294 more.
  1295 </li>
  1296 </ul>
  1298 <li> 28-07-2008; changeset 
  1299 <a href="">6f68f1044df1</a>
  1300 <ul>
  1301 <li>
  1302 OLSR: HELLO messages hold time changed to 3*hello
  1303 interval from hello interval.  This is an important bug fix as
  1304 hold time == refresh time was never intentional, as it leads to
  1305 instability in neighbor detection.
  1306 </ul>
  1307 </li>
  1309 </ul>
  1311 </body>
  1312 </html>