From 718ec6459308a607dfbc155743a09681306c9aa8 Mon Sep 17 00:00:00 2001 From: Emmanuelle Laprise Date: Fri, 27 Jul 2007 20:45:18 +0200 Subject: [PATCH] Move LLC encapsulation from NetDevice to subclasses. --- .../point-to-point-net-device.cc | 31 ++++++++++++++++--- .../point-to-point-net-device.h | 21 +++++++++---- src/node/net-device.cc | 28 ++++++++++------- src/node/net-device.h | 14 ++++++--- 4 files changed, 69 insertions(+), 25 deletions(-) diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index 8f474edde..565557df6 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -28,6 +28,7 @@ #include "ns3/composite-trace-resolver.h" #include "point-to-point-net-device.h" #include "point-to-point-channel.h" +#include "ns3/llc-snap-header.h" NS_DEBUG_COMPONENT_DEFINE ("PointToPointNetDevice"); @@ -65,13 +66,30 @@ PointToPointNetDevice::~PointToPointNetDevice() m_queue = 0; } +void PointToPointNetDevice::AddHeader(Packet& p, const MacAddress& dest, + uint16_t protocolNumber) +{ + LlcSnapHeader llc; + llc.SetType (protocolNumber); + p.AddHeader (llc); +} + +bool PointToPointNetDevice::ProcessHeader(Packet& p, int& param) +{ + LlcSnapHeader llc; + p.RemoveHeader (llc); + + param = llc.GetType (); + + return true; +} + void PointToPointNetDevice::DoDispose() { m_channel = 0; NetDevice::DoDispose (); } - void PointToPointNetDevice::SetDataRate(const DataRate& bps) { m_bps = bps; @@ -82,7 +100,8 @@ void PointToPointNetDevice::SetInterframeGap(const Time& t) m_tInterframeGap = t; } -bool PointToPointNetDevice::SendTo (Packet& p, const MacAddress& dest) +bool PointToPointNetDevice::SendTo (Packet& p, const MacAddress& dest, + uint16_t protocolNumber) { NS_DEBUG ("PointToPointNetDevice::SendTo (" << &p << ", " << &dest << ")"); NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << p.GetUid () << ")"); @@ -91,6 +110,7 @@ bool PointToPointNetDevice::SendTo (Packet& p, const MacAddress& dest) // "go down" during the simulation? Shouldn't we just wait for it // to come back up? NS_ASSERT (IsLinkUp ()); + AddHeader(p, dest, protocolNumber); // // This class simulates a point to point device. In the case of a serial @@ -198,9 +218,12 @@ void PointToPointNetDevice::AddQueue (Ptr q) void PointToPointNetDevice::Receive (Packet& p) { NS_DEBUG ("PointToPointNetDevice::Receive (" << &p << ")"); + int param = 0; + Packet packet = p; - m_rxTrace (p); - ForwardUp (p); + ProcessHeader(packet, param); + m_rxTrace (packet); + ForwardUp (packet, param); } Ptr PointToPointNetDevice::GetQueue(void) const diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h index a4bc3be00..6e8f3f0ae 100644 --- a/src/devices/point-to-point/point-to-point-net-device.h +++ b/src/devices/point-to-point/point-to-point-net-device.h @@ -187,11 +187,18 @@ protected: static const DataRate& GetDefaultRate(); private: - // unimplemented methods to make it impossible - // to copy these objects. - PointToPointNetDevice (const PointToPointNetDevice& nd); - PointToPointNetDevice& operator = (const PointToPointNetDevice&o); - + /** + * Adds the necessary headers and trailers to a packet of data in order to + * respect the protocol implemented by the agent. + */ + void AddHeader(Packet& p, const MacAddress& dest, uint16_t protocolNumber); + /** + * Removes, from a packet of data, all headers and trailers that + * relate to the protocol implemented by the agent + * \return Returns true if the packet should be forwarded up the + * protocol stack. + */ + bool ProcessHeader(Packet& p, int& param); /** * Send a Packet Down the Wire. * @@ -202,9 +209,11 @@ private: * @see NetDevice * @param p a reference to the packet to send * @param dest a reference to the MacAddress of the destination device + * @param protocolNumber Protocol Number used to find protocol touse * @returns true if success, false on failure */ - virtual bool SendTo (Packet& p, const MacAddress& dest); + virtual bool SendTo (Packet& p, const MacAddress& dest, + uint16_t protocolNumber); /** * Start Sending a Packet Down the Wire. * diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 5774abeac..7bc61dc9b 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -22,12 +22,15 @@ #include #include "ns3/assert.h" #include "ns3/object.h" +#include "ns3/debug.h" + #include "channel.h" #include "net-device.h" -#include "llc-snap-header.h" #include "node.h" +NS_DEBUG_COMPONENT_DEFINE ("NetDevice"); + namespace ns3 { const InterfaceId NetDevice::iid = MakeInterfaceId ("NetDevice", Object::iid); @@ -172,10 +175,7 @@ NetDevice::Send(Packet& p, const MacAddress& dest, uint16_t protocolNumber) { if (m_isUp) { - LlcSnapHeader llc; - llc.SetType (protocolNumber); - p.AddHeader (llc); - return SendTo(p, dest); + return SendTo(p, dest, protocolNumber); } else { @@ -195,18 +195,24 @@ NetDevice::GetChannel (void) const return DoGetChannel (); } -// Receive packet from below +// Receive packets from below bool -NetDevice::ForwardUp (Packet& packet) +NetDevice::ForwardUp(Packet& p, uint32_t param) { bool retval = false; - LlcSnapHeader llc; - packet.RemoveHeader (llc); + Packet packet = p; + + NS_DEBUG ("NetDevice::ForwardUp: UID is " << packet.GetUid() + << " device is: " << GetName()); + if (!m_receiveCallback.IsNull ()) { - retval = m_receiveCallback (this, packet, llc.GetType ()); + retval = m_receiveCallback (this, packet, param); + } else { + NS_DEBUG ("NetDevice::Receive call back is NULL"); } - return retval; + + return retval; } void diff --git a/src/node/net-device.h b/src/node/net-device.h index 522b1ed41..b5de34fc8 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -17,6 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Mathieu Lacage + * Modified by Emmanuelle Laprise to remove dependance on LLC headers */ #ifndef NET_DEVICE_H #define NET_DEVICE_H @@ -227,6 +228,8 @@ public: /** * \param p packet sent from below up to Network Device + * \param param Extra parameter extracted from header and needed by + * some protocols * \returns true if the packet was forwarded successfully, * false otherwise. * @@ -234,7 +237,8 @@ public: * forwards it to the higher layers by calling this method * which is responsible for passing it up to the Rx callback. */ - bool ForwardUp (Packet& p); + bool ForwardUp (Packet& p, uint32_t param); + /** * The dispose method for this NetDevice class. @@ -244,10 +248,13 @@ public: */ virtual void DoDispose (void); + Callback,const Packet &,uint16_t> m_receiveCallback; + private: /** * \param p packet to send * \param dest address of destination to which packet must be sent + * \param protocolNumber Number of the protocol (used with some protocols) * \returns true if the packet could be sent successfully, false * otherwise. * @@ -255,7 +262,7 @@ public: * method. When the link is Up, this method is invoked to ask * subclasses to forward packets. Subclasses MUST override this method. */ - virtual bool SendTo (Packet& p, const MacAddress& dest) = 0; + virtual bool SendTo (Packet& p, const MacAddress &dest, uint16_t protocolNumber) = 0; /** * \returns true if this NetDevice needs the higher-layers * to perform ARP over it, false otherwise. @@ -279,7 +286,7 @@ public: */ virtual Ptr DoGetChannel (void) const = 0; - Ptr m_node; + Ptr m_node; std::string m_name; uint16_t m_ifIndex; MacAddress m_address; @@ -290,7 +297,6 @@ public: bool m_isMulticast; bool m_isPointToPoint; Callback m_linkChangeCallback; - Callback,const Packet &,uint16_t> m_receiveCallback; }; }; // namespace ns3