bug 592: Ipv4RoutingProtocol::RouteOutput needs a packet pointer argument for reactive protocols
--- a/src/internet-stack/arp-l3-protocol.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/arp-l3-protocol.cc Fri Jun 26 09:55:36 2009 +0200
@@ -318,7 +318,8 @@
Ipv4Header header;
header.SetDestination (to);
Socket::SocketErrno errno_;
- Ptr<Ipv4Route> route = ipv4->GetRoutingProtocol ()->RouteOutput (header, interface, errno_);
+ Ptr<Packet> packet = Create<Packet> ();
+ Ptr<Ipv4Route> route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, interface, errno_);
NS_ASSERT (route != 0);
NS_LOG_LOGIC ("ARP: sending request from node "<<m_node->GetId ()<<
" || src: " << cache->GetDevice ()->GetAddress () <<
@@ -329,7 +330,6 @@
route->GetSource (),
cache->GetDevice ()->GetBroadcast (),
to);
- Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader (arp);
cache->GetDevice ()->Send (packet, cache->GetDevice ()->GetBroadcast (), PROT_NUMBER);
}
@@ -346,7 +346,8 @@
Ipv4Header header;
header.SetDestination (toIp);
Socket::SocketErrno errno_;
- Ptr<Ipv4Route> route = ipv4->GetRoutingProtocol ()->RouteOutput (header, interface, errno_);
+ Ptr<Packet> packet = Create<Packet> ();
+ Ptr<Ipv4Route> route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, interface, errno_);
NS_ASSERT (route != 0);
NS_LOG_LOGIC ("ARP: sending reply from node "<<m_node->GetId ()<<
"|| src: " << cache->GetDevice ()->GetAddress () <<
@@ -354,7 +355,6 @@
" || dst: " << toMac << " / " << toIp);
arp.SetReply (cache->GetDevice ()->GetAddress (),
route->GetSource (), toMac, toIp);
- Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader (arp);
cache->GetDevice ()->Send (packet, toMac, PROT_NUMBER);
}
--- a/src/internet-stack/icmpv4-l4-protocol.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/icmpv4-l4-protocol.cc Fri Jun 26 09:55:36 2009 +0200
@@ -84,7 +84,7 @@
Socket::SocketErrno errno_;
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
if (route != 0)
{
NS_LOG_LOGIC ("Route exists");
--- a/src/internet-stack/ipv4-l3-protocol.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/ipv4-l3-protocol.cc Fri Jun 26 09:55:36 2009 +0200
@@ -532,7 +532,7 @@
Socket::SocketErrno errno_;
uint32_t oif = 0; // unused for now
ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
- Ptr<Ipv4Route> newRoute = m_routingProtocol->RouteOutput (ipHeader, oif, errno_);
+ Ptr<Ipv4Route> newRoute = m_routingProtocol->RouteOutput (packet, ipHeader, oif, errno_);
if (newRoute)
{
SendRealOut (newRoute, packet, ipHeader);
--- a/src/internet-stack/ipv4-raw-socket-impl.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/ipv4-raw-socket-impl.cc Fri Jun 26 09:55:36 2009 +0200
@@ -178,7 +178,7 @@
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
// TBD-- we could cache the route and just check its validity
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
if (route != 0)
{
NS_LOG_LOGIC ("Route exists");
--- a/src/internet-stack/tcp-l4-protocol.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/tcp-l4-protocol.cc Fri Jun 26 09:55:36 2009 +0200
@@ -547,7 +547,7 @@
Socket::SocketErrno errno_;
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route);
}
}
@@ -585,7 +585,7 @@
Socket::SocketErrno errno_;
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route);
}
else
--- a/src/internet-stack/tcp-socket-impl.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/tcp-socket-impl.cc Fri Jun 26 09:55:36 2009 +0200
@@ -354,7 +354,7 @@
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
// XXX here, cache the route in the endpoint?
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (Ptr<Packet> (), header, oif, errno_);
if (route != 0)
{
NS_LOG_LOGIC ("Route exists");
@@ -855,7 +855,7 @@
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
header.SetDestination (m_remoteAddress);
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (Ptr<Packet> (), header, oif, errno_);
if (route != 0)
{
NS_LOG_LOGIC ("Route exists");
--- a/src/internet-stack/udp-socket-impl.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/internet-stack/udp-socket-impl.cc Fri Jun 26 09:55:36 2009 +0200
@@ -400,7 +400,7 @@
Ptr<Ipv4Route> route;
uint32_t oif = 0; //specify non-zero if bound to a source address
// TBD-- we could cache the route and just check its validity
- route = ipv4->GetRoutingProtocol ()->RouteOutput (header, oif, errno_);
+ route = ipv4->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
if (route != 0)
{
NS_LOG_LOGIC ("Route exists");
--- a/src/node/ipv4-routing-protocol.h Fri Jun 26 09:46:21 2009 +0200
+++ b/src/node/ipv4-routing-protocol.h Fri Jun 26 09:55:36 2009 +0200
@@ -60,6 +60,8 @@
* packet to be forwarded, and is synchronous. Can be used for
* multicast or unicast. The Linux equivalent is ip_route_output()
*
+ * \param p packet to be routed. Note that this method may modify the packet.
+ * Callers may also pass in a null pointer.
* \param header input parameter (used to form key to search for the route)
* \param oif Output interface index. May be zero, or may be bound via
* socket options to a particular output interface.
@@ -67,7 +69,7 @@
*
* \returns a code that indicates what happened in the lookup
*/
- virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
/**
* \brief Route an input packet (to be forwarded or locally delivered)
--- a/src/routing/global-routing/ipv4-global-routing.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/global-routing/ipv4-global-routing.cc Fri Jun 26 09:55:36 2009 +0200
@@ -259,7 +259,7 @@
}
Ptr<Ipv4Route>
-Ipv4GlobalRouting::RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
+Ipv4GlobalRouting::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
{
//
--- a/src/routing/global-routing/ipv4-global-routing.h Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/global-routing/ipv4-global-routing.h Fri Jun 26 09:55:36 2009 +0200
@@ -80,7 +80,7 @@
Ipv4GlobalRouting ();
virtual ~Ipv4GlobalRouting ();
- virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,
--- a/src/routing/list-routing/ipv4-list-routing.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/list-routing/ipv4-list-routing.cc Fri Jun 26 09:55:36 2009 +0200
@@ -69,7 +69,7 @@
}
Ptr<Ipv4Route>
-Ipv4ListRouting::RouteOutput (const Ipv4Header &header, uint32_t oif, enum Socket::SocketErrno &sockerr)
+Ipv4ListRouting::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, enum Socket::SocketErrno &sockerr)
{
NS_LOG_FUNCTION (this << header.GetDestination () << " " << header.GetSource () << " " << oif);
Ptr<Ipv4Route> route;
@@ -79,7 +79,7 @@
{
NS_LOG_LOGIC ("Checking protocol " << (*i).second->GetInstanceTypeId () << " with priority " << (*i).first);
NS_LOG_LOGIC ("Requesting source address for destination " << header.GetDestination ());
- route = (*i).second->RouteOutput (header, oif, sockerr);
+ route = (*i).second->RouteOutput (p, header, oif, sockerr);
if (route)
{
NS_LOG_LOGIC ("Found route " << route);
@@ -335,7 +335,7 @@
class Ipv4ARouting : public Ipv4RoutingProtocol {
public:
- Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) { return 0;}
+ Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) { return 0;}
bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,
LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
@@ -348,7 +348,7 @@
class Ipv4BRouting : public Ipv4RoutingProtocol {
public:
- Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) { return 0;}
+ Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) { return 0;}
bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,
LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
--- a/src/routing/list-routing/ipv4-list-routing.h Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/list-routing/ipv4-list-routing.h Fri Jun 26 09:55:36 2009 +0200
@@ -73,7 +73,7 @@
virtual Ptr<Ipv4RoutingProtocol> GetRoutingProtocol (uint32_t index, int16_t& priority) const;
// Below are from Ipv4RoutingProtocol
- virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,
--- a/src/routing/olsr/olsr-routing-protocol.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/olsr/olsr-routing-protocol.cc Fri Jun 26 09:55:36 2009 +0200
@@ -2551,7 +2551,7 @@
}
Ptr<Ipv4Route>
-RoutingProtocol::RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
+RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
{
NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination () << " " << oif);
// TBD: oif is unused; can be used to restrict the outgoing interface
--- a/src/routing/olsr/olsr-routing-protocol.h Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/olsr/olsr-routing-protocol.h Fri Jun 26 09:55:36 2009 +0200
@@ -120,7 +120,7 @@
RoutingTableEntry &outEntry) const;
// From Ipv4RoutingProtocol
- virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,
LocalDeliverCallback lcb, ErrorCallback ecb);
--- a/src/routing/static-routing/ipv4-static-routing.cc Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/static-routing/ipv4-static-routing.cc Fri Jun 26 09:55:36 2009 +0200
@@ -437,7 +437,7 @@
}
Ptr<Ipv4Route>
-Ipv4StaticRouting::RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
+Ipv4StaticRouting::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
{
NS_LOG_FUNCTION (this << header << oif);
Ipv4Address destination = header.GetDestination ();
--- a/src/routing/static-routing/ipv4-static-routing.h Fri Jun 26 09:46:21 2009 +0200
+++ b/src/routing/static-routing/ipv4-static-routing.h Fri Jun 26 09:55:36 2009 +0200
@@ -70,7 +70,7 @@
Ipv4StaticRouting ();
virtual ~Ipv4StaticRouting ();
- virtual Ptr<Ipv4Route> RouteOutput (const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
+ virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr);
virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
UnicastForwardCallback ucb, MulticastForwardCallback mcb,