diff --git a/src/devices/p2p/p2p-net-device.cc b/src/devices/p2p/p2p-net-device.cc deleted file mode 100644 index 3e0596d48..000000000 --- a/src/devices/p2p/p2p-net-device.cc +++ /dev/null @@ -1,222 +0,0 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2005,2006 INRIA - * 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 - * Revised: George Riley - */ - -#include -#include -#include "ns3/debug.h" -#include "ns3/queue.h" -#include "ns3/simulator.h" -#include "ns3/composite-trace-resolver.h" -#include "ns3/eui48-address.h" -#include "p2p-net-device.h" -#include "p2p-channel.h" - -NS_DEBUG_COMPONENT_DEFINE ("PointToPointNetDevice"); - -namespace ns3 { - -DataRateDefaultValue PointToPointNetDevice::g_defaultRate( - "PointToPointLinkDataRate", - "The default data rate for point to point links", - DataRate ("10Mb/s")); - -PointToPointNetDevice::PointToPointNetDevice (Ptr node, - const DataRate& rate) -: - NetDevice(node, Eui48Address::Allocate ().ConvertTo ()), - m_txMachineState (READY), - m_bps (rate), - m_tInterframeGap (Seconds(0)), - m_channel (0), - m_queue (0), - m_rxTrace () -{ - NS_DEBUG ("PointToPointNetDevice::PointToPointNetDevice (" << node << ")"); - - // BUGBUG FIXME - // - // You _must_ support broadcast to get any sort of packet from the ARP layer. - EnableBroadcast (Eui48Address ("ff:ff:ff:ff:ff:ff").ConvertTo ()); - EnableMulticast(); - EnablePointToPoint(); -} - -PointToPointNetDevice::~PointToPointNetDevice() -{ - NS_DEBUG ("PointToPointNetDevice::~PointToPointNetDevice ()"); - m_queue = 0; -} - -void PointToPointNetDevice::DoDispose() -{ - m_channel = 0; - NetDevice::DoDispose (); -} - - -void PointToPointNetDevice::SetDataRate(const DataRate& bps) -{ - m_bps = bps; -} - -void PointToPointNetDevice::SetInterframeGap(const Time& t) -{ - m_tInterframeGap = t; -} - -bool PointToPointNetDevice::SendTo (Packet& p, const Address& dest) -{ - NS_DEBUG ("PointToPointNetDevice::SendTo (" << &p << ", " << &dest << ")"); - NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << p.GetUid () << ")"); - - // GFR Comment. Why is this an assertion? Can't a link legitimately - // "go down" during the simulation? Shouldn't we just wait for it - // to come back up? - NS_ASSERT (IsLinkUp ()); - -// -// This class simulates a point to point device. In the case of a serial -// link, this means that we're simulating something like a UART. -// -// -// If there's a transmission in progress, we enque the packet for later -// trnsmission; otherwise we send it now. - if (m_txMachineState == READY) - { - return TransmitStart (p); - } - else - { - return m_queue->Enqueue(p); - } -} - - bool -PointToPointNetDevice::TransmitStart (Packet &p) -{ - NS_DEBUG ("PointToPointNetDevice::TransmitStart (" << &p << ")"); - 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 the transmission is complete. -// - NS_ASSERT_MSG(m_txMachineState == READY, "Must be READY to transmit"); - m_txMachineState = BUSY; - Time txTime = Seconds (m_bps.CalculateTxTime(p.GetSize())); - Time txCompleteTime = txTime + m_tInterframeGap; - - NS_DEBUG ("PointToPointNetDevice::TransmitStart (): " << - "Schedule TransmitCompleteEvent in " << - txCompleteTime.GetSeconds () << "sec"); - // Schedule the tx complete event - Simulator::Schedule (txCompleteTime, - &PointToPointNetDevice::TransmitComplete, - this); - return m_channel->TransmitStart(p, this, txTime); -} - -void PointToPointNetDevice::TransmitComplete (void) -{ - NS_DEBUG ("PointToPointNetDevice::TransmitCompleteEvent ()"); -// -// This function is called to finish the process of transmitting a packet. -// We need to tell the channel that we've stopped wiggling the wire and -// get the next packet from the queue. If the queue is empty, we are -// done, otherwise transmit the next packet. -// - NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting"); - m_txMachineState = READY; - Packet p; - if (!m_queue->Dequeue(p)) return; // Nothing to do at this point - TransmitStart(p); -} - -TraceResolver* PointToPointNetDevice::DoCreateTraceResolver ( - TraceContext const &context) -{ - CompositeTraceResolver *resolver = new CompositeTraceResolver (context); - resolver->Add ("queue", - MakeCallback (&Queue::CreateTraceResolver, PeekPointer (m_queue)), - PointToPointNetDevice::QUEUE); - resolver->Add ("rx", - m_rxTrace, - PointToPointNetDevice::RX); - return resolver; -} - -bool PointToPointNetDevice::Attach (Ptr ch) -{ - NS_DEBUG ("PointToPointNetDevice::Attach (" << &ch << ")"); - - m_channel = ch; - - m_channel->Attach(this); - m_bps = m_channel->GetDataRate (); - // GFR Comment. Below is definitely wrong. Interframe gap - // is unrelated to channel delay. - //m_tInterframeGap = m_channel->GetDelay (); - - /* - * For now, this device is up whenever a channel is attached to it. - * In fact, it should become up only when the second device - * is attached to the channel. So, there should be a way for - * a PointToPointChannel to notify both of its attached devices - * that the channel is 'complete', hence that the devices are - * up, hence that they can call NotifyLinkUp. - */ - NotifyLinkUp (); - return true; -} - -void PointToPointNetDevice::AddQueue (Ptr q) -{ - NS_DEBUG ("PointToPointNetDevice::AddQueue (" << q << ")"); - - m_queue = q; -} - -void PointToPointNetDevice::Receive (Packet& p) -{ - NS_DEBUG ("PointToPointNetDevice::Receive (" << &p << ")"); - - m_rxTrace (p); - ForwardUp (p); -} - -Ptr PointToPointNetDevice::GetQueue(void) const -{ - return m_queue; -} - -Ptr PointToPointNetDevice::DoGetChannel(void) const -{ - return m_channel; -} - -bool PointToPointNetDevice::DoNeedsArp (void) const -{ - return false; -} - -} // namespace ns3 diff --git a/src/devices/p2p/p2p-net-device.h b/src/devices/p2p/p2p-net-device.h deleted file mode 100644 index 474a6383c..000000000 --- a/src/devices/p2p/p2p-net-device.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2007 University of Washington - * - * 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 - */ - -#ifndef POINT_TO_POINT_NET_DEVICE_H -#define POINT_TO_POINT_NET_DEVICE_H - -#include -#include "ns3/address.h" -#include "ns3/node.h" -#include "ns3/net-device.h" -#include "ns3/callback.h" -#include "ns3/packet.h" -#include "ns3/callback-trace-source.h" -#include "ns3/nstime.h" -#include "ns3/data-rate.h" -#include "ns3/default-value.h" -#include "ns3/ptr.h" - -namespace ns3 { - -class Queue; -class PointToPointChannel; - -/** - * \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. - * - * 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, /**< 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 (Ptr node, - const DataRate& = g_defaultRate.GetValue()); - /** - * Destroy a PointToPointNetDevice - * - * This is the destructor for the PointToPointNetDevice. - */ - virtual ~PointToPointNetDevice(); - /** - * 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(const 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(const Time& t); - /** - * 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(Ptr ch); - /** - * 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(Ptr 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: - virtual void DoDispose (void); - /** - * 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. - */ - Ptr 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 Ptr DoGetChannel(void) const; - /** - * Set a new default data rate - * @param Data rate to set for new default - */ - static void SetDefaultRate(const DataRate&); - - /** - * Get the current default rate. - * @returns a const reference to current default - */ - - static const DataRate& GetDefaultRate(); - -private: - // unimplemented methods to make it impossible - // to copy these objects. - PointToPointNetDevice (const PointToPointNetDevice& nd); - PointToPointNetDevice& operator = (const PointToPointNetDevice&o); - - /** - * 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 Address of the destination device - * @returns true if success, false on failure - */ - virtual bool SendTo (Packet& p, const Address& 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 TransmitComplete method is used internally to finish the process - * of sending a packet out on the channel. - * - */ - void TransmitComplete(void); - /** - * Create a Trace Resolver for events in the net device. - * - * @see class TraceResolver - */ - virtual TraceResolver* DoCreateTraceResolver (TraceContext const &context); - virtual bool DoNeedsArp (void) const; - /** - * Enumeration of the states of the transmit machine of the net device. - */ - enum TxMachineState - { - READY, /**< The transmitter is ready to begin transmission of a packet */ - BUSY /**< The transmitter is busy transmitting a packet */ - }; - /** - * 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 - */ - Ptr 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 - */ - Ptr m_queue; - /** - * The trace source for the packet reception events that the device can - * fire. - * - * @see class CallBackTraceSource - * @see class TraceResolver - */ - CallbackTraceSource m_rxTrace; - /** - * Default data rate. Used for all newly created p2p net devices - */ - static DataRateDefaultValue g_defaultRate; - -}; - -}; // namespace ns3 - -#endif // POINT_TO_POINT_NET_DEVICE_H -