Added documentation for animation interface
authorJosh Pelkey <jpelkey@gatech.edu>
Wed, 16 Dec 2009 11:17:07 -0500
changeset 5859 41cff0992d09
parent 5858 afb51c7f34c2
child 5860 035a59e5798e
Added documentation for animation interface
doc/manual/animation.texi
doc/manual/figures/animation-dumbbell.pdf
doc/manual/figures/animation-dumbbell.png
examples/animation/star-animation.cc
examples/csma/csma-star.cc
examples/tcp/star.cc
src/helper/csma-star-helper.cc
src/helper/csma-star-helper.h
src/helper/point-to-point-dumbbell-helper.h
src/helper/point-to-point-grid-helper.h
src/helper/point-to-point-star-helper.cc
src/helper/point-to-point-star-helper.h
--- a/doc/manual/animation.texi	Tue Dec 15 21:52:50 2009 -0800
+++ b/doc/manual/animation.texi	Wed Dec 16 11:17:07 2009 -0500
@@ -1,13 +1,210 @@
 @node Animation
 @chapter Animation
+@anchor{chap:Animation}
 
-@cartouche
-Placeholder chapter
-@end cartouche
+@menu
+* Animation interface::
+* NetAnim::
+@end menu
+
+Animation is an important tool for network simulation. While ns-3 does 
+not contain a graphical animation tool, it does provide an animation interface 
+for use with stand-alone animators. Currently, the animation 
+interface only supports point-to-point links; however, we hope
+to support other link types such as CSMA and wireless in the near future.
+The animation interface in ns-3 allows the generation of a custom trace 
+file to be used by an animation program.
+
+An existing stand-alone program, NetAnim, uses these custom traces to 
+graphically display the simulation. NetAnim depicts packets traveling 
+on point-to-point links as they travel from node to node.
+
+@node Animation interface
+@section Animation interface
+
+The animation interface in ns-3 currently only supports point-to-point 
+links and can generate a custom trace file for use by an animation 
+program.  A snippet from a sample trace file is shown below.
+
+@verbatim
+0.0 N 0 4 5.5
+0.0 N 1 7 5.5
+0.0 N 2 2.5 2.90192
+
+...
+
+0.0 L 0 1
+0.0 L 0 2
+0.0 L 0 3
+
+...
+
+Running the simulation
+0.668926 P 11 1 0.66936 0.669926 0.67036
+0.67036 P 1 0 0.670794 0.67136 0.671794
+0.671794 P 0 6 0.672227 0.672794 0.673227
+
+...
+@end verbatim
+
+The tracefile describes where nodes and links should be placed at 
+the top of the file. Following this placement, the packet events 
+are shown. The format for node placement, link placement and 
+packet events is shown below.
+
+@itemize @bullet
+@item Node placement: <time of placement> <N for node> <node id> 
+                      <x position> <y position>
+@item Link placement: <time of placement> <L for link> <node1 id> 
+                      <node2 id>
+@item Packet events:  <time of first bit tx> <P for packet> 
+                      <source node> <destination node> 
+                      <time of last bit tx> 
+                      <time of first bit rx> 
+                      <time of last bit rx>
+@end itemize
+
+To get started using the animation interface, several example scripts 
+have been provided to show proper use.  These examples can be found 
+in examples/animation. The example scripts use the animation interface 
+as well as topology helpers in order to automatically place the nodes 
+and generate the custom trace. It is important to note that if a 
+topology helper is not used with its provided BoundingBox method, 
+which automatically calculates the nodes' canvas positions, the nodes 
+must be placed manually by aggregating a CanvasLocation to the node. 
+An example use of CanvasLocation can be found in any of the topology 
+helpers. Additionally, a simple example of placing a node is shown below:
+
+@verbatim
+  // assuming a node container m_hub exists and 
+  // contains at least one node.
+  // we grab this node and associate a 
+  // CanvasLocation to it, in order for the 
+  // animation interface to place the node
+  Ptr<Node> hub = m_hub.Get (0);
+  Ptr<CanvasLocation> hubLoc =  hub->GetObject<CanvasLocation> ();
+    if (hubLoc == 0)
+      {
+        hubLoc = CreateObject<CanvasLocation> ();
+        hub->AggregateObject (hubLoc);
+      }
+  Vector hubVec (5, 7);
+  hubLoc->SetLocation (hubVec);
+@end verbatim
+
+Finally, after the simulation has been set up and the nodes have been 
+placed, the animation interface is used to start the animation, which 
+writes the custom trace file.  Below is an example of how to set 
+up and start the animation interface.
 
-This wiki page: @*
-@uref{http://www.nsnam.org/wiki/index.php/NetAnim,,http://www.nsnam.org/wiki/index.php/NetAnim}
-contains information about the animator support that has been added to ns-3.6.
+@verbatim
+  AnimationInterface anim;
+  // the animation interface can be set up to write 
+  // to a socket, if a port > 0 is specified
+  // see doxygen for more information
+  if (port > 0)
+    {
+      anim.SetServerPort (port);
+    }
+  else if (!animFile.empty ())
+    {
+      // if a file name is specified, 
+      // the trace is written to the file.
+      // otherwise, it is directed to stdout
+      anim.SetOutputFile (animFile);
+    }
+  anim.StartAnimation ();
+@end verbatim
+
+@node NetAnim
+@section NetAnim
+
+NetAnim is a stand-alone program which uses the custom trace files 
+generated by the animation interface to graphically display the 
+simulation.  NetAnim is based on the multi-platform 
+@uref{http://www.qtsoftware.com/products/,,Qt4 GUI toolkit}. A 
+screenshot of the NetAnim GUI is shown below.
+
+@float Figure,fig:anim-dumbbell
+@caption{NetAnim GUI with dumbbell animation.}
+@image{figures/animation-dumbbell, 4in}
+@end float
+
+The NetAnim GUI provides play, pause, and record buttons.  Play and 
+pause start and stop the simulation.  The record button starts a series 
+of screenshots of the animator, which are written to the directory in 
+which the trace file was run.  Two slider bars also exist.  The top 
+slider provides a "seek" functionality, which allows a user to skip to 
+any moment in the simulation.  The bottom slider changes the granularity 
+of the time step for the animation. Finally, there is a quit button to 
+stop the simulation and quit the animator.
+
+@subsection Prerequisites
+
+The animator requires the Qt4 development packages. If you are using a 
+Debian or Ubuntu Linux distribution, you can get the following package: 
+qt4-dev-tools 
+
+This should install everything you need to compile and build NetAnim. 
+If you are using an Red Hat based distribution, look for similar qt4 
+packages (or libqt4*) and install these using yum. Mac users should 
+install the binaries: http://www.qtsoftware.com/downloads/mac-os-cpp
 
-Another Python-based animator is available (ns-3-pyviz) but is not
-documented.
+Make sure to download the binary package; look for a link to something 
+without the word "src" or "debug" in the download filename. These will 
+be the library binaries you need.
+
+@subsection Downloading NetAnim
+
+The tarball of the source code for NetAnim is available here: 
+@uref{http://www.nsnam.org/~jpelkey3/NetAnim.tar.gz,,http://www.nsnam.org/~jpelkey3/NetAnim.tar.gz}. 
+Download it, then untar it: 
+
+@verbatim
+tar -xzvf NetAnim.tar.gz
+@end verbatim
+
+@subsection Building NetAnim
+
+NetAnim uses a Qt4 build tool called qmake; this is similar to the 
+configure script from autotools in that it generates the Makefile, 
+which make then uses to build the project. qmake is different on 
+different versions of Qt, so we'll provide some additional information 
+that is system dependent. You can check your default version of qmake:
+
+@verbatim
+qmake --version
+Qmake version: 1.07a (Qt 3.3.8b)
+Qmake is free software from Trolltech ASA.
+@end verbatim
+
+If you see something like the above, where it says Qt 3.x.x, find the 
+qt4 version of qmake on your system and explicitly call it instead.
+
+In general,
+
+@verbatim
+cd NetAnim
+qmake
+make
+@end verbatim
+
+On Mac OSX,
+
+@verbatim
+cd NetAnim
+/usr/local/Trolltech/Qt-4.x.y/bin/qmake
+make
+@end verbatim
+
+Note that above, the x.y is the specific version of Qt4 you are running. 
+As of April 1st 2009, the latest version is 4.5.0, although you might 
+have an older version already installed. 
+
+On Ubuntu/Debian with Qt3 AND Qt4,
+
+@verbatim
+cd NetAnim
+qmake-qt4
+make
+@end verbatim
Binary file doc/manual/figures/animation-dumbbell.pdf has changed
Binary file doc/manual/figures/animation-dumbbell.png has changed
--- a/examples/animation/star-animation.cc	Tue Dec 15 21:52:50 2009 -0800
+++ b/examples/animation/star-animation.cc	Wed Dec 16 11:17:07 2009 -0500
@@ -99,7 +99,7 @@
     {
       AddressValue remoteAddress (InetSocketAddress (star.GetHubIpv4Address (i), port));
       onOffHelper.SetAttribute ("Remote", remoteAddress);
-      spokeApps.Add (onOffHelper.Install (star.GetSpoke (i)));
+      spokeApps.Add (onOffHelper.Install (star.GetSpokeNode (i)));
   }
   spokeApps.Start (Seconds (1.0));
   spokeApps.Stop (Seconds (10.0));
--- a/examples/csma/csma-star.cc	Tue Dec 15 21:52:50 2009 -0800
+++ b/examples/csma/csma-star.cc	Wed Dec 16 11:17:07 2009 -0500
@@ -146,7 +146,7 @@
     {
       AddressValue remoteAddress (InetSocketAddress (star.GetHubIpv4Address (i), port));
       onOffHelper.SetAttribute ("Remote", remoteAddress);
-      spokeApps.Add (onOffHelper.Install (star.GetSpoke (i)));
+      spokeApps.Add (onOffHelper.Install (star.GetSpokeNode (i)));
     }
 
   spokeApps.Start (Seconds (1.0));
--- a/examples/tcp/star.cc	Tue Dec 15 21:52:50 2009 -0800
+++ b/examples/tcp/star.cc	Wed Dec 16 11:17:07 2009 -0500
@@ -94,7 +94,7 @@
     {
       AddressValue remoteAddress (InetSocketAddress (star.GetHubIpv4Address (i), port));
       onOffHelper.SetAttribute ("Remote", remoteAddress);
-      spokeApps.Add (onOffHelper.Install (star.GetSpoke (i)));
+      spokeApps.Add (onOffHelper.Install (star.GetSpokeNode (i)));
   }
   spokeApps.Start (Seconds (1.0));
   spokeApps.Stop (Seconds (10.0));
--- a/src/helper/csma-star-helper.cc	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/csma-star-helper.cc	Wed Dec 16 11:17:07 2009 -0500
@@ -54,7 +54,7 @@
 }
 
 Ptr<Node> 
-CsmaStarHelper::GetSpoke (uint32_t i) const
+CsmaStarHelper::GetSpokeNode (uint32_t i) const
 {
   return m_spokes.Get (i);
 }
--- a/src/helper/csma-star-helper.h	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/csma-star-helper.h	Wed Dec 16 11:17:07 2009 -0500
@@ -28,21 +28,85 @@
 
 namespace ns3 {
   
+/**
+ * \brief A helper to make it easier to create a star topology
+ * with Csma links
+ */
 class CsmaStarHelper
 {
 public:
+  /**
+   * Create a CsmaStarHelper in order to easily create
+   * star topologies using Csma links
+   *
+   * \param numSpokes the number of links attached to 
+   *        the hub node, creating a total of 
+   *        numSpokes + 1 nodes
+   *
+   * \param csmaHelper the link helper for Csma links, 
+   *        used to link nodes together
+   */
   CsmaStarHelper (uint32_t numSpokes, 
                   CsmaHelper csmaHelper);
+
   ~CsmaStarHelper ();
+
 public:
+  /**
+   * \returns a node pointer to the hub node in the
+   *          star, i.e., the center node
+   */
   Ptr<Node> GetHub () const;
-  Ptr<Node> GetSpoke (uint32_t) const;
+
+  /**
+   * \param i an index into the spokes of the star
+   *
+   * \returns a node pointer to the node at the indexed spoke
+   */
+  Ptr<Node> GetSpokeNode (uint32_t i) const;
+
+  /**
+   * \returns the net-device container which contains all of 
+   *          the devices on the hub node
+   */
   NetDeviceContainer GetHubDevices () const;
+
+  /**
+   * \returns the net-device container which contains all of 
+   *          the spoke node devices
+   */
   NetDeviceContainer GetSpokeDevices () const;
-  Ipv4Address GetHubIpv4Address (uint32_t) const;
-  Ipv4Address GetSpokeIpv4Address (uint32_t) const;
+
+  /**
+   * \param i index into the hub interfaces
+   *
+   * \returns Ipv4Address according to indexed hub interface
+   */
+  Ipv4Address GetHubIpv4Address (uint32_t i) const;
+
+  /**
+   * \param i index into the spoke interfaces
+   *
+   * \returns Ipv4Address according to indexed spoke interface
+   */
+  Ipv4Address GetSpokeIpv4Address (uint32_t i) const;
+
+  /**
+   * \returns the total number of spokes in the star
+   */
   uint32_t SpokeCount () const;
+
+  /**
+   * \param stack an InternetStackHelper which is used to install 
+   *              on every node in the star
+   */
   void InstallStack (InternetStackHelper stack);
+
+  /**
+   * \param address an Ipv4AddressHelper which is used to install 
+   *                Ipv4 addresses on all the node interfaces in 
+   *                the star
+   */
   void AssignIpv4Addresses (Ipv4AddressHelper address);
 
 private:
@@ -53,7 +117,7 @@
   Ipv4InterfaceContainer m_hubInterfaces;
   Ipv4InterfaceContainer m_spokeInterfaces;
 };
-}
-#endif
 
+} // namespace ns3
 
+#endif /* CSMA_STAR_HELPER_H */
--- a/src/helper/point-to-point-dumbbell-helper.h	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/point-to-point-dumbbell-helper.h	Wed Dec 16 11:17:07 2009 -0500
@@ -30,30 +30,113 @@
 
 namespace ns3 {
   
+/**
+ * \brief A helper to make it easier to create a dumbbell topology
+ * with p2p links
+ */
 class PointToPointDumbbellHelper
 {
 public:
-  PointToPointDumbbellHelper (uint32_t nLeftLeaf,  // Number of left size leaf nodes
-           PointToPointHelper leftHelper,
-           uint32_t nRightLeaf, // Number of right side leaf nodes
-           PointToPointHelper rightHelper,
-           PointToPointHelper bottleneckHelper);
+  /**
+   * Create a PointToPointDumbbellHelper in order to easily create
+   * dumbbell topologies using p2p links
+   *
+   * \param nLeftLeaf number of left side leaf nodes in the dumbbell
+   *
+   * \param leftHelper PointToPointHelper used to install the links 
+   *                   between the left leaf nodes and the left-most 
+   *                   router
+   *
+   * \param nRightLeaf number of right side leaf nodes in the dumbbell
+   *
+   * \param rightHelper PointToPointHelper used to install the links 
+   *                    between the right leaf nodes and the right-most 
+   *                    router
+   *
+   * \param bottleneckHelper PointToPointHelper used to install the link 
+   *                         between the inner-routers, usually known as 
+   *                         the bottleneck link
+   */
+  PointToPointDumbbellHelper (uint32_t nLeftLeaf,
+                              PointToPointHelper leftHelper,
+                              uint32_t nRightLeaf,
+                              PointToPointHelper rightHelper,
+                              PointToPointHelper bottleneckHelper);
+
   ~PointToPointDumbbellHelper ();
+
 public:
-  Ptr<Node> GetLeft ()           const; // Get the left side bottleneck router
-  Ptr<Node> GetLeft (uint32_t)   const; // Get the i'th left side leaf
-  Ptr<Node> GetRight ()          const; // Get the right side bottleneck router
-  Ptr<Node> GetRight (uint32_t)  const; // Get the i'th right side leaf
-  Ipv4Address GetLeftIpv4Address (uint32_t)  const; // Get left leaf address
-  Ipv4Address GetRightIpv4Address (uint32_t) const; // Get right leaf address
-  uint32_t  LeftCount ()         const; // Number of left side nodes
-  uint32_t  RightCount ()        const; // Number of right side nodes
+  /**
+   * \returns pointer to the node of the left side bottleneck
+   *          router
+   */
+  Ptr<Node> GetLeft () const;
+  
+  /**
+   * \returns pointer to the i'th left side leaf node
+   */
+  Ptr<Node> GetLeft (uint32_t i) const;
+
+  /**
+   * \returns pointer to the node of the right side bottleneck
+   *          router
+   */
+  Ptr<Node> GetRight () const;
+
+  /**
+   * \returns pointer to the i'th left side leaf node
+   */
+  Ptr<Node> GetRight (uint32_t i) const;
+
+  /**
+   * \returns an Ipv4Address of the i'th left leaf
+   */
+  Ipv4Address GetLeftIpv4Address (uint32_t i ) const; // Get left leaf address
+
+  /**
+   * \returns an Ipv4Address of the i'th right leaf
+   */
+  Ipv4Address GetRightIpv4Address (uint32_t i) const; // Get right leaf address
+
+  /**
+   * \returns total number of left side leaf nodes
+   */
+  uint32_t  LeftCount () const;
+
+  /**
+   * \returns total number of right side leaf nodes
+   */
+  uint32_t  RightCount () const;
+
+  /**
+   * \param stack an InternetStackHelper which is used to install 
+   *              on every node in the dumbbell
+   */
   void      InstallStack (InternetStackHelper stack);
+
+  /**
+   * \param leftIp Ipv4AddressHelper to assign Ipv4 addresses to the
+   *               interfaces on the left side of the dumbbell
+   *
+   * \param rightIp Ipv4AddressHelper to assign Ipv4 addresses to the
+   *                interfaces on the right side of the dumbbell
+   *
+   * \param routerIp Ipv4AddressHelper to assign Ipv4 addresses to the 
+   *                 interfaces on the bottleneck link
+   */
   void      AssignIpv4Addresses (Ipv4AddressHelper leftIp,
-                            Ipv4AddressHelper rightIp,
-                            Ipv4AddressHelper routerIp);
-  // Add locations in the specified bounding box
-  // Arguments are uppler left x, upper left y, lower right x, lower right y
+                                 Ipv4AddressHelper rightIp,
+                                 Ipv4AddressHelper routerIp);
+
+  /**
+   * Sets up the node canvas locations for every node in the dumbbell.
+   * This is needed for use with the animation interface
+   *
+   * \param ulx upper left x value
+   * \param uly upper left y value
+   * \param lrx lower right x value
+   * \param lry lower right y value
+   */
   void      BoundingBox (double, double, double, double);
   
 private:
@@ -63,7 +146,6 @@
   NetDeviceContainer     m_rightLeafDevices;
   NodeContainer          m_routers;
   NetDeviceContainer     m_routerDevices; // just two connecting the routers
-  // Device containers for the router devices connecting to the leaf devices
   NetDeviceContainer     m_leftRouterDevices;
   NetDeviceContainer     m_rightRouterDevices;
   Ipv4InterfaceContainer m_leftLeafInterfaces;
@@ -72,7 +154,7 @@
   Ipv4InterfaceContainer m_rightRouterInterfaces;
   Ipv4InterfaceContainer m_routerInterfaces;
 };
-}
-#endif
 
+} // namespace ns3
 
+#endif /* POINT_TO_POINT_DUMBBELL_HELPER_H */
--- a/src/helper/point-to-point-grid-helper.h	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/point-to-point-grid-helper.h	Wed Dec 16 11:17:07 2009 -0500
@@ -29,28 +29,95 @@
 
 namespace ns3 {
   
+/**
+ * \brief A helper to make it easier to create a grid topology
+ * with p2p links
+ */
 class PointToPointGridHelper 
 {
-  public: 
-    PointToPointGridHelper (uint32_t nRows, uint32_t nCols, PointToPointHelper pointToPoint);
-    ~PointToPointGridHelper ();
+public: 
+  /**
+   * Create a PointToPointGridHelper in order to easily create
+   * grid topologies using p2p links
+   *
+   * \param nRows total number of rows in the grid
+   *
+   * \param nCols total number of colums in the grid
+   *
+   * \param pointToPoint the PointToPointHelper which is used 
+   *                     to connect all of the nodes together 
+   *                     in the grid
+   */
+  PointToPointGridHelper (uint32_t nRows, 
+                          uint32_t nCols, 
+                          PointToPointHelper pointToPoint);
 
-    Ptr<Node> GetNode (uint32_t row, uint32_t col);
-    Ipv4Address GetIpv4Address (uint32_t row, uint32_t col);
+  ~PointToPointGridHelper ();
+
+  /**
+   * \param row the row address of the node desired
+   *
+   * \param col the column address of the node desired
+   *
+   * \returns a pointer to the node specified by the 
+   *          (row, col) address
+   */
+  Ptr<Node> GetNode (uint32_t row, uint32_t col);
 
-    void InstallStack (InternetStackHelper stack);
-    void AssignIpv4Addresses (Ipv4AddressHelper rowIp, Ipv4AddressHelper colIp);
-    void BoundingBox (double ulx, double uly, double lrx, double lry);
+  /**
+   * This returns an Ipv4 address at the node specified by 
+   * the (row, col) address.  Technically, a node will have 
+   * multiple interfaces in the grid; therefore, it also has 
+   * multiple Ipv4 addresses.  This method only returns one of 
+   * the addresses. If you picture the grid, the address returned 
+   * is the left row device of all the nodes, except the left-most 
+   * grid nodes, which returns the right row device.
+   *
+   * \param row the row address of the node desired
+   *
+   * \param col the column address of the node desired
+   *
+   * \returns Ipv4Address of one of the intefaces of the node 
+   *          specified by the (row, col) address
+   */
+  Ipv4Address GetIpv4Address (uint32_t row, uint32_t col);
+
+  /**
+   * \param stack an InternetStackHelper which is used to install 
+   *              on every node in the grid
+   */
+  void InstallStack (InternetStackHelper stack);
 
-  private:
-    uint32_t m_xSize;
-    uint32_t m_ySize;
-    std::vector<NetDeviceContainer> m_rowDevices;
-    std::vector<NetDeviceContainer> m_colDevices;
-    std::vector<Ipv4InterfaceContainer> m_rowInterfaces;
-    std::vector<Ipv4InterfaceContainer> m_colInterfaces;
-    std::vector<NodeContainer> m_nodes;
+  /**
+   * Assigns Ipv4 addresses to all the row and column interfaces
+   *
+   * \param rowIp the Ipv4AddressHelper used to assign Ipv4 addresses 
+   *              to all of the row interfaces in the grid
+   *
+   * \param colIp the Ipv4AddressHelper used to assign Ipv4 addresses 
+   *              to all of the row interfaces in the grid
+   */
+  void AssignIpv4Addresses (Ipv4AddressHelper rowIp, Ipv4AddressHelper colIp);
 
+  /**
+   * Sets up the node canvas locations for every node in the grid.
+   * This is needed for use with the animation interface
+   *
+   * \param ulx upper left x value
+   * \param uly upper left y value
+   * \param lrx lower right x value
+   * \param lry lower right y value
+   */
+  void BoundingBox (double ulx, double uly, double lrx, double lry);
+
+private:
+  uint32_t m_xSize;
+  uint32_t m_ySize;
+  std::vector<NetDeviceContainer> m_rowDevices;
+  std::vector<NetDeviceContainer> m_colDevices;
+  std::vector<Ipv4InterfaceContainer> m_rowInterfaces;
+  std::vector<Ipv4InterfaceContainer> m_colInterfaces;
+  std::vector<NodeContainer> m_nodes;
 };
 
 } // namespace ns3
--- a/src/helper/point-to-point-star-helper.cc	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/point-to-point-star-helper.cc	Wed Dec 16 11:17:07 2009 -0500
@@ -54,7 +54,7 @@
 }
 
 Ptr<Node> 
-PointToPointStarHelper::GetSpoke (uint32_t i) const
+PointToPointStarHelper::GetSpokeNode (uint32_t i) const
 {
   return m_spokes.Get (i);
 }
--- a/src/helper/point-to-point-star-helper.h	Tue Dec 15 21:52:50 2009 -0800
+++ b/src/helper/point-to-point-star-helper.h	Wed Dec 16 11:17:07 2009 -0500
@@ -28,21 +28,85 @@
 
 namespace ns3 {
   
+/**
+ * \brief A helper to make it easier to create a star topology
+ * with PointToPoint links
+ */
 class PointToPointStarHelper
 {
 public:
+  /**
+   * Create a PointToPointStarHelper in order to easily create
+   * star topologies using p2p links
+   *
+   * \param numSpokes the number of links attached to 
+   *        the hub node, creating a total of 
+   *        numSpokes + 1 nodes
+   *
+   * \param p2pHelper the link helper for p2p links, 
+   *        used to link nodes together
+   */
   PointToPointStarHelper (uint32_t numSpokes, 
                           PointToPointHelper p2pHelper);
+
   ~PointToPointStarHelper ();
+
 public:
+  /**
+   * \returns a node pointer to the hub node in the
+   *          star, i.e., the center node
+   */
   Ptr<Node> GetHub () const;
-  Ptr<Node> GetSpoke (uint32_t) const;
-  Ipv4Address GetHubIpv4Address (uint32_t) const;
-  Ipv4Address GetSpokeIpv4Address (uint32_t) const;
+
+  /**
+   * \param i an index into the spokes of the star
+   *
+   * \returns a node pointer to the node at the indexed spoke
+   */
+  Ptr<Node> GetSpokeNode (uint32_t i) const;
+
+  /**
+   * \param i index into the hub interfaces
+   *
+   * \returns Ipv4Address according to indexed hub interface
+   */
+  Ipv4Address GetHubIpv4Address (uint32_t i) const;
+
+  /**
+   * \param i index into the spoke interfaces
+   *
+   * \returns Ipv4Address according to indexed spoke interface
+   */
+  Ipv4Address GetSpokeIpv4Address (uint32_t i) const;
+
+  /**
+   * \returns the total number of spokes in the star
+   */
   uint32_t SpokeCount () const;
+
+  /**
+   * \param stack an InternetStackHelper which is used to install 
+   *              on every node in the star
+   */
   void InstallStack (InternetStackHelper stack);
+
+  /**
+   * \param address an Ipv4AddressHelper which is used to install 
+   *                Ipv4 addresses on all the node interfaces in 
+   *                the star
+   */
   void AssignIpv4Addresses (Ipv4AddressHelper address);
-  void BoundingBox (double, double, double, double);
+
+  /**
+   * Sets up the node canvas locations for every node in the star. 
+   * This is needed for use with the animation interface
+   *
+   * \param ulx upper left x value
+   * \param uly upper left y value
+   * \param lrx lower right x value
+   * \param lry lower right y value
+   */
+  void BoundingBox (double ulx, double uly, double lrx, double lry);
 
 private:
   NodeContainer m_hub;
@@ -52,7 +116,7 @@
   Ipv4InterfaceContainer m_hubInterfaces;
   Ipv4InterfaceContainer m_spokeInterfaces;
 };
-}
-#endif
 
+} // namespace ns3
 
+#endif /* POINT_TO_POINT_STAR_HELPER_H */