more documentation to address trace sources bugs
authorCraig Dowell <craigdo@ee.washington.edu>
Fri, 12 Dec 2008 11:27:05 -0800
changeset 4017 4521a81f94b8
parent 4016 88e8d69b15f2
child 4018 ea1dd6fcaf55
more documentation to address trace sources bugs
doc/manual/csma.texi
src/devices/csma/csma.h
src/devices/emu/emu-net-device.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/manual/csma.texi	Fri Dec 12 11:27:05 2008 -0800
@@ -0,0 +1,334 @@
+@node CSMA NetDevice
+@chapter CSMA NetDevice
+
+This is the introduction to CSMA NetDevice chapter, to complement the
+Csma model doxygen.
+
+@menu
+* Overview of the model::
+* Using the CsmaNetDevice::
+* CSMA Tracing::
+@end menu
+
+@node Overview of the model
+@section Overview of the model
+
+The ns-3 CSMA device models a simple bus network in the spirit of Ethernet.
+Although it does not model any real physical network you could ever build 
+or buy, it does provide some very useful functionality.
+
+Typically when one thinks of a bus network Ethernet or IEEE 802.3 comes to
+mind.  Ethernet uses CSMA/CD (Carrier Sense Multiple Access with Collision
+Detection with exponentially increasing backoff to contend for the shared 
+transmission medium.  The ns-3 CSMA device models only a portion of this 
+process, using the nature of the globally available channel to provide 
+instantaneous (faster than light) carrier sense and priority-based 
+collision "avoidance."  Collisions in the sense of Ethernet never happen and
+so the ns-3 CSMA device does not model collision detection, nor will any
+transmission in progress be "jammed."
+
+@subsection CSMA Layer Model
+
+There are a number of conventions in use for describing layered 
+communications architectures in the literature and in textbooks.  The most
+common layering  model is the ISO seven layer reference model.  In this view
+the CsmaNetDevice and CsmaChannel pair occupies the lowest two 
+layers -- at the physical (layer one), and data link (layer two) positions.
+Another important reference model is that specified by RFC 1122, 
+"Requirements for Internet Hosts -- Communication Layers."  In this view the
+CsmaNetDevice and CsmaChannel pair occupies the lowest layer -- 
+the link layer.  There is also a seemingly endless litany of alternative 
+descriptions found in textbooks and in the literature.  We adopt the naming
+conventions used in the IEEE 802 standards which speak of LLC, MAC, MII
+and PHY layering.  These acronyms are defined as:
+
+@itemize @bullet
+@item LLC:  Logical Link Control;
+@item MAC:  Media Access Control;
+@item MII:  Media Independent Interface;
+@item PHY:  Physical Layer.
+@end itemize
+
+In this case the @emph{LLC} and @emph{MAC }are sublayers of the OSI data link 
+layer and the @emph{MII} and @emph{PHY} are sublayers of the OSI physical layer.
+
+The "top" of the CSMA device defines the transition from the network layer
+to the data link layer.  This transition is performed by higher layers by 
+calling either CsmaNetDevice::Send or CsmaNetDevice::SendFrom.
+
+In contrast to the IEEE 802.3 standards, there is no precisely specified
+PHY in the CSMA model in the sense of wire types, signals or pinouts.  The
+"bottom" interface of the CsmaNetDevice can be thought of as as a kind
+of Media Independent Interface (MII) as seen in the "Fast Ethernet" 
+(IEEE 802.3u) specifications.  This MII interface fits into a corresponding
+media independent interface on the CsmaChannel.  You will not find the
+equivalent of a 10BASE-T or a 1000BASE-LX PHY.
+
+The CsmaNetDevice calls the CsmaChannel through a media independent
+interface.  There is a method defined to tell the channel when to start 
+"wiggling the wires" using the method CsmaChannel::TransmitStart, and 
+a method to tell the channel when the transmission process is done and
+the channel should begin propagating the last bit across the "wire":
+CsmaChannel::TransmitEnd.
+
+When the TransmitEnd method is executed, the channel will model a single 
+uniform signal propagation delay in the medium and deliver copes of the packet
+to each of the devices attached to the packet via the 
+CsmaNetDevice::Receive method.
+
+There is a "pin" in the device media independent interface corresponding to 
+"COL" (collision).  The state of the channel may be sensed by calling 
+CsmaChannel::GetState.  Each device will look at this "pin" before 
+starting a send and will perform appropriate backoff operations if required.
+
+Properly received packets are forwarded up to higher levels from the 
+CsmaNetDevice via a callback mechanism.  The callback function is
+initialized by the higher layer (when the net device is attached) using
+CsmaNetDevice::SetReceiveCallback and is invoked upon "proper"
+ reception of a packet by the net device in order to forward the packet up
+the protocol stack.
+
+@section CSMA Channel Model
+
+The class CsmaChannel models the actual transmission medium.
+There is no fixed limit for the number of devices connected to the channel.
+The CsmaChannel models a data rate and a speed-of-light delay which can
+be accessed via the attributes "DataRate" and "Delay" respectively.
+The data rate provided to the channel is used to set the data rates
+used by the transmitter sections of the CSMA devices connected to the 
+channel.  There is no way to independently set data rates in the
+devices.  Since the data rate is only used to calculate a delay time, there
+is no limitation (other than by the data type holding the value) on the 
+speed at which CSMA channels and devices can operate; and no restriction
+based on any kind of PHY characteristics.
+
+The CsmaChannel has three states, @code{IDLE}, @code{TRANSMITTING} and 
+@code{PROPAGATING}.  These three states are "seen" instantaneously by all 
+devices on the channel.  By this we mean that if one device begins or ends a
+simulated transmission, all devices on the channel are @emph{immediately}
+aware of the change in state.  There is no time during which one device may
+see an @code{IDLE} channel while another device physically further away in 
+the collision domain may have begun transmitting with the associated signals 
+not propagated down the channel to other devices.  Thus there is no need for
+collision detection in the CsmaChannel model and it is not implemented in any
+way.
+
+We do, as the name indicates, have a Carrier Sense aspect to the model.
+Since the simulator is single threaded, access to the common channel will
+be serialized by the simulator.  This provides a deterministic mechanism
+for contending for the channel.  The channel is allocated (transitioned from
+state @code{IDLE} to state @code{TRANSMITTING}) on a first-come first-served 
+basis.  The channel always goes through a three state process:
+
+@verbatim
+  IDLE -> TRANSMITTING -> PROPAGATING -> IDLE
+@end verbatim
+
+The @code{TRANSMITTING} state models the time during which the source net device
+is actually wiggling the signals on the wire.  The @code{PROPAGATING} state 
+models the time after the last bit was sent, when the signal is propagating down 
+the wire to the "far end."  
+
+The transition to the @code{TRANSMITTING} state is  driven by a call to 
+CsmaChannel::TransmitStart which is called by the net device that 
+transmits the packet.  It is the responsibility of that device to end the
+transmission with a call to CsmaChannel::TransmitEnd at the appropriate
+simulation time that reflects the time elapsed to put all of the packet bits
+on the wire.  When TransmitEnd is called, the channel schedules an event
+corresponding to a single speed-of-light delay.  This delay applies to all
+net devices on the channel identically.  You can think of a symmetrical hub
+in which the packet bits propagate to a central location and then back out
+equal length cables to the other devices on the channel.  The single ``speed
+of light'' delay then corresponds to the time it takes for: 1) a singal to 
+propagate from one CsmaNetDevice through its cable to the hub; plus 2) the
+time it takes for the hub to forward the packet out a port; plus 3) the time
+it takes for the signal in question to propagate to the destination net 
+device.
+
+The CsmaChannel models a broadcast medium so the packet is delivered
+to all of the devices on the channel (including the source) at the end of 
+the propagation time.  It is the responsibility of the sending device to 
+determine whether or not it receives a packet broadcast over the channel.
+
+The CsmaChannel provides following Attributes:
+
+@itemize @bullet
+@item DataRate:  The bitrate for packet transmission on connected devices;
+@item Delay: The speed of light transmission delay for the channel.
+@end itemize
+
+@section CSMA Net Device Model
+
+ The CSMA network device appears somewhat like an Ethernet device.  The
+ CsmaNetDevice provides following Attributes:
+
+@itemize @bullet
+@item Address:  The Mac48Address of the device;
+@item SendEnable:  Enable packet transmission if true;
+@item ReceiveEnable:  Enable packet reception if true;
+@item EncapsulationMode:  Type of link layer encapsulation to use;
+@item RxErrorModel:  The receive error model;
+@item TxQueue:  The trasmit queue used by the device;
+@item InterframeGap:  The optional time to wait between "frames";
+@item Rx:  A trace source for received packets;
+@item Drop:  A trace source for dropped packets.
+@end itemize
+
+The CsmaNetDevice supports the assignment of a "receive error model."
+This is an ErrorModel object that is used to simulate data corruption
+on the link.
+
+Packets sent over the CsmaNetDevice are always routed through the 
+transmit queue to provide a trace hook for packets sent out over the 
+network.  This transmit queue can be set (via attribute) to model different
+queueing strategies.
+
+Also configurable by attribute is the encapsulation method used by the
+device.  Every packet gets an EthernetHeader that includes the 
+destination and source MAC addresses, and a length/type field.  Every packet
+also gets an EthernetTrailer which includes the FCS.  Data in the
+packet may be encapsulated in different ways.  
+
+By default, or by setting the "EncapsulationMode" attribute to "Dix", the 
+encapsulation is according to the DEC, Intel, Xerox standard.  This is sometimes
+called EthernetII framing and is the familiar destination MAC, source MAC, 
+EtherType, Data, CRC format.
+
+If the "EncapsulationMode" attribute is set to "Llc", the encapsulation is by 
+LLC SNAP.  In this case, a SNAP header is added that contains the EtherType
+(IP or ARP).  
+
+The other implemented encapsulation modes are IP_ARP (set "EncapsulationMode" to
+"IpArp") in which the length type of the Ethernet header receives the protocol 
+number of the packet; or ETHERNET_V1 (set "EncapsulationMode" to "EthernetV1") 
+in which the length type of the Ethernet header receives the length of the packet.
+A "Raw" encapsulation mode is defined but not implemented -- use of the RAW mode 
+results in an assertion.  
+
+Note that all net devices on a channel must be set to the same encapsulation mode
+for correct results.  The encapsulation mode is not sensed at the receiver.
+
+The CsmaNetDevice implements a random exponential backoff algorithm 
+that is executed if the channel is determined to be busy (@code{TRANSMITTING} or
+@code{PPROPAGATING}) when the device wants to start propagating.  This results in a
+random delay of up to pow (2, retries) - 1 microseconds before a retry is
+attempted.  The default maximum number of retries is 1000.
+
+@node Using the CsmaNetDevice
+@section Using the CsmaNetDevice
+
+The CSMA net devices and channels are typically created and configured using
+the associated @code{CsmaHelper} object.  The various ns3 device dhelpers 
+generatlly work in a simlar way, and their use is seen in many of our example
+programs.
+
+The conceptual model of interest is that of a bare computer ``husk'' into which 
+you plug net devices.  The bare computers are created using a @code{NodeContainer}
+helper.  You just ask this helper to create as many computers (we call them
+@code{Nodes}) as you need on your network:
+
+@verbatim
+  NodeContainer csmaNodes;
+  csmaNodes.Create (nCsmaNodes);
+@end verbatim
+
+Once you have your nodes, you need to instantiate a @code{CsmaHelper} and set
+any attributes you may want to change.
+
+@verbatim
+  CsmaHelper csma;
+  csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
+  csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
+
+  csma.SetDeviceAttribute ("EncapsulationMode", StringValue ("Dix"));
+  csma.SetDeviceAttribute ("FrameSize", UintegerValue (2000));
+@end verbatim
+ 
+Once the attributes are set, all that remains is to create the devices
+and install them on the required nodes, and to connect the devices 
+together using a CSMA channel.  When we create the net devices, we add
+them to a container to allow you to use them in the future.  This all
+takes just one line of code.
+
+@verbatim
+  NetDeviceContainer csmaDevices = csma.Install (csmaNodes);
+@end verbatim
+
+@node Csma Tracing
+@section CSMA Tracing
+
+Like all ns-3 devices, the CSMA Model provides a number of trace sources.
+These trace sources can be hooked using your own custom trace code, or you
+can use our helper functions to arrange for tracing to be enabled on devices
+you specify.
+
+@subsection Upper-Level (MAC) Hooks
+
+From the point of view of tracing in the net device, there are several 
+interesting points to insert trace hooks.  A convention inherited from other
+simulators is that packets destined for transmission onto attached networks
+pass through a single "transmit queue" in the net device.  We provide trace 
+hooks at this point in packet flow, which corresponds (abstractly) only to a 
+transition from the network to data link layer, and call them collectively
+the device MAC hooks.
+
+When a packet is sent to the CSMA net device for transmission it always 
+passes through the transmit queue.  The transmit queue in the 
+CsmaNetDevice inherits from Queue, and therefore inherits three 
+trace sources:
+
+@itemize @bullet
+@item An Enqueue operation source (see Queue::m_traceEnqueue);
+@item A Dequeue operation source (see Queue::m_traceDequeue);
+@item A Drop operation source (see Queue::m_traceDrop).
+@end itemize
+
+The upper-level (MAC) trace hooks for the CsmaNetDevice are, in fact, 
+exactly these three trace sources on the single transmit queue of the device.  
+
+The m_traceEnqueue event is triggered when a packet is placed on the transmit
+queue.  This happens at the time that CsmaNetDevice::Send or 
+CsmaNetDevice::SendFrom is called by a higher layer to queue a packet for 
+transmission.
+
+The m_traceDequeue event is triggered when a packet is removed from the
+transmit queue.  Dequeues from the transmit queue can happen in three 
+situations:  1) If the underlying channel is idle when the 
+CsmaNetDevice::Send or CsmaNetDevice::SendFrom is called, a packet
+is dequeued from the transmit queue and immediately transmitted;  2) If the
+underlying channel is idle, a packet may be dequeued and immediately 
+transmitted in an internal TransmitCompleteEvent that functions much 
+like a transmit complete interrupt service routine; or 3) from
+the random exponential backoff handler if a timeout is detected.
+
+Case (3) implies that a packet is dequeued from the transmit queue if it is 
+unable to be transmittted according to the backoff rules.  It is important 
+to understand that this will appear as a Dequeued packet and it is easy to 
+incorrectly assume that the packet was transmitted since it passed through
+the transmit queue.  In fact, a packet is actually dropped by the net device
+in this case.  The reason for this behavior is due to the definition of the 
+Queue Drop event.  The m_traceDrop event is, by defintion, fired when a 
+packet cannot be enqueued on the transmit queue becasue it is full.  This 
+event only fires if the queue is full and we do not overload this event
+to indicate that the CsmaChannel is "full."
+
+@subsection Lower-Level (PHY) Hooks
+
+Similar to the upper level trace hooks, there are trace hooks available at
+the lower levels of the net device.  We call these the PHY hooks.  These 
+events fire from the device methods that talk directly to the CsmaChannel.
+
+The trace source m_dropTrace is called to indicate a packet that is dropped
+by the device.  This happens in two cases:  First, if the receive side of 
+the net device is not enabled (see CsmaNetDevice::m_receiveEnable and the 
+associated attribute "ReceiveEnable").
+
+The m_dropTrace is also used to indicate that a packet was discarded as 
+corrupt if a receive error model is used (see 
+CsmaNetDevice::m_receiveErrorModel and the associated attribute 
+"ReceiveErrorModel").
+
+The other low-level trace source fires on reception of an accepted packet
+(see CsmaNetDevice::m_rxTrace).  A packet is accepted if it is destined
+for the broadcast address, a multicast address, or to the MAC address 
+assigned to the net device.
--- a/src/devices/csma/csma.h	Fri Dec 12 11:40:59 2008 +0000
+++ b/src/devices/csma/csma.h	Fri Dec 12 11:27:05 2008 -0800
@@ -161,19 +161,21 @@
  * queueing strategies.
  *
  * Also configurable by attribute is the encapsulation method used by the
- * device.  Every packet gets an EthernetHeader that includes the 
- * destination and source MAC addresses, and a length/type field.  Every packet
- * also gets an EthernetTrailer which includes the FCS.  Data in the
- * packet may be encapsulated in different ways.  By default, or by setting
- * the "EncapsulationMode" attribute to "Llc", the encapsulation is by 
+ * device.  By default, or by setting the "EncapsulationMode" attribute to 
+ * "Dix", the encapsulation is according to the DEC, Intel, Xerox standard.
+ * This is sometimes called EthernetII framing and is the familiar destination
+ * MAC, source MAC, EtherType, Data, CRC format.
+ *
+ * If the "EncapsulationMode" attribute is set to "Llc", the encapsulation is by 
  * LLC SNAP.  In this case, a SNAP header is added that contains the EtherType
- * (IP or ARP).  The other implemented encapsulation modes are IP_ARP (set
- * "EncapsulationMode" to "IpArp") in which the length type of the Ethernet 
- * header receives the protocol number of the packet; or ETHERNET_V1 (set
- * "EncapsulationMode" to "EthernetV1") in which the length type of the 
- * Ethernet header receives the length of the packet.  A "Raw" encapsulation
- * mode is defined but not implemented -- use of the RAW mode results in an
- * assert firing.
+ * (IP or ARP).  
+ *
+ * The other implemented encapsulation modes are IP_ARP (set "EncapsulationMode"
+ * to "IpArp") in which the length type of the Ethernet header receives the 
+ * protocol number of the packet; or ETHERNET_V1 (set "EncapsulationMode" to 
+ * "EthernetV1") in which the length type of the Ethernet header receives the 
+ * length of the packet.  A "Raw" encapsulation mode is defined but not 
+ * implemented -- use of the RAW mode results in an assertion.
  *
  * The CsmaNetDevice implements a random exponential backoff algorithm 
  * that is executed if the channel is determined to be busy (TRANSMITTING or
@@ -241,7 +243,7 @@
  * Similar to the upper level trace hooks, there are trace hooks available at
  * the lower levels of the net device.  We call these the PHY hooks.  These 
  * events fire from the device methods that talk directly to the CsmaChannel.
-
+ *
  * The trace source m_dropTrace is called to indicate a packet that is dropped
  * by the device.  This happens in two cases:  First, if the receive side of 
  * the net device is not enabled (see ns3::CsmaNetDevice::m_receiveEnable and the 
--- a/src/devices/emu/emu-net-device.cc	Fri Dec 12 11:40:59 2008 +0000
+++ b/src/devices/emu/emu-net-device.cc	Fri Dec 12 11:27:05 2008 -0800
@@ -88,11 +88,8 @@
                    MakePointerAccessor (&EmuNetDevice::m_queue),
                    MakePointerChecker<Queue> ())
     .AddTraceSource ("Rx", 
-                     "Trace source to fire on reception of a MAC packet.",
+                     "Trace source indicating recvfrom of packet destined for broadcast, multicast or local address.",
                      MakeTraceSourceAccessor (&EmuNetDevice::m_rxTrace))
-    .AddTraceSource ("Drop", 
-                     "Trace source to fire on when a MAC packet is dropped.",
-                     MakeTraceSourceAccessor (&EmuNetDevice::m_dropTrace))
     ;
   return tid;
 }