diff --git a/src/node/internet-node.cc b/src/node/internet-node.cc index 7dfc6a9bf..b4f5055aa 100644 --- a/src/node/internet-node.cc +++ b/src/node/internet-node.cc @@ -30,6 +30,7 @@ #include "udp.h" #include "ipv4.h" #include "arp.h" +#include "net-device.h" namespace ns3 { @@ -144,7 +145,20 @@ InternetNode::GetArp (void) const void InternetNode::DoAddDevice (NetDevice *device) const { - //XXX + device->SetReceiveCallback (MakeCallback (&InternetNode::ReceiveFromDevice, this)); +} + +bool +InternetNode::ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const +{ + L3Protocol *target = GetL3Demux()->Lookup(protocolNumber); + if (target != 0) + { + Packet packet = p; + target->Receive(packet, *device); + return true; + } + return false; } diff --git a/src/node/internet-node.h b/src/node/internet-node.h index adc0caec4..ad117be71 100644 --- a/src/node/internet-node.h +++ b/src/node/internet-node.h @@ -31,6 +31,7 @@ namespace ns3 { +class Packet; class InternetNode : public Node { @@ -57,6 +58,7 @@ public: void SetName(std::string name); private: virtual void DoAddDevice (NetDevice *device) const; + bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const; // Capabilities ApplicationList* m_applicationList; L3Demux* m_l3Demux; diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 8ce2bf869..d292250e8 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -179,19 +179,15 @@ NetDevice::GetChannel (void) const bool NetDevice::ForwardUp (Packet& packet) { + bool retval = false; LlcSnapHeader llc; packet.Peek (llc); packet.Remove (llc); - if (GetNode()->GetL3Demux() != 0) + if (!m_receiveCallback.IsNull ()) { - L3Protocol *target = GetNode()->GetL3Demux()->Lookup(llc.GetType ()); - if (target != 0) - { - target->Receive(packet, *this); - return true; - } + retval = m_receiveCallback (this, packet, llc.GetType ()); } - return false; + return retval; } void @@ -226,4 +222,10 @@ NetDevice::NeedsArp (void) const return DoNeedsArp (); } +void +NetDevice::SetReceiveCallback (Callback cb) +{ + m_receiveCallback = cb; +} + }; // namespace ns3 diff --git a/src/node/net-device.h b/src/node/net-device.h index 116901275..a3bba8e08 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -154,6 +154,8 @@ class NetDevice { bool NeedsArp (void) const; + void SetReceiveCallback (Callback cb); + protected: /** * Enable broadcast support. This method should be @@ -238,6 +240,7 @@ class NetDevice { bool m_isMulticast; bool m_isPointToPoint; Callback m_linkChangeCallback; + Callback m_receiveCallback; }; }; // namespace ns3