fix queue leak and add p2p net device dox
authorCraig Dowell
Thu, 29 Mar 2007 15:53:20 -0700
changeset 414 71babb829194
parent 413 08523c548170
child 418 b784c2bb687c
fix queue leak and add p2p net device dox
src/devices/p2p/p2p-net-device.cc
src/devices/p2p/p2p-net-device.h
--- a/src/devices/p2p/p2p-net-device.cc	Thu Mar 29 22:39:26 2007 +0200
+++ b/src/devices/p2p/p2p-net-device.cc	Thu Mar 29 15:53:20 2007 -0700
@@ -61,6 +61,9 @@
       m_channel->Unref ();
       m_channel = 0;
     }
+
+  delete m_queue;
+  m_queue = 0;
 }
 
 //
@@ -136,7 +139,7 @@
   NS_DEBUG ("PointToPointNetDevice::SendTo (" << &p << ", " << &dest << ")");
   NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << p.GetUid () << ")");
 
-  assert (IsLinkUp ());
+  NS_ASSERT (IsLinkUp ());
 
 #ifdef NOTYET
     struct NetDevicePacketDestAddress tag;
@@ -206,14 +209,15 @@
 PointToPointNetDevice::TransmitStart (Packet &p)
 {
   NS_DEBUG ("PointToPointNetDevice::TransmitStart (" << &p << ")");
-  NS_DEBUG ("PointToPointNetDevice::TransmitStart (): UID is " << p.GetUid () << ")");
+  NS_DEBUG (
+    "PointToPointNetDevice::TransmitStart (): UID is " << p.GetUid () << ")");
 //
 // This function is called to start the process of transmitting a packet.
 // We need to tell the channel that we've started wiggling the wire and
 // schedule an event that will be executed when it's time to tell the 
 // channel that we're done wiggling the wire.
 //
-  NS_ASSERT(m_txMachineState == READY && "Must be READY to transmit");
+  NS_ASSERT_MSG(m_txMachineState == READY, "Must be READY to transmit");
   m_txMachineState = BUSY;
   Time tEvent = Seconds (m_bps.CalculateTxTime(p.GetSize()));
 
@@ -237,12 +241,12 @@
 // schedule an event that will be executed when it's time to re-enable
 // the transmitter after the interframe gap.
 //
-  NS_ASSERT(m_txMachineState == BUSY && "Must be BUSY if transmitting");
+  NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting");
   m_txMachineState = GAP;
   Packet p;
   bool found;
   found = m_queue->Dequeue (p);
-  NS_ASSERT(found && "Packet must be on queue if transmitted");
+  NS_ASSERT_MSG(found, "Packet must be on queue if transmitted");
   NS_DEBUG ("PointToPointNetDevice::TransmitCompleteEvent (): Pkt UID is " << 
             p.GetUid () << ")");
   m_channel->TransmitEnd (p, this); 
@@ -266,7 +270,7 @@
 // gap has passed.  If there are pending transmissions, we use this opportunity
 // to start the next transmit.
 //
-  NS_ASSERT(m_txMachineState == GAP && "Must be in interframe gap");
+  NS_ASSERT_MSG(m_txMachineState == GAP, "Must be in interframe gap");
   m_txMachineState = READY;
 
   if (m_queue->IsEmpty())
@@ -278,7 +282,7 @@
       Packet p;
       bool found;
       found = m_queue->Peek (p);
-      NS_ASSERT(found && "IsEmpty false but no Packet on queue?");
+      NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?");
       TransmitStart (p);
     }
 }
--- a/src/devices/p2p/p2p-net-device.h	Thu Mar 29 22:39:26 2007 +0200
+++ b/src/devices/p2p/p2p-net-device.h	Thu Mar 29 15:53:20 2007 -0700
@@ -37,63 +37,271 @@
 class PointToPointChannel;
 
 /**
- * \brief A duplex link
+ * \class PointToPointNetDevice
+ * \brief A Device for a Point to Point Network Link.
+ *
+ * Ns-3 takes a four-layer view of a protocol stack.  This is the same model
+ * that TCP uses.  In this view, layers 5-7 of the OSI reference model are
+ * grouped together into an application layer; layer four (transport / TCP) is
+ * broken out; layer three (network / IP) is broken out; and layers 1-2 are
+ * grouped together.  We call this grouping of layers one and two a NetDevice
+ * and represent it as a class in the system.
  *
- * XXX: Add small description of model implemented in this subclass of NetDevice.
+ * The NetDevice class is specialized according to the needs of the specific
+ * kind of network link.  In this case, the link is a PointToPoint link.  The
+ * PointToPoint link is a family of classes that includes this class, the
+ * PointToPointNetDevice, a PointToPointChannel class that represents the 
+ * actual medium across which bits are sent, a PointToPointIpv4Interface class
+ * that provides the hook to tie a general purpose node to this specific
+ * link, and finally, a PointToPointTopology object that is responsible for
+ * putting all of the pieces together.
+ *
+ * This is the PointToPointNetDevice class that represents, essentially, the
+ * PC card that is used to connect to the PointToPoint network.
  */
 class PointToPointNetDevice : public NetDevice {
 public:
+  /**
+   * Enumeration of the types of traces supported in the class.
+   *
+   */
   enum TraceType {
-    QUEUE,
-    RX,
+    QUEUE, /**< Trace queue events on the attached queue */
+    RX,    /**< Trace packet reception events (from the channel) */
   };
-
+  /**
+   * Construct a PointToPointNetDevice
+   *
+   * This is the constructor for the PointToPointNetDevice.  It takes as a
+   * parameter the Node to which this device is connected.  Ownership of the
+   * Node pointer is not implied and the node must not be deleded.
+   *
+   * @see PointToPointTopology::AddPointToPointLink ()
+   * @param node the Node to which this device is connected.
+   */
   PointToPointNetDevice (Node* node);
+  /**
+   * Copy Construct a PointToPointNetDevice
+   *
+   * This is the copy constructor for the PointToPointNetDevice.  This is
+   * primarily used in topology creation.
+   *
+   * @see PointToPointTopology::AddPointToPointLink ()
+   * @param nd the object to be copied
+   */
   PointToPointNetDevice (const PointToPointNetDevice& nd);
-
+  /**
+   * Destroy a PointToPointNetDevice
+   *
+   * This is the destructor for the PointToPointNetDevice.
+   */
   virtual ~PointToPointNetDevice();
-
+  /**
+   * Assignment Operator for a PointToPointNetDevice
+   *
+   * This is the assignment operator for the PointToPointNetDevice.  This is
+   * to allow
+   *
+   * @param nd the object to be copied
+   */
   PointToPointNetDevice& operator= (PointToPointNetDevice nd);
-
   /**
-   * \param bps the number of bits per second
-   *        which this interface can achieve.
+   * Set the Data Rate used for transmission of packets.  The data rate is
+   * set in the Attach () method from the corresponding field in the channel
+   * to which the device is attached.  It can be overridden using this method.
+   *
+   * @see Attach ()
+   * @param bps the data rate at which this object operates
    */
   void SetDataRate(DataRate bps);
+  /**
+   * Set the inteframe gap used to separate packets.  The interframe gap
+   * defines the minimum space required between packets sent by this device.
+   * It is usually set in the Attach () method based on the speed of light
+   * delay of the channel to which the device is attached.  It can be 
+   * overridden using this method if desired.
+   *
+   * @see Attach ()
+   * @param t the interframe gap time
+   */
   void SetInterframeGap(Time t);
-  
-public:
+  /**
+   * Attach the device to a channel.
+   *
+   * The PointToPointTopology object creates a PointToPointChannel and two
+   * PointtoPointNetDevices.  In order to introduce these components to each
+   * other, the topology object calls Attach () on each PointToPointNetDevice.
+   * Inside this method, the Net Device calls out to the PointToPointChannel
+   * to introduce itself.
+   *
+   * @see PointToPointTopology::AddPointToPointLink ()
+   * @see SetDataRate ()
+   * @see SetInterframeGap ()
+   * @param ch a pointer to the channel to which this object is being attached.
+   */
   bool Attach(PointToPointChannel* ch);
-  void AddQueue(Queue*);
+  /**
+   * Attach a queue to the PointToPointNetDevice.
+   *
+   * The PointToPointNetDevice "owns" a queue.  This queue is created by the
+   * PointToPointTopology object and implements a queueing method such as
+   * DropTail or RED.  The PointToPointNetDevice assumes ownership of this
+   * queue and must delete it when the device is destroyed.
+   *
+   * @see PointToPointTopology::AddPointToPointLink ()
+   * @see Queue
+   * @see DropTailQueue
+   * @param queue a pointer to the queue for which object is assuming
+   *        ownership.
+   */
+  void AddQueue(Queue* queue);
+  /**
+   * Receive a packet from a connected PointToPointChannel.
+   *
+   * The PointToPointNetDevice receives packets from its connected channel
+   * and forwards them up the protocol stack.  This is the public method
+   * used by the channel to indicate that the last bit of a packet has 
+   * arrived at the device.
+   *
+   * @see PointToPointChannel
+   * @param p a reference to the received packet
+   */
   void Receive (Packet& p);
-
 protected:
+  /**
+   * Get a copy of the attached Queue.
+   *
+   * This method is provided for any derived class that may need to get
+   * direct access to the underlying queue.
+   *
+   * @see PointToPointTopology
+   * @returns a pointer to the queue.
+   */
   Queue* GetQueue(void) const; 
-
+  /**
+   * Get a copy of the attached Channel
+   *
+   * This method is provided for any derived class that may need to get
+   * direct access to the connected channel
+   *
+   * @see PointToPointChannel
+   * @returns a pointer to the channel
+   */
+  virtual Channel *DoGetChannel(void) const;
 private:
+  /**
+   * Send a Packet Down the Wire.
+   *
+   * The SendTo method is defined as the standard way that the level three
+   * protocol uses to tell a NetDevice to send a packet.  SendTo is declared
+   * as abstract in the NetDevice class and we declare it here.
+   *
+   * @see NetDevice
+   * @param p a reference to the packet to send
+   * @param dest a reference to the MacAddress of the destination device
+   * @returns true if success, false on failure
+   */
   virtual bool SendTo (Packet& p, const MacAddress& dest);
-
+  /**
+   * Start Sending a Packet Down the Wire.
+   *
+   * The TransmitStart method is the method that is used internally in the
+   * PointToPointNetDevice to begin the process of sending a packet out on
+   * the channel.  The corresponding method is called on the channel to let
+   * it know that the physical device this class represents has virually
+   * started sending signals.  An event is scheduled for the time at which
+   * the bits have been completely transmitted.
+   *
+   * @see PointToPointChannel::TransmitStart ()
+   * @see TransmitCompleteEvent ()
+   * @param p a reference to the packet to send
+   * @returns true if success, false on failure
+   */
   bool TransmitStart (Packet &p);
+  /**
+   * Stop Sending a Packet Down the Wire and Begin the Interframe Gap.
+   *
+   * The TransmitCompleteEvent method is used internally to finish the process
+   * of sending a packet out on the channel.  During execution of this method
+   * the TransmitEnd method is called on the channel to let it know that the
+   * physical device this class represents has virually finished sending 
+   * signals.  The channel uses this event to begin its speed of light delay
+   * timer after which it notifies the Net Device at the other end of the 
+   * link that the bits have arrived.  During this method, the net device 
+   * also schedules the TransmitReadyEvent at which time the transmitter 
+   * becomes ready to send the next packet.
+   *
+   * @see PointToPointChannel::TransmitEnd ()
+   * @see TransmitReadyEvent ()
+   * @param p a reference to the packet to send
+   * @returns true if success, false on failure
+   */
   void TransmitCompleteEvent (void);
+  /**
+   * Cause the Transmitter to Become Ready to Send Another Packet.
+   *
+   * The TransmitReadyEvent method is used internally to re-enable the 
+   * transmit machine of the net device.  It is scheduled after a suitable
+   * interframe gap after the completion of the previous transmission.
+   * The queue is checked at this time, and if there is a packet waiting on
+   * the queue, the transmission process is begun.
+   *
+   * @see TransmitStart ()
+   */
   void TransmitReadyEvent (void);
-
+  /**
+   * Create a Trace Resolver for events in the net device.
+   *
+   * @see class TraceResolver
+   */
   virtual TraceResolver *DoCreateTraceResolver (TraceContext const &context);
-  virtual Channel *DoGetChannel(void) const;
-
-
+  /**
+   * Enumeration of the states of the transmit machine of the net device.
+   */
   enum TxMachineState
     {
-      READY,
-      BUSY,
-      GAP
+      READY, /**< The transmitter is ready to begin transmission of a packet */
+      BUSY,  /**< The transmitter is busy transmitting a packet */
+      GAP    /**< The transmitter is in the interframe gap time */
     };
-
+  /**
+   * The state of the Net Device transmit state machine.
+   * @see TxMachineState
+   */
   TxMachineState m_txMachineState;
+  /**
+   * The data rate that the Net Device uses to simulate packet transmission
+   * timing.
+   * @see class DataRate
+   */
   DataRate       m_bps;
+  /**
+   * The interframe gap that the Net Device uses to throttle packet
+   * transmission
+   * @see class Time
+   */
   Time           m_tInterframeGap;
-
+  /**
+   * The PointToPointChannel to which this PointToPointNetDevice has been
+   * attached.
+   * @see class PointToPointChannel
+   */
   PointToPointChannel* m_channel;
+  /**
+   * The Queue which this PointToPointNetDevice uses as a packet source.
+   * Management of this Queue has been delegated to the PointToPointNetDevice
+   * and it has the responsibility for deletion.
+   * @see class Queue
+   * @see class DropTailQueue
+   */
   Queue* m_queue;
+  /**
+   * The trace source for the packet reception events that the device can
+   * fire.
+   *
+   * @see class CallBackTraceSource
+   * @see class TraceResolver
+   */
   CallbackTraceSource<Packet &> m_rxTrace;
 };