From 04a6e02b5885ca103951e47436372720ad17ed12 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 29 Mar 2007 22:39:11 +0200 Subject: [PATCH 1/3] remove dead code --- SConstruct | 2 - samples/main-p2p-net-device-if.cc | 18 ++--- src/common/trace-writer.cc | 112 ------------------------------ src/common/trace-writer.h | 59 ---------------- 4 files changed, 4 insertions(+), 187 deletions(-) delete mode 100644 src/common/trace-writer.cc delete mode 100644 src/common/trace-writer.h diff --git a/SConstruct b/SConstruct index 7d66347f5..ff05f4afc 100644 --- a/SConstruct +++ b/SConstruct @@ -145,7 +145,6 @@ common.add_sources([ 'packet.cc', 'tags.cc', 'pcap-writer.cc', - 'trace-writer.cc', 'variable-tracer-test.cc', 'trace-context.cc', 'trace-resolver.cc', @@ -166,7 +165,6 @@ common.add_inst_headers([ 'uv-trace-source.h', 'sv-trace-source.h', 'fv-trace-source.h', - 'trace-writer.h', 'pcap-writer.h', 'callback-trace-source.h', 'trace-context.h', diff --git a/samples/main-p2p-net-device-if.cc b/samples/main-p2p-net-device-if.cc index 5f75228b4..d181fdde6 100644 --- a/samples/main-p2p-net-device-if.cc +++ b/samples/main-p2p-net-device-if.cc @@ -21,6 +21,7 @@ #include #include #endif +#include #include "ns3/debug.h" #include "ns3/internet-node.h" @@ -29,7 +30,6 @@ #include "ns3/ipv4-address.h" #include "ns3/p2p-channel.h" #include "ns3/p2p-net-device.h" -#include "ns3/trace-writer.h" #include "ns3/drop-tail.h" #include "ns3/arp-ipv4-interface.h" #include "ns3/ipv4.h" @@ -42,23 +42,13 @@ using namespace ns3; -class Logger : public TraceWriter{ +class Logger { public: - Logger () - { - NS_DEBUG_UNCOND("**** Logger()"); - } Logger (std::string const &filename) { + m_filestr.open (filename.c_str ()); NS_DEBUG_UNCOND("**** Logger(string const &)"); - Open(filename); - } - - Logger (char const *filename) : m_tracer(filename) - { - NS_DEBUG_UNCOND("**** Logger(char const *)"); - Open(filename); } ~Logger () {} @@ -89,7 +79,7 @@ public: } protected: - TraceWriter m_tracer; + std::ofstream m_filestr;; }; static void diff --git a/src/common/trace-writer.cc b/src/common/trace-writer.cc deleted file mode 100644 index 45bd9ce6c..000000000 --- a/src/common/trace-writer.cc +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2007 University of Washington - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Craig Dowell - * - * Thu Feb 8 10:42:52 PST 2007 craigdo: Created from pcap-writer.c - */ - -#include "ns3/debug.h" -#include "trace-writer.h" - -NS_DEBUG_COMPONENT_DEFINE ("TraceWriter"); - -namespace ns3 { - -TraceWriter::TraceWriter () : - m_filestr() -{ - NS_DEBUG ("TraceWriter()::TraceWriter()"); - - std::streambuf *sb = m_filestr.rdbuf(); - - NS_DEBUG ("TraceWriter()::TraceWriter(): rdbuf ()"); - rdbuf(sb); - - NS_DEBUG ("TraceWriter()::TraceWriter(): done"); -} - - TraceWriter::TraceWriter (std::string const &filename) : - m_filestr() -{ - NS_DEBUG ("TraceWriter()::TraceWriter (\"" << filename << "\")"); - - m_filestr.open (filename.c_str(), std::ios::out | std::ios::app); - - std::streambuf *sb = m_filestr.rdbuf(); - - NS_DEBUG ("TraceWriter()::TraceWriter(): rdbuf ()"); - rdbuf(sb); - - NS_DEBUG ("TraceWriter()::TraceWriter(): done"); -} - -TraceWriter::TraceWriter (char const *filename) : - m_filestr() -{ - NS_DEBUG ("TraceWriter()::TraceWriter (\"" << filename << "\")"); - - m_filestr.open (filename, std::ios::out | std::ios::app); - - std::streambuf *sb = m_filestr.rdbuf(); - - NS_DEBUG ("TraceWriter()::TraceWriter(): rdbuf ()"); - rdbuf(sb); - - NS_DEBUG ("TraceWriter()::TraceWriter(): done"); -} - - -TraceWriter::~TraceWriter () -{ - NS_DEBUG ("TraceWriter()::~TraceWriter()"); -} - - void -TraceWriter::Open (std::string const &filename) -{ - NS_DEBUG ("TraceWriter()::Open (\"" << filename << "\")"); - - m_filestr.open (filename.c_str(), std::ios::out); -} - - void -TraceWriter::Open (char const *filename) -{ - NS_DEBUG ("TraceWriter()::Open (\"" << filename << "\")"); - - m_filestr.open (filename, std::ios::out); -} - - void -TraceWriter::Close () -{ - NS_DEBUG ("TraceWriter()::Close ()"); - - m_filestr.close (); -} - - void -TraceWriter::Write (std::string const &str) -{ - NS_DEBUG ("TraceWriter()::Write (\"" << str << "\")"); - - m_filestr << str; -} - -}; // namespace ns3 diff --git a/src/common/trace-writer.h b/src/common/trace-writer.h deleted file mode 100644 index 0b53e2362..000000000 --- a/src/common/trace-writer.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2007 University of Washington - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Craig Dowell - * - * Thu Feb 8 10:41:40 PST 2007 craigdo: Created - */ - -#ifndef TRACE_WRITER_H -#define TRACE_WRITER_H - -#include -#include -#include -#include -#include "ns3/callback.h" - -namespace ns3 { - -class TraceWriter : public std::ostream { -public: - TraceWriter (); - TraceWriter (std::string const &filename); - TraceWriter (char const *filename); - - ~TraceWriter (); - - void Open (std::string const &filename); - void Open (char const *filename); - void Close (); - - /** - * \param String to write to output file - */ - void Write (std::string const &str); - -protected: - std::ofstream m_filestr; - void Init (const char *filename); -}; - -}; // namespace ns3 - -#endif /* TRACE_WRITER_H */ From 9bc94d7f8033657694d86ba7d4544a20c29e0dd1 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 29 Mar 2007 22:39:26 +0200 Subject: [PATCH 2/3] remove useless code --- samples/main-p2p-net-device-if.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/samples/main-p2p-net-device-if.cc b/samples/main-p2p-net-device-if.cc index d181fdde6..ed92e5187 100644 --- a/samples/main-p2p-net-device-if.cc +++ b/samples/main-p2p-net-device-if.cc @@ -17,10 +17,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#if 0 -#include -#include -#endif #include #include "ns3/debug.h" From 403f2419d604aacf4e49213dec3ecb132496b330 Mon Sep 17 00:00:00 2001 From: Craig Dowell Date: Thu, 29 Mar 2007 15:53:20 -0700 Subject: [PATCH 3/3] fix queue leak and add p2p net device dox --- src/devices/p2p/p2p-net-device.cc | 18 +- src/devices/p2p/p2p-net-device.h | 280 ++++++++++++++++++++++++++---- 2 files changed, 255 insertions(+), 43 deletions(-) diff --git a/src/devices/p2p/p2p-net-device.cc b/src/devices/p2p/p2p-net-device.cc index e5f1f8d58..2510598b3 100644 --- a/src/devices/p2p/p2p-net-device.cc +++ b/src/devices/p2p/p2p-net-device.cc @@ -61,6 +61,9 @@ PointToPointNetDevice::~PointToPointNetDevice() m_channel->Unref (); m_channel = 0; } + + delete m_queue; + m_queue = 0; } // @@ -136,7 +139,7 @@ PointToPointNetDevice::SendTo (Packet& p, const MacAddress& dest) 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::SendTo (Packet& p, const MacAddress& dest) 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 @@ PointToPointNetDevice::TransmitCompleteEvent (void) // 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 @@ PointToPointNetDevice::TransmitReadyEvent (void) // 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 @@ PointToPointNetDevice::TransmitReadyEvent (void) 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); } } diff --git a/src/devices/p2p/p2p-net-device.h b/src/devices/p2p/p2p-net-device.h index 8b40c0ade..7301a7d22 100644 --- a/src/devices/p2p/p2p-net-device.h +++ b/src/devices/p2p/p2p-net-device.h @@ -37,63 +37,271 @@ class Queue; class PointToPointChannel; /** - * \brief A duplex link + * \class PointToPointNetDevice + * \brief A Device for a Point to Point Network Link. * - * XXX: Add small description of model implemented in this subclass of NetDevice. + * 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. + * + * 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: - enum TraceType { - QUEUE, - RX, - }; - - PointToPointNetDevice (Node* node); - PointToPointNetDevice (const PointToPointNetDevice& nd); - - virtual ~PointToPointNetDevice(); - - PointToPointNetDevice& operator= (PointToPointNetDevice nd); - /** - * \param bps the number of bits per second - * which this interface can achieve. + * Enumeration of the types of traces supported in the class. + * + */ + enum TraceType { + 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); + /** + * 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; - -private: - virtual bool SendTo (Packet& p, const MacAddress& dest); - - bool TransmitStart (Packet &p); - void TransmitCompleteEvent (void); - void TransmitReadyEvent (void); - - virtual TraceResolver *DoCreateTraceResolver (TraceContext const &context); + /** + * 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); + /** + * 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 m_rxTrace; };