a very simple howto for implementing NetDevice/Channel subclasses
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 23 Jun 2008 12:49:51 -0700
changeset 3313 9410e0ff6a1c
parent 3312 c4f001798693
child 3314 27443ac75474
child 3315 85d6b10511fe
a very simple howto for implementing NetDevice/Channel subclasses
doc/howtos/howtos-net-device.h
doc/howtos/howtos.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/howtos/howtos-net-device.h	Mon Jun 23 12:49:51 2008 -0700
@@ -0,0 +1,93 @@
+/*!
+  \page net-device How to create a new OSI layer 1 + 2 implementation ?
+  \anchor howtos-net-device
+
+  <b>Question:</b> How do I integrate a new OSI layer 1 + 2 implementation ?
+
+  <b>Answer:</b> The OSI layers 1 and 2 are represented by the ns3::NetDevice
+  and ns3::Channel classes. To plug transparently in ns-3, a new layer 1+2 model
+  thus simply needs to provide two new subclasses of these two base classes.
+
+  To make that subclassing process easy, two skeleton classes are provided in
+  the src/node directory: simple-net-device.h (ns3::SimpleNetDevice) and 
+  simple-channel.h (ns3::SimpleChannel) implement a broadcast passthru medium 
+  using 48bit MAC addresses without any kind of MAC access algorithm or PHY 
+  layer modeling.
+
+  The ns3::SimpleChannel class is really very simple: it provides
+  an implementation for the ns3::Channel::GetNDevices and ns3::Channel::GetDevice
+  methods defined in the Channel base class and, then defines the channel-specific
+  send and add methods:
+- The Add method is used by SimpleNetDevice::SetChannel to register a new 
+  SimpleNetDevice with its associated channel.
+- The Send method is used by SimpleNetDevice::Send to send a packet over the
+  broadcast medium and ensure that it gets delivered to all associated devices
+  (except the sender).
+
+\code
+class SimpleChannel : public Channel
+{
+public:
+  static TypeId GetTypeId (void);
+  SimpleChannel ();
+
+  void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
+	     Ptr<SimpleNetDevice> sender);
+
+  void Add (Ptr<SimpleNetDevice> device);
+
+  // inherited from ns3::Channel
+  virtual uint32_t GetNDevices (void) const;
+  virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
+
+private:
+  std::vector<Ptr<SimpleNetDevice> > m_devices;
+};
+\endcode
+
+The SimpleNetDevice class is also trivial since it implements no special
+MAC-layer processing:
+\code
+class SimpleNetDevice : public NetDevice
+{
+public:
+  static TypeId GetTypeId (void);
+  SimpleNetDevice ();
+
+  void Receive (Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
+  void SetChannel (Ptr<SimpleChannel> channel);
+  void SetAddress (Mac48Address address);
+
+  // inherited from NetDevice base class.
+  virtual void SetName(const std::string name);
+  ...
+};
+\endcode
+
+The code below illustrates how the three model-specific methods defined above are
+implemented:
+
+\code
+void 
+SimpleNetDevice::Receive (Ptr<Packet> packet, uint16_t protocol, 
+			  Mac48Address to, Mac48Address from)
+{
+  if (to == m_address || to == Mac48Address::GetBroadcast ())
+    {
+      m_rxCallback (this, packet, protocol, from);
+    }
+}
+void 
+SimpleNetDevice::SetChannel (Ptr<SimpleChannel> channel)
+{
+  m_channel = channel;
+  m_channel->Add (this);
+}
+void 
+SimpleNetDevice::SetAddress (Mac48Address address)
+{
+  m_address = address;
+}
+\endcode
+
+*/
--- a/doc/howtos/howtos.h	Mon Jun 23 12:45:01 2008 -0700
+++ b/doc/howtos/howtos.h	Mon Jun 23 12:49:51 2008 -0700
@@ -11,6 +11,7 @@
 Please consider contributing tips to either the wiki (yourself) or
 by submitting a patch to this maintained documentation.
 
+- \subpage net-device
 - \subpage callbacks
 - \subpage packet-header-trailer