strawman connectors and channel
authorowner@UPSTAIRS.Belkin
Sun, 18 Feb 2007 19:19:42 -0800
changeset 299 dd6d1a6d6eff
parent 298 9a2b600ffee7
child 300 6b63789695a5
strawman connectors and channel
SConstruct
samples/main-channel.cc
src/node/channel.cc
src/node/channel.h
src/node/layer-connector.cc
src/node/layer-connector.h
--- a/SConstruct	Sun Feb 18 11:22:23 2007 +0100
+++ b/SConstruct	Sun Feb 18 19:19:42 2007 -0800
@@ -24,7 +24,7 @@
     'test.cc',
     ])
 env = Environment()
-if env['PLATFORM'] == 'posix' or env['PLATFORM'] == 'darwin':
+if env['PLATFORM'] == 'posix' or env['PLATFORM'] == 'darwin' or env['PLATFORM'] == 'cygwin':
     core.add_external_dep('pthread')
     core.add_sources([
         'unix-system-wall-clock-ms.cc',
@@ -197,6 +197,8 @@
     'serial-channel.cc',
     'queue.cc',
     'drop-tail.cc',
+    'layer-connector.cc',
+    'channel.cc',
     ])
 node.add_headers ([
     'ipv4-header.h',
@@ -236,6 +238,8 @@
     'serial-channel.h',
     'queue.h',
     'drop-tail.h',
+    'layer-connector.h',
+    'channel.h',
     'serial-net-device.h'
     ])
 
@@ -335,5 +339,12 @@
 sample_simple_tcl.add_deps(['core', 'simulator', 'node'])
 sample_simple_tcl.add_source('ns-2/simple.tcl.cc')
 
+sample_channel = build.Ns3Module('sample-channel', 'samples')
+sample_channel.set_executable()
+ns3.add(sample_channel)
+sample_channel.add_dep ('common')
+sample_channel.add_dep ('node')
+sample_channel.add_dep ('core')
+sample_channel.add_source('main-channel.cc')
 
 ns3.generate_dependencies()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/main-channel.cc	Sun Feb 18 19:19:42 2007 -0800
@@ -0,0 +1,216 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 University of Washington
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <string>
+#include "ns3/debug.h"
+#include "ns3/packet.h"
+#include "ns3/drop-tail.h"
+#include "ns3/layer-connector.h"
+#include "ns3/channel.h"
+
+using namespace ns3;
+
+// ===========================================================================
+// Cook up a simplistic Internet Node
+// ===========================================================================
+class FakeInternetNode : public LayerConnectorUpper
+{
+public:
+  FakeInternetNode ();
+ ~FakeInternetNode ();
+
+  void Doit (void);
+
+protected:
+  bool UpperDoSendUp (Packet &p);
+  bool UpperDoPull (Packet &p);
+
+  DropTailQueue m_dtqOutbound;
+  DropTailQueue m_dtqInbound;
+};
+
+FakeInternetNode::FakeInternetNode ()
+{
+  NS_DEBUG_UNCOND("FakeInternetNode::FakeInternetNode ()")
+}
+
+FakeInternetNode::~FakeInternetNode ()
+{
+  NS_DEBUG_UNCOND("FakeInternetNode::~FakeInternetNode ()")
+}
+
+  void
+FakeInternetNode::Doit (void)
+{
+  NS_DEBUG_UNCOND("FakeInternetNode::Doit ()")
+  NS_DEBUG_UNCOND("FakeInternetNode::Doit (): **** Send outbound packet")
+  Packet p;
+
+  m_dtqOutbound.Enque(p);
+  UpperNotify();
+}
+
+  bool
+FakeInternetNode::UpperDoSendUp (Packet &p)
+{
+  NS_DEBUG_UNCOND("FakeInternetNode::UpperDoSendUp (" << &p << ")")
+
+  NS_DEBUG_UNCOND("FakeInternetNode::UpperDoSendUp (): **** Receive inbound packet")
+  m_dtqInbound.Enque(p);
+  return m_dtqInbound.Deque(p);
+}
+
+  bool
+FakeInternetNode::UpperDoPull (Packet &p)
+{
+  NS_DEBUG_UNCOND("FakeInternetNode::DoPull (" << &p << ")")
+
+  return m_dtqOutbound.Deque(p);
+}
+
+// ===========================================================================
+// Cook up a simplistic Physical Layer
+// ===========================================================================
+class FakePhysicalLayer :
+  public LayerConnectorLower,
+  public LayerConnectorUpper
+{
+public:
+  FakePhysicalLayer ();
+ ~FakePhysicalLayer ();
+
+protected:
+  bool LowerDoNotify (LayerConnectorUpper *upper);
+  bool UpperDoSendUp (Packet &p);
+  bool UpperDoPull (Packet &p);
+
+  DropTailQueue m_dtqInbound;
+  DropTailQueue m_dtqOutbound;
+};
+
+FakePhysicalLayer::FakePhysicalLayer ()
+{
+  NS_DEBUG_UNCOND("FakePhysicalLayer::FakePhysicalLayer ()")
+}
+
+FakePhysicalLayer::~FakePhysicalLayer ()
+{
+  NS_DEBUG_UNCOND("FakePhysicalLayer::~FakePhysicalLayer ()")
+}
+
+  bool
+FakePhysicalLayer::LowerDoNotify (LayerConnectorUpper *upper)
+{
+  NS_DEBUG_UNCOND("FakePhysicalLayer::LowerDoNotify ()")
+
+  Packet p;
+
+  NS_DEBUG_UNCOND("FakePhysicalLayer::LowerDoNotify (): Starting pull")
+
+  assert(m_upperPartner);
+  m_upperPartner->UpperPull(p);
+
+  m_dtqOutbound.Enque(p);
+
+  NS_DEBUG_UNCOND("FakePhysicalLayer::LowerDoNotify (): Got bits,  Notify lower")
+
+  assert(m_lowerPartner);
+  return m_lowerPartner->LowerNotify(this);
+}
+
+  bool
+FakePhysicalLayer::UpperDoSendUp (Packet &p)
+{
+  NS_DEBUG_UNCOND("FakePhysicalLayer::UpperDoSendUp (" << &p << ")")
+
+  assert(m_upperPartner);
+  return m_upperPartner->UpperSendUp(p);
+}
+
+  bool
+FakePhysicalLayer::UpperDoPull (Packet &p)
+{
+  NS_DEBUG_UNCOND("FakePhysicalLayer::DoPull (" << &p << ")")
+
+  return m_dtqOutbound.Deque(p);
+}
+
+// ===========================================================================
+// Cook up a simplistic Channel, just to add any moby hack we feel like
+// ===========================================================================
+class FakeChannel : public Channel
+{
+public:
+  FakeChannel ();
+ ~FakeChannel ();
+};
+
+FakeChannel::FakeChannel ()
+{
+  NS_DEBUG_UNCOND("FakeChannel::FakeChannel ()")
+}
+
+FakeChannel::~FakeChannel ()
+{
+  NS_DEBUG_UNCOND("FakeChannel::~FakeChannel ()")
+}
+
+int main (int argc, char *argv[])
+{
+  NS_DEBUG_UNCOND("Channel Hackorama")
+
+  DebugComponentEnable("Queue");
+  DebugComponentEnable("DropTailQueue");
+  DebugComponentEnable("LayerConnector");
+  DebugComponentEnable("Channel");
+
+  FakeInternetNode      node1, node2, node3, node4;
+  FakePhysicalLayer     phys1, phys2, phys3, phys4;
+  FakeChannel           channel;
+  Packet                pkt;
+
+  // all the hassle above lets us do something very simple here
+
+  node1.ConnectToLower(phys1);
+  phys1.ConnectToUpper(node1);
+  phys1.ConnectToLower(channel);
+  channel.ConnectToUpper(phys1);
+
+  node2.ConnectToLower(phys2);
+  phys2.ConnectToUpper(node2);
+  phys2.ConnectToLower(channel);
+  channel.ConnectToUpper(phys2);
+
+  node3.ConnectToLower(phys3);
+  phys3.ConnectToUpper(node3);
+  phys3.ConnectToLower(channel);
+  channel.ConnectToUpper(phys3);
+
+  node4.ConnectToLower(phys4);
+  phys4.ConnectToUpper(node4);
+  phys4.ConnectToLower(channel);
+  channel.ConnectToUpper(phys4);
+
+  node1.Doit();
+  node2.Doit();
+  node3.Doit();
+  node4.Doit();
+
+  return 0;
+}
--- a/src/node/channel.cc	Sun Feb 18 11:22:23 2007 +0100
+++ b/src/node/channel.cc	Sun Feb 18 19:19:42 2007 -0800
@@ -30,32 +30,49 @@
 
 Channel::Channel ()
 {
-  NS_DEBUG ("Channel::Channel ()")
+  NS_DEBUG("Channel::Channel ()")
 }
 
 Channel::~Channel ()
 {
-  NS_DEBUG ("Channel::~Channel ()")
+  NS_DEBUG("Channel::~Channel ()")
 }
 
   bool
-Channel::Connect (PhysicalLayer &phys)
+Channel::DoConnectToUpper (LayerConnectorUpper &upper)
 {
-  NS_DEBUG ("Channel::Connect (" << &phys << ")")
-  m_physList.push_back(static_cast<PhysicalLayer *>(&phys));
+  NS_DEBUG("Channel::DoConnectToUpper (" << &upper << ")")
+  m_connectorList.push_back(&upper);
+
   return true;
 }
 
   bool
-Channel::Propagate (Propagator &propagator)
+Channel::LowerDoNotify (LayerConnectorUpper *upper)
 {
-  NS_DEBUG ("Channel::Propagate (" << &propagator << ")")
+  NS_DEBUG("Channel::LowerDoNotify ()")
+
+  Packet p;
+
+  NS_DEBUG("Channel::LowerDoNotify (): Starting pull")
+
+  upper->UpperPull(p);
+
+  NS_DEBUG("Channel::LowerDoNotify (): Got bits,  Propagate()")
 
-  for (PhysicalLayerList::const_iterator i = m_physList.begin ();
-       i != m_physList.end (); 
+  return Propagate(p);
+}
+
+  bool
+Channel::Propagate (Packet &p)
+{
+  NS_DEBUG("Channel::Propagate (" << &p << ")")
+
+  for (ConnectorList::const_iterator i = m_connectorList.begin ();
+       i != m_connectorList.end (); 
        i++)
     {
-      (*i)->Receive (propagator);
+      (*i)->UpperSendUp (p);
     }
 
   return true;
--- a/src/node/channel.h	Sun Feb 18 11:22:23 2007 +0100
+++ b/src/node/channel.h	Sun Feb 18 19:19:42 2007 -0800
@@ -22,36 +22,33 @@
  */
 
 #include <list>
-#include "physical-layer.h"
+#include "ns3/packet.h"
+#include "layer-connector.h"
 
 #ifndef CHANNEL_H
 #define CHANNEL_H
 
 namespace ns3 {
 
-class Propagator;
-
-class Channel
+class Channel : public LayerConnectorLower
 {
 public:
   Channel ();
   virtual ~Channel ();
 
-  // called by the builderto introduce the channel and the physical layer
-  // of the node.
-  bool Connect (PhysicalLayer &phys);
-
   // Called by the physical layer to cause bits to propagate along the channel
   // The channel will call Receive on each of the phys.
-  bool Propagate (Propagator &p);
+  bool Propagate (Packet &p);
+  bool DoConnectToUpper (LayerConnectorUpper &upper);
+  bool LowerDoNotify (LayerConnectorUpper *upper);
 
 protected:
-  typedef std::list<PhysicalLayer *> PhysicalLayerList;
-  PhysicalLayerList m_physList;
+  typedef std::list<LayerConnectorUpper *> ConnectorList;
+  ConnectorList m_connectorList;
 
 private:
 };
 
 }; // namespace ns3
 
-#endif /* SERIAL_PHY_H */
+#endif /* CHANNEL_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/layer-connector.cc	Sun Feb 18 19:19:42 2007 -0800
@@ -0,0 +1,137 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 University of Washington
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Craig Dowell <craigdo@ee.washingon.edu>
+ *
+ *      Fri Feb 16 12:18:11 PST 2007 craigdo:  created
+ */
+
+#include "ns3/debug.h"
+#include "layer-connector.h"
+
+NS_DEBUG_COMPONENT_DEFINE ("LayerConnector");
+
+namespace ns3 {
+
+LayerConnectorUpper::LayerConnectorUpper ()
+{
+  NS_DEBUG("LayerConnectorUpper::LayerConnectorUpper ()")
+}
+
+LayerConnectorUpper::~LayerConnectorUpper ()
+{
+  NS_DEBUG("LayerConnectorUpper::~LayerConnectorUpper ()")
+}
+
+  bool
+LayerConnectorUpper::ConnectToLower (LayerConnectorLower &partner)
+{
+  NS_DEBUG("LayerConnectorUpper::ConnectToLower (" << &partner << ")")
+
+  return DoConnectToLower(partner);
+}
+
+  bool
+LayerConnectorUpper::DoConnectToLower (LayerConnectorLower &partner)
+{
+  NS_DEBUG("LayerConnectorUpper::DoConnectToLower (" << &partner << ")")
+
+  m_lowerPartner = &partner;
+  assert(m_lowerPartner);
+  return true;
+}
+
+  bool
+LayerConnectorUpper::UpperSendUp (Packet &p)
+{
+  NS_DEBUG("LayerConnectorUpper::UpperSendUp (" << &p << ")")
+
+  return UpperDoSendUp(p);
+}
+
+  bool
+LayerConnectorUpper::UpperPull (Packet &p)
+{
+  NS_DEBUG("LayerConnectorUpper::UpperPull (" << &p << ")")
+
+  return UpperDoPull(p);
+}
+
+  bool
+LayerConnectorUpper::UpperNotify ()
+{
+  NS_DEBUG("LayerConnectorUpper::UpperNotify ()")
+
+  assert(m_lowerPartner);
+  return m_lowerPartner->LowerNotify(this);
+}
+
+LayerConnectorLower::LayerConnectorLower ()
+{
+  NS_DEBUG("LayerConnectorLower::LayerConnectorLower ()")
+}
+
+LayerConnectorLower::~LayerConnectorLower ()
+{
+  NS_DEBUG("LayerConnectorLower::~LayerConnectorLower ()")
+}
+
+  bool
+LayerConnectorLower::ConnectToUpper (LayerConnectorUpper &partner)
+{
+  NS_DEBUG("LayerConnectorLower::ConnectToUpper (" << &partner << ")")
+
+  return DoConnectToUpper(partner);
+}
+
+  bool
+LayerConnectorLower::DoConnectToUpper (LayerConnectorUpper &partner)
+{
+  NS_DEBUG("LayerConnectorLower::DoConnectToUpper (" << &partner << ")")
+
+  m_upperPartner = &partner;
+  assert(m_upperPartner);
+  return true;
+}
+
+  bool
+LayerConnectorLower::LowerSendUp (Packet &p)
+{
+  NS_DEBUG("LayerConnectorLower::LowerSendUp (" << &p << ")")
+
+  assert(m_upperPartner);
+  return m_upperPartner->UpperSendUp(p);
+}
+
+  bool
+LayerConnectorLower::LowerPull (Packet &p)
+{
+  NS_DEBUG("LayerConnectorLower::LowerPull (" << &p << ")")
+
+  assert(m_upperPartner);
+  return m_upperPartner->UpperPull(p);
+}
+
+  bool
+LayerConnectorLower::LowerNotify (LayerConnectorUpper *upper)
+{
+  NS_DEBUG("LayerConnectorLower::LowerNotify ()")
+  return LowerDoNotify(upper);
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/layer-connector.h	Sun Feb 18 19:19:42 2007 -0800
@@ -0,0 +1,97 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 University of Washington
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Craig Dowell <craigdo@ee.washingon.edu>
+ *
+ *      Wed Feb 14 16:05:46 PST 2007 craigdo:  created
+ */
+
+#include "ns3/packet.h"
+
+#ifndef LAYER_CONNECTOR_H
+#define LAYER_CONNECTOR_H
+
+namespace ns3 {
+
+class LayerConnectorLower;
+
+class LayerConnectorUpper {
+public:
+  LayerConnectorUpper ();
+  virtual ~LayerConnectorUpper ();
+
+  // called by the layer connector to introduce the lower interface to us here
+  bool ConnectToLower (LayerConnectorLower &lower);
+
+  // called by the lower layer to send a received packet on up the protocol
+  // stack to us here.
+  bool UpperSendUp (Packet &p);
+
+  // Call this function to tell a lower layer that there is data available
+  // here.  It is expected that the lower layer will call pull as soon as
+  // possible to get the data.
+  bool UpperNotify ();
+
+  // called by the lower layer to get available packet data that was implied
+  // by a previous Notify() call.
+  bool UpperPull(Packet &p);
+
+protected:
+  virtual bool DoConnectToLower (LayerConnectorLower &lower);
+  virtual bool UpperDoSendUp (Packet &p) = 0;
+  virtual bool UpperDoPull (Packet &p) = 0;
+
+  LayerConnectorLower *m_lowerPartner;
+
+private:
+};
+
+class LayerConnectorLower
+{
+public:
+  LayerConnectorLower ();
+  virtual ~LayerConnectorLower ();
+
+  // This function is called by the layer connector to introduce the upper
+  // layer interface to us here
+  bool ConnectToUpper (LayerConnectorUpper &upper);
+
+  // Notify is called by the upper layer connector to tell us that there
+  // is data available.  It is expected that we will call pull (below) as
+  // soon as possible to get the data.
+  bool LowerNotify (LayerConnectorUpper *upper);
+
+  // The lower connector calls this method to send a received packet on up 
+  // the protocol stack
+  bool LowerSendUp (Packet &p);
+
+  // Call this function to get available packet data from the upper connector
+  // that was implied by a previous Notify() call.
+  bool LowerPull(Packet &p);
+
+protected:
+  virtual bool DoConnectToUpper (LayerConnectorUpper &upper);
+  virtual bool LowerDoNotify (LayerConnectorUpper *upper) = 0;
+  LayerConnectorUpper *m_upperPartner;
+
+private:
+};
+
+}; // namespace ns3
+
+#endif /* LAYER_CONNECTOR_H */