large checkin-- bringing in serial device code
authorTom Henderson <tomh@tomh.org>
Thu, 15 Feb 2007 23:55:15 -0800
changeset 291 f5a98bae86c1
parent 290 6c88561a0907
child 292 cc17705d3344
large checkin-- bringing in serial device code
SConstruct
samples/ns-2/simple.tcl.cc
src/node/capability.h
src/node/channel.cc
src/node/channel.h
src/node/demux.h
src/node/net-device-serial.cc
src/node/net-device-serial.h
src/node/propagator.h
src/node/protocol.h
src/node/serial-channel.cc
src/node/serial-channel.h
--- a/SConstruct	Thu Feb 15 22:27:33 2007 -0800
+++ b/SConstruct	Thu Feb 15 23:55:15 2007 -0800
@@ -19,7 +19,8 @@
     'reference-list-test.cc',
     'callback-test.cc',
     'ptr.cc',
-    'test.cc'
+    'test.cc',
+    'debug.cc'
     ])
 env = Environment()
 if env['PLATFORM'] == 'posix' or env['PLATFORM'] == 'darwin':
@@ -39,7 +40,8 @@
     'reference-list.h',
     'callback.h',
     'ptr.h',
-    'test.h'
+    'test.h',
+    'debug.h'
     ])
 
 
@@ -153,6 +155,7 @@
     'ipv4-address.cc',
     'internet-node.cc',
     'net-device.cc',
+    'net-device-serial.cc',
     'mac-address.cc',
     'ipv4-header.cc',
     'udp-header.cc',
@@ -174,7 +177,10 @@
     'ipv4-loopback-interface.cc',
     'llc-snap-header.cc',
     'header-utils.cc',
-    'net-device-list.cc'
+    'net-device-list.cc',
+    'serial-channel.cc',
+    'queue.cc',
+    'drop-tail.cc',
     ])
 node.add_headers ([
     'ipv4-header.h',
@@ -193,8 +199,14 @@
     'l3-protocol.h',
     'ipv4-l4-demux.h',
     'net-device-list.h',
+    'net-device-serial.h',
     'llc-snap-header.h',
     'header-utils.h',
+    'protocol.h',
+    'demux.h',
+    'serial-channel.h',
+    'queue.h',
+    'drop-tail.h'
     ])
 node.add_inst_headers ([
     'node.h',
@@ -209,6 +221,9 @@
     'mac-address.h',
     'ipv4.h',
     'ipv4-route.h',
+    'serial-channel.h',
+    'queue.h',
+    'net-device-serial.h'
     ])
 
 
--- a/samples/ns-2/simple.tcl.cc	Thu Feb 15 22:27:33 2007 -0800
+++ b/samples/ns-2/simple.tcl.cc	Thu Feb 15 23:55:15 2007 -0800
@@ -24,9 +24,15 @@
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 #include "ns3/internet-node.h"
+#include "ns3/serial-channel.h"
 
 using namespace ns3;
 
+static SerialChannel* AddDuplexLink(InternetNode* a, InternetNode* b) {
+    SerialChannel* channel = new SerialChannel();
+    return channel;
+}
+
 int main (int argc, char *argv[])
 {
     // set ns [new Simulator]
@@ -54,6 +60,8 @@
     // $ns duplex-link $n1 $n2 5Mb 2ms DropTail
     // $ns duplex-link $n2 $n3 1.5Mb 10ms DropTail
     // ** part of topology creation object? **
+    SerialChannel* ch = AddDuplexLink(n0,n1);
+    delete ch;
 
     // $ns duplex-link-op $n0 $n2 orient right-up
     // $ns duplex-link-op $n1 $n2 orient right-down
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/capability.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,48 @@
+// -*- Mode:NS3 -*-
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+// 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: George F. Riley<riley@ece.gatech.edu>
+//
+// Define the base class for all node capabilities.
+// George F. Riley, Georgia Tech, Fall 2006
+
+#ifndef __CAPABILITY_H__
+#define __CAPABILITY_H__
+
+// All capabilities must implement a copy method, to allow node subclasses
+// to have a pointer to any subclass of the capability and still copy
+// correctly.
+
+namespace ns3 {
+
+const int nil=0;
+
+class Node;
+
+class Capability 
+{
+public:
+  Capability() : pNode(nil) {}
+  virtual ~Capability() {}
+  virtual Capability* Copy() const = 0;
+  Node*   pNode;  // Node on which this capability is assigned
+};
+
+}; // namespace ns3
+    
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/channel.cc	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,66 @@
+/* -*- 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>
+ *
+ *	Thu Feb 15 14:50:46 PST 2007 craigdo: Created.
+ */
+
+#include "ns3/debug.h"
+#include "channel.h"
+
+namespace ns3 {
+
+namespace {
+  int chDebug = 1;
+};
+
+Channel::Channel ()
+{
+  NS3_TRACE(chDebug, "Channel::Channel ()")
+}
+
+Channel::~Channel ()
+{
+  NS3_TRACE(chDebug, "Channel::~Channel ()")
+}
+
+  bool
+Channel::Connect (PhysicalLayer &phys)
+{
+  NS3_TRACE(chDebug, "Channel::Connect (" << &phys << ")")
+  m_physList.push_back(static_cast<PhysicalLayer *>(&phys));
+  return true;
+}
+
+  bool
+Channel::Propagate (Propagator &propagator)
+{
+  NS3_TRACE(chDebug, "Channel::Propagate (" << &propagator << ")")
+
+  for (PhysicalLayerList::const_iterator i = m_physList.begin ();
+       i != m_physList.end (); 
+       i++)
+    {
+      (*i)->Receive (propagator);
+    }
+
+  return true;
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/channel.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,57 @@
+/* -*- 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 <list>
+#include "physical-layer.h"
+
+#ifndef CHANNEL_H
+#define CHANNEL_H
+
+namespace ns3 {
+
+class Propagator;
+
+class Channel
+{
+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);
+
+protected:
+  typedef std::list<PhysicalLayer *> PhysicalLayerList;
+  PhysicalLayerList m_physList;
+
+private:
+};
+
+}; // namespace ns3
+
+#endif /* SERIAL_PHY_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/demux.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,62 @@
+// -*- Mode:NS3 -*-
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+// 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: George F. Riley<riley@ece.gatech.edu>
+//
+// Define the Protocols capability for ns3.
+// George F. Riley, Georgia Tech, Fall 2006
+
+// This object manages the different layer 3 protocols for any ns3
+// node that has this capability.  
+
+// Note;  changed class name to Demux-- tomh
+
+#ifndef __DEMUX_H__
+#define __DEMUX_H__
+
+#include <map>
+
+#include "capability.h"
+#include "l3-protocol.h"
+
+namespace ns3 {
+
+// Use a map structure for l3 protocol lookup
+typedef std::map<int, L3Protocol*> DemuxMap_t;
+
+class Demux : public Capability
+{
+public:
+  Demux() {}
+  Demux(const Demux&);
+  virtual ~Demux();
+  virtual Demux* Copy() const;
+
+  // Insert a new protocol
+  void Insert(L3Protocol*, int proto);
+  // Look up a protocol by protocol number
+  L3Protocol* Lookup(int);
+
+private:
+  DemuxMap_t Protocols;
+};
+
+}; // namespace ns3
+   
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/net-device-serial.cc	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,141 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include <iostream>
+#include <cassert>
+#include "ns3/debug.h"
+#include "protocol.h"
+#include "demux.h"
+#include "queue.h"
+#include "net-device-serial.h"
+#include "serial-channel.h"
+
+namespace ns3 {
+
+const int IPv4ProtocolNumber = 4;
+
+namespace {
+  int sndDebug = 0;
+}
+
+SerialNetDevice::SerialNetDevice(Node* node, const MacAddress& addr) : 
+  NetDevice(node, addr)
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::SerialNetDevice (" << node << ", " << &addr << ")")
+
+  // BUGBUG FIXME
+  //
+  // You _must_ support broadcast to get any sort of packet from the ARP layer.
+  EnableBroadcast (MacAddress ("ff:ff:ff:ff:ff:ff"));
+  EnableMulticast();
+  EnablePointToPoint();
+  SetMtu(512); // bytes
+}
+
+SerialNetDevice::~SerialNetDevice()
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::~SerialNetDevice ()")
+}
+
+
+  bool
+SerialNetDevice::SendTo (Packet& p, const MacAddress& dest)
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::SendTo (" << &p << ", " << &dest << ")")
+
+  assert (IsLinkUp ());
+
+#ifdef NOTYET
+    struct NetDevicePacketDestAddress tag;
+    tag.address = address;
+    p.AddTag (tag);
+#endif
+    if (m_queue->Enque(p) )
+      {
+        NotifyDataAvailable ();
+        return true;
+      }
+    return false;
+}
+
+  bool
+SerialNetDevice::Attach (SerialChannel* ch)
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::Attach (" << &ch << ")")
+
+  m_channel = ch;
+  /* 
+   * For now, this device is up whenever a channel is attached to it.
+   * In fact, it should become up only when the second device
+   * is attached to the channel. So, there should be a way for
+   * a SerialChannel to notify both of its attached devices
+   * that the channel is 'complete', hence that the devices are
+   * up, hence that they can call NotifyLinkUp. 
+   */
+  NotifyLinkUp ();
+  return true;
+}
+
+void
+SerialNetDevice::AddQueue (Queue* q)
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::AddQueue (" << q << ")")
+
+  m_queue = q;
+}
+
+void
+SerialNetDevice::Receive (Packet& p)
+{
+  // ignore return value for now.
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::Receive (" << &p << ")")
+
+  ForwardUp (p);
+}
+
+void
+SerialNetDevice::NotifyDataAvailable(void)
+{
+  NS3_TRACE(sndDebug, 
+    "SerialNetDevice::NotifyDataAvailable ()")
+
+  Packet p;
+  bool found = GetQueue ()->Deque (p);
+  if (found)
+    {
+#ifdef NOTYET
+      struct NetDevicePacketDestAddress tag;
+      p.PeekTag (tag);
+      // send packet to address tag.address
+#endif
+      NS3_TRACE(sndDebug, 
+        "SerialNetDevice::NotifyDataAvailable (): Dequeued")
+      m_channel->Send(p, this);
+    }
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/net-device-serial.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,67 @@
+/* -*- 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.washington.edu>
+ */
+
+#ifndef SERIAL_NET_DEVICE_H
+#define SERIAL_NET_DEVICE_H
+
+#include <string.h>
+#include "mac-address.h"
+#include "internet-node.h"
+#include "net-device.h"
+#include "ns3/callback.h"
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+class SerialChannel;
+class Queue;
+
+class SerialNetDevice : public NetDevice {
+public:
+  SerialNetDevice(Node* node, const MacAddress& addr);
+  virtual ~SerialNetDevice();
+
+private:
+  // Don't let the compiler slip in copy and assignment construction
+  SerialNetDevice(const SerialNetDevice&);
+  SerialNetDevice&operator=(const SerialNetDevice&);
+
+public:
+  bool Attach(SerialChannel* ch);
+  void AddQueue(Queue *);
+  // called by ChannelSerial
+  void Receive (Packet& p);
+
+protected:
+  Queue* GetQueue(void) const { return m_queue;};
+
+private:
+  virtual void NotifyDataAvailable (void);
+  virtual bool SendTo (Packet& p, const MacAddress& dest);
+
+  SerialChannel* m_channel;
+  Queue* m_queue;
+};
+
+}; // namespace ns3
+
+#endif // SERIAL_NET_DEVICE_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/propagator.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,49 @@
+/* -*- 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>
+ *
+ *      Thu Feb 15 15:06:15 PST 2007 craigdo:  Created
+ */
+
+#ifndef PROPAGATOR_H
+#define PROPAGATOR_H
+
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+class Propagator
+{
+public:
+  Propagator () : m_packet(0) {}
+  virtual ~Propagator () {}
+
+  void SetPacket (Packet &p) {DoSetPacket(p);}
+
+protected:
+  virtual void DoSetPacket (Packet &p) {m_packet = static_cast<Packet *>(&p);}
+
+  Packet *m_packet;
+private:
+};
+
+
+}; // namespace ns3
+
+#endif /* SERIAL_PHY_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/protocol.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,46 @@
+// -*- Mode:NS3 -*-
+//
+// Copyright (c) 2006 Georgia Tech Research Corporation
+// 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: George F. Riley<riley@ece.gatech.edu>
+//
+
+// NS3 - Layer 3 Protocol base class
+// George F. Riley, Georgia Tech, Summer 2006
+
+// Note:  class name tentatively moved to Protocol-- tomh
+
+#ifndef __protocol_h__
+#define __protocol_h__
+
+namespace ns3 {
+
+class InternetNode;
+
+class Protocol {
+public:
+Protocol(InternetNode* n) : m_node(n) {}
+Protocol* Copy() const { return new Protocol(*this); }
+InternetNode *GetNode (void) const  { return m_node; }
+
+private:
+  InternetNode* m_node;
+};
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/serial-channel.cc	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,45 @@
+/* -*- 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 "serial-channel.h"
+#include "net-device-serial.h"
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+void
+SerialChannel::Attach(SerialNetDevice* nd)
+{
+    nd->Attach(this);
+    m_devices.push_back (nd);
+}
+
+bool
+SerialChannel::Send(Packet& p, SerialNetDevice* caller)
+{
+    for (NetDevicesCI i = m_devices.begin (); i != m_devices.end (); i++) {
+        if (caller != (*i)) {
+            (*i)->Receive (p);
+            return true;
+        }
+    }
+    return false;
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/serial-channel.h	Thu Feb 15 23:55:15 2007 -0800
@@ -0,0 +1,47 @@
+/* -*- 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
+ */
+
+// The queue base class does not have any limit based on the number
+// of packets or number of bytes. It is, conceptually, infinite 
+// by default. Only subclasses define limitations.
+// The base class implements tracing and basic statistics calculations.
+
+#ifndef CHANNEL_SERIAL_H
+#define CHANNEL_SERIAL_H
+
+#include <list>
+#include "net-device-serial.h"
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+// Simple SerialChannel class
+class SerialChannel {
+public:
+  bool Send(Packet& p, SerialNetDevice *caller);
+  void Attach (SerialNetDevice* nd);
+private:
+  typedef std::list<SerialNetDevice *> NetDevices;
+  typedef std::list<SerialNetDevice *>::const_iterator  NetDevicesCI;
+  NetDevices m_devices;
+};
+
+} // namespace ns3
+
+#endif /* CHANNEL_SERIAL__H */