--- a/examples/csma-cd-packet-socket.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * 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
- */
-
-// Port of ns-2/tcl/ex/simple.tcl to ns-3
-//
-// Network topology
-//
-// n0 n1 n2 n3
-// | | | |
-// =====================
-//
-// - CBR/UDP flows from n0 to n1, and from n3 to n0
-// - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec.
-// (i.e., DataRate of 448,000 bps)
-// - DropTail queues
-// - Tracing of queues and packet receptions to file "csma-cd-one-subnet.tr"
-
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <cassert>
-
-#include "ns3/command-line.h"
-#include "ns3/default-value.h"
-#include "ns3/ptr.h"
-#include "ns3/random-variable.h"
-#include "ns3/debug.h"
-
-#include "ns3/simulator.h"
-#include "ns3/nstime.h"
-#include "ns3/data-rate.h"
-
-#include "ns3/ascii-trace.h"
-#include "ns3/pcap-trace.h"
-#include "ns3/internet-node.h"
-#include "ns3/csma-cd-channel.h"
-#include "ns3/csma-cd-net-device.h"
-#include "ns3/eui48-address.h"
-#include "ns3/packet-socket-address.h"
-#include "ns3/socket.h"
-#include "ns3/onoff-application.h"
-#include "ns3/queue.h"
-
-using namespace ns3;
-
-static Ptr<CsmaCdNetDevice>
-CreateCsmaCdDevice (Ptr<Node> node, Ptr<CsmaCdChannel> channel)
-{
- Ptr<CsmaCdNetDevice> device = Create<CsmaCdNetDevice> (node);
- device->Attach (channel);
- Ptr<Queue> queue = Queue::CreateDefault ();
- device->AddQueue (queue);
- return device;
-}
-
-
-int main (int argc, char *argv[])
-{
- CommandLine::Parse (argc, argv);
-
- // Here, we will explicitly create four nodes. In more sophisticated
- // topologies, we could configure a node factory.
- Ptr<Node> n0 = Create<Node> ();
- Ptr<Node> n1 = Create<Node> ();
- Ptr<Node> n2 = Create<Node> ();
- Ptr<Node> n3 = Create<Node> ();
-
- // create the shared medium used by all csma/cd devices.
- Ptr<CsmaCdChannel> channel = Create<CsmaCdChannel> (DataRate(5000000), MilliSeconds(2));
-
- // use a helper function to connect our nodes to the shared channel.
- Ptr<NetDevice> n0If = CreateCsmaCdDevice (n0, channel);
- Ptr<NetDevice> n1If = CreateCsmaCdDevice (n1, channel);
- Ptr<NetDevice> n2If = CreateCsmaCdDevice (n2, channel);
- Ptr<NetDevice> n3If = CreateCsmaCdDevice (n3, channel);
-
-
- // create the address which identifies n1 from n0
- PacketSocketAddress n0ToN1;
- n0ToN1.SetSingleDevice (n0If->GetIfIndex ()); // set outgoing interface for outgoing packets
- n0ToN1.SetPhysicalAddress (n1If->GetAddress ()); // set destination address for outgoing packets
- n0ToN1.SetProtocol (2); // set arbitrary protocol for outgoing packets
-
- // create the address which identifies n0 from n3
- PacketSocketAddress n3ToN0;
- n3ToN0.SetSingleDevice (n3If->GetIfIndex ());
- n3ToN0.SetPhysicalAddress (n0If->GetAddress ());
- n3ToN0.SetProtocol (3);
-
- // Create the OnOff application to send raw datagrams of size
- // 210 bytes at a rate of 448 Kb/s
- // from n0 to n1
- Ptr<OnOffApplication> ooff = Create<OnOffApplication> (
- n0,
- n0ToN1,
- "Packet",
- ConstantVariable(1),
- ConstantVariable(0));
- // Start the application
- ooff->Start(Seconds(1.0));
- ooff->Stop (Seconds(10.0));
-
- // Create a similar flow from n3 to n0, starting at time 1.1 seconds
- ooff = Create<OnOffApplication> (
- n3,
- n3ToN0,
- "Packet",
- ConstantVariable(1),
- ConstantVariable(0));
- // Start the application
- ooff->Start(Seconds(1.1));
- ooff->Stop (Seconds(10.0));
-
- // Configure tracing of all enqueue, dequeue, and NetDevice receive events
- // Trace output will be sent to the csma-cd-packet-socket.tr file
- AsciiTrace asciitrace ("csma-cd-packet-socket.tr");
- asciitrace.TraceAllNetDeviceRx ();
- asciitrace.TraceAllQueues ();
-
- Simulator::Run ();
-
- Simulator::Destroy ();
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/csma-one-subnet.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,166 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * 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
+ */
+
+// Port of ns-2/tcl/ex/simple.tcl to ns-3
+//
+// Network topology
+//
+// n0 n1 n2 n3
+// | | | |
+// =====================
+//
+// - CBR/UDP flows from n0 to n1, and from n3 to n0
+// - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec.
+// (i.e., DataRate of 448,000 bps)
+// - DropTail queues
+// - Tracing of queues and packet receptions to file "csma-one-subnet.tr"
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <cassert>
+
+#include "ns3/command-line.h"
+#include "ns3/default-value.h"
+#include "ns3/ptr.h"
+#include "ns3/random-variable.h"
+#include "ns3/debug.h"
+
+#include "ns3/simulator.h"
+#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
+
+#include "ns3/ascii-trace.h"
+#include "ns3/pcap-trace.h"
+#include "ns3/internet-node.h"
+#include "ns3/csma-channel.h"
+#include "ns3/csma-net-device.h"
+#include "ns3/csma-topology.h"
+#include "ns3/csma-ipv4-topology.h"
+#include "ns3/eui48-address.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/ipv4.h"
+#include "ns3/socket.h"
+#include "ns3/ipv4-route.h"
+#include "ns3/onoff-application.h"
+
+
+using namespace ns3;
+
+
+int main (int argc, char *argv[])
+{
+
+ // Users may find it convenient to turn on explicit debugging
+ // for selected modules; the below lines suggest how to do this
+#if 0
+ DebugComponentEnable("CsmaNetDevice");
+ DebugComponentEnable("Ipv4L3Protocol");
+ DebugComponentEnable("NetDevice");
+ DebugComponentEnable("Channel");
+ DebugComponentEnable("CsmaChannel");
+ DebugComponentEnable("PacketSocket");
+#endif
+
+ // Set up some default values for the simulation. Use the Bind()
+ // technique to tell the system what subclass of Queue to use,
+ // and what the queue limit is
+
+ // The below Bind command tells the queue factory which class to
+ // instantiate, when the queue factory is invoked in the topology code
+ DefaultValue::Bind ("Queue", "DropTailQueue");
+
+ // Allow the user to override any of the defaults and the above
+ // Bind()s at run-time, via command-line arguments
+ CommandLine::Parse (argc, argv);
+
+ // Here, we will explicitly create four nodes. In more sophisticated
+ // topologies, we could configure a node factory.
+ Ptr<Node> n0 = Create<InternetNode> ();
+ Ptr<Node> n1 = Create<InternetNode> ();
+ Ptr<Node> n2 = Create<InternetNode> ();
+ Ptr<Node> n3 = Create<InternetNode> ();
+
+ // We create the channels first without any IP addressing information
+ Ptr<CsmaChannel> channel0 =
+ CsmaTopology::CreateCsmaChannel(
+ DataRate(5000000), MilliSeconds(2));
+
+ uint32_t n0ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n0, channel0,
+ Eui48Address("10:54:23:54:23:50"));
+ uint32_t n1ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n1, channel0,
+ Eui48Address("10:54:23:54:23:51"));
+ uint32_t n2ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n2, channel0,
+ Eui48Address("10:54:23:54:23:52"));
+ uint32_t n3ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n3, channel0,
+ Eui48Address("10:54:23:54:23:53"));
+
+ // Later, we add IP addresses.
+ CsmaIpv4Topology::AddIpv4Address (
+ n0, n0ifIndex, Ipv4Address("10.1.1.1"), Ipv4Mask("255.255.255.0"));
+
+ CsmaIpv4Topology::AddIpv4Address (
+ n1, n1ifIndex, Ipv4Address("10.1.1.2"), Ipv4Mask("255.255.255.0"));
+
+ CsmaIpv4Topology::AddIpv4Address (
+ n2, n2ifIndex, Ipv4Address("10.1.1.3"), Ipv4Mask("255.255.255.0"));
+
+ CsmaIpv4Topology::AddIpv4Address (
+ n3, n3ifIndex, Ipv4Address("10.1.1.4"), Ipv4Mask("255.255.255.0"));
+
+ // Create the OnOff application to send UDP datagrams of size
+ // 210 bytes at a rate of 448 Kb/s
+ // from n0 to n1
+ Ptr<OnOffApplication> ooff = Create<OnOffApplication> (
+ n0,
+ InetSocketAddress ("10.1.1.2", 80),
+ "Udp",
+ ConstantVariable(1),
+ ConstantVariable(0));
+ // Start the application
+ ooff->Start(Seconds(1.0));
+ ooff->Stop (Seconds(10.0));
+
+ // Create a similar flow from n3 to n0, starting at time 1.1 seconds
+ ooff = Create<OnOffApplication> (
+ n3,
+ InetSocketAddress ("10.1.1.1", 80),
+ "Udp",
+ ConstantVariable(1),
+ ConstantVariable(0));
+ // Start the application
+ ooff->Start(Seconds(1.1));
+ ooff->Stop (Seconds(10.0));
+
+ // Configure tracing of all enqueue, dequeue, and NetDevice receive events
+ // Trace output will be sent to the csma-one-subnet.tr file
+ AsciiTrace asciitrace ("csma-one-subnet.tr");
+ asciitrace.TraceAllNetDeviceRx ();
+ asciitrace.TraceAllQueues ();
+
+ // Also configure some tcpdump traces; each interface will be traced
+ // The output files will be named
+ // simple-point-to-point.pcap-<nodeId>-<interfaceId>
+ // and can be read by the "tcpdump -r" command (use "-tt" option to
+ // display timestamps correctly)
+ PcapTrace pcaptrace ("csma-one-subnet.pcap");
+ pcaptrace.TraceAllIp ();
+
+ Simulator::Run ();
+
+ Simulator::Destroy ();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/csma-packet-socket.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,136 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * 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
+ */
+
+// Port of ns-2/tcl/ex/simple.tcl to ns-3
+//
+// Network topology
+//
+// n0 n1 n2 n3
+// | | | |
+// =====================
+//
+// - CBR/UDP flows from n0 to n1, and from n3 to n0
+// - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec.
+// (i.e., DataRate of 448,000 bps)
+// - DropTail queues
+// - Tracing of queues and packet receptions to file "csma-one-subnet.tr"
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <cassert>
+
+#include "ns3/command-line.h"
+#include "ns3/default-value.h"
+#include "ns3/ptr.h"
+#include "ns3/random-variable.h"
+#include "ns3/debug.h"
+
+#include "ns3/simulator.h"
+#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
+
+#include "ns3/ascii-trace.h"
+#include "ns3/pcap-trace.h"
+#include "ns3/internet-node.h"
+#include "ns3/csma-channel.h"
+#include "ns3/csma-net-device.h"
+#include "ns3/eui48-address.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/socket.h"
+#include "ns3/onoff-application.h"
+#include "ns3/queue.h"
+
+using namespace ns3;
+
+static Ptr<CsmaNetDevice>
+CreateCsmaDevice (Ptr<Node> node, Ptr<CsmaChannel> channel)
+{
+ Ptr<CsmaNetDevice> device = Create<CsmaNetDevice> (node);
+ device->Attach (channel);
+ Ptr<Queue> queue = Queue::CreateDefault ();
+ device->AddQueue (queue);
+ return device;
+}
+
+
+int main (int argc, char *argv[])
+{
+ CommandLine::Parse (argc, argv);
+
+ // Here, we will explicitly create four nodes. In more sophisticated
+ // topologies, we could configure a node factory.
+ Ptr<Node> n0 = Create<Node> ();
+ Ptr<Node> n1 = Create<Node> ();
+ Ptr<Node> n2 = Create<Node> ();
+ Ptr<Node> n3 = Create<Node> ();
+
+ // create the shared medium used by all csma devices.
+ Ptr<CsmaChannel> channel = Create<CsmaChannel> (DataRate(5000000), MilliSeconds(2));
+
+ // use a helper function to connect our nodes to the shared channel.
+ Ptr<NetDevice> n0If = CreateCsmaDevice (n0, channel);
+ Ptr<NetDevice> n1If = CreateCsmaDevice (n1, channel);
+ Ptr<NetDevice> n2If = CreateCsmaDevice (n2, channel);
+ Ptr<NetDevice> n3If = CreateCsmaDevice (n3, channel);
+
+
+ // create the address which identifies n1 from n0
+ PacketSocketAddress n0ToN1;
+ n0ToN1.SetSingleDevice (n0If->GetIfIndex ()); // set outgoing interface for outgoing packets
+ n0ToN1.SetPhysicalAddress (n1If->GetAddress ()); // set destination address for outgoing packets
+ n0ToN1.SetProtocol (2); // set arbitrary protocol for outgoing packets
+
+ // create the address which identifies n0 from n3
+ PacketSocketAddress n3ToN0;
+ n3ToN0.SetSingleDevice (n3If->GetIfIndex ());
+ n3ToN0.SetPhysicalAddress (n0If->GetAddress ());
+ n3ToN0.SetProtocol (3);
+
+ // Create the OnOff application to send raw datagrams of size
+ // 210 bytes at a rate of 448 Kb/s
+ // from n0 to n1
+ Ptr<OnOffApplication> ooff = Create<OnOffApplication> (
+ n0,
+ n0ToN1,
+ "Packet",
+ ConstantVariable(1),
+ ConstantVariable(0));
+ // Start the application
+ ooff->Start(Seconds(1.0));
+ ooff->Stop (Seconds(10.0));
+
+ // Create a similar flow from n3 to n0, starting at time 1.1 seconds
+ ooff = Create<OnOffApplication> (
+ n3,
+ n3ToN0,
+ "Packet",
+ ConstantVariable(1),
+ ConstantVariable(0));
+ // Start the application
+ ooff->Start(Seconds(1.1));
+ ooff->Stop (Seconds(10.0));
+
+ // Configure tracing of all enqueue, dequeue, and NetDevice receive events
+ // Trace output will be sent to the csma-packet-socket.tr file
+ AsciiTrace asciitrace ("csma-packet-socket.tr");
+ asciitrace.TraceAllNetDeviceRx ();
+ asciitrace.TraceAllQueues ();
+
+ Simulator::Run ();
+
+ Simulator::Destroy ();
+}
--- a/examples/wscript Thu Aug 09 13:42:42 2007 +0200
+++ b/examples/wscript Thu Aug 09 15:56:28 2007 -0700
@@ -3,15 +3,17 @@
def build(bld):
obj = bld.create_ns3_program('simple-global-routing',
- ['point-to-point', 'internet-node', 'global-routing'])
+ ['point-to-point', 'internet-node', 'global-routing'])
obj.source = 'simple-global-routing.cc'
- obj = bld.create_ns3_program('simple-point-to-point', ['point-to-point', 'internet-node'])
+ obj = bld.create_ns3_program('simple-point-to-point',
+ ['point-to-point', 'internet-node'])
obj.source = 'simple-point-to-point.cc'
- obj = bld.create_ns3_program('csma-cd-one-subnet', ['csma-cd', 'internet-node'])
- obj.source = 'csma-cd-one-subnet.cc'
+ obj = bld.create_ns3_program('csma-one-subnet',
+ ['csma', 'internet-node'])
+ obj.source = 'csma-one-subnet.cc'
- obj = bld.create_ns3_program('csma-cd-packet-socket', ['csma-cd', 'internet-node'])
- obj.source = 'csma-cd-packet-socket.cc'
-
+ obj = bld.create_ns3_program('csma-packet-socket',
+ ['csma', 'internet-node'])
+ obj.source = 'csma-packet-socket.cc'
--- a/src/devices/csma-cd/backoff.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007, Emmanuelle Laprise
- * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
- */
-
-#include "backoff.h"
-
-namespace ns3 {
-
-Backoff::Backoff()
-{
- m_slotTime = MicroSeconds(1);
- m_minSlots = 1;
- m_maxSlots = 1000;
- m_ceiling = 10;
- m_maxRetries = 1000;
-
- ResetBackoffTime();
-}
-
-Backoff::Backoff(Time slotTime, uint32_t minSlots, uint32_t maxSlots,
- uint32_t ceiling, uint32_t maxRetries)
-{
- m_slotTime = slotTime;
- m_minSlots = minSlots;
- m_maxSlots = maxSlots;
- m_ceiling = ceiling;
- m_maxRetries = maxRetries;
-}
-
-Time
-Backoff::GetBackoffTime (void)
-{
- Time backoff;
- uint32_t ceiling;
-
- if ((m_ceiling > 0) &&(m_numBackoffRetries > m_ceiling))
- ceiling = m_ceiling;
- else
- ceiling = m_numBackoffRetries;
-
- uint32_t minSlot = m_minSlots;
- uint32_t maxSlot = (uint32_t)pow(2, ceiling) - 1;
- if (maxSlot > m_maxSlots)
- maxSlot = m_maxSlots;
-
- uint32_t backoffSlots =
- (uint32_t)UniformVariable::GetSingleValue(minSlot, maxSlot);
-
- backoff = Scalar(backoffSlots) * m_slotTime;
- return (backoff);
-}
-
-void Backoff::ResetBackoffTime (void)
-{
- m_numBackoffRetries = 0;
-}
-
-bool Backoff::MaxRetriesReached(void) {
- return (m_numBackoffRetries >= m_maxRetries);
-}
-
-void Backoff::IncrNumRetries(void) {
- m_numBackoffRetries++;
-}
-
-} // namespace ns3
--- a/src/devices/csma-cd/backoff.h Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Emmanuelle Laprise
- *
- * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca
- * Derived from the p2p net device file
-Transmi */
-
-#ifndef BACKOFF_H
-#define BACKOFF_H
-
-#include <stdint.h>
-#include "ns3/nstime.h"
-#include "ns3/random-variable.h"
-
-namespace ns3 {
-
- /**
- * \brief The backoff class is used for calculating backoff times
- * when many net devices can write to the same channel
- *
- */
-
-class Backoff {
-public:
- uint32_t m_minSlots; // Minimum number of backoff slots (when
- // multiplied by m_slotTime, determines minimum
- // backoff time)
- uint32_t m_maxSlots; // Maximim number of backoff slots (when
- // multiplied by m_slotTime, determines
- // maximum backoff time)
- uint32_t m_ceiling; // Caps the exponential function when the
- // number of retries reaches m_ceiling
- uint32_t m_maxRetries; // Maximum number of transmission retries
- // before the packet is dropped.
- Time m_slotTime; // Length of one slot. A slot time, it usually
- // the packet transmission time, if the packet
- // size is fixed.
-
- Backoff();
- Backoff(Time slotTime, uint32_t minSlots, uint32_t maxSlots,
- uint32_t ceiling, uint32_t maxRetries);
-
- /**
- * \return The amount of time that the net device should wait before
- * trying to retransmit the packet
- */
- Time GetBackoffTime();
- /**
- * Indicates to the backoff object that the last packet was
- * successfully transmitted and that the number of retries should be
- * reset to 0.
- */
- void ResetBackoffTime();
- /**
- * \return True if the maximum number of retries has been reached
- */
- bool MaxRetriesReached();
- /**
- * Increments the number of retries by 1.
- */
- void IncrNumRetries();
-
-private:
- uint32_t m_numBackoffRetries; // Number of times that the
- // transmitter has tried to
- // unsuccessfully transmit the current
- // packet
-};
-
-}; // namespace ns3
-
-#endif // BACKOFF_H
-
--- a/src/devices/csma-cd/csma-cd-channel.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,371 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Emmanuelle Laprise
- * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
- */
-
-#include "csma-cd-channel.h"
-#include "csma-cd-net-device.h"
-#include "ns3/packet.h"
-#include "ns3/simulator.h"
-#include "ns3/debug.h"
-
-NS_DEBUG_COMPONENT_DEFINE ("CsmaCdChannel");
-
-namespace ns3 {
-
-CsmaCdDeviceRec::CsmaCdDeviceRec()
-{
- active = false;
-}
-
-CsmaCdDeviceRec::CsmaCdDeviceRec(Ptr<CsmaCdNetDevice> device)
-{
- devicePtr = device;
- active = true;
-}
-
-bool
-CsmaCdDeviceRec::IsActive() {
- return active;
-}
-
-
-//
-// By default, you get a channel with the name "CsmaCd Channel" that
-// has an "infitely" fast transmission speed and zero delay.
-CsmaCdChannel::CsmaCdChannel()
-:
- Channel ("CsmaCd Channel"),
- m_bps (DataRate(0xffffffff)),
- m_delay (Seconds(0))
-{
- NS_DEBUG("CsmaCdChannel::CsmaCdChannel ()");
- Init();
-}
-
-CsmaCdChannel::CsmaCdChannel(
- const DataRate& bps,
- const Time& delay)
-:
- Channel ("CsmaCd Channel"),
- m_bps (bps),
- m_delay (delay)
-{
- NS_DEBUG("CsmaCdChannel::CsmaCdChannel (" << Channel::GetName()
- << ", " << bps.GetBitRate() << ", " << delay << ")");
- Init();
-}
-
-CsmaCdChannel::CsmaCdChannel(
- const std::string& name,
- const DataRate& bps,
- const Time& delay)
-:
- Channel (name),
- m_bps (bps),
- m_delay (delay)
-{
- NS_DEBUG("CsmaCdChannel::CsmaCdChannel (" << name << ", " <<
- bps.GetBitRate() << ", " << delay << ")");
- Init();
-}
-
-void CsmaCdChannel::Init() {
- m_state = IDLE;
- m_deviceList.clear();
-}
-
-int32_t
-CsmaCdChannel::Attach(Ptr<CsmaCdNetDevice> device)
-{
- NS_DEBUG("CsmaCdChannel::Attach (" << device << ")");
- NS_ASSERT(device != 0);
-
- CsmaCdDeviceRec rec(device);
-
- m_deviceList.push_back(rec);
- return (m_deviceList.size() - 1);
-}
-
-bool
-CsmaCdChannel::Reattach(Ptr<CsmaCdNetDevice> device)
-{
- NS_DEBUG("CsmaCdChannel::Reattach (" << device << ")");
- NS_ASSERT(device != 0);
-
- std::vector<CsmaCdDeviceRec>::iterator it;
- for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
- {
- if (it->devicePtr == device)
- {
- if (!it->active)
- {
- it->active = true;
- return true;
- }
- else
- {
- return false;
- }
- }
- }
- return false;
-}
-
-bool
-CsmaCdChannel::Reattach(uint32_t deviceId)
-{
- NS_DEBUG("CsmaCdChannel::Reattach (" << deviceId << ")");
- if (deviceId < m_deviceList.size())
- {
- return false;
- }
-
- if (m_deviceList[deviceId].active)
- {
- return false;
- }
- else
- {
- m_deviceList[deviceId].active = true;
- return true;
- }
-}
-
-bool
-CsmaCdChannel::Detach(uint32_t deviceId)
-{
- NS_DEBUG("CsmaCdChannel::Detach (" << deviceId << ")");
-
- if (deviceId < m_deviceList.size())
- {
- if (!m_deviceList[deviceId].active)
- {
- NS_DEBUG("CsmaCdChannel::Detach Device is already detached ("
- << deviceId << ")");
- return false;
- }
-
- m_deviceList[deviceId].active = false;
- if ((m_state == TRANSMITTING) && (m_currentSrc == deviceId))
- {
- NS_DEBUG("CsmaCdChannel::Detach Device is currently"
- << "transmitting (" << deviceId << ")");
- // Here we will need to place a warning in the packet
- }
-
- return true;
- }
- else
- {
- return false;
- }
-}
-
-bool
-CsmaCdChannel::Detach(Ptr<CsmaCdNetDevice> device)
-{
- NS_DEBUG("CsmaCdChannel::Detach (" << device << ")");
- NS_ASSERT(device != 0);
-
- std::vector<CsmaCdDeviceRec>::iterator it;
- for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
- {
- if ((it->devicePtr == device) && (it->active))
- {
- it->active = false;
- return true;
- }
- }
- return false;
-}
-
-bool
-CsmaCdChannel::TransmitStart(Packet& p, uint32_t srcId)
-{
- NS_DEBUG ("CsmaCdChannel::TransmitStart (" << &p << ", " << srcId
- << ")");
- NS_DEBUG ("CsmaCdChannel::TransmitStart (): UID is " <<
- p.GetUid () << ")");
-
- if (m_state != IDLE)
- {
- NS_DEBUG("CsmaCdChannel::TransmitStart (): state is not IDLE");
- return false;
- }
-
- if (!IsActive(srcId))
- {
- NS_DEBUG("CsmaCdChannel::TransmitStart (): ERROR: Seclected "
- << "source is not currently attached to network");
- return false;
- }
-
- NS_DEBUG("CsmaCdChannel::TransmitStart (): switch to TRANSMITTING");
- m_currentPkt = p;
- m_currentSrc = srcId;
- m_state = TRANSMITTING;
- return true;
-}
-
-bool
-CsmaCdChannel::IsActive(uint32_t deviceId)
-{
- return (m_deviceList[deviceId].active);
-}
-
-bool
-CsmaCdChannel::TransmitEnd()
-{
- NS_DEBUG("CsmaCdChannel::TransmitEnd (" << &m_currentPkt << ", "
- << m_currentSrc << ")");
- NS_DEBUG("CsmaCdChannel::TransmitEnd (): UID is " <<
- m_currentPkt.GetUid () << ")");
-
- NS_ASSERT(m_state == TRANSMITTING);
- m_state = PROPAGATING;
-
- bool retVal = true;
-
- if (!IsActive(m_currentSrc)) {
- NS_DEBUG("CsmaCdChannel::TransmitEnd (): ERROR: Seclected source "
- << "was detached before the end of the transmission");
- retVal = false;
- }
-
- NS_DEBUG ("CsmaCdChannel::TransmitEnd (): Schedule event in " <<
- m_delay.GetSeconds () << "sec");
-
- Simulator::Schedule (m_delay,
- &CsmaCdChannel::PropagationCompleteEvent,
- this);
- return retVal;
-}
-
-void
-CsmaCdChannel::PropagationCompleteEvent()
-{
- NS_DEBUG("CsmaCdChannel::PropagationCompleteEvent ("
- << &m_currentPkt << ")");
- NS_DEBUG ("CsmaCdChannel::PropagationCompleteEvent (): UID is " <<
- m_currentPkt.GetUid () << ")");
-
- NS_ASSERT(m_state == PROPAGATING);
-
- NS_DEBUG ("CsmaCdChannel::PropagationCompleteEvent (): Receive");
-
- std::vector<CsmaCdDeviceRec>::iterator it;
- for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
- {
- if (it->IsActive())
- {
- it->devicePtr->Receive (m_currentPkt);
- }
- }
- m_state = IDLE;
-}
-
-
-uint32_t
-CsmaCdChannel::GetNumActDevices (void)
-{
- int numActDevices = 0;
- std::vector<CsmaCdDeviceRec>::iterator it;
- for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
- {
- if (it->active)
- {
- numActDevices++;
- }
- }
- return numActDevices;
-}
-
-// This is not the number of active devices. This is the total number
-// of devices even if some were detached after.
-uint32_t
-CsmaCdChannel::GetNDevices (void) const
-{
- return (m_deviceList.size());
-}
-
-Ptr<NetDevice>
-CsmaCdChannel::GetDevice (uint32_t i) const
-{
- Ptr< CsmaCdNetDevice > netDevice;
-
- netDevice = m_deviceList[i].devicePtr;
- return netDevice;
-}
-
-int32_t
-CsmaCdChannel::GetDeviceNum (Ptr<CsmaCdNetDevice> device)
-{
- std::vector<CsmaCdDeviceRec>::iterator it;
- int i = 0;
- for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
- {
- if (it->devicePtr == device)
- {
- if (it->active)
- {
- return i;
- }
- else
- {
- return -2;
- }
- }
- i++;
- }
- return -1;
-}
-
-bool
-CsmaCdChannel::IsBusy (void)
-{
- if (m_state == IDLE)
- {
- return false;
- }
- else
- {
- return true;
- }
-}
-
-DataRate
-CsmaCdChannel::GetDataRate (void)
-{
- return m_bps;
-}
-
-Time
-CsmaCdChannel::GetDelay (void)
-{
- return m_delay;
-}
-
-WireState
-CsmaCdChannel::GetState(void)
-{
- return m_state;
-}
-
-} // namespace ns3
--- a/src/devices/csma-cd/csma-cd-channel.h Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,307 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Emmanuelle Laprise
- *
- * 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: Emmanuelle Laprise<emmanuelle.laprise@bluekazoo.ca>
- */
-
-#ifndef CSMA_CD_CHANNEL_H
-#define CSMA_CD_CHANNEL_H
-
-#include "ns3/channel.h"
-#include "ns3/ptr.h"
-#include "ns3/packet.h"
-#include "ns3/nstime.h"
-#include "ns3/data-rate.h"
-
-namespace ns3 {
-
-class CsmaCdNetDevice;
-
- /**
- * \brief CsmaCdNetDevice Record
- *
- * Stores the information related to each net device that is
- * connected to the channel.
- */
- class CsmaCdDeviceRec {
- public:
- Ptr< CsmaCdNetDevice > devicePtr; /// Pointer to the net device
- bool active; /// Is net device enabled to TX/RX
-
- CsmaCdDeviceRec();
- CsmaCdDeviceRec(Ptr< CsmaCdNetDevice > device);
- /*
- * \return If the net device pointed to by the devicePtr is active
- * and ready to RX/TX.
- */
- bool IsActive();
- };
-
- /**
- * Current state of the channel
- */
- enum WireState
- {
- IDLE, /**< Channel is IDLE, no packet is being
- transmitted */
- TRANSMITTING, /**< Channel is BUSY, a packet is being written
- by a net device */
- PROPAGATING /**< Channel is BUSY, packet is propagating to
- all attached net devices */
- };
-
-/**
- * \brief CsmaCd Channel.
- *
- * This class represents a simple Csma/Cd channel that can be used
- * when many nodes are connected to one wire. It uses a single busy
- * flag to indicate if the channel is currently in use. It does not
- * take into account the distances between stations or the speed of
- * light to determine collisions.
- *
- * Each net device must query the state of the channel and make sure
- * that it is IDLE before writing a packet to the channel.
- *
- * When the channel is instaniated, the constructor takes parameters
- * for a single speed, in bits per second, and a speed-of-light delay
- * time as a Time object. When a net device is attached to a channel,
- * it is assigned a device ID, this is in order to facilitate the
- * check that makes sure that a net device that is trying to send a
- * packet to the channel is really connected to this channel
- *
- */
-class CsmaCdChannel : public Channel {
-public:
- /**
- * \brief Create a CsmaCdChannel
- *
- * By default, you get a channel with the name "CsmaCd Channel" that
- * has an "infitely" fast transmission speed and zero delay.
- */
- CsmaCdChannel ();
-
- /**
- * \brief Create a CsmaCdChannel
- *
- * \param bps The bitrate of the channel
- * \param delay Transmission delay through the channel
- */
- CsmaCdChannel (const DataRate& bps, const Time& delay);
-
- /**
- * \brief Create a CsmaCdChannel
- *
- * \param name the name of the channel for identification purposes
- * \param bps The bitrate of the channel
- * \param delay Transmission delay through the channel
- */
- CsmaCdChannel (const std::string& name,
- const DataRate& bps, const Time& delay);
-
- /**
- * \brief Attach a given netdevice to this channel
- *
- * \param device Device pointer to the netdevice to attach to the channel
- * \return The assigned device number
- */
- int32_t Attach (Ptr<CsmaCdNetDevice> device);
- /**
- * \brief Detach a given netdevice from this channel
- *
- * The net device is marked as inactive and it is not allowed to
- * receive or transmit packets
- *
- * \param device Device pointer to the netdevice to detach from the channel
- * \return True if the device is found and attached to the channel,
- * false if the device is not currently connected to the channel or
- * can't be found.
- */
- bool Detach (Ptr<CsmaCdNetDevice> device);
- /**
- * \brief Detach a given netdevice from this channel
- *
- * The net device is marked as inactive and it is not allowed to
- * receive or transmit packets
- *
- * \param deviceId The deviceID assigned to the net device when it
- * was connected to the channel
- * \return True if the device is found and attached to the channel,
- * false if the device is not currently connected to the channel or
- * can't be found.
- */
- bool Detach (uint32_t deviceId);
- /**
- * \brief Reattach a previously detached net device to the channel
- *
- * The net device is marked as active. It is now allowed to receive
- * or transmit packets. The net device must have been previously
- * attached to the channel using the attach function.
- *
- * \param deviceId The device ID assigned to the net device when it
- * was connected to the channel
- * \return True if the device is found and is not attached to the
- * channel, false if the device is currently connected to the
- * channel or can't be found.
- */
- bool Reattach(uint32_t deviceId);
- /**
- * \brief Reattach a previously detached net device to the channel
- *
- * The net device is marked as active. It is now allowed to receive
- * or transmit packets. The net device must have been previously
- * attached to the channel using the attach function.
- *
- * \param device Device pointer to the netdevice to detach from the channel
- * \return True if the device is found and is not attached to the
- * channel, false if the device is currently connected to the
- * channel or can't be found.
- */
- bool Reattach(Ptr<CsmaCdNetDevice> device);
- /**
- * \brief Start transmitting a packet over the channel
- *
- * If the srcId belongs to a net device that is connected to the
- * channel, packet transmission begins, and the channel becomes busy
- * until the packet has completely reached all destinations.
- *
- * \param p A reference to the packet that will be transmitted over
- * the channel
- * \param srcId The device Id of the net device that wants to
- * transmit on the channel.
- * \return True if the channel is not busy and the transmitting net
- * device is currently active.
- */
- bool TransmitStart (Packet& p, uint32_t srcId);
- /**
- * \brief Indicates that the net device has finished transmitting
- * the packet over the channel
- *
- * The channel will stay busy until the packet has completely
- * propagated to all net devices attached to the channel. The
- * TransmitEnd function schedules the PropagationCompleteEvent which
- * will free the channel for further transmissions. Stores the
- * packet p as the m_currentPkt, the packet being currently
- * transmitting.
- *
- * \return Returns true unless the source was detached before it
- * completed its transmission.
- */
- bool TransmitEnd ();
- /**
- * \brief Indicates that the channel has finished propagating the
- * current packet. The channel is released and becomes free.
- *
- * Calls the receive function of every active net device that is
- * attached to the channel.
- */
- void PropagationCompleteEvent();
- /**
- * \return Returns the device number assigned to a net device by the
- * channel
- *
- * \param device Device pointer to the netdevice for which the device
- * number is needed
- */
- int32_t GetDeviceNum (Ptr<CsmaCdNetDevice> device);
- /**
- * \return Returns the state of the channel (IDLE -- free,
- * TRANSMITTING -- busy, PROPAGATING - busy )
- */
- WireState GetState();
-
- /**
- * \brief Indicates if the channel is busy. The channel will only
- * accept new packets for transmission if it is not busy.
- *
- * \return Returns true if the channel is busy and false if it is
- * free.
- */
- bool IsBusy();
-
- /**
- * \brief Indicates if a net device is currently attached or
- * detached from the channel.
- *
- * \param deviceId The ID that was assigned to the net device when
- * it was attached to the channel.
- * \return Returns true if the net device is attached to the
- * channel, false otherwise.
- */
- bool IsActive(uint32_t deviceId);
- /**
- * \return Returns the number of net devices that are currently
- * attached to the channel.
- */
- uint32_t GetNumActDevices (void);
- /**
- * \return Returns the total number of devices including devices
- * that have been detached from the channel.
- */
- virtual uint32_t GetNDevices (void) const;
- /**
- * \param i The deviceId of the net device for which we want the
- * pointer.
- * \return Returns the pointer to the net device that is associated
- * with deviceId i.
- */
- virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
-
- virtual DataRate GetDataRate (void);
- virtual Time GetDelay (void);
-
-private:
- DataRate m_bps; /// Data rate of the channel
- Time m_delay; /// Delay of the channel.
-
- /**
- * List of the net devices that have been or are currently connected
- * to the channel.
- *
- * Devices are nor removed from this list, they are marked as
- * inactive. Otherwise the assigned device IDs will not refer to the
- * correct NetDevice. The DeviceIds are used so that it is possible
- * to have a number to refer to an entry in the list so that the
- * whole list does not have to be searched when making sure that a
- * source is attached to a channel when it is transmitting data.
- */
- std::vector< CsmaCdDeviceRec > m_deviceList;
- /**
- * Packet that is currently being transmitted on the channel (or last
- * packet to have been transmitted on the channel if the channel is
- * free.)
- */
- Packet m_currentPkt;
- /**
- * Device Id of the source that is currently transmitting on the
- * channel. Or last source to have transmitted a packet on the
- * channel, if the channel is currently not busy.
- */
- uint32_t m_currentSrc;
- /**
- * Current state of the channel
- */
- WireState m_state;
- /**
- * Initializes the channel when it is constructed. Resets the
- * deviceList and sets the channel state to IDLE.
- */
- void Init (void);
-};
-
-} // namespace ns3
-
-#endif /* CSMA_CD_CHANNEL_H */
--- a/src/devices/csma-cd/csma-cd-ipv4-topology.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-//
-// Copyright (c) 2007 Emmanuelle Laprise
-//
-// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
-//
-
-#include <algorithm>
-#include "ns3/assert.h"
-#include "ns3/debug.h"
-#include "ns3/fatal-error.h"
-#include "ns3/nstime.h"
-#include "ns3/internet-node.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ipv4.h"
-#include "ns3/queue.h"
-
-#include "csma-cd-channel.h"
-#include "csma-cd-net-device.h"
-#include "csma-cd-ipv4-topology.h"
-
-namespace ns3 {
-
-
-uint32_t
-CsmaCdIpv4Topology::AddIpv4CsmaCdNode(Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr)
-{
- Ptr<Queue> q = Queue::CreateDefault ();
-
- // assume full-duplex
- Ptr<CsmaCdNetDevice> nd0 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::IP_ARP,
- true, true);
- nd0->AddQueue(q);
- nd0->Attach (ch);
- return nd0->GetIfIndex ();
-}
-
-
-void
-CsmaCdIpv4Topology::AddIpv4LlcCsmaCdNode(Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr)
-{
- Ptr<Queue> q = Queue::CreateDefault ();
-
- Ptr<CsmaCdNetDevice> nd0 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::LLC,
- true, false);
- nd0->AddQueue(q);
- nd0->Attach (ch);
-
- Ptr<CsmaCdNetDevice> nd1 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::LLC,
- false, true);
- nd1->AddQueue(q);
- nd1->Attach (ch);
-}
-
-void
-CsmaCdIpv4Topology::AddIpv4RawCsmaCdNode(Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr)
-{
- Ptr<Queue> q = Queue::CreateDefault ();
-
- Ptr<CsmaCdNetDevice> nd0 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::RAW,
- true, false);
- nd0->AddQueue(q);
- nd0->Attach (ch);
-
- Ptr<CsmaCdNetDevice> nd1 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::RAW,
- false, true);
- nd1->AddQueue(q);
- nd1->Attach (ch);
-}
-
-void
-CsmaCdIpv4Topology::AddIpv4Address(Ptr<Node> n1,
- int ndNum,
- const Ipv4Address& addr1,
- const Ipv4Mask& netmask1)
-{
-
- // Duplex link is assumed to be subnetted as a /30
- // May run this unnumbered in the future?
- Ipv4Mask netmask(netmask1);
-
- Ptr<NetDevice> nd1 = n1->GetDevice(ndNum);
-
- Ptr<Ipv4> ip1 = n1->QueryInterface<Ipv4> (Ipv4::iid);
- uint32_t index1 = ip1->AddInterface (nd1);
-
- ip1->SetAddress (index1, addr1);
- ip1->SetNetworkMask (index1, netmask);
- ip1->SetUp (index1);
-
-}
-
-void
-CsmaCdIpv4Topology::AddIpv4Routes (
- Ptr<NetDevice> nd1, Ptr<NetDevice> nd2)
-{
- // Assert that both are Ipv4 nodes
- Ptr<Ipv4> ip1 = nd1->GetNode ()->QueryInterface<Ipv4> (Ipv4::iid);
- Ptr<Ipv4> ip2 = nd2->GetNode ()->QueryInterface<Ipv4> (Ipv4::iid);
- NS_ASSERT(ip1 != 0 && ip2 != 0);
-
- // Get interface indexes for both nodes corresponding to the right channel
- uint32_t index1 = 0;
- bool found = false;
- for (uint32_t i = 0; i < ip1->GetNInterfaces (); i++)
- {
- if (ip1 ->GetNetDevice (i) == nd1)
- {
- index1 = i;
- found = true;
- }
- }
- NS_ASSERT(found);
-
- uint32_t index2 = 0;
- found = false;
- for (uint32_t i = 0; i < ip2->GetNInterfaces (); i++)
- {
- if (ip2 ->GetNetDevice (i) == nd2)
- {
- index2 = i;
- found = true;
- }
- }
- NS_ASSERT(found);
-
- ip1->AddHostRouteTo (ip2-> GetAddress (index2), index1);
- ip2->AddHostRouteTo (ip1-> GetAddress (index1), index2);
-}
-
-} // namespace ns3
-
--- a/src/devices/csma-cd/csma-cd-ipv4-topology.h Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-//
-// Copyright (c) 2007 Emmanuelle Laprise
-//
-// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
-//
-
-#ifndef __CSMA_CD_IPV4_TOPOLOGY_H__
-#define __CSMA_CD_IPV4_TOPOLOGY_H__
-
-#include "ns3/ptr.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ipv4.h"
-#include "ns3/ipv4-route.h"
-#include "ns3/internet-node.h"
-#include "ns3/csma-cd-net-device.h"
-
-// The topology class consists of only static methods thar are used to
-// create the topology and data flows for an ns3 simulation
-
-namespace ns3 {
-
-class CsmaCdIpv4Channel;
-class Node;
-class IPAddr;
-class DataRate;
-class Queue;
-
-/**
- * \brief A helper class to create Topologies based on the
- * InternetNodes and CsmaCdChannels. Either the
- * SimpleCsmaCdNetDevice or the LLCCsmaCdNetDevice can be used
- * when constructing these topologies.
- */
-class CsmaCdIpv4Topology {
-public:
-
- /**
- * \param n1 Node to be attached to the Csma/Cd channel
- * \param ch CsmaCdChannel to which node n1 should be attached
- * \param addr Mac address of the node
- *
- * Add a Csma/Cd node to a Csma/Cd channel. This function adds
- * a EthernetCsmaCdNetDevice to the nodes so that they can
- * connect to a CsmaCdChannel. This means that Ethernet headers
- * and trailers will be added to the packet before sending out on
- * the net device.
- *
- * \return ifIndex of the device
- */
- static uint32_t AddIpv4CsmaCdNode( Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr);
-
- /**
- * \param n1 Node to be attached to the Csma/Cd channel
- * \param ch CsmaCdChannel to which node n1 should be attached
- * \param addr Mac address of the node
- *
- * Add a Csma/Cd node to a Csma/Cd channel. This function adds
- * a RawCsmaCdNetDevice to the nodes so that they can connect
- * to a CsmaCdChannel.
- */
- static void AddIpv4RawCsmaCdNode( Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr);
-
- /**
- * \param n1 Node to be attached to the Csma/Cd channel
- * \param ch CsmaCdChannel to which node n1 should be attached
- * \param addr Mac address of the node
- *
- * Add a Csma/Cd node to a Csma/Cd channel. This function adds
- * a LlcCsmaCdNetDevice to the nodes so that they can connect
- * to a CsmaCdChannel.
- */
- static void AddIpv4LlcCsmaCdNode( Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- Eui48Address addr);
-
-
-
- /**
- * \param n1 Node
- * \param ndNum NetDevice number with which to associate address
- * \param addr1 Ipv4 Address for ndNum of n1
- * \param network network mask for ndNum of node n1
- *
- * Add an Ipv4Address to the Ipv4 interface associated with the
- * ndNum CsmaCdIpv4NetDevices on the provided
- * CsmaCdIpv4Channel
- */
- static void AddIpv4Address(Ptr<Node> n1, int ndNum,
- const Ipv4Address& addr1,
- const Ipv4Mask& netmask1);
-
- /**
- * \param nd1 Node
- * \param nd2 Node
- *
- * Add an IPV4 host route between the two specified net devices
- */
- static void AddIpv4Routes (Ptr<NetDevice> nd1, Ptr<NetDevice> nd2);
-};
-
-} // namespace ns3
-
-#endif
-
--- a/src/devices/csma-cd/csma-cd-net-device.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,570 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Emmanuelle Laprise
- * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
- */
-
-#include <iostream>
-#include <cassert>
-#include "ns3/debug.h"
-#include "ns3/queue.h"
-#include "ns3/simulator.h"
-#include "ns3/composite-trace-resolver.h"
-#include "csma-cd-net-device.h"
-#include "csma-cd-channel.h"
-#include "ns3/ethernet-header.h"
-#include "ns3/ethernet-trailer.h"
-#include "ns3/llc-snap-header.h"
-
-NS_DEBUG_COMPONENT_DEFINE ("CsmaCdNetDevice");
-
-namespace ns3 {
-
-CsmaCdTraceType::CsmaCdTraceType (enum Type type)
- : m_type (type)
-{}
-CsmaCdTraceType::CsmaCdTraceType ()
- : m_type (RX)
-{}
-void
-CsmaCdTraceType::Print (std::ostream &os) const
-{
- switch (m_type) {
- case RX:
- os << "dev-rx";
- break;
- case DROP:
- os << "dev-drop";
- break;
- }
-}
-uint16_t
-CsmaCdTraceType::GetUid (void)
-{
- static uint16_t uid = AllocateUid<CsmaCdTraceType> ("CsmaCdTraceType");
- return uid;
-}
-
-
-CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node)
- : NetDevice (node, Eui48Address::Allocate ()),
- m_bps (DataRate (0xffffffff))
-{
- NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
- m_encapMode = IP_ARP;
- Init(true, true);
-}
-
-CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr,
- CsmaCdEncapsulationMode encapMode)
- : NetDevice(node, addr),
- m_bps (DataRate (0xffffffff))
-{
- NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
- m_encapMode = encapMode;
-
- Init(true, true);
-}
-
-CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr,
- CsmaCdEncapsulationMode encapMode,
- bool sendEnable, bool receiveEnable)
- : NetDevice(node, addr),
- m_bps (DataRate (0xffffffff))
-{
- NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
- m_encapMode = encapMode;
-
- Init(sendEnable, receiveEnable);
-}
-
-CsmaCdNetDevice::~CsmaCdNetDevice()
-{
- NS_DEBUG ("CsmaCdNetDevice::~CsmaCdNetDevice ()");
- m_queue = 0;
-}
-
-void
-CsmaCdNetDevice::DoDispose ()
-{
- m_channel = 0;
- NetDevice::DoDispose ();
-}
-
-//
-// Assignment operator for CsmaCdNetDevice.
-//
-// This uses the non-obvious trick of taking the source net device passed by
-// value instead of by reference. This causes the copy constructor to be
-// invoked (where the real work is done -- see above). All we have to do
-// here is to return the newly constructed net device.
-//
-/*
-CsmaCdNetDevice&
-CsmaCdNetDevice::operator= (const CsmaCdNetDevice nd)
-{
- NS_DEBUG ("CsmaCdNetDevice::operator= (" << &nd << ")");
- return *this;
-}
-*/
-
-void
-CsmaCdNetDevice::Init(bool sendEnable, bool receiveEnable)
-{
- m_txMachineState = READY;
- m_tInterframeGap = Seconds(0);
- m_channel = 0;
- m_queue = 0;
-
- EnableBroadcast (Eui48Address ("ff:ff:ff:ff:ff:ff"));
- EnableMulticast();
- EnablePointToPoint();
-
- SetSendEnable (sendEnable);
- SetReceiveEnable (receiveEnable);
-}
-
-void
-CsmaCdNetDevice::SetSendEnable (bool sendEnable)
-{
- m_sendEnable = sendEnable;
-}
-
-void
-CsmaCdNetDevice::SetReceiveEnable (bool receiveEnable)
-{
- m_receiveEnable = receiveEnable;
-}
-bool
-CsmaCdNetDevice::IsSendEnabled (void)
-{
- return (m_sendEnable);
-}
-
-bool
-CsmaCdNetDevice::IsReceiveEnabled (void)
-{
- return (m_receiveEnable);
-}
-
-void
-CsmaCdNetDevice::SetDataRate (DataRate bps)
-{
- m_bps = bps;
-}
-
-void
-CsmaCdNetDevice::SetInterframeGap (Time t)
-{
- m_tInterframeGap = t;
-}
-
-void
-CsmaCdNetDevice::SetBackoffParams (Time slotTime, uint32_t minSlots,
- uint32_t maxSlots, uint32_t ceiling,
- uint32_t maxRetries)
-{
- m_backoff.m_slotTime = slotTime;
- m_backoff.m_minSlots = minSlots;
- m_backoff.m_maxSlots = maxSlots;
- m_backoff.m_ceiling = ceiling;
- m_backoff.m_maxRetries = maxRetries;
-}
-void
-CsmaCdNetDevice::AddHeader (Packet& p, Eui48Address dest,
- uint16_t protocolNumber)
-{
- if (m_encapMode == RAW)
- {
- return;
- }
- EthernetHeader header (false);
- EthernetTrailer trailer;
- Eui48Address source = Eui48Address::ConvertFrom (GetAddress ());
- header.SetSource(source);
- header.SetDestination(dest);
-
- uint16_t lengthType = 0;
- switch (m_encapMode)
- {
- case ETHERNET_V1:
- lengthType = p.GetSize() + header.GetSerializedSize() + trailer.GetSerializedSize();
- break;
- case IP_ARP:
- lengthType = protocolNumber;
- break;
- case LLC: {
- LlcSnapHeader llc;
- llc.SetType (protocolNumber);
- p.AddHeader (llc);
- } break;
- case RAW:
- NS_ASSERT (false);
- break;
- }
- header.SetLengthType (lengthType);
- p.AddHeader(header);
- trailer.CalcFcs(p);
- p.AddTrailer(trailer);
-}
-bool
-CsmaCdNetDevice::ProcessHeader (Packet& p, uint16_t & param)
-{
- if (m_encapMode == RAW)
- {
- return true;
- }
- EthernetHeader header (false);
- EthernetTrailer trailer;
-
- p.RemoveTrailer(trailer);
- trailer.CheckFcs(p);
- p.RemoveHeader(header);
-
- if ((header.GetDestination() != GetBroadcast ()) &&
- (header.GetDestination() != GetAddress ()))
- {
- return false;
- }
-
- switch (m_encapMode)
- {
- case ETHERNET_V1:
- case IP_ARP:
- param = header.GetLengthType();
- break;
- case LLC: {
- LlcSnapHeader llc;
- p.RemoveHeader (llc);
- param = llc.GetType ();
- } break;
- case RAW:
- NS_ASSERT (false);
- break;
- }
- return true;
-}
-
-bool
-CsmaCdNetDevice::DoNeedsArp (void) const
-{
- if ((m_encapMode == IP_ARP) || (m_encapMode == LLC))
- {
- return true;
- }
- else
- {
- return false;
- }
-}
-
-bool
-CsmaCdNetDevice::SendTo (Packet& p, const Address& dest, uint16_t protocolNumber)
-{
- NS_DEBUG ("CsmaCdNetDevice::SendTo (" << &p << ")");
- NS_DEBUG ("CsmaCdNetDevice::SendTo (): UID is " << p.GetUid () << ")");
-
- NS_ASSERT (IsLinkUp ());
-
- // Only transmit if send side of net device is enabled
- if (!IsSendEnabled())
- return false;
-
- Eui48Address destination = Eui48Address::ConvertFrom (dest);
- AddHeader(p, destination, protocolNumber);
-
- // Place the packet to be sent on the send queue
- if (m_queue->Enqueue(p) == false )
- {
- return false;
- }
- // If the device is idle, we need to start a transmission. Otherwise,
- // the transmission will be started when the current packet finished
- // transmission (see TransmitCompleteEvent)
- if (m_txMachineState == READY)
- {
- // Store the next packet to be transmitted
- if (m_queue->Dequeue (m_currentPkt))
- {
- TransmitStart();
- }
- }
- return true;
-}
-
-void
-CsmaCdNetDevice::TransmitStart ()
-{
- NS_DEBUG ("CsmaCdNetDevice::TransmitStart (" << &m_currentPkt << ")");
- NS_DEBUG ("CsmaCdNetDevice::TransmitStart (): UID is "
- << m_currentPkt.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_MSG((m_txMachineState == READY) || (m_txMachineState == BACKOFF),
- "Must be READY to transmit. Tx state is: "
- << m_txMachineState);
-
- // Only transmit if send side of net device is enabled
- if (!IsSendEnabled())
- return;
-
- if (m_channel->GetState() != IDLE)
- { // Channel busy, backoff and rechedule TransmitStart()
- m_txMachineState = BACKOFF;
- if (m_backoff.MaxRetriesReached())
- { // Too many retries reached, abort transmission of packet
- TransmitAbort();
- }
- else
- {
- m_backoff.IncrNumRetries();
- Time backoffTime = m_backoff.GetBackoffTime();
-
- NS_DEBUG ("CsmaCdNetDevice::TransmitStart (): "
- << "Channel busy, backing off for "
- << backoffTime.GetSeconds () << "sec");
-
- Simulator::Schedule (backoffTime,
- &CsmaCdNetDevice::TransmitStart,
- this);
- }
- }
- else
- {
- // Channel is free, transmit packet
- m_txMachineState = BUSY;
- Time tEvent = Seconds (m_bps.CalculateTxTime(m_currentPkt.GetSize()));
-
- NS_DEBUG ("CsmaCdNetDevice::TransmitStart (): " <<
- "Schedule TransmitCompleteEvent in " <<
- tEvent.GetSeconds () << "sec");
-
- Simulator::Schedule (tEvent,
- &CsmaCdNetDevice::TransmitCompleteEvent,
- this);
- if (!m_channel->TransmitStart (m_currentPkt, m_deviceId))
- {
- NS_DEBUG ("CsmaCdNetDevice::TransmitStart (): " <<
- "Channel transmit start did not work at " <<
- tEvent.GetSeconds () << "sec");
- m_txMachineState = READY;
- }
- else
- {
- // Transmission success, reset backoff time parameters.
- m_backoff.ResetBackoffTime();
- }
- }
-}
-
-
-void
-CsmaCdNetDevice::TransmitAbort (void)
-{
- NS_DEBUG ("CsmaCdNetDevice::TransmitAbort ()");
-
- NS_DEBUG ("CsmaCdNetDevice::TransmitAbort (): Pkt UID is " <<
- m_currentPkt.GetUid () << ")");
-
- // Try to transmit a new packet
- bool found;
- found = m_queue->Dequeue (m_currentPkt);
- NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?");
- m_backoff.ResetBackoffTime();
- m_txMachineState = READY;
- TransmitStart ();
-}
-
-void
-CsmaCdNetDevice::TransmitCompleteEvent (void)
-{
- NS_DEBUG ("CsmaCdNetDevice::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
-// schedule an event that will be executed when it's time to re-enable
-// the transmitter after the interframe gap.
-//
- NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting");
- // Channel should be transmitting
- NS_ASSERT(m_channel->GetState() == TRANSMITTING);
- m_txMachineState = GAP;
-
- NS_DEBUG ("CsmaCdNetDevice::TransmitCompleteEvent (): Pkt UID is " <<
- m_currentPkt.GetUid () << ")");
- m_channel->TransmitEnd ();
-
- NS_DEBUG (
- "CsmaCdNetDevice::TransmitCompleteEvent (): " <<
- "Schedule TransmitReadyEvent in "
- << m_tInterframeGap.GetSeconds () << "sec");
-
- Simulator::Schedule (m_tInterframeGap,
- &CsmaCdNetDevice::TransmitReadyEvent,
- this);
-}
-
-void
-CsmaCdNetDevice::TransmitReadyEvent (void)
-{
- NS_DEBUG ("CsmaCdNetDevice::TransmitReadyEvent ()");
-//
-// This function is called to enable the transmitter after the interframe
-// gap has passed. If there are pending transmissions, we use this opportunity
-// to start the next transmit.
-//
- NS_ASSERT_MSG(m_txMachineState == GAP, "Must be in interframe gap");
- m_txMachineState = READY;
-
- // Get the next packet from the queue for transmitting
- if (m_queue->IsEmpty())
- {
- return;
- }
- else
- {
- bool found;
- found = m_queue->Dequeue (m_currentPkt);
- NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?");
- TransmitStart ();
- }
-}
-
-TraceResolver *
-CsmaCdNetDevice::DoCreateTraceResolver (TraceContext const &context)
-{
- CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
- resolver->Add ("queue",
- MakeCallback (&Queue::CreateTraceResolver,
- PeekPointer (m_queue)));
- resolver->Add ("rx",
- m_rxTrace,
- CsmaCdTraceType (CsmaCdTraceType::RX));
- resolver->Add ("drop",
- m_dropTrace,
- CsmaCdTraceType (CsmaCdTraceType::DROP));
- return resolver;
-}
-
-bool
-CsmaCdNetDevice::Attach (Ptr<CsmaCdChannel> ch)
-{
- NS_DEBUG ("CsmaCdNetDevice::Attach (" << &ch << ")");
-
- m_channel = ch;
-
- m_deviceId = m_channel->Attach(this);
- m_bps = m_channel->GetDataRate ();
- m_tInterframeGap = m_channel->GetDelay ();
-
- /*
- * For now, this device is up whenever a channel is attached to it.
- */
- NotifyLinkUp ();
- return true;
-}
-
-void
-CsmaCdNetDevice::AddQueue (Ptr<Queue> q)
-{
- NS_DEBUG ("CsmaCdNetDevice::AddQueue (" << q << ")");
-
- m_queue = q;
-}
-
-void
-CsmaCdNetDevice::Receive (const Packet& packet)
-{
- EthernetHeader header (false);
- EthernetTrailer trailer;
- Eui48Address broadcast;
- Eui48Address destination;
- Packet p = packet;
-
- NS_DEBUG ("CsmaCdNetDevice::Receive UID is (" << p.GetUid() << ")");
-
- // Only receive if send side of net device is enabled
- if (!IsReceiveEnabled())
- {
- m_dropTrace (p);
- return;
- }
-
- if (m_encapMode == RAW)
- {
- ForwardUp (packet, 0, GetBroadcast ());
- m_dropTrace (p);
- return;
- }
- p.RemoveTrailer(trailer);
- trailer.CheckFcs(p);
- p.RemoveHeader(header);
-
- broadcast = Eui48Address::ConvertFrom (GetBroadcast ());
- destination = Eui48Address::ConvertFrom (GetAddress ());
- if ((header.GetDestination() != broadcast) &&
- (header.GetDestination() != destination))
- {
- // not for us.
- m_dropTrace (p);
- return;
- }
-//
-// protocol must be initialized to avoid a compiler warning in the RAW
-// case that breaks the optimized build.
-//
- uint16_t protocol = 0;
-
- switch (m_encapMode)
- {
- case ETHERNET_V1:
- case IP_ARP:
- protocol = header.GetLengthType();
- break;
- case LLC: {
- LlcSnapHeader llc;
- p.RemoveHeader (llc);
- protocol = llc.GetType ();
- } break;
- case RAW:
- NS_ASSERT (false);
- break;
- }
-
- m_rxTrace (p);
- ForwardUp (p, protocol, header.GetSource ());
- return;
-}
-
-Ptr<Queue>
-CsmaCdNetDevice::GetQueue(void) const
-{
- return m_queue;
-}
-
-Ptr<Channel>
-CsmaCdNetDevice::DoGetChannel(void) const
-{
- return m_channel;
-}
-
-} // namespace ns3
--- a/src/devices/csma-cd/csma-cd-net-device.h Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,417 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Emmanuelle Laprise
- *
- * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca
- * Derived from the p2p net device file
- */
-
-#ifndef CSMA_CD_NET_DEVICE_H
-#define CSMA_CD_NET_DEVICE_H
-
-#include <string.h>
-#include "ns3/node.h"
-#include "ns3/backoff.h"
-#include "ns3/address.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/ptr.h"
-#include "ns3/random-variable.h"
-#include "ns3/eui48-address.h"
-
-namespace ns3 {
-
-class Queue;
-class CsmaCdChannel;
-
-class CsmaCdTraceType : public TraceContextElement
-{
-public:
- enum Type {
- RX,
- DROP
- };
- CsmaCdTraceType (enum Type type);
- CsmaCdTraceType ();
- void Print (std::ostream &os) const;
- static uint16_t GetUid (void);
-private:
- enum Type m_type;
-};
-
-/**
- * \class CsmaCdNetDevice
- * \brief A Device for a CsmaCd Network Link.
- *
- * The Csma/Cd net device class is analogous to layer 1 and 2 of the
- * TCP stack. The NetDevice takes a raw packet of bytes and creates a
- * protocol specific packet from them. The Csma/Cd net device class
- * takes this packet and adds and processes the headers/trailers that
- * are associated with EthernetV1, EthernetV2, RAW or LLC
- * protocols. The EthernetV1 packet type adds and removes Ethernet
- * destination and source addresses. The LLC packet type adds and
- * removes LLC snap headers. The raw packet type does not add or
- * remove any headers. Each Csma/Cd net device will receive all
- * packets written to the Csma/Cd link. The ProcessHeader function can
- * be used to filter out the packets such that higher level layers
- * only receive packets that are addressed to their associated net
- * devices
- *
- */
-class CsmaCdNetDevice : public NetDevice {
-public:
-
- /**
- * Enumeration of the types of packets supported in the class.
- *
- */
-enum CsmaCdEncapsulationMode {
- ETHERNET_V1, /**< Version one ethernet packet, length field */
- IP_ARP, /**< Ethernet packet encapsulates IP/ARP packet */
- RAW, /**< Packet that contains no headers */
- LLC, /**< LLC packet encapsulation */
-};
-
- CsmaCdNetDevice (Ptr<Node> node);
- /**
- * Construct a CsmaCdNetDevice
- *
- * This is the constructor for the CsmaCdNetDevice. 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 deleted.
- *
- * \param node the Node to which this device is connected.
- * \param addr The source MAC address of the net device.
- */
- CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr, CsmaCdEncapsulationMode pktType);
- CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr,
- CsmaCdEncapsulationMode pktType,
- bool sendEnable, bool receiveEnable);
- /**
- * Destroy a CsmaCdNetDevice
- *
- * This is the destructor for the CsmaCdNetDevice.
- */
- virtual ~CsmaCdNetDevice();
- /**
- * 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);
- /**
- * Set the backoff parameters used to determine the wait to retry
- * transmitting a packet when the channel is busy.
- *
- * @see Attach ()
- * \param slotTime Length of a packet slot (or average packet time)
- * \param minSlots Minimum number of slots to wait
- * \param maxSlots Maximum number of slots to wait
- * \param maxRetries Maximum number of retries before packet is discard
- * \param ceiling Cap on the exponential function when calculating max slots
- */
- void SetBackoffParams (Time slotTime, uint32_t minSlots, uint32_t maxSlots,
- uint32_t maxRetries, uint32_t ceiling);
- /**
- * Attach the device to a channel.
- *
- * The function Attach is used to add a CsmaCdNetDevice to a
- * CsmaCdChannel.
- *
- * @see SetDataRate ()
- * @see SetInterframeGap ()
- * \param ch a pointer to the channel to which this object is being attached.
- */
- bool Attach (Ptr<CsmaCdChannel> ch);
- /**
- * Attach a queue to the CsmaCdNetDevice.
- *
- * The CsmaCdNetDevice "owns" a queue. This queue is created by the
- * CsmaCdTopology object and implements a queueing method such as
- * DropTail or RED. The CsmaCdNetDevice assumes ownership of this
- * queue and must delete it when the device is destroyed.
- *
- * @see CsmaCdTopology::AddCsmaCdLink ()
- * @see Queue
- * @see DropTailQueue
- * \param queue a pointer to the queue for which object is assuming
- * ownership.
- */
- void AddQueue (Ptr<Queue> queue);
- /**
- * Receive a packet from a connected CsmaCdChannel.
- *
- * The CsmaCdNetDevice 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 CsmaCdChannel
- * \param p a reference to the received packet
- */
- void Receive (const Packet& p);
-
- bool IsSendEnabled (void);
- bool IsReceiveEnabled (void);
-
- void SetSendEnable (bool);
- void SetReceiveEnable (bool);
-
-protected:
- virtual bool DoNeedsArp (void) const;
- 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.
- *
- * \return a pointer to the queue.
- */
- Ptr<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
- *
- * \return a pointer to the channel
- */
- virtual Ptr<Channel> DoGetChannel (void) const;
- /**
- * Adds the necessary headers and trailers to a packet of data in order to
- * respect the packet type
- *
- * \param p Packet to which header should be added
- * \param dest MAC destination address to which packet should be sent
- * \param protocolNumber In some protocols, identifies the type of
- * payload contained in this packet.
- */
- void AddHeader (Packet& p, Eui48Address dest,
- uint16_t protocolNumber);
- /**
- * Removes, from a packet of data, all headers and trailers that
- * relate to the packet type
- *
- * \param p Packet whose headers need to be processed
- * \param param An integer parameter that can be set by the function
- * to return information gathered in the header
- * \return Returns true if the packet should be forwarded up the
- * protocol stack.
- */
- bool ProcessHeader (Packet& p, uint16_t & param);
-
-private:
- // disable copy constructor and operator =
- CsmaCdNetDevice &operator = (const CsmaCdNetDevice &o);
- CsmaCdNetDevice (const CsmaCdNetDevice &o);
- /**
- * Initializes variablea when construction object.
- */
- void Init (bool sendEnable, bool receiveEnable);
- /**
- * Send a Packet on the Csma/Cd network
- *
- * This method does not use a destination address since all packets
- * are broadcast to all NetDevices attached to the channel. Packet
- * should contain all needed headers at this time.
- *
- * If the device is ready to transmit, the next packet is read off
- * of the queue and stored locally until it has been transmitted.
- *
- * \param p a reference to the packet to send
- * \param dest destination address
- * \param protocolNumber -- this parameter is not used here
- * \return true if success, false on failure
- */
- virtual bool SendTo (Packet& p, const Address& dest, uint16_t protocolNumber);
-
- /**
- * Start Sending a Packet Down the Wire.
- *
- * The TransmitStart method is the method that is used internally in
- * the CsmaCdNetDevice 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, this causes the
- * channel to become busy. An event is scheduled for the time at
- * which the bits have been completely transmitted. If the channel
- * is busy, the method reschedules itself for a later time (within
- * the backoff period)
- *
- * @see CsmaCdChannel::TransmitStart ()
- * @see TransmitCompleteEvent ()
- */
- void TransmitStart ();
- /**
- * 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 CsmaCdChannel::TransmitEnd ()
- * @see TransmitReadyEvent ()
- */
- 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.
- *
- * If a packet is in the queue, it is extracted for the queue as the
- * next packet to be transmitted by the net device.
- *
- * @see TransmitStart ()
- */
- void TransmitReadyEvent (void);
- /**
- * Create a Trace Resolver for events in the net device.
- * (NOT TESTED)
- * @see class TraceResolver
- */
- virtual TraceResolver *DoCreateTraceResolver (TraceContext const &context);
-
- /**
- * Aborts the transmission of the current packet
- *
- * If the net device has tried to transmit a packet for more times
- * than the maximum allowed number of retries (channel always busy)
- * then the packet is dropped.
- *
- */
- void TransmitAbort (void);
-
- /**
- * Device ID returned by the attached functions. It is used by the
- * mp-channel to identify each net device to make sure that only
- * active net devices are writing to the channel
- */
- uint32_t m_deviceId;
-
- /**
- * Enable net device to send packets. True by default
- */
- bool m_sendEnable;
- /**
- * Enable net device to receive packets. True by default
- */
- bool m_receiveEnable;
- /**
- * 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 */
- GAP, /**< The transmitter is in the interframe gap time */
- BACKOFF /**< The transmitter is waiting for the channel to be free */
- };
- /**
- * The state of the Net Device transmit state machine.
- * @see TxMachineState
- */
- TxMachineState m_txMachineState;
-
- /**
- * The type of packet that should be created by the AddHeader
- * function and that should be processed by the ProcessHeader
- * function.
- */
- CsmaCdEncapsulationMode m_encapMode;
- /**
- * 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;
- /**
- * Holds the backoff parameters and is used to calculate the next
- * backoff time to use when the channel is busy and the net device
- * is ready to transmit
- */
- Backoff m_backoff;
- /**
- * Next packet that will be transmitted (if transmitter is not
- * currently transmitting) or packet that is currently being
- * transmitted.
- */
- Packet m_currentPkt;
- /**
- * The CsmaCdChannel to which this CsmaCdNetDevice has been
- * attached.
- * @see class CsmaCdChannel
- */
- Ptr<CsmaCdChannel> m_channel;
- /**
- * The Queue which this CsmaCdNetDevice uses as a packet source.
- * Management of this Queue has been delegated to the CsmaCdNetDevice
- * and it has the responsibility for deletion.
- * @see class Queue
- * @see class DropTailQueue
- */
- Ptr<Queue> m_queue;
- /**
- * NOT TESTED
- * The trace source for the packet reception events that the device can
- * fire.
- *
- * @see class CallBackTraceSource
- * @see class TraceResolver
- */
- CallbackTraceSource<Packet &> m_rxTrace;
- CallbackTraceSource<Packet &> m_dropTrace;
-
-};
-
-}; // namespace ns3
-
-#endif // CSMA_CD_NET_DEVICE_H
-
--- a/src/devices/csma-cd/csma-cd-topology.cc Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-//
-// Copyright (c) 2007 Emmanuelle Laprise
-//
-// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
-//
-
-//
-// Topology helper for CsmaCd channels in ns3.
-
-#include "ns3/assert.h"
-#include "ns3/debug.h"
-#include "ns3/queue.h"
-
-#include "csma-cd-channel.h"
-#include "csma-cd-net-device.h"
-#include "csma-cd-topology.h"
-#include "ns3/socket-factory.h"
-
-namespace ns3 {
-
-Ptr<CsmaCdChannel>
-CsmaCdTopology::CreateCsmaCdChannel(
- const DataRate& bps,
- const Time& delay)
-{
- Ptr<CsmaCdChannel> channel = Create<CsmaCdChannel> (bps, delay);
-
- return channel;
-}
-
-#if 0
-Ptr<CsmaCdNetDevice>
-CsmaCdTopology::AddCsmaCdEthernetNode(
- Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- MacAddress addr)
-{
- Ptr<CsmaCdNetDevice> nd1 = Create<CsmaCdNetDevice> (n1, addr,
- ns3::CsmaCdNetDevice::ETHERNET_V1);
-
- Ptr<Queue> q = Queue::CreateDefault ();
- nd1->AddQueue(q);
- nd1->Attach (ch);
-
- return nd1;
-}
-
-Ptr<PacketSocket>
-CsmaCdTopology::ConnectPacketSocket(Ptr<PacketSocketApp> app,
- Ptr<CsmaCdNetDevice> ndSrc,
- Ptr<CsmaCdNetDevice> ndDest)
-{
- Ptr<PacketSocket> socket = Create<PacketSocket> ();
- socket->Bind(ndSrc);
- socket->Connect(ndDest->GetAddress());
- app->Connect(socket);
-
- return socket;
-}
-
-Ptr<PacketSocket>
-CsmaCdTopology::ConnectPacketSocket(Ptr<PacketSocketApp> app,
- Ptr<CsmaCdNetDevice> ndSrc,
- MacAddress macAddr)
-{
- Ptr<PacketSocket> socket = Create<PacketSocket> ();
- socket->Bind(ndSrc);
- socket->Connect(macAddr);
- app->Connect(socket);
-
- return socket;
-}
-
-Ptr<Socket>
-CsmaCdTopology::CreatePacketSocket(Ptr<Node> n1, std::string iid_name)
-{
- InterfaceId iid = InterfaceId::LookupByName (iid_name);
-
- Ptr<SocketFactory> socketFactory =
- n1->QueryInterface<SocketFactory> (iid);
-
- Ptr<Socket> socket = socketFactory->CreateSocket ();
-
- return socket;
-}
-#endif
-
-} // namespace ns3
-
--- a/src/devices/csma-cd/csma-cd-topology.h Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-//
-// Copyright (c) 2007 Emmanuelle Laprise
-//
-// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
-//
-// Topology helper for multipoint channels in ns3.
-//
-#ifndef CSMA_CD_TOPOLOGY_H
-#define CSMA_CD_TOPOLOGY_H
-
-#include "ns3/ptr.h"
-#include "ns3/csma-cd-net-device.h"
-#include "ns3/node.h"
-
-// The topology class consists of only static methods thar are used to
-// create the topology and data flows for an ns3 simulation
-
-namespace ns3 {
-
-class CsmaCdChannel;
-class Node;
-class DataRate;
-class Queue;
-
-/**
- * \brief A helper class to create CsmaCd Topologies
- *
- * CsmaCd topologies are created based on the
- * ns3::CsmaCdNetDevice subclasses and ns3::CsmaCdChannel
- * objects. This class uses the EthernetNetDevice and
- * PacketSocket classes in order to create logical connections between
- * net devices. The PacketSocket class generates the data and the
- * EthernetNetDevice class creates ethernet packets from the
- * data, filling in source and destination addresses. The
- * EthernetNetDevice class filters received data packets
- * according to its destination Mac addresses.
- */
-class CsmaCdTopology {
-public:
- /**
- * \param dataRate Maximum transmission link rate
- * \param delay propagation delay between any two nodes
- * \return Pointer to the created CsmaCdChannel
- *
- * Create a CsmaCdChannel. All nodes connected to a multipoint
- * channels will receive all packets written to that channel
- */
- static Ptr<CsmaCdChannel> CreateCsmaCdChannel(
- const DataRate& dataRate, const Time& delay);
-
-#if 0
- /**
- * \param n1 Node to be attached to the multipoint channel
- * \param ch CsmaCdChannel to which node n1 should be attached
- * \param addr MacAddress that should be assigned to the
- * EthernetNetDevice that will be added to the node.
- *
- * Add a multipoint node to a multipoint channel
- */
- static Ptr<CsmaCdNetDevice> AddCsmaCdEthernetNode(Ptr<Node> n1,
- Ptr<CsmaCdChannel> ch,
- MacAddress addr);
-
- /**
- * \param app Application that will be sending data to the agent
- * \param ndSrc Net Device that will be sending the packets onto the
- * network
- * \param ndDest Net Device to which ndSrc will be sending the packets
- * \return A pointer to the PacketSocket
- *
- * Creates an PacketSocket and configure it to send packets between
- * two net devices
- */
-static Ptr<PacketSocket> ConnectPacketSocket(Ptr<PacketSocketApp> app,
- Ptr<CsmaCdNetDevice> ndSrc,
- Ptr<CsmaCdNetDevice> ndDest);
-
- /**
- * \param app Application that will be sending data to the agent
- * \param ndSrc Net Device that will be sending the packets onto the
- * network
- * \param macAddr Mac destination address for the packets send by
- * the ndSrc net device \return a Pointer to the created
- * PacketSocket
- *
- * Creates an PacketSocket and configure it to send packets from a
- * net device to a destination MacAddress
- */
-static Ptr<PacketSocket> ConnectPacketSocket(Ptr<PacketSocketApp> app,
- Ptr<CsmaCdNetDevice> ndSrc,
- MacAddress macAddr);
-
- /**
- * \param n1 Node from which socketfactory should be tested.
- * \param iid_name Interface identifier ("Packet", in this case)
- *
- * This is a test function to make sure that a socket can be created
- * by using the socketfactory interface provided in the
- * netdevicenode.
- */
-static Ptr<Socket> CreatePacketSocket(Ptr<Node> n1,
- std::string iid_name);
-#endif
-
-};
-} // namespace ns3
-
-#endif
-
--- a/src/devices/csma-cd/wscript Thu Aug 09 13:42:42 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-
-def build(bld):
- obj = bld.create_ns3_module('csma-cd', ['node'])
- obj.source = [
- 'backoff.cc',
- 'csma-cd-net-device.cc',
- 'csma-cd-channel.cc',
- 'csma-cd-topology.cc',
- 'csma-cd-ipv4-topology.cc',
- ]
- headers = bld.create_obj('ns3header')
- headers.source = [
- 'backoff.h',
- 'csma-cd-net-device.h',
- 'csma-cd-channel.h',
- 'csma-cd-topology.h',
- 'csma-cd-ipv4-topology.h',
- ]
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/backoff.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,83 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007, Emmanuelle Laprise
+ * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+ */
+
+#include "backoff.h"
+
+namespace ns3 {
+
+Backoff::Backoff()
+{
+ m_slotTime = MicroSeconds(1);
+ m_minSlots = 1;
+ m_maxSlots = 1000;
+ m_ceiling = 10;
+ m_maxRetries = 1000;
+
+ ResetBackoffTime();
+}
+
+Backoff::Backoff(Time slotTime, uint32_t minSlots, uint32_t maxSlots,
+ uint32_t ceiling, uint32_t maxRetries)
+{
+ m_slotTime = slotTime;
+ m_minSlots = minSlots;
+ m_maxSlots = maxSlots;
+ m_ceiling = ceiling;
+ m_maxRetries = maxRetries;
+}
+
+Time
+Backoff::GetBackoffTime (void)
+{
+ Time backoff;
+ uint32_t ceiling;
+
+ if ((m_ceiling > 0) &&(m_numBackoffRetries > m_ceiling))
+ ceiling = m_ceiling;
+ else
+ ceiling = m_numBackoffRetries;
+
+ uint32_t minSlot = m_minSlots;
+ uint32_t maxSlot = (uint32_t)pow(2, ceiling) - 1;
+ if (maxSlot > m_maxSlots)
+ maxSlot = m_maxSlots;
+
+ uint32_t backoffSlots =
+ (uint32_t)UniformVariable::GetSingleValue(minSlot, maxSlot);
+
+ backoff = Scalar(backoffSlots) * m_slotTime;
+ return (backoff);
+}
+
+void Backoff::ResetBackoffTime (void)
+{
+ m_numBackoffRetries = 0;
+}
+
+bool Backoff::MaxRetriesReached(void) {
+ return (m_numBackoffRetries >= m_maxRetries);
+}
+
+void Backoff::IncrNumRetries(void) {
+ m_numBackoffRetries++;
+}
+
+} // namespace ns3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/backoff.h Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,87 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 Emmanuelle Laprise
+ *
+ * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca
+ * Derived from the p2p net device file
+Transmi */
+
+#ifndef BACKOFF_H
+#define BACKOFF_H
+
+#include <stdint.h>
+#include "ns3/nstime.h"
+#include "ns3/random-variable.h"
+
+namespace ns3 {
+
+ /**
+ * \brief The backoff class is used for calculating backoff times
+ * when many net devices can write to the same channel
+ *
+ */
+
+class Backoff {
+public:
+ uint32_t m_minSlots; // Minimum number of backoff slots (when
+ // multiplied by m_slotTime, determines minimum
+ // backoff time)
+ uint32_t m_maxSlots; // Maximim number of backoff slots (when
+ // multiplied by m_slotTime, determines
+ // maximum backoff time)
+ uint32_t m_ceiling; // Caps the exponential function when the
+ // number of retries reaches m_ceiling
+ uint32_t m_maxRetries; // Maximum number of transmission retries
+ // before the packet is dropped.
+ Time m_slotTime; // Length of one slot. A slot time, it usually
+ // the packet transmission time, if the packet
+ // size is fixed.
+
+ Backoff();
+ Backoff(Time slotTime, uint32_t minSlots, uint32_t maxSlots,
+ uint32_t ceiling, uint32_t maxRetries);
+
+ /**
+ * \return The amount of time that the net device should wait before
+ * trying to retransmit the packet
+ */
+ Time GetBackoffTime();
+ /**
+ * Indicates to the backoff object that the last packet was
+ * successfully transmitted and that the number of retries should be
+ * reset to 0.
+ */
+ void ResetBackoffTime();
+ /**
+ * \return True if the maximum number of retries has been reached
+ */
+ bool MaxRetriesReached();
+ /**
+ * Increments the number of retries by 1.
+ */
+ void IncrNumRetries();
+
+private:
+ uint32_t m_numBackoffRetries; // Number of times that the
+ // transmitter has tried to
+ // unsuccessfully transmit the current
+ // packet
+};
+
+}; // namespace ns3
+
+#endif // BACKOFF_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-channel.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,371 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 Emmanuelle Laprise
+ * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+ */
+
+#include "csma-channel.h"
+#include "csma-net-device.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/debug.h"
+
+NS_DEBUG_COMPONENT_DEFINE ("CsmaChannel");
+
+namespace ns3 {
+
+CsmaDeviceRec::CsmaDeviceRec()
+{
+ active = false;
+}
+
+CsmaDeviceRec::CsmaDeviceRec(Ptr<CsmaNetDevice> device)
+{
+ devicePtr = device;
+ active = true;
+}
+
+bool
+CsmaDeviceRec::IsActive() {
+ return active;
+}
+
+
+//
+// By default, you get a channel with the name "Csma Channel" that
+// has an "infitely" fast transmission speed and zero delay.
+CsmaChannel::CsmaChannel()
+:
+ Channel ("Csma Channel"),
+ m_bps (DataRate(0xffffffff)),
+ m_delay (Seconds(0))
+{
+ NS_DEBUG("CsmaChannel::CsmaChannel ()");
+ Init();
+}
+
+CsmaChannel::CsmaChannel(
+ const DataRate& bps,
+ const Time& delay)
+:
+ Channel ("Csma Channel"),
+ m_bps (bps),
+ m_delay (delay)
+{
+ NS_DEBUG("CsmaChannel::CsmaChannel (" << Channel::GetName()
+ << ", " << bps.GetBitRate() << ", " << delay << ")");
+ Init();
+}
+
+CsmaChannel::CsmaChannel(
+ const std::string& name,
+ const DataRate& bps,
+ const Time& delay)
+:
+ Channel (name),
+ m_bps (bps),
+ m_delay (delay)
+{
+ NS_DEBUG("CsmaChannel::CsmaChannel (" << name << ", " <<
+ bps.GetBitRate() << ", " << delay << ")");
+ Init();
+}
+
+void CsmaChannel::Init() {
+ m_state = IDLE;
+ m_deviceList.clear();
+}
+
+int32_t
+CsmaChannel::Attach(Ptr<CsmaNetDevice> device)
+{
+ NS_DEBUG("CsmaChannel::Attach (" << device << ")");
+ NS_ASSERT(device != 0);
+
+ CsmaDeviceRec rec(device);
+
+ m_deviceList.push_back(rec);
+ return (m_deviceList.size() - 1);
+}
+
+bool
+CsmaChannel::Reattach(Ptr<CsmaNetDevice> device)
+{
+ NS_DEBUG("CsmaChannel::Reattach (" << device << ")");
+ NS_ASSERT(device != 0);
+
+ std::vector<CsmaDeviceRec>::iterator it;
+ for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
+ {
+ if (it->devicePtr == device)
+ {
+ if (!it->active)
+ {
+ it->active = true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ return false;
+}
+
+bool
+CsmaChannel::Reattach(uint32_t deviceId)
+{
+ NS_DEBUG("CsmaChannel::Reattach (" << deviceId << ")");
+ if (deviceId < m_deviceList.size())
+ {
+ return false;
+ }
+
+ if (m_deviceList[deviceId].active)
+ {
+ return false;
+ }
+ else
+ {
+ m_deviceList[deviceId].active = true;
+ return true;
+ }
+}
+
+bool
+CsmaChannel::Detach(uint32_t deviceId)
+{
+ NS_DEBUG("CsmaChannel::Detach (" << deviceId << ")");
+
+ if (deviceId < m_deviceList.size())
+ {
+ if (!m_deviceList[deviceId].active)
+ {
+ NS_DEBUG("CsmaChannel::Detach Device is already detached ("
+ << deviceId << ")");
+ return false;
+ }
+
+ m_deviceList[deviceId].active = false;
+ if ((m_state == TRANSMITTING) && (m_currentSrc == deviceId))
+ {
+ NS_DEBUG("CsmaChannel::Detach Device is currently"
+ << "transmitting (" << deviceId << ")");
+ // Here we will need to place a warning in the packet
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool
+CsmaChannel::Detach(Ptr<CsmaNetDevice> device)
+{
+ NS_DEBUG("CsmaChannel::Detach (" << device << ")");
+ NS_ASSERT(device != 0);
+
+ std::vector<CsmaDeviceRec>::iterator it;
+ for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
+ {
+ if ((it->devicePtr == device) && (it->active))
+ {
+ it->active = false;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+CsmaChannel::TransmitStart(Packet& p, uint32_t srcId)
+{
+ NS_DEBUG ("CsmaChannel::TransmitStart (" << &p << ", " << srcId
+ << ")");
+ NS_DEBUG ("CsmaChannel::TransmitStart (): UID is " <<
+ p.GetUid () << ")");
+
+ if (m_state != IDLE)
+ {
+ NS_DEBUG("CsmaChannel::TransmitStart (): state is not IDLE");
+ return false;
+ }
+
+ if (!IsActive(srcId))
+ {
+ NS_DEBUG("CsmaChannel::TransmitStart (): ERROR: Seclected "
+ << "source is not currently attached to network");
+ return false;
+ }
+
+ NS_DEBUG("CsmaChannel::TransmitStart (): switch to TRANSMITTING");
+ m_currentPkt = p;
+ m_currentSrc = srcId;
+ m_state = TRANSMITTING;
+ return true;
+}
+
+bool
+CsmaChannel::IsActive(uint32_t deviceId)
+{
+ return (m_deviceList[deviceId].active);
+}
+
+bool
+CsmaChannel::TransmitEnd()
+{
+ NS_DEBUG("CsmaChannel::TransmitEnd (" << &m_currentPkt << ", "
+ << m_currentSrc << ")");
+ NS_DEBUG("CsmaChannel::TransmitEnd (): UID is " <<
+ m_currentPkt.GetUid () << ")");
+
+ NS_ASSERT(m_state == TRANSMITTING);
+ m_state = PROPAGATING;
+
+ bool retVal = true;
+
+ if (!IsActive(m_currentSrc)) {
+ NS_DEBUG("CsmaChannel::TransmitEnd (): ERROR: Seclected source "
+ << "was detached before the end of the transmission");
+ retVal = false;
+ }
+
+ NS_DEBUG ("CsmaChannel::TransmitEnd (): Schedule event in " <<
+ m_delay.GetSeconds () << "sec");
+
+ Simulator::Schedule (m_delay,
+ &CsmaChannel::PropagationCompleteEvent,
+ this);
+ return retVal;
+}
+
+void
+CsmaChannel::PropagationCompleteEvent()
+{
+ NS_DEBUG("CsmaChannel::PropagationCompleteEvent ("
+ << &m_currentPkt << ")");
+ NS_DEBUG ("CsmaChannel::PropagationCompleteEvent (): UID is " <<
+ m_currentPkt.GetUid () << ")");
+
+ NS_ASSERT(m_state == PROPAGATING);
+
+ NS_DEBUG ("CsmaChannel::PropagationCompleteEvent (): Receive");
+
+ std::vector<CsmaDeviceRec>::iterator it;
+ for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
+ {
+ if (it->IsActive())
+ {
+ it->devicePtr->Receive (m_currentPkt);
+ }
+ }
+ m_state = IDLE;
+}
+
+
+uint32_t
+CsmaChannel::GetNumActDevices (void)
+{
+ int numActDevices = 0;
+ std::vector<CsmaDeviceRec>::iterator it;
+ for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
+ {
+ if (it->active)
+ {
+ numActDevices++;
+ }
+ }
+ return numActDevices;
+}
+
+// This is not the number of active devices. This is the total number
+// of devices even if some were detached after.
+uint32_t
+CsmaChannel::GetNDevices (void) const
+{
+ return (m_deviceList.size());
+}
+
+Ptr<NetDevice>
+CsmaChannel::GetDevice (uint32_t i) const
+{
+ Ptr< CsmaNetDevice > netDevice;
+
+ netDevice = m_deviceList[i].devicePtr;
+ return netDevice;
+}
+
+int32_t
+CsmaChannel::GetDeviceNum (Ptr<CsmaNetDevice> device)
+{
+ std::vector<CsmaDeviceRec>::iterator it;
+ int i = 0;
+ for (it = m_deviceList.begin(); it < m_deviceList.end(); it++)
+ {
+ if (it->devicePtr == device)
+ {
+ if (it->active)
+ {
+ return i;
+ }
+ else
+ {
+ return -2;
+ }
+ }
+ i++;
+ }
+ return -1;
+}
+
+bool
+CsmaChannel::IsBusy (void)
+{
+ if (m_state == IDLE)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+DataRate
+CsmaChannel::GetDataRate (void)
+{
+ return m_bps;
+}
+
+Time
+CsmaChannel::GetDelay (void)
+{
+ return m_delay;
+}
+
+WireState
+CsmaChannel::GetState(void)
+{
+ return m_state;
+}
+
+} // namespace ns3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-channel.h Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,307 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 Emmanuelle Laprise
+ *
+ * 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: Emmanuelle Laprise<emmanuelle.laprise@bluekazoo.ca>
+ */
+
+#ifndef CSMA_CHANNEL_H
+#define CSMA_CHANNEL_H
+
+#include "ns3/channel.h"
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
+#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
+
+namespace ns3 {
+
+class CsmaNetDevice;
+
+ /**
+ * \brief CsmaNetDevice Record
+ *
+ * Stores the information related to each net device that is
+ * connected to the channel.
+ */
+ class CsmaDeviceRec {
+ public:
+ Ptr< CsmaNetDevice > devicePtr; /// Pointer to the net device
+ bool active; /// Is net device enabled to TX/RX
+
+ CsmaDeviceRec();
+ CsmaDeviceRec(Ptr< CsmaNetDevice > device);
+ /*
+ * \return If the net device pointed to by the devicePtr is active
+ * and ready to RX/TX.
+ */
+ bool IsActive();
+ };
+
+ /**
+ * Current state of the channel
+ */
+ enum WireState
+ {
+ IDLE, /**< Channel is IDLE, no packet is being
+ transmitted */
+ TRANSMITTING, /**< Channel is BUSY, a packet is being written
+ by a net device */
+ PROPAGATING /**< Channel is BUSY, packet is propagating to
+ all attached net devices */
+ };
+
+/**
+ * \brief Csma Channel.
+ *
+ * This class represents a simple Csma channel that can be used
+ * when many nodes are connected to one wire. It uses a single busy
+ * flag to indicate if the channel is currently in use. It does not
+ * take into account the distances between stations or the speed of
+ * light to determine collisions.
+ *
+ * Each net device must query the state of the channel and make sure
+ * that it is IDLE before writing a packet to the channel.
+ *
+ * When the channel is instaniated, the constructor takes parameters
+ * for a single speed, in bits per second, and a speed-of-light delay
+ * time as a Time object. When a net device is attached to a channel,
+ * it is assigned a device ID, this is in order to facilitate the
+ * check that makes sure that a net device that is trying to send a
+ * packet to the channel is really connected to this channel
+ *
+ */
+class CsmaChannel : public Channel {
+public:
+ /**
+ * \brief Create a CsmaChannel
+ *
+ * By default, you get a channel with the name "Csma Channel" that
+ * has an "infitely" fast transmission speed and zero delay.
+ */
+ CsmaChannel ();
+
+ /**
+ * \brief Create a CsmaChannel
+ *
+ * \param bps The bitrate of the channel
+ * \param delay Transmission delay through the channel
+ */
+ CsmaChannel (const DataRate& bps, const Time& delay);
+
+ /**
+ * \brief Create a CsmaChannel
+ *
+ * \param name the name of the channel for identification purposes
+ * \param bps The bitrate of the channel
+ * \param delay Transmission delay through the channel
+ */
+ CsmaChannel (const std::string& name,
+ const DataRate& bps, const Time& delay);
+
+ /**
+ * \brief Attach a given netdevice to this channel
+ *
+ * \param device Device pointer to the netdevice to attach to the channel
+ * \return The assigned device number
+ */
+ int32_t Attach (Ptr<CsmaNetDevice> device);
+ /**
+ * \brief Detach a given netdevice from this channel
+ *
+ * The net device is marked as inactive and it is not allowed to
+ * receive or transmit packets
+ *
+ * \param device Device pointer to the netdevice to detach from the channel
+ * \return True if the device is found and attached to the channel,
+ * false if the device is not currently connected to the channel or
+ * can't be found.
+ */
+ bool Detach (Ptr<CsmaNetDevice> device);
+ /**
+ * \brief Detach a given netdevice from this channel
+ *
+ * The net device is marked as inactive and it is not allowed to
+ * receive or transmit packets
+ *
+ * \param deviceId The deviceID assigned to the net device when it
+ * was connected to the channel
+ * \return True if the device is found and attached to the channel,
+ * false if the device is not currently connected to the channel or
+ * can't be found.
+ */
+ bool Detach (uint32_t deviceId);
+ /**
+ * \brief Reattach a previously detached net device to the channel
+ *
+ * The net device is marked as active. It is now allowed to receive
+ * or transmit packets. The net device must have been previously
+ * attached to the channel using the attach function.
+ *
+ * \param deviceId The device ID assigned to the net device when it
+ * was connected to the channel
+ * \return True if the device is found and is not attached to the
+ * channel, false if the device is currently connected to the
+ * channel or can't be found.
+ */
+ bool Reattach(uint32_t deviceId);
+ /**
+ * \brief Reattach a previously detached net device to the channel
+ *
+ * The net device is marked as active. It is now allowed to receive
+ * or transmit packets. The net device must have been previously
+ * attached to the channel using the attach function.
+ *
+ * \param device Device pointer to the netdevice to detach from the channel
+ * \return True if the device is found and is not attached to the
+ * channel, false if the device is currently connected to the
+ * channel or can't be found.
+ */
+ bool Reattach(Ptr<CsmaNetDevice> device);
+ /**
+ * \brief Start transmitting a packet over the channel
+ *
+ * If the srcId belongs to a net device that is connected to the
+ * channel, packet transmission begins, and the channel becomes busy
+ * until the packet has completely reached all destinations.
+ *
+ * \param p A reference to the packet that will be transmitted over
+ * the channel
+ * \param srcId The device Id of the net device that wants to
+ * transmit on the channel.
+ * \return True if the channel is not busy and the transmitting net
+ * device is currently active.
+ */
+ bool TransmitStart (Packet& p, uint32_t srcId);
+ /**
+ * \brief Indicates that the net device has finished transmitting
+ * the packet over the channel
+ *
+ * The channel will stay busy until the packet has completely
+ * propagated to all net devices attached to the channel. The
+ * TransmitEnd function schedules the PropagationCompleteEvent which
+ * will free the channel for further transmissions. Stores the
+ * packet p as the m_currentPkt, the packet being currently
+ * transmitting.
+ *
+ * \return Returns true unless the source was detached before it
+ * completed its transmission.
+ */
+ bool TransmitEnd ();
+ /**
+ * \brief Indicates that the channel has finished propagating the
+ * current packet. The channel is released and becomes free.
+ *
+ * Calls the receive function of every active net device that is
+ * attached to the channel.
+ */
+ void PropagationCompleteEvent();
+ /**
+ * \return Returns the device number assigned to a net device by the
+ * channel
+ *
+ * \param device Device pointer to the netdevice for which the device
+ * number is needed
+ */
+ int32_t GetDeviceNum (Ptr<CsmaNetDevice> device);
+ /**
+ * \return Returns the state of the channel (IDLE -- free,
+ * TRANSMITTING -- busy, PROPAGATING - busy )
+ */
+ WireState GetState();
+
+ /**
+ * \brief Indicates if the channel is busy. The channel will only
+ * accept new packets for transmission if it is not busy.
+ *
+ * \return Returns true if the channel is busy and false if it is
+ * free.
+ */
+ bool IsBusy();
+
+ /**
+ * \brief Indicates if a net device is currently attached or
+ * detached from the channel.
+ *
+ * \param deviceId The ID that was assigned to the net device when
+ * it was attached to the channel.
+ * \return Returns true if the net device is attached to the
+ * channel, false otherwise.
+ */
+ bool IsActive(uint32_t deviceId);
+ /**
+ * \return Returns the number of net devices that are currently
+ * attached to the channel.
+ */
+ uint32_t GetNumActDevices (void);
+ /**
+ * \return Returns the total number of devices including devices
+ * that have been detached from the channel.
+ */
+ virtual uint32_t GetNDevices (void) const;
+ /**
+ * \param i The deviceId of the net device for which we want the
+ * pointer.
+ * \return Returns the pointer to the net device that is associated
+ * with deviceId i.
+ */
+ virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
+
+ virtual DataRate GetDataRate (void);
+ virtual Time GetDelay (void);
+
+private:
+ DataRate m_bps; /// Data rate of the channel
+ Time m_delay; /// Delay of the channel.
+
+ /**
+ * List of the net devices that have been or are currently connected
+ * to the channel.
+ *
+ * Devices are nor removed from this list, they are marked as
+ * inactive. Otherwise the assigned device IDs will not refer to the
+ * correct NetDevice. The DeviceIds are used so that it is possible
+ * to have a number to refer to an entry in the list so that the
+ * whole list does not have to be searched when making sure that a
+ * source is attached to a channel when it is transmitting data.
+ */
+ std::vector< CsmaDeviceRec > m_deviceList;
+ /**
+ * Packet that is currently being transmitted on the channel (or last
+ * packet to have been transmitted on the channel if the channel is
+ * free.)
+ */
+ Packet m_currentPkt;
+ /**
+ * Device Id of the source that is currently transmitting on the
+ * channel. Or last source to have transmitted a packet on the
+ * channel, if the channel is currently not busy.
+ */
+ uint32_t m_currentSrc;
+ /**
+ * Current state of the channel
+ */
+ WireState m_state;
+ /**
+ * Initializes the channel when it is constructed. Resets the
+ * deviceList and sets the channel state to IDLE.
+ */
+ void Init (void);
+};
+
+} // namespace ns3
+
+#endif /* CSMA_CHANNEL_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-ipv4-topology.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,155 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2007 Emmanuelle Laprise
+//
+// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+//
+
+#include <algorithm>
+#include "ns3/assert.h"
+#include "ns3/debug.h"
+#include "ns3/fatal-error.h"
+#include "ns3/nstime.h"
+#include "ns3/internet-node.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv4.h"
+#include "ns3/queue.h"
+
+#include "csma-channel.h"
+#include "csma-net-device.h"
+#include "csma-ipv4-topology.h"
+
+namespace ns3 {
+
+uint32_t
+CsmaIpv4Topology::AddIpv4CsmaNode(Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr)
+{
+ Ptr<Queue> q = Queue::CreateDefault ();
+
+ // assume full-duplex
+ Ptr<CsmaNetDevice> nd0 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::IP_ARP,
+ true, true);
+ nd0->AddQueue(q);
+ nd0->Attach (ch);
+ return nd0->GetIfIndex ();
+}
+
+
+void
+CsmaIpv4Topology::AddIpv4LlcCsmaNode(Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr)
+{
+ Ptr<Queue> q = Queue::CreateDefault ();
+
+ Ptr<CsmaNetDevice> nd0 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::LLC,
+ true, false);
+ nd0->AddQueue(q);
+ nd0->Attach (ch);
+
+ Ptr<CsmaNetDevice> nd1 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::LLC,
+ false, true);
+ nd1->AddQueue(q);
+ nd1->Attach (ch);
+}
+
+void
+CsmaIpv4Topology::AddIpv4RawCsmaNode(Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr)
+{
+ Ptr<Queue> q = Queue::CreateDefault ();
+
+ Ptr<CsmaNetDevice> nd0 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::RAW,
+ true, false);
+ nd0->AddQueue(q);
+ nd0->Attach (ch);
+
+ Ptr<CsmaNetDevice> nd1 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::RAW,
+ false, true);
+ nd1->AddQueue(q);
+ nd1->Attach (ch);
+}
+
+void
+CsmaIpv4Topology::AddIpv4Address(Ptr<Node> n1,
+ int ndNum,
+ const Ipv4Address& addr1,
+ const Ipv4Mask& netmask1)
+{
+
+ // Duplex link is assumed to be subnetted as a /30
+ // May run this unnumbered in the future?
+ Ipv4Mask netmask(netmask1);
+
+ Ptr<NetDevice> nd1 = n1->GetDevice(ndNum);
+
+ Ptr<Ipv4> ip1 = n1->QueryInterface<Ipv4> (Ipv4::iid);
+ uint32_t index1 = ip1->AddInterface (nd1);
+
+ ip1->SetAddress (index1, addr1);
+ ip1->SetNetworkMask (index1, netmask);
+ ip1->SetUp (index1);
+
+}
+
+void
+CsmaIpv4Topology::AddIpv4Routes (
+ Ptr<NetDevice> nd1, Ptr<NetDevice> nd2)
+{
+ // Assert that both are Ipv4 nodes
+ Ptr<Ipv4> ip1 = nd1->GetNode ()->QueryInterface<Ipv4> (Ipv4::iid);
+ Ptr<Ipv4> ip2 = nd2->GetNode ()->QueryInterface<Ipv4> (Ipv4::iid);
+ NS_ASSERT(ip1 != 0 && ip2 != 0);
+
+ // Get interface indexes for both nodes corresponding to the right channel
+ uint32_t index1 = 0;
+ bool found = false;
+ for (uint32_t i = 0; i < ip1->GetNInterfaces (); i++)
+ {
+ if (ip1 ->GetNetDevice (i) == nd1)
+ {
+ index1 = i;
+ found = true;
+ }
+ }
+ NS_ASSERT(found);
+
+ uint32_t index2 = 0;
+ found = false;
+ for (uint32_t i = 0; i < ip2->GetNInterfaces (); i++)
+ {
+ if (ip2 ->GetNetDevice (i) == nd2)
+ {
+ index2 = i;
+ found = true;
+ }
+ }
+ NS_ASSERT(found);
+
+ ip1->AddHostRouteTo (ip2-> GetAddress (index2), index1);
+ ip2->AddHostRouteTo (ip1-> GetAddress (index1), index2);
+}
+
+} // namespace ns3
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-ipv4-topology.h Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,122 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2007 Emmanuelle Laprise
+//
+// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+//
+
+#ifndef __CSMA_IPV4_TOPOLOGY_H__
+#define __CSMA_IPV4_TOPOLOGY_H__
+
+#include "ns3/ptr.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv4.h"
+#include "ns3/ipv4-route.h"
+#include "ns3/internet-node.h"
+#include "ns3/csma-net-device.h"
+
+// The topology class consists of only static methods thar are used to
+// create the topology and data flows for an ns3 simulation
+
+namespace ns3 {
+
+class CsmaIpv4Channel;
+class Node;
+class IPAddr;
+class DataRate;
+class Queue;
+
+/**
+ * \brief A helper class to create Topologies based on the
+ * InternetNodes and CsmaChannels. Either the
+ * SimpleCsmaNetDevice or the LLCCsmaNetDevice can be used
+ * when constructing these topologies.
+ */
+class CsmaIpv4Topology {
+public:
+
+ /**
+ * \param n1 Node to be attached to the Csma channel
+ * \param ch CsmaChannel to which node n1 should be attached
+ * \param addr Mac address of the node
+ *
+ * Add a Csma node to a Csma channel. This function adds
+ * a EthernetCsmaNetDevice to the nodes so that they can
+ * connect to a CsmaChannel. This means that Ethernet headers
+ * and trailers will be added to the packet before sending out on
+ * the net device.
+ *
+ * \return ifIndex of the device
+ */
+ static uint32_t AddIpv4CsmaNode( Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr);
+
+ /**
+ * \param n1 Node to be attached to the Csma channel
+ * \param ch CsmaChannel to which node n1 should be attached
+ * \param addr Mac address of the node
+ *
+ * Add a Csma node to a Csma channel. This function adds
+ * a RawCsmaNetDevice to the nodes so that they can connect
+ * to a CsmaChannel.
+ */
+ static void AddIpv4RawCsmaNode( Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr);
+
+ /**
+ * \param n1 Node to be attached to the Csma channel
+ * \param ch CsmaChannel to which node n1 should be attached
+ * \param addr Mac address of the node
+ *
+ * Add a Csma node to a Csma channel. This function adds
+ * a LlcCsmaNetDevice to the nodes so that they can connect
+ * to a CsmaChannel.
+ */
+ static void AddIpv4LlcCsmaNode( Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ Eui48Address addr);
+
+
+
+ /**
+ * \param n1 Node
+ * \param ndNum NetDevice number with which to associate address
+ * \param addr1 Ipv4 Address for ndNum of n1
+ * \param network network mask for ndNum of node n1
+ *
+ * Add an Ipv4Address to the Ipv4 interface associated with the
+ * ndNum CsmaIpv4NetDevices on the provided
+ * CsmaIpv4Channel
+ */
+ static void AddIpv4Address(Ptr<Node> n1, int ndNum,
+ const Ipv4Address& addr1,
+ const Ipv4Mask& netmask1);
+
+ /**
+ * \param nd1 Node
+ * \param nd2 Node
+ *
+ * Add an IPV4 host route between the two specified net devices
+ */
+ static void AddIpv4Routes (Ptr<NetDevice> nd1, Ptr<NetDevice> nd2);
+};
+
+} // namespace ns3
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-net-device.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,570 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 Emmanuelle Laprise
+ * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+ */
+
+#include <iostream>
+#include <cassert>
+#include "ns3/debug.h"
+#include "ns3/queue.h"
+#include "ns3/simulator.h"
+#include "ns3/composite-trace-resolver.h"
+#include "csma-net-device.h"
+#include "csma-channel.h"
+#include "ns3/ethernet-header.h"
+#include "ns3/ethernet-trailer.h"
+#include "ns3/llc-snap-header.h"
+
+NS_DEBUG_COMPONENT_DEFINE ("CsmaNetDevice");
+
+namespace ns3 {
+
+CsmaTraceType::CsmaTraceType (enum Type type)
+ : m_type (type)
+{}
+CsmaTraceType::CsmaTraceType ()
+ : m_type (RX)
+{}
+void
+CsmaTraceType::Print (std::ostream &os) const
+{
+ switch (m_type) {
+ case RX:
+ os << "dev-rx";
+ break;
+ case DROP:
+ os << "dev-drop";
+ break;
+ }
+}
+uint16_t
+CsmaTraceType::GetUid (void)
+{
+ static uint16_t uid = AllocateUid<CsmaTraceType> ("CsmaTraceType");
+ return uid;
+}
+
+
+CsmaNetDevice::CsmaNetDevice (Ptr<Node> node)
+ : NetDevice (node, Eui48Address::Allocate ()),
+ m_bps (DataRate (0xffffffff))
+{
+ NS_DEBUG ("CsmaNetDevice::CsmaNetDevice (" << node << ")");
+ m_encapMode = IP_ARP;
+ Init(true, true);
+}
+
+CsmaNetDevice::CsmaNetDevice (Ptr<Node> node, Eui48Address addr,
+ CsmaEncapsulationMode encapMode)
+ : NetDevice(node, addr),
+ m_bps (DataRate (0xffffffff))
+{
+ NS_DEBUG ("CsmaNetDevice::CsmaNetDevice (" << node << ")");
+ m_encapMode = encapMode;
+
+ Init(true, true);
+}
+
+CsmaNetDevice::CsmaNetDevice (Ptr<Node> node, Eui48Address addr,
+ CsmaEncapsulationMode encapMode,
+ bool sendEnable, bool receiveEnable)
+ : NetDevice(node, addr),
+ m_bps (DataRate (0xffffffff))
+{
+ NS_DEBUG ("CsmaNetDevice::CsmaNetDevice (" << node << ")");
+ m_encapMode = encapMode;
+
+ Init(sendEnable, receiveEnable);
+}
+
+CsmaNetDevice::~CsmaNetDevice()
+{
+ NS_DEBUG ("CsmaNetDevice::~CsmaNetDevice ()");
+ m_queue = 0;
+}
+
+void
+CsmaNetDevice::DoDispose ()
+{
+ m_channel = 0;
+ NetDevice::DoDispose ();
+}
+
+//
+// Assignment operator for CsmaNetDevice.
+//
+// This uses the non-obvious trick of taking the source net device passed by
+// value instead of by reference. This causes the copy constructor to be
+// invoked (where the real work is done -- see above). All we have to do
+// here is to return the newly constructed net device.
+//
+/*
+CsmaNetDevice&
+CsmaNetDevice::operator= (const CsmaNetDevice nd)
+{
+ NS_DEBUG ("CsmaNetDevice::operator= (" << &nd << ")");
+ return *this;
+}
+*/
+
+void
+CsmaNetDevice::Init(bool sendEnable, bool receiveEnable)
+{
+ m_txMachineState = READY;
+ m_tInterframeGap = Seconds(0);
+ m_channel = 0;
+ m_queue = 0;
+
+ EnableBroadcast (Eui48Address ("ff:ff:ff:ff:ff:ff"));
+ EnableMulticast();
+ EnablePointToPoint();
+
+ SetSendEnable (sendEnable);
+ SetReceiveEnable (receiveEnable);
+}
+
+void
+CsmaNetDevice::SetSendEnable (bool sendEnable)
+{
+ m_sendEnable = sendEnable;
+}
+
+void
+CsmaNetDevice::SetReceiveEnable (bool receiveEnable)
+{
+ m_receiveEnable = receiveEnable;
+}
+bool
+CsmaNetDevice::IsSendEnabled (void)
+{
+ return (m_sendEnable);
+}
+
+bool
+CsmaNetDevice::IsReceiveEnabled (void)
+{
+ return (m_receiveEnable);
+}
+
+void
+CsmaNetDevice::SetDataRate (DataRate bps)
+{
+ m_bps = bps;
+}
+
+void
+CsmaNetDevice::SetInterframeGap (Time t)
+{
+ m_tInterframeGap = t;
+}
+
+void
+CsmaNetDevice::SetBackoffParams (Time slotTime, uint32_t minSlots,
+ uint32_t maxSlots, uint32_t ceiling,
+ uint32_t maxRetries)
+{
+ m_backoff.m_slotTime = slotTime;
+ m_backoff.m_minSlots = minSlots;
+ m_backoff.m_maxSlots = maxSlots;
+ m_backoff.m_ceiling = ceiling;
+ m_backoff.m_maxRetries = maxRetries;
+}
+void
+CsmaNetDevice::AddHeader (Packet& p, Eui48Address dest,
+ uint16_t protocolNumber)
+{
+ if (m_encapMode == RAW)
+ {
+ return;
+ }
+ EthernetHeader header (false);
+ EthernetTrailer trailer;
+ Eui48Address source = Eui48Address::ConvertFrom (GetAddress ());
+ header.SetSource(source);
+ header.SetDestination(dest);
+
+ uint16_t lengthType = 0;
+ switch (m_encapMode)
+ {
+ case ETHERNET_V1:
+ lengthType = p.GetSize() + header.GetSerializedSize() + trailer.GetSerializedSize();
+ break;
+ case IP_ARP:
+ lengthType = protocolNumber;
+ break;
+ case LLC: {
+ LlcSnapHeader llc;
+ llc.SetType (protocolNumber);
+ p.AddHeader (llc);
+ } break;
+ case RAW:
+ NS_ASSERT (false);
+ break;
+ }
+ header.SetLengthType (lengthType);
+ p.AddHeader(header);
+ trailer.CalcFcs(p);
+ p.AddTrailer(trailer);
+}
+bool
+CsmaNetDevice::ProcessHeader (Packet& p, uint16_t & param)
+{
+ if (m_encapMode == RAW)
+ {
+ return true;
+ }
+ EthernetHeader header (false);
+ EthernetTrailer trailer;
+
+ p.RemoveTrailer(trailer);
+ trailer.CheckFcs(p);
+ p.RemoveHeader(header);
+
+ if ((header.GetDestination() != GetBroadcast ()) &&
+ (header.GetDestination() != GetAddress ()))
+ {
+ return false;
+ }
+
+ switch (m_encapMode)
+ {
+ case ETHERNET_V1:
+ case IP_ARP:
+ param = header.GetLengthType();
+ break;
+ case LLC: {
+ LlcSnapHeader llc;
+ p.RemoveHeader (llc);
+ param = llc.GetType ();
+ } break;
+ case RAW:
+ NS_ASSERT (false);
+ break;
+ }
+ return true;
+}
+
+bool
+CsmaNetDevice::DoNeedsArp (void) const
+{
+ if ((m_encapMode == IP_ARP) || (m_encapMode == LLC))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool
+CsmaNetDevice::SendTo (Packet& p, const Address& dest, uint16_t protocolNumber)
+{
+ NS_DEBUG ("CsmaNetDevice::SendTo (" << &p << ")");
+ NS_DEBUG ("CsmaNetDevice::SendTo (): UID is " << p.GetUid () << ")");
+
+ NS_ASSERT (IsLinkUp ());
+
+ // Only transmit if send side of net device is enabled
+ if (!IsSendEnabled())
+ return false;
+
+ Eui48Address destination = Eui48Address::ConvertFrom (dest);
+ AddHeader(p, destination, protocolNumber);
+
+ // Place the packet to be sent on the send queue
+ if (m_queue->Enqueue(p) == false )
+ {
+ return false;
+ }
+ // If the device is idle, we need to start a transmission. Otherwise,
+ // the transmission will be started when the current packet finished
+ // transmission (see TransmitCompleteEvent)
+ if (m_txMachineState == READY)
+ {
+ // Store the next packet to be transmitted
+ if (m_queue->Dequeue (m_currentPkt))
+ {
+ TransmitStart();
+ }
+ }
+ return true;
+}
+
+void
+CsmaNetDevice::TransmitStart ()
+{
+ NS_DEBUG ("CsmaNetDevice::TransmitStart (" << &m_currentPkt << ")");
+ NS_DEBUG ("CsmaNetDevice::TransmitStart (): UID is "
+ << m_currentPkt.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_MSG((m_txMachineState == READY) || (m_txMachineState == BACKOFF),
+ "Must be READY to transmit. Tx state is: "
+ << m_txMachineState);
+
+ // Only transmit if send side of net device is enabled
+ if (!IsSendEnabled())
+ return;
+
+ if (m_channel->GetState() != IDLE)
+ { // Channel busy, backoff and rechedule TransmitStart()
+ m_txMachineState = BACKOFF;
+ if (m_backoff.MaxRetriesReached())
+ { // Too many retries reached, abort transmission of packet
+ TransmitAbort();
+ }
+ else
+ {
+ m_backoff.IncrNumRetries();
+ Time backoffTime = m_backoff.GetBackoffTime();
+
+ NS_DEBUG ("CsmaNetDevice::TransmitStart (): "
+ << "Channel busy, backing off for "
+ << backoffTime.GetSeconds () << "sec");
+
+ Simulator::Schedule (backoffTime,
+ &CsmaNetDevice::TransmitStart,
+ this);
+ }
+ }
+ else
+ {
+ // Channel is free, transmit packet
+ m_txMachineState = BUSY;
+ Time tEvent = Seconds (m_bps.CalculateTxTime(m_currentPkt.GetSize()));
+
+ NS_DEBUG ("CsmaNetDevice::TransmitStart (): " <<
+ "Schedule TransmitCompleteEvent in " <<
+ tEvent.GetSeconds () << "sec");
+
+ Simulator::Schedule (tEvent,
+ &CsmaNetDevice::TransmitCompleteEvent,
+ this);
+ if (!m_channel->TransmitStart (m_currentPkt, m_deviceId))
+ {
+ NS_DEBUG ("CsmaNetDevice::TransmitStart (): " <<
+ "Channel transmit start did not work at " <<
+ tEvent.GetSeconds () << "sec");
+ m_txMachineState = READY;
+ }
+ else
+ {
+ // Transmission success, reset backoff time parameters.
+ m_backoff.ResetBackoffTime();
+ }
+ }
+}
+
+
+void
+CsmaNetDevice::TransmitAbort (void)
+{
+ NS_DEBUG ("CsmaNetDevice::TransmitAbort ()");
+
+ NS_DEBUG ("CsmaNetDevice::TransmitAbort (): Pkt UID is " <<
+ m_currentPkt.GetUid () << ")");
+
+ // Try to transmit a new packet
+ bool found;
+ found = m_queue->Dequeue (m_currentPkt);
+ NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?");
+ m_backoff.ResetBackoffTime();
+ m_txMachineState = READY;
+ TransmitStart ();
+}
+
+void
+CsmaNetDevice::TransmitCompleteEvent (void)
+{
+ NS_DEBUG ("CsmaNetDevice::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
+// schedule an event that will be executed when it's time to re-enable
+// the transmitter after the interframe gap.
+//
+ NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting");
+ // Channel should be transmitting
+ NS_ASSERT(m_channel->GetState() == TRANSMITTING);
+ m_txMachineState = GAP;
+
+ NS_DEBUG ("CsmaNetDevice::TransmitCompleteEvent (): Pkt UID is " <<
+ m_currentPkt.GetUid () << ")");
+ m_channel->TransmitEnd ();
+
+ NS_DEBUG (
+ "CsmaNetDevice::TransmitCompleteEvent (): " <<
+ "Schedule TransmitReadyEvent in "
+ << m_tInterframeGap.GetSeconds () << "sec");
+
+ Simulator::Schedule (m_tInterframeGap,
+ &CsmaNetDevice::TransmitReadyEvent,
+ this);
+}
+
+void
+CsmaNetDevice::TransmitReadyEvent (void)
+{
+ NS_DEBUG ("CsmaNetDevice::TransmitReadyEvent ()");
+//
+// This function is called to enable the transmitter after the interframe
+// gap has passed. If there are pending transmissions, we use this opportunity
+// to start the next transmit.
+//
+ NS_ASSERT_MSG(m_txMachineState == GAP, "Must be in interframe gap");
+ m_txMachineState = READY;
+
+ // Get the next packet from the queue for transmitting
+ if (m_queue->IsEmpty())
+ {
+ return;
+ }
+ else
+ {
+ bool found;
+ found = m_queue->Dequeue (m_currentPkt);
+ NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?");
+ TransmitStart ();
+ }
+}
+
+TraceResolver *
+CsmaNetDevice::DoCreateTraceResolver (TraceContext const &context)
+{
+ CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
+ resolver->Add ("queue",
+ MakeCallback (&Queue::CreateTraceResolver,
+ PeekPointer (m_queue)));
+ resolver->Add ("rx",
+ m_rxTrace,
+ CsmaTraceType (CsmaTraceType::RX));
+ resolver->Add ("drop",
+ m_dropTrace,
+ CsmaTraceType (CsmaTraceType::DROP));
+ return resolver;
+}
+
+bool
+CsmaNetDevice::Attach (Ptr<CsmaChannel> ch)
+{
+ NS_DEBUG ("CsmaNetDevice::Attach (" << &ch << ")");
+
+ m_channel = ch;
+
+ m_deviceId = m_channel->Attach(this);
+ m_bps = m_channel->GetDataRate ();
+ m_tInterframeGap = m_channel->GetDelay ();
+
+ /*
+ * For now, this device is up whenever a channel is attached to it.
+ */
+ NotifyLinkUp ();
+ return true;
+}
+
+void
+CsmaNetDevice::AddQueue (Ptr<Queue> q)
+{
+ NS_DEBUG ("CsmaNetDevice::AddQueue (" << q << ")");
+
+ m_queue = q;
+}
+
+void
+CsmaNetDevice::Receive (const Packet& packet)
+{
+ EthernetHeader header (false);
+ EthernetTrailer trailer;
+ Eui48Address broadcast;
+ Eui48Address destination;
+ Packet p = packet;
+
+ NS_DEBUG ("CsmaNetDevice::Receive UID is (" << p.GetUid() << ")");
+
+ // Only receive if send side of net device is enabled
+ if (!IsReceiveEnabled())
+ {
+ m_dropTrace (p);
+ return;
+ }
+
+ if (m_encapMode == RAW)
+ {
+ ForwardUp (packet, 0, GetBroadcast ());
+ m_dropTrace (p);
+ return;
+ }
+ p.RemoveTrailer(trailer);
+ trailer.CheckFcs(p);
+ p.RemoveHeader(header);
+
+ broadcast = Eui48Address::ConvertFrom (GetBroadcast ());
+ destination = Eui48Address::ConvertFrom (GetAddress ());
+ if ((header.GetDestination() != broadcast) &&
+ (header.GetDestination() != destination))
+ {
+ // not for us.
+ m_dropTrace (p);
+ return;
+ }
+//
+// protocol must be initialized to avoid a compiler warning in the RAW
+// case that breaks the optimized build.
+//
+ uint16_t protocol = 0;
+
+ switch (m_encapMode)
+ {
+ case ETHERNET_V1:
+ case IP_ARP:
+ protocol = header.GetLengthType();
+ break;
+ case LLC: {
+ LlcSnapHeader llc;
+ p.RemoveHeader (llc);
+ protocol = llc.GetType ();
+ } break;
+ case RAW:
+ NS_ASSERT (false);
+ break;
+ }
+
+ m_rxTrace (p);
+ ForwardUp (p, protocol, header.GetSource ());
+ return;
+}
+
+Ptr<Queue>
+CsmaNetDevice::GetQueue(void) const
+{
+ return m_queue;
+}
+
+Ptr<Channel>
+CsmaNetDevice::DoGetChannel(void) const
+{
+ return m_channel;
+}
+
+} // namespace ns3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-net-device.h Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,417 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 Emmanuelle Laprise
+ *
+ * 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca
+ * Derived from the p2p net device file
+ */
+
+#ifndef CSMA_NET_DEVICE_H
+#define CSMA_NET_DEVICE_H
+
+#include <string.h>
+#include "ns3/node.h"
+#include "ns3/backoff.h"
+#include "ns3/address.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/ptr.h"
+#include "ns3/random-variable.h"
+#include "ns3/eui48-address.h"
+
+namespace ns3 {
+
+class Queue;
+class CsmaChannel;
+
+class CsmaTraceType : public TraceContextElement
+{
+public:
+ enum Type {
+ RX,
+ DROP
+ };
+ CsmaTraceType (enum Type type);
+ CsmaTraceType ();
+ void Print (std::ostream &os) const;
+ static uint16_t GetUid (void);
+private:
+ enum Type m_type;
+};
+
+/**
+ * \class CsmaNetDevice
+ * \brief A Device for a Csma Network Link.
+ *
+ * The Csma net device class is analogous to layer 1 and 2 of the
+ * TCP stack. The NetDevice takes a raw packet of bytes and creates a
+ * protocol specific packet from them. The Csma net device class
+ * takes this packet and adds and processes the headers/trailers that
+ * are associated with EthernetV1, EthernetV2, RAW or LLC
+ * protocols. The EthernetV1 packet type adds and removes Ethernet
+ * destination and source addresses. The LLC packet type adds and
+ * removes LLC snap headers. The raw packet type does not add or
+ * remove any headers. Each Csma net device will receive all
+ * packets written to the Csma link. The ProcessHeader function can
+ * be used to filter out the packets such that higher level layers
+ * only receive packets that are addressed to their associated net
+ * devices
+ *
+ */
+class CsmaNetDevice : public NetDevice {
+public:
+
+ /**
+ * Enumeration of the types of packets supported in the class.
+ *
+ */
+enum CsmaEncapsulationMode {
+ ETHERNET_V1, /**< Version one ethernet packet, length field */
+ IP_ARP, /**< Ethernet packet encapsulates IP/ARP packet */
+ RAW, /**< Packet that contains no headers */
+ LLC, /**< LLC packet encapsulation */
+};
+
+ CsmaNetDevice (Ptr<Node> node);
+ /**
+ * Construct a CsmaNetDevice
+ *
+ * This is the constructor for the CsmaNetDevice. 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 deleted.
+ *
+ * \param node the Node to which this device is connected.
+ * \param addr The source MAC address of the net device.
+ */
+ CsmaNetDevice (Ptr<Node> node, Eui48Address addr, CsmaEncapsulationMode pktType);
+ CsmaNetDevice (Ptr<Node> node, Eui48Address addr,
+ CsmaEncapsulationMode pktType,
+ bool sendEnable, bool receiveEnable);
+ /**
+ * Destroy a CsmaNetDevice
+ *
+ * This is the destructor for the CsmaNetDevice.
+ */
+ virtual ~CsmaNetDevice();
+ /**
+ * 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);
+ /**
+ * Set the backoff parameters used to determine the wait to retry
+ * transmitting a packet when the channel is busy.
+ *
+ * @see Attach ()
+ * \param slotTime Length of a packet slot (or average packet time)
+ * \param minSlots Minimum number of slots to wait
+ * \param maxSlots Maximum number of slots to wait
+ * \param maxRetries Maximum number of retries before packet is discard
+ * \param ceiling Cap on the exponential function when calculating max slots
+ */
+ void SetBackoffParams (Time slotTime, uint32_t minSlots, uint32_t maxSlots,
+ uint32_t maxRetries, uint32_t ceiling);
+ /**
+ * Attach the device to a channel.
+ *
+ * The function Attach is used to add a CsmaNetDevice to a
+ * CsmaChannel.
+ *
+ * @see SetDataRate ()
+ * @see SetInterframeGap ()
+ * \param ch a pointer to the channel to which this object is being attached.
+ */
+ bool Attach (Ptr<CsmaChannel> ch);
+ /**
+ * Attach a queue to the CsmaNetDevice.
+ *
+ * The CsmaNetDevice "owns" a queue. This queue is created by the
+ * CsmaTopology object and implements a queueing method such as
+ * DropTail or RED. The CsmaNetDevice assumes ownership of this
+ * queue and must delete it when the device is destroyed.
+ *
+ * @see CsmaTopology::AddCsmaLink ()
+ * @see Queue
+ * @see DropTailQueue
+ * \param queue a pointer to the queue for which object is assuming
+ * ownership.
+ */
+ void AddQueue (Ptr<Queue> queue);
+ /**
+ * Receive a packet from a connected CsmaChannel.
+ *
+ * The CsmaNetDevice 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 CsmaChannel
+ * \param p a reference to the received packet
+ */
+ void Receive (const Packet& p);
+
+ bool IsSendEnabled (void);
+ bool IsReceiveEnabled (void);
+
+ void SetSendEnable (bool);
+ void SetReceiveEnable (bool);
+
+protected:
+ virtual bool DoNeedsArp (void) const;
+ 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.
+ *
+ * \return a pointer to the queue.
+ */
+ Ptr<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
+ *
+ * \return a pointer to the channel
+ */
+ virtual Ptr<Channel> DoGetChannel (void) const;
+ /**
+ * Adds the necessary headers and trailers to a packet of data in order to
+ * respect the packet type
+ *
+ * \param p Packet to which header should be added
+ * \param dest MAC destination address to which packet should be sent
+ * \param protocolNumber In some protocols, identifies the type of
+ * payload contained in this packet.
+ */
+ void AddHeader (Packet& p, Eui48Address dest,
+ uint16_t protocolNumber);
+ /**
+ * Removes, from a packet of data, all headers and trailers that
+ * relate to the packet type
+ *
+ * \param p Packet whose headers need to be processed
+ * \param param An integer parameter that can be set by the function
+ * to return information gathered in the header
+ * \return Returns true if the packet should be forwarded up the
+ * protocol stack.
+ */
+ bool ProcessHeader (Packet& p, uint16_t & param);
+
+private:
+ // disable copy constructor and operator =
+ CsmaNetDevice &operator = (const CsmaNetDevice &o);
+ CsmaNetDevice (const CsmaNetDevice &o);
+ /**
+ * Initializes variablea when construction object.
+ */
+ void Init (bool sendEnable, bool receiveEnable);
+ /**
+ * Send a Packet on the Csma network
+ *
+ * This method does not use a destination address since all packets
+ * are broadcast to all NetDevices attached to the channel. Packet
+ * should contain all needed headers at this time.
+ *
+ * If the device is ready to transmit, the next packet is read off
+ * of the queue and stored locally until it has been transmitted.
+ *
+ * \param p a reference to the packet to send
+ * \param dest destination address
+ * \param protocolNumber -- this parameter is not used here
+ * \return true if success, false on failure
+ */
+ virtual bool SendTo (Packet& p, const Address& dest, uint16_t protocolNumber);
+
+ /**
+ * Start Sending a Packet Down the Wire.
+ *
+ * The TransmitStart method is the method that is used internally in
+ * the CsmaNetDevice 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, this causes the
+ * channel to become busy. An event is scheduled for the time at
+ * which the bits have been completely transmitted. If the channel
+ * is busy, the method reschedules itself for a later time (within
+ * the backoff period)
+ *
+ * @see CsmaChannel::TransmitStart ()
+ * @see TransmitCompleteEvent ()
+ */
+ void TransmitStart ();
+ /**
+ * 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 CsmaChannel::TransmitEnd ()
+ * @see TransmitReadyEvent ()
+ */
+ 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.
+ *
+ * If a packet is in the queue, it is extracted for the queue as the
+ * next packet to be transmitted by the net device.
+ *
+ * @see TransmitStart ()
+ */
+ void TransmitReadyEvent (void);
+ /**
+ * Create a Trace Resolver for events in the net device.
+ * (NOT TESTED)
+ * @see class TraceResolver
+ */
+ virtual TraceResolver *DoCreateTraceResolver (TraceContext const &context);
+
+ /**
+ * Aborts the transmission of the current packet
+ *
+ * If the net device has tried to transmit a packet for more times
+ * than the maximum allowed number of retries (channel always busy)
+ * then the packet is dropped.
+ *
+ */
+ void TransmitAbort (void);
+
+ /**
+ * Device ID returned by the attached functions. It is used by the
+ * mp-channel to identify each net device to make sure that only
+ * active net devices are writing to the channel
+ */
+ uint32_t m_deviceId;
+
+ /**
+ * Enable net device to send packets. True by default
+ */
+ bool m_sendEnable;
+ /**
+ * Enable net device to receive packets. True by default
+ */
+ bool m_receiveEnable;
+ /**
+ * 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 */
+ GAP, /**< The transmitter is in the interframe gap time */
+ BACKOFF /**< The transmitter is waiting for the channel to be free */
+ };
+ /**
+ * The state of the Net Device transmit state machine.
+ * @see TxMachineState
+ */
+ TxMachineState m_txMachineState;
+
+ /**
+ * The type of packet that should be created by the AddHeader
+ * function and that should be processed by the ProcessHeader
+ * function.
+ */
+ CsmaEncapsulationMode m_encapMode;
+ /**
+ * 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;
+ /**
+ * Holds the backoff parameters and is used to calculate the next
+ * backoff time to use when the channel is busy and the net device
+ * is ready to transmit
+ */
+ Backoff m_backoff;
+ /**
+ * Next packet that will be transmitted (if transmitter is not
+ * currently transmitting) or packet that is currently being
+ * transmitted.
+ */
+ Packet m_currentPkt;
+ /**
+ * The CsmaChannel to which this CsmaNetDevice has been
+ * attached.
+ * @see class CsmaChannel
+ */
+ Ptr<CsmaChannel> m_channel;
+ /**
+ * The Queue which this CsmaNetDevice uses as a packet source.
+ * Management of this Queue has been delegated to the CsmaNetDevice
+ * and it has the responsibility for deletion.
+ * @see class Queue
+ * @see class DropTailQueue
+ */
+ Ptr<Queue> m_queue;
+ /**
+ * NOT TESTED
+ * The trace source for the packet reception events that the device can
+ * fire.
+ *
+ * @see class CallBackTraceSource
+ * @see class TraceResolver
+ */
+ CallbackTraceSource<Packet &> m_rxTrace;
+ CallbackTraceSource<Packet &> m_dropTrace;
+
+};
+
+}; // namespace ns3
+
+#endif // CSMA_NET_DEVICE_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-topology.cc Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,103 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2007 Emmanuelle Laprise
+//
+// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+//
+
+//
+// Topology helper for Csma channels in ns3.
+
+#include "ns3/assert.h"
+#include "ns3/debug.h"
+#include "ns3/queue.h"
+
+#include "csma-channel.h"
+#include "csma-net-device.h"
+#include "csma-topology.h"
+#include "ns3/socket-factory.h"
+
+namespace ns3 {
+
+Ptr<CsmaChannel>
+CsmaTopology::CreateCsmaChannel(
+ const DataRate& bps,
+ const Time& delay)
+{
+ Ptr<CsmaChannel> channel = Create<CsmaChannel> (bps, delay);
+
+ return channel;
+}
+
+#if 0
+Ptr<CsmaNetDevice>
+CsmaTopology::AddCsmaEthernetNode(
+ Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ MacAddress addr)
+{
+ Ptr<CsmaNetDevice> nd1 = Create<CsmaNetDevice> (n1, addr,
+ ns3::CsmaNetDevice::ETHERNET_V1);
+
+ Ptr<Queue> q = Queue::CreateDefault ();
+ nd1->AddQueue(q);
+ nd1->Attach (ch);
+
+ return nd1;
+}
+
+Ptr<PacketSocket>
+CsmaTopology::ConnectPacketSocket(Ptr<PacketSocketApp> app,
+ Ptr<CsmaNetDevice> ndSrc,
+ Ptr<CsmaNetDevice> ndDest)
+{
+ Ptr<PacketSocket> socket = Create<PacketSocket> ();
+ socket->Bind(ndSrc);
+ socket->Connect(ndDest->GetAddress());
+ app->Connect(socket);
+
+ return socket;
+}
+
+Ptr<PacketSocket>
+CsmaTopology::ConnectPacketSocket(Ptr<PacketSocketApp> app,
+ Ptr<CsmaNetDevice> ndSrc,
+ MacAddress macAddr)
+{
+ Ptr<PacketSocket> socket = Create<PacketSocket> ();
+ socket->Bind(ndSrc);
+ socket->Connect(macAddr);
+ app->Connect(socket);
+
+ return socket;
+}
+
+Ptr<Socket>
+CsmaTopology::CreatePacketSocket(Ptr<Node> n1, std::string iid_name)
+{
+ InterfaceId iid = InterfaceId::LookupByName (iid_name);
+
+ Ptr<SocketFactory> socketFactory =
+ n1->QueryInterface<SocketFactory> (iid);
+
+ Ptr<Socket> socket = socketFactory->CreateSocket ();
+
+ return socket;
+}
+#endif
+
+} // namespace ns3
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/csma-topology.h Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,123 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+//
+// Copyright (c) 2007 Emmanuelle Laprise
+//
+// 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: Emmanuelle Laprise <emmanuelle.laprise@bluekazoo.ca>
+//
+// Topology helper for multipoint channels in ns3.
+//
+#ifndef CSMA_TOPOLOGY_H
+#define CSMA_TOPOLOGY_H
+
+#include "ns3/ptr.h"
+#include "ns3/csma-net-device.h"
+#include "ns3/node.h"
+
+// The topology class consists of only static methods thar are used to
+// create the topology and data flows for an ns3 simulation
+
+namespace ns3 {
+
+class CsmaChannel;
+class Node;
+class DataRate;
+class Queue;
+
+/**
+ * \brief A helper class to create Csma Topologies
+ *
+ * Csma topologies are created based on the
+ * ns3::CsmaNetDevice subclasses and ns3::CsmaChannel
+ * objects. This class uses the EthernetNetDevice and
+ * PacketSocket classes in order to create logical connections between
+ * net devices. The PacketSocket class generates the data and the
+ * EthernetNetDevice class creates ethernet packets from the
+ * data, filling in source and destination addresses. The
+ * EthernetNetDevice class filters received data packets
+ * according to its destination Mac addresses.
+ */
+class CsmaTopology {
+public:
+ /**
+ * \param dataRate Maximum transmission link rate
+ * \param delay propagation delay between any two nodes
+ * \return Pointer to the created CsmaChannel
+ *
+ * Create a CsmaChannel. All nodes connected to a multipoint
+ * channels will receive all packets written to that channel
+ */
+ static Ptr<CsmaChannel> CreateCsmaChannel(
+ const DataRate& dataRate, const Time& delay);
+
+#if 0
+ /**
+ * \param n1 Node to be attached to the multipoint channel
+ * \param ch CsmaChannel to which node n1 should be attached
+ * \param addr MacAddress that should be assigned to the
+ * EthernetNetDevice that will be added to the node.
+ *
+ * Add a multipoint node to a multipoint channel
+ */
+ static Ptr<CsmaNetDevice> AddCsmaEthernetNode(Ptr<Node> n1,
+ Ptr<CsmaChannel> ch,
+ MacAddress addr);
+
+ /**
+ * \param app Application that will be sending data to the agent
+ * \param ndSrc Net Device that will be sending the packets onto the
+ * network
+ * \param ndDest Net Device to which ndSrc will be sending the packets
+ * \return A pointer to the PacketSocket
+ *
+ * Creates an PacketSocket and configure it to send packets between
+ * two net devices
+ */
+static Ptr<PacketSocket> ConnectPacketSocket(Ptr<PacketSocketApp> app,
+ Ptr<CsmaNetDevice> ndSrc,
+ Ptr<CsmaNetDevice> ndDest);
+
+ /**
+ * \param app Application that will be sending data to the agent
+ * \param ndSrc Net Device that will be sending the packets onto the
+ * network
+ * \param macAddr Mac destination address for the packets send by
+ * the ndSrc net device \return a Pointer to the created
+ * PacketSocket
+ *
+ * Creates an PacketSocket and configure it to send packets from a
+ * net device to a destination MacAddress
+ */
+static Ptr<PacketSocket> ConnectPacketSocket(Ptr<PacketSocketApp> app,
+ Ptr<CsmaNetDevice> ndSrc,
+ MacAddress macAddr);
+
+ /**
+ * \param n1 Node from which socketfactory should be tested.
+ * \param iid_name Interface identifier ("Packet", in this case)
+ *
+ * This is a test function to make sure that a socket can be created
+ * by using the socketfactory interface provided in the
+ * netdevicenode.
+ */
+static Ptr<Socket> CreatePacketSocket(Ptr<Node> n1,
+ std::string iid_name);
+#endif
+
+};
+} // namespace ns3
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/csma/wscript Thu Aug 09 15:56:28 2007 -0700
@@ -0,0 +1,19 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def build(bld):
+ obj = bld.create_ns3_module('csma', ['node'])
+ obj.source = [
+ 'backoff.cc',
+ 'csma-net-device.cc',
+ 'csma-channel.cc',
+ 'csma-topology.cc',
+ 'csma-ipv4-topology.cc',
+ ]
+ headers = bld.create_obj('ns3header')
+ headers.source = [
+ 'backoff.h',
+ 'csma-net-device.h',
+ 'csma-channel.h',
+ 'csma-topology.h',
+ 'csma-ipv4-topology.h',
+ ]
--- a/src/wscript Thu Aug 09 13:42:42 2007 +0200
+++ b/src/wscript Thu Aug 09 15:56:28 2007 -0700
@@ -17,7 +17,7 @@
'node',
'internet-node',
'devices/point-to-point',
- 'devices/csma-cd',
+ 'devices/csma',
'applications',
'routing/global-routing',
'mobility',